@@ -59,8 +59,7 @@ use rand_core::{CryptoRng, RngCore, SeedableRng, TryCryptoRng, TryRngCore};
59
59
/// use rand::rngs::OsRng;
60
60
/// use rand::rngs::ReseedingRng;
61
61
///
62
- /// let prng = ChaCha20Core::from_os_rng();
63
- /// let mut reseeding_rng = ReseedingRng::new(prng, 0, OsRng);
62
+ /// let mut reseeding_rng = ReseedingRng::<ChaCha20Core, _>::new(0, OsRng).unwrap();
64
63
///
65
64
/// println!("{}", reseeding_rng.random::<u64>());
66
65
///
88
87
/// `threshold` sets the number of generated bytes after which to reseed the
89
88
/// PRNG. Set it to zero to never reseed based on the number of generated
90
89
/// values.
91
- pub fn new ( rng : R , threshold : u64 , reseeder : Rsdr ) -> Self {
92
- ReseedingRng ( BlockRng :: new ( ReseedingCore :: new ( rng, threshold, reseeder) ) )
90
+ pub fn new ( threshold : u64 , reseeder : Rsdr ) -> Result < Self , Rsdr :: Error > {
91
+ Ok ( ReseedingRng ( BlockRng :: new ( ReseedingCore :: new (
92
+ threshold, reseeder,
93
+ ) ?) ) )
93
94
}
94
95
95
96
/// Immediately reseed the generator
@@ -177,7 +178,10 @@ where
177
178
Rsdr : TryRngCore ,
178
179
{
179
180
/// Create a new `ReseedingCore`.
180
- fn new ( rng : R , threshold : u64 , reseeder : Rsdr ) -> Self {
181
+ ///
182
+ /// `threshold` is the maximum number of bytes produced by
183
+ /// [`BlockRngCore::generate`] before attempting reseeding.
184
+ fn new ( threshold : u64 , mut reseeder : Rsdr ) -> Result < Self , Rsdr :: Error > {
181
185
// Because generating more values than `i64::MAX` takes centuries on
182
186
// current hardware, we just clamp to that value.
183
187
// Also we set a threshold of 0, which indicates no limit, to that
@@ -190,12 +194,14 @@ where
190
194
i64:: MAX
191
195
} ;
192
196
193
- ReseedingCore {
194
- inner : rng,
197
+ let inner = R :: try_from_rng ( & mut reseeder) ?;
198
+
199
+ Ok ( ReseedingCore {
200
+ inner,
195
201
reseeder,
196
202
threshold,
197
203
bytes_until_reseed : threshold,
198
- }
204
+ } )
199
205
}
200
206
201
207
/// Reseed the internal PRNG.
@@ -249,16 +255,15 @@ where
249
255
mod test {
250
256
use crate :: rngs:: mock:: StepRng ;
251
257
use crate :: rngs:: std:: Core ;
252
- use crate :: { Rng , SeedableRng } ;
258
+ use crate :: Rng ;
253
259
254
260
use super :: ReseedingRng ;
255
261
256
262
#[ test]
257
263
fn test_reseeding ( ) {
258
- let mut zero = StepRng :: new ( 0 , 0 ) ;
259
- let rng = Core :: from_rng ( & mut zero) ;
264
+ let zero = StepRng :: new ( 0 , 0 ) ;
260
265
let thresh = 1 ; // reseed every time the buffer is exhausted
261
- let mut reseeding = ReseedingRng :: new ( rng , thresh, zero) ;
266
+ let mut reseeding = ReseedingRng :: < Core , _ > :: new ( thresh, zero) . unwrap ( ) ;
262
267
263
268
// RNG buffer size is [u32; 64]
264
269
// Debug is only implemented up to length 32 so use two arrays
@@ -276,9 +281,8 @@ mod test {
276
281
#[ test]
277
282
#[ allow( clippy:: redundant_clone) ]
278
283
fn test_clone_reseeding ( ) {
279
- let mut zero = StepRng :: new ( 0 , 0 ) ;
280
- let rng = Core :: from_rng ( & mut zero) ;
281
- let mut rng1 = ReseedingRng :: new ( rng, 32 * 4 , zero) ;
284
+ let zero = StepRng :: new ( 0 , 0 ) ;
285
+ let mut rng1 = ReseedingRng :: < Core , _ > :: new ( 32 * 4 , zero) . unwrap ( ) ;
282
286
283
287
let first: u32 = rng1. random ( ) ;
284
288
for _ in 0 ..10 {
0 commit comments