// Copyright 2018 Developers of the Rand project. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Entropy generator, or wrapper around external generators #![allow(deprecated)] // whole module is deprecated use rand_core::{RngCore, CryptoRng, Error}; use crate::rngs::OsRng; /// An interface returning random data from external source(s), provided /// specifically for securely seeding algorithmic generators (PRNGs). /// /// This is deprecated. It is suggested you use [`rngs::OsRng`] instead. /// /// [`rngs::OsRng`]: crate::rngs::OsRng #[derive(Debug)] #[deprecated(since="0.7.0", note="use rngs::OsRng instead")] pub struct EntropyRng { source: OsRng, } impl EntropyRng { /// Create a new `EntropyRng`. /// /// This method will do no system calls or other initialization routines, /// those are done on first use. This is done to make `new` infallible, /// and `try_fill_bytes` the only place to report errors. pub fn new() -> Self { EntropyRng { source: OsRng } } } impl Default for EntropyRng { fn default() -> Self { EntropyRng::new() } } impl RngCore for EntropyRng { fn next_u32(&mut self) -> u32 { self.source.next_u32() } fn next_u64(&mut self) -> u64 { self.source.next_u64() } fn fill_bytes(&mut self, dest: &mut [u8]) { self.source.fill_bytes(dest) } fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { self.source.try_fill_bytes(dest) } } impl CryptoRng for EntropyRng {} #[cfg(test)] mod test { use super::*; #[test] fn test_entropy() { let mut rng = EntropyRng::new(); let n = (rng.next_u32() ^ rng.next_u32()).count_ones(); assert!(n >= 2); // p(failure) approx 1e-7 } }