Skip to content

Commit 02dee35

Browse files
Expose randomness source for KeyPair::generate
1 parent 9b1ad40 commit 02dee35

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

src/lib.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,14 +1335,17 @@ fn write_general_subtrees(writer :DERWriter, tag :u64, general_subtrees :&[Gener
13351335

13361336
impl Certificate {
13371337
/// Generates a new certificate from the given parameters
1338+
///
1339+
/// This function will generate a random (using `ring`'s [`SystemRandom`]) [`KeyPair`] if none is provided in the [`CertificateParams`].
1340+
/// If you need to control the [`KeyPair`], set it ahead of time before calling this function.
13381341
pub fn from_params(mut params :CertificateParams) -> Result<Self, RcgenError> {
13391342
let key_pair = if let Some(key_pair) = params.key_pair.take() {
13401343
if !key_pair.is_compatible(&params.alg) {
13411344
return Err(RcgenError::CertificateKeyPairMismatch);
13421345
}
13431346
key_pair
13441347
} else {
1345-
KeyPair::generate(&params.alg)?
1348+
KeyPair::generate(&params.alg, &SystemRandom::new())?
13461349
};
13471350

13481351
Ok(Certificate {
@@ -1715,22 +1718,21 @@ impl From<pem::PemError> for RcgenError {
17151718

17161719
impl KeyPair {
17171720
/// Generate a new random key pair for the specified signature algorithm
1718-
pub fn generate(alg :&'static SignatureAlgorithm) -> Result<Self, RcgenError> {
1719-
let system_random = SystemRandom::new();
1721+
pub fn generate(alg :&'static SignatureAlgorithm, rng: &dyn SecureRandom) -> Result<Self, RcgenError> {
17201722
match alg.sign_alg {
17211723
SignAlgo::EcDsa(sign_alg) => {
1722-
let key_pair_doc = EcdsaKeyPair::generate_pkcs8(sign_alg, &system_random)?;
1724+
let key_pair_doc = EcdsaKeyPair::generate_pkcs8(sign_alg, rng)?;
17231725
let key_pair_serialized = key_pair_doc.as_ref().to_vec();
17241726

1725-
let key_pair = EcdsaKeyPair::from_pkcs8(&sign_alg, &&key_pair_doc.as_ref(), &system_random).unwrap();
1727+
let key_pair = EcdsaKeyPair::from_pkcs8(&sign_alg, &&key_pair_doc.as_ref(), rng).unwrap();
17261728
Ok(KeyPair {
17271729
kind : KeyPairKind::Ec(key_pair),
17281730
alg,
17291731
serialized_der : key_pair_serialized,
17301732
})
17311733
},
17321734
SignAlgo::EdDsa(_sign_alg) => {
1733-
let key_pair_doc = Ed25519KeyPair::generate_pkcs8(&system_random)?;
1735+
let key_pair_doc = Ed25519KeyPair::generate_pkcs8(rng)?;
17341736
let key_pair_serialized = key_pair_doc.as_ref().to_vec();
17351737

17361738
let key_pair = Ed25519KeyPair::from_pkcs8(&&key_pair_doc.as_ref()).unwrap();

tests/generic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn test_key_params_mismatch() {
3131

3232
let mut wrong_params = util::default_params();
3333
if i != 0 {
34-
wrong_params.key_pair = Some(KeyPair::generate(kalg_1).unwrap());
34+
wrong_params.key_pair = Some(KeyPair::generate(kalg_1, &ring::rand::SystemRandom::new()).unwrap());
3535
} else {
3636
let kp = KeyPair::from_pem(util::RSA_TEST_KEY_PAIR_PEM, &ring::rand::SystemRandom::new()).unwrap();
3737
wrong_params.key_pair = Some(kp);

tests/webpki.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ fn from_remote() {
271271
}
272272
}
273273

274-
let key_pair = KeyPair::generate(&rcgen::PKCS_ECDSA_P256_SHA256).unwrap();
274+
let key_pair = KeyPair::generate(&rcgen::PKCS_ECDSA_P256_SHA256, &SystemRandom::new()).unwrap();
275275
let remote = EcdsaKeyPair::from_pkcs8(&signature::ECDSA_P256_SHA256_ASN1_SIGNING, &key_pair.serialize_der(), &SystemRandom::new()).unwrap();
276276
let key_pair = EcdsaKeyPair::from_pkcs8(&signature::ECDSA_P256_SHA256_ASN1_SIGNING, &key_pair.serialize_der(), &SystemRandom::new()).unwrap();
277277
let remote = KeyPair::from_remote(Box::new(Remote(remote))).unwrap();

0 commit comments

Comments
 (0)