diff --git a/Cargo.toml b/Cargo.toml index a3ead5c..7a30b32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,3 @@ crypto-bigint = { git = "https://github.com/RustCrypto/crypto-bigint.git" } glass_pumpkin = { git = "https://github.com/baloo/agora-glass_pumpkin.git", branch = "baloo/rand-core/0.9" } # https://github.com/rust-num/num-bigint/pull/317 num-bigint = { git = "https://github.com/bionicles/num-bigint.git" } - -# https://github.com/rust-random/rand/pull/1593 -rand_core = { git = "https://github.com/fjarri/rand.git", branch = "sized" } diff --git a/benches/bench.rs b/benches/bench.rs index 36c3a46..9034e8e 100644 --- a/benches/bench.rs +++ b/benches/bench.rs @@ -18,6 +18,7 @@ use crypto_primes::{ SmallPrimesSieve, }, is_prime_with_rng, is_safe_prime_with_rng, + rng::MaybeRng, }; #[cfg(feature = "multicore")] use crypto_primes::{par_generate_prime_with_rng, par_generate_safe_prime_with_rng}; @@ -32,7 +33,7 @@ fn make_random_rng() -> ChaCha8Rng { } fn random_odd_uint(rng: &mut R, bit_length: u32) -> Odd { - random_odd_integer::(rng, NonZero::new(bit_length).unwrap(), SetBits::Msb).unwrap() + random_odd_integer::(&mut MaybeRng(rng), NonZero::new(bit_length).unwrap(), SetBits::Msb).unwrap() } fn make_sieve(rng: &mut R) -> SmallPrimesSieve> { @@ -444,9 +445,10 @@ fn bench_glass_pumpkin(c: &mut Criterion) { // Mimics the sequence of checks `glass-pumpkin` does to find a prime. fn prime_like_gp(bit_length: u32, rng: &mut R) -> BoxedUint { loop { - let start = random_odd_integer::(rng, NonZero::new(bit_length).unwrap(), SetBits::Msb) - .unwrap() - .get(); + let start = + random_odd_integer::(&mut MaybeRng(rng), NonZero::new(bit_length).unwrap(), SetBits::Msb) + .unwrap() + .get(); let sieve = SmallPrimesSieve::new(start, NonZero::new(bit_length).unwrap(), false); for num in sieve { let odd_num = Odd::new(num.clone()).unwrap(); @@ -470,9 +472,10 @@ fn bench_glass_pumpkin(c: &mut Criterion) { // Mimics the sequence of checks `glass-pumpkin` does to find a safe prime. fn safe_prime_like_gp(bit_length: u32, rng: &mut R) -> BoxedUint { loop { - let start = random_odd_integer::(rng, NonZero::new(bit_length).unwrap(), SetBits::Msb) - .unwrap() - .get(); + let start = + random_odd_integer::(&mut MaybeRng(rng), NonZero::new(bit_length).unwrap(), SetBits::Msb) + .unwrap() + .get(); let sieve = SmallPrimesSieve::new(start, NonZero::new(bit_length).unwrap(), true); for num in sieve { let odd_num = Odd::new(num.clone()).unwrap(); diff --git a/src/hazmat/sieve.rs b/src/hazmat/sieve.rs index f483a47..18d7c0e 100644 --- a/src/hazmat/sieve.rs +++ b/src/hazmat/sieve.rs @@ -328,8 +328,8 @@ impl SieveFactory for SmallPrimesSieveFactory { rng: &mut R, _previous_sieve: Option<&Self::Sieve>, ) -> Option { - let start = - random_odd_integer::(rng, self.max_bit_length, self.set_bits).expect("random_odd_integer() failed"); + let start = random_odd_integer::(&mut crate::rng::MaybeRng(rng), self.max_bit_length, self.set_bits) + .expect("random_odd_integer() failed"); Some(SmallPrimesSieve::new( start.get(), self.max_bit_length, diff --git a/src/lib.rs b/src/lib.rs index 19ff3ec..a01b1fc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,9 @@ pub mod hazmat; mod presets; mod traits; +#[doc(hidden)] +pub mod rng; + pub use generic::{sieve_and_find, SieveIterator}; pub use presets::{generate_prime_with_rng, generate_safe_prime_with_rng, is_prime_with_rng, is_safe_prime_with_rng}; pub use traits::{RandomPrimeWithRng, SieveFactory}; diff --git a/src/rng.rs b/src/rng.rs new file mode 100644 index 0000000..f953726 --- /dev/null +++ b/src/rng.rs @@ -0,0 +1,34 @@ +use rand_core::{CryptoRng, RngCore, TryCryptoRng, TryRngCore}; + +/// Adapter from [`CryptoRng`] to [`TryCryptoRng`] +/// +/// This is pending the release of a fix availale in this PR: +/// +#[doc(hidden)] +#[derive(Debug)] +pub struct MaybeRng<'r, R>(pub &'r mut R) +where + R: ?Sized; + +impl TryRngCore for MaybeRng<'_, R> +where + R: RngCore + ?Sized, +{ + type Error = core::convert::Infallible; + + #[inline] + fn try_next_u32(&mut self) -> Result { + Ok(self.0.next_u32()) + } + #[inline] + fn try_next_u64(&mut self) -> Result { + Ok(self.0.next_u64()) + } + #[inline] + fn try_fill_bytes(&mut self, dst: &mut [u8]) -> Result<(), Self::Error> { + self.0.fill_bytes(dst); + Ok(()) + } +} + +impl TryCryptoRng for MaybeRng<'_, R> {}