@@ -106,6 +106,7 @@ impl KeyPair {
106106 pkcs8 : & [ u8 ] ,
107107 alg : & ' static SignatureAlgorithm ,
108108 ) -> Result < Self , Error > {
109+ let rng = & SystemRandom :: new ( ) ;
109110 let pkcs8_vec = pkcs8. to_vec ( ) ;
110111
111112 let kind = if alg == & PKCS_ED25519 {
@@ -114,11 +115,13 @@ impl KeyPair {
114115 KeyPairKind :: Ec ( EcdsaKeyPair :: from_pkcs8 (
115116 & signature:: ECDSA_P256_SHA256_ASN1_SIGNING ,
116117 pkcs8,
118+ rng,
117119 ) ?)
118120 } else if alg == & PKCS_ECDSA_P384_SHA384 {
119121 KeyPairKind :: Ec ( EcdsaKeyPair :: from_pkcs8 (
120122 & signature:: ECDSA_P384_SHA384_ASN1_SIGNING ,
121123 pkcs8,
124+ rng,
122125 ) ?)
123126 } else if alg == & PKCS_RSA_SHA256 {
124127 let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8) ?;
@@ -146,14 +149,15 @@ impl KeyPair {
146149 pub ( crate ) fn from_raw (
147150 pkcs8 : & [ u8 ] ,
148151 ) -> Result < ( KeyPairKind , & ' static SignatureAlgorithm ) , Error > {
152+ let rng = SystemRandom :: new ( ) ;
149153 let ( kind, alg) = if let Ok ( edkp) = Ed25519KeyPair :: from_pkcs8_maybe_unchecked ( pkcs8) {
150154 ( KeyPairKind :: Ed ( edkp) , & PKCS_ED25519 )
151155 } else if let Ok ( eckp) =
152- EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P256_SHA256_ASN1_SIGNING , pkcs8)
156+ EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P256_SHA256_ASN1_SIGNING , pkcs8, & rng )
153157 {
154158 ( KeyPairKind :: Ec ( eckp) , & PKCS_ECDSA_P256_SHA256 )
155159 } else if let Ok ( eckp) =
156- EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P384_SHA384_ASN1_SIGNING , pkcs8)
160+ EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P384_SHA384_ASN1_SIGNING , pkcs8, & rng )
157161 {
158162 ( KeyPairKind :: Ec ( eckp) , & PKCS_ECDSA_P384_SHA384 )
159163 } else if let Ok ( rsakp) = RsaKeyPair :: from_pkcs8 ( pkcs8) {
@@ -212,22 +216,23 @@ impl TryFrom<Vec<u8>> for KeyPair {
212216impl KeyPair {
213217 /// Generate a new random key pair for the specified signature algorithm
214218 pub fn generate ( alg : & ' static SignatureAlgorithm ) -> Result < Self , Error > {
215- let system_random = SystemRandom :: new ( ) ;
219+ let rng = & SystemRandom :: new ( ) ;
220+
216221 match alg. sign_alg {
217222 SignAlgo :: EcDsa ( sign_alg) => {
218- let key_pair_doc = EcdsaKeyPair :: generate_pkcs8 ( sign_alg, & system_random ) ?;
223+ let key_pair_doc = EcdsaKeyPair :: generate_pkcs8 ( sign_alg, rng ) ?;
219224 let key_pair_serialized = key_pair_doc. as_ref ( ) . to_vec ( ) ;
220225
221226 let key_pair =
222- EcdsaKeyPair :: from_pkcs8 ( & sign_alg, & & key_pair_doc. as_ref ( ) ) . unwrap ( ) ;
227+ EcdsaKeyPair :: from_pkcs8 ( & sign_alg, & & key_pair_doc. as_ref ( ) , rng ) . unwrap ( ) ;
223228 Ok ( KeyPair {
224229 kind : KeyPairKind :: Ec ( key_pair) ,
225230 alg,
226231 serialized_der : key_pair_serialized,
227232 } )
228233 } ,
229234 SignAlgo :: EdDsa ( _sign_alg) => {
230- let key_pair_doc = Ed25519KeyPair :: generate_pkcs8 ( & system_random ) ?;
235+ let key_pair_doc = Ed25519KeyPair :: generate_pkcs8 ( rng ) ?;
231236 let key_pair_serialized = key_pair_doc. as_ref ( ) . to_vec ( ) ;
232237
233238 let key_pair = Ed25519KeyPair :: from_pkcs8 ( & & key_pair_doc. as_ref ( ) ) . unwrap ( ) ;
@@ -275,7 +280,7 @@ impl KeyPair {
275280 } ,
276281 KeyPairKind :: Rsa ( kp, padding_alg) => {
277282 let system_random = SystemRandom :: new ( ) ;
278- let mut signature = vec ! [ 0 ; kp. public_modulus_len ( ) ] ;
283+ let mut signature = vec ! [ 0 ; kp. public ( ) . modulus_len ( ) ] ;
279284 kp. sign ( * padding_alg, & system_random, msg, & mut signature) ?;
280285 let sig = & signature. as_ref ( ) ;
281286 writer. write_bitvec_bytes ( & sig, & sig. len ( ) * 8 ) ;
0 commit comments