[−][src]Struct rand::rngs::adapter::ReseedingRng
A wrapper around any PRNG which reseeds the underlying PRNG after it has generated a certain number of random bytes.
When the RNG gets cloned, the clone is reseeded on first use.
Reseeding is never strictly necessary. Cryptographic PRNGs don't have a limited number of bytes they can output, or at least not a limit reachable in any practical way. There is no such thing as 'running out of entropy'.
Some small non-cryptographic PRNGs can have very small periods, for example less than 264. Would reseeding help to ensure that you do not wrap around at the end of the period? A period of 264 still takes several centuries of CPU-years on current hardware. Reseeding will actually make things worse, because the reseeded PRNG will just continue somewhere else in the same period, with a high chance of overlapping with previously used parts of it.
When should you use ReseedingRng
?
- Reseeding can be seen as some form of 'security in depth'. Even if in the future a cryptographic weakness is found in the CSPRNG being used, occasionally reseeding should make exploiting it much more difficult or even impossible.
- It can be used as a poor man's cryptography (not recommended, just use a
good CSPRNG). Previous implementations of
thread_rng
for example usedReseedingRng
with the ISAAC RNG. That algorithm, although apparently strong and with no known attack, does not come with any proof of security and does not meet the current standards for a cryptographically secure PRNG. By reseeding it frequently (every 32 kiB) it seems safe to assume there is no attack that can operate on the tiny window between reseeds.
Error handling
Although extremely unlikely, reseeding the wrapped PRNG can fail.
ReseedingRng
will never panic but try to handle the error intelligently
through some combination of retrying and delaying reseeding until later.
If handling the source error fails ReseedingRng
will continue generating
data from the wrapped PRNG without reseeding.
Implementations
impl<R, Rsdr> ReseedingRng<R, Rsdr> where
R: BlockRngCore + SeedableRng,
Rsdr: RngCore,
[src]
R: BlockRngCore + SeedableRng,
Rsdr: RngCore,
pub fn new(rng: R, threshold: u64, reseeder: Rsdr) -> Self
[src]
Create a new ReseedingRng
with the given parameters.
Arguments
rng
: the random number generator to use.threshold
: the number of generated bytes after which to reseed the RNG.reseeder
: the RNG to use for reseeding.
pub fn reseed(&mut self) -> Result<(), Error>
[src]
Reseed the internal PRNG.
Trait Implementations
impl<R, Rsdr> Clone for ReseedingRng<R, Rsdr> where
R: BlockRngCore + SeedableRng + Clone,
Rsdr: RngCore + Clone,
[src]
R: BlockRngCore + SeedableRng + Clone,
Rsdr: RngCore + Clone,
fn clone(&self) -> ReseedingRng<R, Rsdr>
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl<R, Rsdr> CryptoRng for ReseedingRng<R, Rsdr> where
R: BlockRngCore + SeedableRng + CryptoRng,
Rsdr: RngCore + CryptoRng,
[src]
R: BlockRngCore + SeedableRng + CryptoRng,
Rsdr: RngCore + CryptoRng,
impl<R: Debug, Rsdr: Debug> Debug for ReseedingRng<R, Rsdr> where
R: BlockRngCore + SeedableRng,
Rsdr: RngCore,
[src]
R: BlockRngCore + SeedableRng,
Rsdr: RngCore,
impl<R, Rsdr: RngCore> RngCore for ReseedingRng<R, Rsdr> where
R: BlockRngCore<Item = u32> + SeedableRng,
<R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]>,
[src]
R: BlockRngCore<Item = u32> + SeedableRng,
<R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]>,
Auto Trait Implementations
impl<R, Rsdr> RefUnwindSafe for ReseedingRng<R, Rsdr> where
R: RefUnwindSafe,
Rsdr: RefUnwindSafe,
<R as BlockRngCore>::Results: RefUnwindSafe,
R: RefUnwindSafe,
Rsdr: RefUnwindSafe,
<R as BlockRngCore>::Results: RefUnwindSafe,
impl<R, Rsdr> Send for ReseedingRng<R, Rsdr> where
R: Send,
Rsdr: Send,
<R as BlockRngCore>::Results: Send,
R: Send,
Rsdr: Send,
<R as BlockRngCore>::Results: Send,
impl<R, Rsdr> Sync for ReseedingRng<R, Rsdr> where
R: Sync,
Rsdr: Sync,
<R as BlockRngCore>::Results: Sync,
R: Sync,
Rsdr: Sync,
<R as BlockRngCore>::Results: Sync,
impl<R, Rsdr> Unpin for ReseedingRng<R, Rsdr> where
R: Unpin,
Rsdr: Unpin,
<R as BlockRngCore>::Results: Unpin,
R: Unpin,
Rsdr: Unpin,
<R as BlockRngCore>::Results: Unpin,
impl<R, Rsdr> UnwindSafe for ReseedingRng<R, Rsdr> where
R: UnwindSafe,
Rsdr: UnwindSafe,
<R as BlockRngCore>::Results: UnwindSafe,
R: UnwindSafe,
Rsdr: UnwindSafe,
<R as BlockRngCore>::Results: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<R> Rng for R where
R: RngCore + ?Sized,
[src]
R: RngCore + ?Sized,
fn gen<T>(&mut self) -> T where
Standard: Distribution<T>,
[src]
Standard: Distribution<T>,
fn gen_range<T: PartialOrd + SampleUniform>(&mut self, low: T, high: T) -> T
[src]
fn sample<T, D: Distribution<T>>(&mut self, distr: D) -> T
[src]
fn sample_iter<'a, T, D: Distribution<T>>(
&'a mut self,
distr: &'a D
) -> DistIter<'a, D, Self, T>ⓘ where
Self: Sized,
[src]
&'a mut self,
distr: &'a D
) -> DistIter<'a, D, Self, T>ⓘ where
Self: Sized,
fn fill<T: AsByteSliceMut + ?Sized>(&mut self, dest: &mut T)
[src]
fn try_fill<T: AsByteSliceMut + ?Sized>(
&mut self,
dest: &mut T
) -> Result<(), Error>
[src]
&mut self,
dest: &mut T
) -> Result<(), Error>
fn gen_bool(&mut self, p: f64) -> bool
[src]
fn choose<'a, T>(&mut self, values: &'a [T]) -> Option<&'a T>
[src]
fn choose_mut<'a, T>(&mut self, values: &'a mut [T]) -> Option<&'a mut T>
[src]
fn shuffle<T>(&mut self, values: &mut [T])
[src]
fn gen_iter<T>(&mut self) -> Generator<T, &mut Self>ⓘ where
Standard: Distribution<T>,
[src]
Standard: Distribution<T>,
fn gen_weighted_bool(&mut self, n: u32) -> bool
[src]
fn gen_ascii_chars(&mut self) -> AsciiGenerator<&mut Self>ⓘImportant traits for AsciiGenerator<R>
impl<R: RngCore> Iterator for AsciiGenerator<R> type Item = char;
[src]
Important traits for AsciiGenerator<R>
impl<R: RngCore> Iterator for AsciiGenerator<R> type Item = char;
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,