Skip to content

Commit 23607b6

Browse files
committed
relax sizing requirement on the TryCryptoRng
1 parent 8b57f55 commit 23607b6

File tree

5 files changed

+64
-12
lines changed

5 files changed

+64
-12
lines changed

Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,3 @@ crypto-bigint = { git = "https://github.com/RustCrypto/crypto-bigint.git" }
6262
glass_pumpkin = { git = "https://github.com/baloo/agora-glass_pumpkin.git", branch = "baloo/rand-core/0.9" }
6363
# https://github.com/rust-num/num-bigint/pull/317
6464
num-bigint = { git = "https://github.com/bionicles/num-bigint.git" }
65-
66-
# https://github.com/rust-random/rand/pull/1593
67-
rand_core = { git = "https://github.com/fjarri/rand.git", branch = "sized" }

benches/bench.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crypto_primes::{
1818
SmallPrimesSieve,
1919
},
2020
is_prime_with_rng, is_safe_prime_with_rng,
21+
rng::MaybeRng,
2122
};
2223
#[cfg(feature = "multicore")]
2324
use crypto_primes::{par_generate_prime_with_rng, par_generate_safe_prime_with_rng};
@@ -32,7 +33,7 @@ fn make_random_rng() -> ChaCha8Rng {
3233
}
3334

3435
fn random_odd_uint<T: RandomBits + Integer, R: CryptoRng + ?Sized>(rng: &mut R, bit_length: u32) -> Odd<T> {
35-
random_odd_integer::<T, R>(rng, NonZero::new(bit_length).unwrap(), SetBits::Msb).unwrap()
36+
random_odd_integer::<T, _>(&mut MaybeRng(rng), NonZero::new(bit_length).unwrap(), SetBits::Msb).unwrap()
3637
}
3738

3839
fn make_sieve<const L: usize, R: CryptoRng + ?Sized>(rng: &mut R) -> SmallPrimesSieve<Uint<L>> {
@@ -444,9 +445,10 @@ fn bench_glass_pumpkin(c: &mut Criterion) {
444445
// Mimics the sequence of checks `glass-pumpkin` does to find a prime.
445446
fn prime_like_gp<R: CryptoRng + ?Sized>(bit_length: u32, rng: &mut R) -> BoxedUint {
446447
loop {
447-
let start = random_odd_integer::<BoxedUint, R>(rng, NonZero::new(bit_length).unwrap(), SetBits::Msb)
448-
.unwrap()
449-
.get();
448+
let start =
449+
random_odd_integer::<BoxedUint, _>(&mut MaybeRng(rng), NonZero::new(bit_length).unwrap(), SetBits::Msb)
450+
.unwrap()
451+
.get();
450452
let sieve = SmallPrimesSieve::new(start, NonZero::new(bit_length).unwrap(), false);
451453
for num in sieve {
452454
let odd_num = Odd::new(num.clone()).unwrap();
@@ -470,9 +472,10 @@ fn bench_glass_pumpkin(c: &mut Criterion) {
470472
// Mimics the sequence of checks `glass-pumpkin` does to find a safe prime.
471473
fn safe_prime_like_gp<R: CryptoRng + ?Sized>(bit_length: u32, rng: &mut R) -> BoxedUint {
472474
loop {
473-
let start = random_odd_integer::<BoxedUint, _>(rng, NonZero::new(bit_length).unwrap(), SetBits::Msb)
474-
.unwrap()
475-
.get();
475+
let start =
476+
random_odd_integer::<BoxedUint, _>(&mut MaybeRng(rng), NonZero::new(bit_length).unwrap(), SetBits::Msb)
477+
.unwrap()
478+
.get();
476479
let sieve = SmallPrimesSieve::new(start, NonZero::new(bit_length).unwrap(), true);
477480
for num in sieve {
478481
let odd_num = Odd::new(num.clone()).unwrap();

src/hazmat/sieve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,8 @@ impl<T: Integer + RandomBits> SieveFactory for SmallPrimesSieveFactory<T> {
328328
rng: &mut R,
329329
_previous_sieve: Option<&Self::Sieve>,
330330
) -> Option<Self::Sieve> {
331-
let start =
332-
random_odd_integer::<T, R>(rng, self.max_bit_length, self.set_bits).expect("random_odd_integer() failed");
331+
let start = random_odd_integer::<T, _>(&mut crate::rng::MaybeRng(rng), self.max_bit_length, self.set_bits)
332+
.expect("random_odd_integer() failed");
333333
Some(SmallPrimesSieve::new(
334334
start.get(),
335335
self.max_bit_length,

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ pub mod hazmat;
2121
mod presets;
2222
mod traits;
2323

24+
#[doc(hidden)]
25+
pub mod rng;
26+
2427
pub use generic::{sieve_and_find, SieveIterator};
2528
pub use presets::{generate_prime_with_rng, generate_safe_prime_with_rng, is_prime_with_rng, is_safe_prime_with_rng};
2629
pub use traits::{RandomPrimeWithRng, SieveFactory};

src/rng.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use rand_core::{CryptoRng, RngCore, TryCryptoRng, TryRngCore};
2+
3+
/// Adapter from [`CryptoRng`] to [`TryCryptoRng`]
4+
///
5+
/// This is pending the release of a fix availale in this PR:
6+
/// <https://github.com/rust-random/rand/pull/1593>
7+
#[doc(hidden)]
8+
#[derive(Debug)]
9+
pub struct MaybeRng<'r, R>(pub &'r mut R)
10+
where
11+
R: ?Sized;
12+
13+
impl<R> TryRngCore for MaybeRng<'_, R>
14+
where
15+
R: RngCore + ?Sized,
16+
{
17+
type Error = core::convert::Infallible;
18+
19+
#[inline]
20+
fn try_next_u32(&mut self) -> Result<u32, Self::Error> {
21+
Ok(self.0.next_u32())
22+
}
23+
#[inline]
24+
fn try_next_u64(&mut self) -> Result<u64, Self::Error> {
25+
Ok(self.0.next_u64())
26+
}
27+
#[inline]
28+
fn try_fill_bytes(&mut self, dst: &mut [u8]) -> Result<(), Self::Error> {
29+
self.0.fill_bytes(dst);
30+
Ok(())
31+
}
32+
}
33+
34+
impl<R: CryptoRng + ?Sized> TryCryptoRng for MaybeRng<'_, R> {}
35+
36+
#[cfg(test)]
37+
mod tests {
38+
use super::*;
39+
use rand_core::OsRng;
40+
#[test]
41+
fn test_rng() {
42+
let mut rng = OsRng.unwrap_err();
43+
44+
let mut rng = MaybeRng(&mut rng);
45+
rng.try_next_u32().unwrap();
46+
rng.try_next_u64().unwrap();
47+
rng.try_fill_bytes(&mut []).unwrap();
48+
}
49+
}

0 commit comments

Comments
 (0)