@@ -206,7 +206,7 @@ impl RSAPrivateKey {
206
206
. clone ( )
207
207
. mod_inverse ( & self . primes [ 0 ] )
208
208
. map ( |v| BigInt :: from_biguint ( Plus , v) )
209
- . unwrap ( ) ;
209
+ . expect ( "invalid prime" ) ;
210
210
211
211
let mut r: BigUint = & self . primes [ 0 ] * & self . primes [ 1 ] ;
212
212
let crt_values: Vec < CRTValue > = self
@@ -217,7 +217,10 @@ impl RSAPrivateKey {
217
217
let res = CRTValue {
218
218
exp : BigInt :: from_biguint ( Plus , & self . d % ( prime - BigUint :: one ( ) ) ) ,
219
219
r : BigInt :: from_biguint ( Plus , r. clone ( ) ) ,
220
- coeff : BigInt :: from_biguint ( Plus , r. clone ( ) . mod_inverse ( prime) . unwrap ( ) ) ,
220
+ coeff : BigInt :: from_biguint (
221
+ Plus ,
222
+ r. clone ( ) . mod_inverse ( prime) . expect ( "invalid coeff" ) ,
223
+ ) ,
221
224
} ;
222
225
r *= prime;
223
226
@@ -360,18 +363,16 @@ pub fn decrypt<R: Rng>(
360
363
priv_key : & RSAPrivateKey ,
361
364
c : & BigUint ,
362
365
) -> Result < BigUint > {
363
- if c > priv_key. n ( ) {
366
+ if c >= priv_key. n ( ) {
364
367
return Err ( Error :: Decryption ) ;
365
368
}
366
369
367
370
if priv_key. n ( ) . is_zero ( ) {
368
371
return Err ( Error :: Decryption ) ;
369
372
}
370
373
371
- let mut c = c. clone ( ) ;
372
374
let mut ir = None ;
373
-
374
- if let Some ( ref mut rng) = rng {
375
+ let c = if let Some ( ref mut rng) = rng {
375
376
// Blinding enabled. Blinding involves multiplying c by r^e.
376
377
// Then the decryption operation performs (m^e * r^e)^d mod n
377
378
// which equals mr mod n. The factor of r can then be removed
@@ -391,24 +392,32 @@ pub fn decrypt<R: Rng>(
391
392
392
393
let e = priv_key. e ( ) ;
393
394
let rpowe = r. modpow ( & e, priv_key. n ( ) ) ; // N != 0
394
- c = ( c * & rpowe) % priv_key. n ( ) ;
395
- }
395
+ ( c * & rpowe) % priv_key. n ( )
396
+ } else {
397
+ c. clone ( )
398
+ } ;
396
399
397
400
let m = match priv_key. precomputed {
398
401
None => c. modpow ( priv_key. d ( ) , priv_key. n ( ) ) ,
399
402
Some ( ref precomputed) => {
400
403
// We have the precalculated values needed for the CRT.
401
- let mut m = BigInt :: from_biguint ( Plus , c. modpow ( & precomputed. dp , & priv_key. primes [ 0 ] ) ) ;
402
- let mut m2 = BigInt :: from_biguint ( Plus , c. modpow ( & precomputed. dq , & priv_key. primes [ 1 ] ) ) ;
404
+
405
+ let p = & priv_key. primes [ 0 ] ;
406
+ let q = & priv_key. primes [ 1 ] ;
407
+
408
+ let mut m = BigInt :: from_biguint ( Plus , c. modpow ( & precomputed. dp , p) ) ;
409
+ let mut m2 = BigInt :: from_biguint ( Plus , c. modpow ( & precomputed. dq , q) ) ;
403
410
404
411
m -= & m2;
412
+
405
413
// clones make me sad :(
406
414
let primes: Vec < _ > = priv_key
407
415
. primes
408
416
. iter ( )
409
417
. map ( |v| BigInt :: from_biguint ( Plus , v. clone ( ) ) )
410
418
. collect ( ) ;
411
- if m. is_negative ( ) {
419
+
420
+ while m. is_negative ( ) {
412
421
m += & primes[ 0 ] ;
413
422
}
414
423
m *= & precomputed. qinv ;
@@ -423,14 +432,14 @@ pub fn decrypt<R: Rng>(
423
432
m2 -= & m;
424
433
m2 *= & value. coeff ;
425
434
m2 %= prime;
426
- if m2. is_negative ( ) {
435
+ while m2. is_negative ( ) {
427
436
m2 += prime;
428
437
}
429
438
m2 *= & value. r ;
430
439
m += & m2;
431
440
}
432
441
433
- m. to_biguint ( ) . unwrap ( )
442
+ m. to_biguint ( ) . expect ( "failed to decrypt" )
434
443
}
435
444
} ;
436
445
@@ -496,21 +505,23 @@ mod tests {
496
505
assert_eq ! ( public_key. e( ) . to_u64( ) , Some ( 200 ) ) ;
497
506
}
498
507
499
- fn test_key_basics ( private_key : RSAPrivateKey ) {
500
- private_key. validate ( ) . expect ( "failed to validate " ) ;
508
+ fn test_key_basics ( private_key : & RSAPrivateKey ) {
509
+ private_key. validate ( ) . expect ( "invalid private key " ) ;
501
510
502
511
assert ! (
503
512
private_key. d( ) < private_key. n( ) ,
504
513
"private exponent too large"
505
514
) ;
506
515
507
516
let pub_key: RSAPublicKey = private_key. clone ( ) . into ( ) ;
508
- let m = BigUint :: from_u64 ( 42 ) . unwrap ( ) ;
517
+ let m = BigUint :: from_u64 ( 42 ) . expect ( "invalid 42" ) ;
509
518
let c = encrypt ( & pub_key, & m) ;
510
- let m2 = decrypt :: < ThreadRng > ( None , & private_key, & c) . unwrap ( ) ;
519
+ let m2 = decrypt :: < ThreadRng > ( None , & private_key, & c)
520
+ . expect ( "unable to decrypt without blinding" ) ;
511
521
assert_eq ! ( m, m2) ;
512
522
let mut rng = thread_rng ( ) ;
513
- let m3 = decrypt ( Some ( & mut rng) , & private_key, & c) . unwrap ( ) ;
523
+ let m3 =
524
+ decrypt ( Some ( & mut rng) , & private_key, & c) . expect ( "unable to decrypt with blinding" ) ;
514
525
assert_eq ! ( m, m3) ;
515
526
}
516
527
@@ -519,14 +530,17 @@ mod tests {
519
530
#[ test]
520
531
fn $name( ) {
521
532
let mut rng = thread_rng( ) ;
522
- let private_key = if $multi == 2 {
523
- RSAPrivateKey :: new( & mut rng, $size) . unwrap( )
524
- } else {
525
- generate_multi_prime_key( & mut rng, $multi, $size) . unwrap( )
526
- } ;
527
- assert_eq!( private_key. n( ) . bits( ) , $size) ;
528
533
529
- test_key_basics( private_key) ;
534
+ for _ in 0 ..10 {
535
+ let private_key = if $multi == 2 {
536
+ RSAPrivateKey :: new( & mut rng, $size) . expect( "failed to generate key" )
537
+ } else {
538
+ generate_multi_prime_key( & mut rng, $multi, $size) . unwrap( )
539
+ } ;
540
+ assert_eq!( private_key. n( ) . bits( ) , $size) ;
541
+
542
+ test_key_basics( & private_key) ;
543
+ }
530
544
}
531
545
} ;
532
546
}
@@ -553,4 +567,25 @@ mod tests {
553
567
let _ = generate_multi_prime_key ( & mut rng, 5 , i) ;
554
568
}
555
569
}
570
+
571
+ #[ test]
572
+ fn test_negative_decryption_value ( ) {
573
+ let private_key = RSAPrivateKey :: from_components (
574
+ BigUint :: from_bytes_le ( & vec ! [
575
+ 99 , 192 , 208 , 179 , 0 , 220 , 7 , 29 , 49 , 151 , 75 , 107 , 75 , 73 , 200 , 180 ,
576
+ ] ) ,
577
+ BigUint :: from_bytes_le ( & vec ! [ 1 , 0 , 1 ] ) ,
578
+ BigUint :: from_bytes_le ( & vec ! [
579
+ 81 , 163 , 254 , 144 , 171 , 159 , 144 , 42 , 244 , 133 , 51 , 249 , 28 , 12 , 63 , 65 ,
580
+ ] ) ,
581
+ vec ! [
582
+ BigUint :: from_bytes_le( & vec![ 105 , 101 , 60 , 173 , 19 , 153 , 3 , 192 ] ) ,
583
+ BigUint :: from_bytes_le( & vec![ 235 , 65 , 160 , 134 , 32 , 136 , 6 , 241 ] ) ,
584
+ ] ,
585
+ ) ;
586
+
587
+ for _ in 0 ..1000 {
588
+ test_key_basics ( & private_key) ;
589
+ }
590
+ }
556
591
}
0 commit comments