@@ -330,6 +330,7 @@ fn blind_new<R: CryptoRngCore, K: PublicKeyParts>(
330330 rng : & mut R ,
331331 key : & K ,
332332 c : & BoxedUint ,
333+ n_params : & BoxedResidueParams ,
333334) -> ( BoxedUint , BoxedUint ) {
334335 let n = NonZero :: new ( to_uint ( key. n ( ) . clone ( ) ) ) . unwrap ( ) ;
335336 let mut r: BoxedUint ;
@@ -349,10 +350,9 @@ fn blind_new<R: CryptoRngCore, K: PublicKeyParts>(
349350 }
350351 }
351352
352- let n_params = BoxedResidueParams :: new ( n. get ( ) ) . unwrap ( ) ;
353353 let e = to_uint ( key. e ( ) . clone ( ) ) ;
354354 let c = {
355- let r = reduce ( & r, n_params) ;
355+ let r = reduce ( & r, n_params. clone ( ) ) ;
356356 let rpowe = r. pow ( & e) . retrieve ( ) ;
357357
358358 let c = c. wrapping_mul ( & rpowe) ;
@@ -393,16 +393,20 @@ pub fn rsa_decrypt_new<R: CryptoRngCore + ?Sized>(
393393
394394 let mut ir = None ;
395395
396+ let n_params = priv_key
397+ . residue_params ( )
398+ . cloned ( )
399+ . unwrap_or_else ( || BoxedResidueParams :: new ( n. clone ( ) . get ( ) ) . unwrap ( ) ) ;
400+
396401 let c = if let Some ( ref mut rng) = rng {
397- let ( blinded, unblinder) = blind_new ( rng, priv_key, & c) ;
402+ let ( blinded, unblinder) = blind_new ( rng, priv_key, & c, & n_params ) ;
398403 ir = Some ( unblinder) ;
399404 blinded
400405 } else {
401406 c
402407 } ;
403408
404409 // TODO: fast path with precalculated values;
405- let n_params = BoxedResidueParams :: new ( n. clone ( ) . get ( ) ) . unwrap ( ) ;
406410 let c = reduce ( & c, n_params) ;
407411 let m = c. pow ( & d) . retrieve ( ) ;
408412
0 commit comments