@@ -953,8 +953,8 @@ thread_local!(
953
953
static THREAD_RNG_KEY : Rc <RefCell <ReseedingRng <StdRng , EntropyRng >>> = {
954
954
const THREAD_RNG_RESEED_THRESHOLD : u64 = 32_768 ;
955
955
let mut entropy_source = EntropyRng :: new( ) ;
956
- let r = StdRng :: from_rng( & mut entropy_source)
957
- . expect ( "could not initialize thread_rng" ) ;
956
+ let r = StdRng :: from_rng( & mut entropy_source) . unwrap_or_else ( |err|
957
+ panic! ( "could not initialize thread_rng: {}" , err ) ) ;
958
958
let rng = ReseedingRng :: new( r,
959
959
THREAD_RNG_RESEED_THRESHOLD ,
960
960
entropy_source) ;
@@ -1063,7 +1063,8 @@ impl Rng for EntropyRng {
1063
1063
}
1064
1064
1065
1065
fn fill_bytes ( & mut self , dest : & mut [ u8 ] ) {
1066
- self . try_fill_bytes ( dest) . unwrap ( ) ;
1066
+ self . try_fill_bytes ( dest) . unwrap_or_else ( |err|
1067
+ panic ! ( "all entropy sources failed; first error: {}" , err) )
1067
1068
}
1068
1069
1069
1070
fn try_fill_bytes ( & mut self , dest : & mut [ u8 ] ) -> Result < ( ) , Error > {
@@ -1087,13 +1088,15 @@ impl Rng for EntropyRng {
1087
1088
let os_rng_result = try_os_new ( dest) ;
1088
1089
match os_rng_result {
1089
1090
Ok ( os_rng) => {
1091
+ debug ! ( "EntropyRng: using OsRng" ) ;
1090
1092
switch_rng = Some ( EntropySource :: Os ( os_rng) ) ;
1091
1093
}
1092
1094
Err ( os_rng_error) => {
1093
1095
warn ! ( "EntropyRng: OsRng failed [falling back to JitterRng]: {}" ,
1094
1096
os_rng_error) ;
1095
1097
match try_jitter_new ( dest) {
1096
1098
Ok ( jitter_rng) => {
1099
+ debug ! ( "EntropyRng: using JitterRng" ) ;
1097
1100
switch_rng = Some ( EntropySource :: Jitter ( jitter_rng) ) ;
1098
1101
}
1099
1102
Err ( _jitter_error) => {
@@ -1112,6 +1115,7 @@ impl Rng for EntropyRng {
1112
1115
os_rng_error) ;
1113
1116
match try_jitter_new ( dest) {
1114
1117
Ok ( jitter_rng) => {
1118
+ debug ! ( "EntropyRng: using JitterRng" ) ;
1115
1119
switch_rng = Some ( EntropySource :: Jitter ( jitter_rng) ) ;
1116
1120
}
1117
1121
Err ( _jitter_error) => {
@@ -1124,7 +1128,7 @@ impl Rng for EntropyRng {
1124
1128
}
1125
1129
EntropySource :: Jitter ( ref mut rng) => {
1126
1130
if let Ok ( os_rng) = try_os_new ( dest) {
1127
- info ! ( "EntropyRng: OsRng available [switching back from JitterRng] " ) ;
1131
+ debug ! ( "EntropyRng: using OsRng " ) ;
1128
1132
switch_rng = Some ( EntropySource :: Os ( os_rng) ) ;
1129
1133
} else {
1130
1134
return rng. try_fill_bytes ( dest) ; // use JitterRng
@@ -1217,7 +1221,7 @@ pub fn sample<T, I, R>(rng: &mut R, iterable: I, amount: usize) -> Vec<T>
1217
1221
mod test {
1218
1222
use impls;
1219
1223
#[ cfg( feature="std" ) ]
1220
- use super :: { random, thread_rng} ;
1224
+ use super :: { random, thread_rng, EntropyRng } ;
1221
1225
use super :: { Rng , SeedableRng , StdRng } ;
1222
1226
#[ cfg( feature="alloc" ) ]
1223
1227
use alloc:: boxed:: Box ;
@@ -1263,6 +1267,13 @@ mod test {
1263
1267
impls:: fill_bytes_via_u64 ( self , dest)
1264
1268
}
1265
1269
}
1270
+
1271
+ #[ test]
1272
+ #[ cfg( feature="std" ) ]
1273
+ fn test_entropy ( ) {
1274
+ let mut rng = EntropyRng :: new ( ) ;
1275
+ rng. next_u32 ( ) ;
1276
+ }
1266
1277
1267
1278
#[ test]
1268
1279
fn test_fill_bytes_default ( ) {
0 commit comments