11#[ cfg( feature = "pem" ) ]
22use pem:: Pem ;
3- use ring:: rand:: SystemRandom ;
3+ use ring:: rand:: { SecureRandom , SystemRandom } ;
44use ring:: signature:: KeyPair as RingKeyPair ;
55use ring:: signature:: { self , EcdsaKeyPair , Ed25519KeyPair , RsaEncoding , RsaKeyPair } ;
66use std:: fmt;
@@ -55,7 +55,7 @@ impl KeyPair {
5555 ///
5656 /// Equivalent to using the [`TryFrom`] implementation.
5757 pub fn from_der ( der : & [ u8 ] ) -> Result < Self , RcgenError > {
58- Ok ( KeyPair :: from_raw ( der) ?)
58+ Ok ( KeyPair :: from_raw ( der, & SystemRandom :: new ( ) ) ?)
5959 }
6060 /// Returns the key pair's signature algorithm
6161 pub fn algorithm ( & self ) -> & ' static SignatureAlgorithm {
@@ -66,7 +66,7 @@ impl KeyPair {
6666 pub fn from_pem ( pem_str : & str ) -> Result < Self , RcgenError > {
6767 let private_key = pem:: parse ( pem_str) ?;
6868 let private_key_der: & [ _ ] = private_key. contents ( ) ;
69- Ok ( KeyPair :: from_raw ( private_key_der) ?)
69+ Ok ( KeyPair :: from_raw ( private_key_der, & SystemRandom :: new ( ) ) ?)
7070 }
7171
7272 /// Obtains the key pair from a raw public key and a remote private key
@@ -105,6 +105,7 @@ impl KeyPair {
105105 pkcs8 : & [ u8 ] ,
106106 alg : & ' static SignatureAlgorithm ,
107107 ) -> Result < Self , RcgenError > {
108+ let rng = & SystemRandom :: new ( ) ;
108109 let pkcs8_vec = pkcs8. to_vec ( ) ;
109110
110111 let kind = if alg == & PKCS_ED25519 {
@@ -113,11 +114,13 @@ impl KeyPair {
113114 KeyPairKind :: Ec ( EcdsaKeyPair :: from_pkcs8 (
114115 & signature:: ECDSA_P256_SHA256_ASN1_SIGNING ,
115116 pkcs8,
117+ rng,
116118 ) ?)
117119 } else if alg == & PKCS_ECDSA_P384_SHA384 {
118120 KeyPairKind :: Ec ( EcdsaKeyPair :: from_pkcs8 (
119121 & signature:: ECDSA_P384_SHA384_ASN1_SIGNING ,
120122 pkcs8,
123+ rng,
121124 ) ?)
122125 } else if alg == & PKCS_RSA_SHA256 {
123126 let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8) ?;
@@ -142,15 +145,15 @@ impl KeyPair {
142145 } )
143146 }
144147
145- pub ( crate ) fn from_raw ( pkcs8 : & [ u8 ] ) -> Result < KeyPair , RcgenError > {
148+ pub ( crate ) fn from_raw ( pkcs8 : & [ u8 ] , rng : & dyn SecureRandom ) -> Result < KeyPair , RcgenError > {
146149 let ( kind, alg) = if let Ok ( edkp) = Ed25519KeyPair :: from_pkcs8_maybe_unchecked ( pkcs8) {
147150 ( KeyPairKind :: Ed ( edkp) , & PKCS_ED25519 )
148151 } else if let Ok ( eckp) =
149- EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P256_SHA256_ASN1_SIGNING , pkcs8)
152+ EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P256_SHA256_ASN1_SIGNING , pkcs8, rng )
150153 {
151154 ( KeyPairKind :: Ec ( eckp) , & PKCS_ECDSA_P256_SHA256 )
152155 } else if let Ok ( eckp) =
153- EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P384_SHA384_ASN1_SIGNING , pkcs8)
156+ EcdsaKeyPair :: from_pkcs8 ( & signature:: ECDSA_P384_SHA384_ASN1_SIGNING , pkcs8, rng )
154157 {
155158 ( KeyPairKind :: Ec ( eckp) , & PKCS_ECDSA_P384_SHA384 )
156159 } else if let Ok ( rsakp) = RsaKeyPair :: from_pkcs8 ( pkcs8) {
@@ -187,23 +190,25 @@ pub trait RemoteKeyPair {
187190
188191impl KeyPair {
189192 /// Generate a new random key pair for the specified signature algorithm
190- pub fn generate ( alg : & ' static SignatureAlgorithm ) -> Result < Self , RcgenError > {
191- let system_random = SystemRandom :: new ( ) ;
193+ pub fn generate (
194+ alg : & ' static SignatureAlgorithm ,
195+ rng : & dyn SecureRandom ,
196+ ) -> Result < Self , RcgenError > {
192197 match alg. sign_alg {
193198 SignAlgo :: EcDsa ( sign_alg) => {
194- let key_pair_doc = EcdsaKeyPair :: generate_pkcs8 ( sign_alg, & system_random ) ?;
199+ let key_pair_doc = EcdsaKeyPair :: generate_pkcs8 ( sign_alg, rng ) ?;
195200 let key_pair_serialized = key_pair_doc. as_ref ( ) . to_vec ( ) ;
196201
197202 let key_pair =
198- EcdsaKeyPair :: from_pkcs8 ( & sign_alg, & & key_pair_doc. as_ref ( ) ) . unwrap ( ) ;
203+ EcdsaKeyPair :: from_pkcs8 ( & sign_alg, & & key_pair_doc. as_ref ( ) , rng ) . unwrap ( ) ;
199204 Ok ( KeyPair {
200205 kind : KeyPairKind :: Ec ( key_pair) ,
201206 alg,
202207 serialized_der : key_pair_serialized,
203208 } )
204209 } ,
205210 SignAlgo :: EdDsa ( _sign_alg) => {
206- let key_pair_doc = Ed25519KeyPair :: generate_pkcs8 ( & system_random ) ?;
211+ let key_pair_doc = Ed25519KeyPair :: generate_pkcs8 ( rng ) ?;
207212 let key_pair_serialized = key_pair_doc. as_ref ( ) . to_vec ( ) ;
208213
209214 let key_pair = Ed25519KeyPair :: from_pkcs8 ( & & key_pair_doc. as_ref ( ) ) . unwrap ( ) ;
@@ -251,7 +256,7 @@ impl KeyPair {
251256 } ,
252257 KeyPairKind :: Rsa ( kp, padding_alg) => {
253258 let system_random = SystemRandom :: new ( ) ;
254- let mut signature = vec ! [ 0 ; kp. public_modulus_len ( ) ] ;
259+ let mut signature = vec ! [ 0 ; kp. public ( ) . modulus_len ( ) ] ;
255260 kp. sign ( * padding_alg, & system_random, msg, & mut signature) ?;
256261 let sig = & signature. as_ref ( ) ;
257262 writer. write_bitvec_bytes ( & sig, & sig. len ( ) * 8 ) ;
0 commit comments