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

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bign256/src/ecdsa.rs

Lines changed: 1 addition & 1 deletion
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

Lines changed: 14 additions & 1 deletion
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 3 deletions
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

0 commit comments

Comments
 (0)