@@ -106,6 +106,7 @@ impl KeyPair {
106
106
pkcs8 : & [ u8 ] ,
107
107
alg : & ' static SignatureAlgorithm ,
108
108
) -> Result < Self , Error > {
109
+ let rng = & SystemRandom :: new ( ) ;
109
110
let pkcs8_vec = pkcs8. to_vec ( ) ;
110
111
111
112
let kind = if alg == & PKCS_ED25519 {
@@ -114,11 +115,13 @@ impl KeyPair {
114
115
KeyPairKind :: Ec ( EcdsaKeyPair :: from_pkcs8 (
115
116
& signature:: ECDSA_P256_SHA256_ASN1_SIGNING ,
116
117
pkcs8,
118
+ rng,
117
119
) ?)
118
120
} else if alg == & PKCS_ECDSA_P384_SHA384 {
119
121
KeyPairKind :: Ec ( EcdsaKeyPair :: from_pkcs8 (
120
122
& signature:: ECDSA_P384_SHA384_ASN1_SIGNING ,
121
123
pkcs8,
124
+ rng,
122
125
) ?)
123
126
} else if alg == & PKCS_RSA_SHA256 {
124
127
let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8) ?;
@@ -146,14 +149,15 @@ impl KeyPair {
146
149
pub ( crate ) fn from_raw (
147
150
pkcs8 : & [ u8 ] ,
148
151
) -> Result < ( KeyPairKind , & ' static SignatureAlgorithm ) , Error > {
152
+ let rng = SystemRandom :: new ( ) ;
149
153
let ( kind, alg) = if let Ok ( edkp) = Ed25519KeyPair :: from_pkcs8_maybe_unchecked ( pkcs8) {
150
154
( KeyPairKind :: Ed ( edkp) , & PKCS_ED25519 )
151
155
} 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 )
153
157
{
154
158
( KeyPairKind :: Ec ( eckp) , & PKCS_ECDSA_P256_SHA256 )
155
159
} 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 )
157
161
{
158
162
( KeyPairKind :: Ec ( eckp) , & PKCS_ECDSA_P384_SHA384 )
159
163
} else if let Ok ( rsakp) = RsaKeyPair :: from_pkcs8 ( pkcs8) {
@@ -212,22 +216,23 @@ impl TryFrom<Vec<u8>> for KeyPair {
212
216
impl KeyPair {
213
217
/// Generate a new random key pair for the specified signature algorithm
214
218
pub fn generate ( alg : & ' static SignatureAlgorithm ) -> Result < Self , Error > {
215
- let system_random = SystemRandom :: new ( ) ;
219
+ let rng = & SystemRandom :: new ( ) ;
220
+
216
221
match alg. sign_alg {
217
222
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 ) ?;
219
224
let key_pair_serialized = key_pair_doc. as_ref ( ) . to_vec ( ) ;
220
225
221
226
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 ( ) ;
223
228
Ok ( KeyPair {
224
229
kind : KeyPairKind :: Ec ( key_pair) ,
225
230
alg,
226
231
serialized_der : key_pair_serialized,
227
232
} )
228
233
} ,
229
234
SignAlgo :: EdDsa ( _sign_alg) => {
230
- let key_pair_doc = Ed25519KeyPair :: generate_pkcs8 ( & system_random ) ?;
235
+ let key_pair_doc = Ed25519KeyPair :: generate_pkcs8 ( rng ) ?;
231
236
let key_pair_serialized = key_pair_doc. as_ref ( ) . to_vec ( ) ;
232
237
233
238
let key_pair = Ed25519KeyPair :: from_pkcs8 ( & & key_pair_doc. as_ref ( ) ) . unwrap ( ) ;
@@ -275,7 +280,7 @@ impl KeyPair {
275
280
} ,
276
281
KeyPairKind :: Rsa ( kp, padding_alg) => {
277
282
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 ( ) ] ;
279
284
kp. sign ( * padding_alg, & system_random, msg, & mut signature) ?;
280
285
let sig = & signature. as_ref ( ) ;
281
286
writer. write_bitvec_bytes ( & sig, & sig. len ( ) * 8 ) ;
0 commit comments