@@ -469,6 +469,92 @@ impl Pk {
469
469
Ok ( q)
470
470
}
471
471
472
+ pub fn rsa_private_exponent ( & self ) -> Result < Mpi > {
473
+ match self . pk_type ( ) {
474
+ Type :: Rsa => { }
475
+ _ => return Err ( Error :: PkTypeMismatch ) ,
476
+ }
477
+
478
+ let mut d = Mpi :: new ( 0 ) ?;
479
+
480
+ unsafe {
481
+ rsa_export (
482
+ self . inner . pk_ctx as * const rsa_context ,
483
+ ptr:: null_mut ( ) ,
484
+ ptr:: null_mut ( ) ,
485
+ ptr:: null_mut ( ) ,
486
+ d. handle_mut ( ) ,
487
+ ptr:: null_mut ( ) ,
488
+ )
489
+ . into_result ( ) ?;
490
+ }
491
+
492
+ Ok ( d)
493
+ }
494
+
495
+ pub fn rsa_crt_dp ( & self ) -> Result < Mpi > {
496
+ match self . pk_type ( ) {
497
+ Type :: Rsa => { }
498
+ _ => return Err ( Error :: PkTypeMismatch ) ,
499
+ }
500
+
501
+ let mut dp = Mpi :: new ( 0 ) ?;
502
+
503
+ unsafe {
504
+ rsa_export_crt (
505
+ self . inner . pk_ctx as * const rsa_context ,
506
+ dp. handle_mut ( ) ,
507
+ ptr:: null_mut ( ) ,
508
+ ptr:: null_mut ( ) ,
509
+ )
510
+ . into_result ( ) ?;
511
+ }
512
+
513
+ Ok ( dp)
514
+ }
515
+
516
+ pub fn rsa_crt_dq ( & self ) -> Result < Mpi > {
517
+ match self . pk_type ( ) {
518
+ Type :: Rsa => { }
519
+ _ => return Err ( Error :: PkTypeMismatch ) ,
520
+ }
521
+
522
+ let mut dq = Mpi :: new ( 0 ) ?;
523
+
524
+ unsafe {
525
+ rsa_export_crt (
526
+ self . inner . pk_ctx as * const rsa_context ,
527
+ ptr:: null_mut ( ) ,
528
+ dq. handle_mut ( ) ,
529
+ ptr:: null_mut ( ) ,
530
+ )
531
+ . into_result ( ) ?;
532
+ }
533
+
534
+ Ok ( dq)
535
+ }
536
+
537
+ pub fn rsa_crt_qp ( & self ) -> Result < Mpi > {
538
+ match self . pk_type ( ) {
539
+ Type :: Rsa => { }
540
+ _ => return Err ( Error :: PkTypeMismatch ) ,
541
+ }
542
+
543
+ let mut qp = Mpi :: new ( 0 ) ?;
544
+
545
+ unsafe {
546
+ rsa_export_crt (
547
+ self . inner . pk_ctx as * const rsa_context ,
548
+ ptr:: null_mut ( ) ,
549
+ ptr:: null_mut ( ) ,
550
+ qp. handle_mut ( ) ,
551
+ )
552
+ . into_result ( ) ?;
553
+ }
554
+
555
+ Ok ( qp)
556
+ }
557
+
472
558
pub fn rsa_public_exponent ( & self ) -> Result < u32 > {
473
559
match self . pk_type ( ) {
474
560
Type :: Rsa => { }
@@ -1277,6 +1363,29 @@ iy6KC991zzvaWY/Ys+q/84Afqa+0qJKQnPuy/7F5GkVdQA/lfbhi
1277
1363
) ;
1278
1364
}
1279
1365
1366
+ #[ test]
1367
+ fn rsa_params ( ) {
1368
+ let pk = Pk :: from_private_key ( TEST_DER , None ) . unwrap ( ) ;
1369
+
1370
+ let n = pk. rsa_public_modulus ( ) . unwrap ( ) ;
1371
+ let d = pk. rsa_private_exponent ( ) . unwrap ( ) ;
1372
+ let p = pk. rsa_private_prime1 ( ) . unwrap ( ) ;
1373
+ let q = pk. rsa_private_prime2 ( ) . unwrap ( ) ;
1374
+
1375
+ let dp = pk. rsa_crt_dp ( ) . unwrap ( ) ;
1376
+ let dq = pk. rsa_crt_dq ( ) . unwrap ( ) ;
1377
+ let qp = pk. rsa_crt_qp ( ) . unwrap ( ) ;
1378
+
1379
+ let one = Mpi :: new ( 1 ) . unwrap ( ) ;
1380
+
1381
+ let p1 = ( & p - & one) . unwrap ( ) ;
1382
+ let q1 = ( & q - & one) . unwrap ( ) ;
1383
+ assert_eq ! ( & p * & q, Ok ( n) ) ;
1384
+ assert_eq ! ( & d % & p1, Ok ( dp) ) ;
1385
+ assert_eq ! ( & d % & q1, Ok ( dq) ) ;
1386
+ assert_eq ! ( ( & qp * & q) . unwrap( ) . modulo( & p) , Ok ( one) ) ;
1387
+ }
1388
+
1280
1389
#[ test]
1281
1390
fn custom_pk_obj ( ) {
1282
1391
let pk = Pk :: public_custom_algo ( & [ 8 , 0 , 2 ] , & [ 1 , 2 , 3 , 4 ] ) . unwrap ( ) ;
0 commit comments