Skip to content

Commit c6b8af1

Browse files
authored
use try_from_rng for signing and secret keys (#1130)
1 parent f0ae3ae commit c6b8af1

File tree

17 files changed

+50
-31
lines changed

17 files changed

+50
-31
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bign256/src/ecdsa.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
//! };
1515
//!
1616
//! // Signing
17-
//! let secret_key = SecretKey::random(&mut OsRng.unwrap_mut()); // serialize with `::to_bytes()`
17+
//! let secret_key = SecretKey::try_from_rng(&mut OsRng).unwrap(); // serialize with `::to_bytes()`
1818
//! let signing_key = SigningKey::new(&secret_key)?;
1919
//! let verifying_key_bytes = signing_key.verifying_key().to_bytes();
2020
//! let message = b"test message";

bign256/src/secret_key.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ use pkcs8::{
1313
use crate::FieldBytes;
1414
use crate::{ALGORITHM_OID, PublicKey, ScalarPrimitive, SecretKey};
1515
#[cfg(feature = "arithmetic")]
16-
use crate::{BignP256, NonZeroScalar, Result, elliptic_curve::rand_core::CryptoRng};
16+
use crate::{
17+
BignP256, NonZeroScalar, Result,
18+
elliptic_curve::rand_core::{CryptoRng, TryCryptoRng},
19+
};
1720

1821
impl SecretKey {
1922
const MIN_SIZE: usize = 24;
@@ -26,6 +29,16 @@ impl SecretKey {
2629
}
2730
}
2831

32+
/// Generate a random [`SecretKey`].
33+
#[cfg(feature = "arithmetic")]
34+
pub fn try_from_rng<R: TryCryptoRng + ?Sized>(
35+
rng: &mut R,
36+
) -> core::result::Result<Self, R::Error> {
37+
Ok(Self {
38+
inner: NonZeroScalar::try_from_rng(rng)?.into(),
39+
})
40+
}
41+
2942
/// Borrow the inner secret [`elliptic_curve::ScalarPrimitive`] value.
3043
///
3144
/// # ⚠️ Warning

k256/src/ecdh.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
1414
//!
1515
//! // Alice
16-
//! let alice_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
16+
//! let alice_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
1717
//! let alice_pk_bytes = EncodedPoint::from(alice_secret.public_key());
1818
//!
1919
//! // Bob
20-
//! let bob_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
20+
//! let bob_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
2121
//! let bob_pk_bytes = EncodedPoint::from(bob_secret.public_key());
2222
//!
2323
//! // Alice decodes Bob's serialized public key and computes a shared secret from it

k256/src/ecdsa.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@
2828
//! ecdsa::{SigningKey, Signature, signature::Signer},
2929
//! SecretKey,
3030
//! };
31-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
31+
//! use rand_core::OsRng; // requires 'os_rng' feature
3232
//!
3333
//! // Signing
34-
//! let signing_key = SigningKey::random(&mut OsRng.unwrap_mut()); // Serialize with `::to_bytes()`
34+
//! let signing_key = SigningKey::try_from_rng(&mut OsRng).unwrap(); // Serialize with `::to_bytes()`
3535
//! let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
3636
//!
3737
//! // Note: The signature type must be annotated or otherwise inferable as

k256/src/schnorr.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@
3535
//! signature::{Signer, Verifier},
3636
//! SigningKey, VerifyingKey
3737
//! };
38-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
38+
//! use rand_core::OsRng; // requires 'os_rng' feature
3939
//!
4040
//! //
4141
//! // Signing
4242
//! //
43-
//! let signing_key = SigningKey::random(&mut OsRng.unwrap_mut()); // serialize with `.to_bytes()`
43+
//! let signing_key = SigningKey::try_from_rng(&mut OsRng).unwrap(); // serialize with `.to_bytes()`
4444
//! let verifying_key_bytes = signing_key.verifying_key().to_bytes(); // 32-bytes
4545
//!
4646
//! let message = b"Schnorr signatures prove knowledge of a secret in the random oracle model";

k256/src/schnorr/signing.rs

+7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ impl SigningKey {
4040
NonZeroScalar::random(rng).into()
4141
}
4242

43+
/// Generate a cryptographically random [`SigningKey`].
44+
pub fn try_from_rng<R: TryCryptoRng + ?Sized>(
45+
rng: &mut R,
46+
) -> core::result::Result<Self, R::Error> {
47+
Ok(NonZeroScalar::try_from_rng(rng)?.into())
48+
}
49+
4350
/// Parse signing key from big endian-encoded bytes.
4451
pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
4552
NonZeroScalar::try_from(bytes)

p224/src/ecdh.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
//!
1111
//! ```
1212
//! use p224::{EncodedPoint, PublicKey, ecdh::EphemeralSecret};
13-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
13+
//! use rand_core::OsRng; // requires 'os_rng' feature
1414
//!
1515
//! // Alice
16-
//! let alice_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
16+
//! let alice_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
1717
//! let alice_pk_bytes = EncodedPoint::from(alice_secret.public_key());
1818
//!
1919
//! // Bob
20-
//! let bob_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
20+
//! let bob_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
2121
//! let bob_pk_bytes = EncodedPoint::from(bob_secret.public_key());
2222
//!
2323
//! // Alice decodes Bob's serialized public key and computes a shared secret from it

p224/src/ecdsa.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
2626
//!
2727
//! // Signing
28-
//! let signing_key = SigningKey::random(&mut OsRng.unwrap_mut()); // Serialize with `::to_bytes()`
28+
//! let signing_key = SigningKey::try_from_rng(&mut OsRng).unwrap(); // Serialize with `::to_bytes()`
2929
//! let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
3030
//! let signature: Signature = signing_key.sign(message);
3131
//!

p256/src/ecdh.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
//!
1111
//! ```
1212
//! use p256::{EncodedPoint, PublicKey, ecdh::EphemeralSecret};
13-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
13+
//! use rand_core::OsRng; // requires 'os_rng' feature
1414
//!
1515
//! // Alice
16-
//! let alice_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
16+
//! let alice_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
1717
//! let alice_pk_bytes = EncodedPoint::from(alice_secret.public_key());
1818
//!
1919
//! // Bob
20-
//! let bob_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
20+
//! let bob_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
2121
//! let bob_pk_bytes = EncodedPoint::from(bob_secret.public_key());
2222
//!
2323
//! // Alice decodes Bob's serialized public key and computes a shared secret from it

p256/src/ecdsa.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
//! use p256::{
2525
//! ecdsa::{SigningKey, Signature, signature::Signer},
2626
//! };
27-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
27+
//! use rand_core::OsRng; // requires 'os_rng' feature
2828
//!
2929
//! // Signing
30-
//! let signing_key = SigningKey::random(&mut OsRng.unwrap_mut()); // Serialize with `::to_bytes()`
30+
//! let signing_key = SigningKey::try_from_rng(&mut OsRng).unwrap(); // Serialize with `::to_bytes()`
3131
//! let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
3232
//! let signature: Signature = signing_key.sign(message);
3333
//!

p384/src/ecdh.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
//!
1111
//! ```
1212
//! use p384::{EncodedPoint, PublicKey, ecdh::EphemeralSecret};
13-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
13+
//! use rand_core::OsRng; // requires 'os_rng' feature
1414
//!
1515
//! // Alice
16-
//! let alice_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
16+
//! let alice_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
1717
//! let alice_pk_bytes = EncodedPoint::from(alice_secret.public_key());
1818
//!
1919
//! // Bob
20-
//! let bob_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
20+
//! let bob_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
2121
//! let bob_pk_bytes = EncodedPoint::from(bob_secret.public_key());
2222
//!
2323
//! // Alice decodes Bob's serialized public key and computes a shared secret from it

p384/src/ecdsa.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
2626
//!
2727
//! // Signing
28-
//! let signing_key = SigningKey::random(&mut OsRng.unwrap_mut()); // Serialize with `::to_bytes()`
28+
//! let signing_key = SigningKey::try_from_rng(&mut OsRng).unwrap(); // Serialize with `::to_bytes()`
2929
//! let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
3030
//! let signature: Signature = signing_key.sign(message);
3131
//!

p521/src/ecdh.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
1414
//!
1515
//! // Alice
16-
//! let alice_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
16+
//! let alice_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
1717
//! let alice_pk_bytes = EncodedPoint::from(alice_secret.public_key());
1818
//!
1919
//! // Bob
20-
//! let bob_secret = EphemeralSecret::random(&mut OsRng.unwrap_mut());
20+
//! let bob_secret = EphemeralSecret::try_from_rng(&mut OsRng).unwrap();
2121
//! let bob_pk_bytes = EncodedPoint::from(bob_secret.public_key());
2222
//!
2323
//! // Alice decodes Bob's serialized public key and computes a shared secret from it

p521/src/ecdsa.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
//! # #[cfg(feature = "ecdsa")]
2323
//! # {
2424
//! use p521::ecdsa::{signature::Signer, Signature, SigningKey};
25-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng' feature
25+
//! use rand_core::OsRng; // requires 'os_rng' feature
2626
//!
2727
//! // Signing
28-
//! let signing_key = SigningKey::random(&mut OsRng.unwrap_mut()); // Serialize with `::to_bytes()`
28+
//! let signing_key = SigningKey::try_from_rng(&mut OsRng).unwrap(); // Serialize with `::to_bytes()`
2929
//! let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
3030
//! let signature: Signature = signing_key.sign(message);
3131
//!

sm2/src/dsa.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
//! };
1616
//!
1717
//! // Signing
18-
//! let secret_key = SecretKey::random(&mut OsRng.unwrap_mut()); // serialize with `::to_bytes()`
18+
//! let secret_key = SecretKey::try_from_rng(&mut OsRng).unwrap(); // serialize with `::to_bytes()`
1919
//! let distid = "example@rustcrypto.org"; // distinguishing identifier
2020
//! let signing_key = SigningKey::new(distid, &secret_key)?;
2121
//! let verifying_key_bytes = signing_key.verifying_key().to_sec1_bytes();

sm2/src/pke.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@
99
#![cfg_attr(feature = "std", doc = "```")]
1010
#![cfg_attr(not(feature = "std"), doc = "```ignore")]
1111
//! # fn example() -> Result<(), Box<dyn std::error::Error>> {
12-
//! use rand_core::{OsRng, TryRngCore}; // requires 'os_rng` feature
12+
//! use rand_core::OsRng; // requires 'os_rng` feature
1313
//! use sm2::{
1414
//! pke::{EncryptingKey, Mode},
1515
//! {SecretKey, PublicKey}
16-
//!
1716
//! };
1817
//!
1918
//! // Encrypting
20-
//! let secret_key = SecretKey::random(&mut OsRng.unwrap_mut()); // serialize with `::to_bytes()`
19+
//! let secret_key = SecretKey::try_from_rng(&mut OsRng).unwrap(); // serialize with `::to_bytes()`
2120
//! let public_key = secret_key.public_key();
2221
//! let encrypting_key = EncryptingKey::new_with_mode(public_key, Mode::C1C2C3);
2322
//! let plaintext = b"plaintext";

0 commit comments

Comments
 (0)