10
10
11
11
pub use self :: imp:: OsRng ;
12
12
13
+ use mem;
14
+
15
+ fn next_u32 ( mut fill_buf : & mut FnMut ( & mut [ u8 ] ) ) -> u32 {
16
+ let mut buf: [ u8 ; 4 ] = [ 0 ; 4 ] ;
17
+ fill_buf ( & mut buf) ;
18
+ unsafe { mem:: transmute :: < [ u8 ; 4 ] , u32 > ( buf) }
19
+ }
20
+
21
+ fn next_u64 ( mut fill_buf : & mut FnMut ( & mut [ u8 ] ) ) -> u64 {
22
+ let mut buf: [ u8 ; 8 ] = [ 0 ; 8 ] ;
23
+ fill_buf ( & mut buf) ;
24
+ unsafe { mem:: transmute :: < [ u8 ; 8 ] , u64 > ( buf) }
25
+ }
26
+
13
27
#[ cfg( all( unix, not( target_os = "ios" ) , not( target_os = "openbsd" ) ) ) ]
14
28
mod imp {
15
29
use self :: OsRngInner :: * ;
30
+ use super :: { next_u32, next_u64} ;
16
31
17
32
use fs:: File ;
18
33
use io;
19
34
use libc;
20
- use mem;
21
35
use rand:: Rng ;
22
36
use rand:: reader:: ReaderRng ;
23
37
use sys:: os:: errno;
@@ -87,18 +101,6 @@ mod imp {
87
101
}
88
102
}
89
103
90
- fn getrandom_next_u32 ( ) -> u32 {
91
- let mut buf: [ u8 ; 4 ] = [ 0 ; 4 ] ;
92
- getrandom_fill_bytes ( & mut buf) ;
93
- unsafe { mem:: transmute :: < [ u8 ; 4 ] , u32 > ( buf) }
94
- }
95
-
96
- fn getrandom_next_u64 ( ) -> u64 {
97
- let mut buf: [ u8 ; 8 ] = [ 0 ; 8 ] ;
98
- getrandom_fill_bytes ( & mut buf) ;
99
- unsafe { mem:: transmute :: < [ u8 ; 8 ] , u64 > ( buf) }
100
- }
101
-
102
104
#[ cfg( all( target_os = "linux" ,
103
105
any( target_arch = "x86_64" ,
104
106
target_arch = "x86" ,
@@ -163,13 +165,13 @@ mod imp {
163
165
impl Rng for OsRng {
164
166
fn next_u32 ( & mut self ) -> u32 {
165
167
match self . inner {
166
- OsGetrandomRng => getrandom_next_u32 ( ) ,
168
+ OsGetrandomRng => next_u32 ( & mut getrandom_fill_bytes ) ,
167
169
OsReaderRng ( ref mut rng) => rng. next_u32 ( ) ,
168
170
}
169
171
}
170
172
fn next_u64 ( & mut self ) -> u64 {
171
173
match self . inner {
172
- OsGetrandomRng => getrandom_next_u64 ( ) ,
174
+ OsGetrandomRng => next_u64 ( & mut getrandom_fill_bytes ) ,
173
175
OsReaderRng ( ref mut rng) => rng. next_u64 ( ) ,
174
176
}
175
177
}
@@ -184,9 +186,10 @@ mod imp {
184
186
185
187
#[ cfg( target_os = "openbsd" ) ]
186
188
mod imp {
189
+ use super :: { next_u32, next_u64} ;
190
+
187
191
use io;
188
192
use libc;
189
- use mem;
190
193
use sys:: os:: errno;
191
194
use rand:: Rng ;
192
195
@@ -205,14 +208,10 @@ mod imp {
205
208
206
209
impl Rng for OsRng {
207
210
fn next_u32 ( & mut self ) -> u32 {
208
- let mut v = [ 0 ; 4 ] ;
209
- self . fill_bytes ( & mut v) ;
210
- unsafe { mem:: transmute ( v) }
211
+ next_u32 ( & mut |v| self . fill_bytes ( v) )
211
212
}
212
213
fn next_u64 ( & mut self ) -> u64 {
213
- let mut v = [ 0 ; 8 ] ;
214
- self . fill_bytes ( & mut v) ;
215
- unsafe { mem:: transmute ( v) }
214
+ next_u64 ( & mut |v| self . fill_bytes ( v) )
216
215
}
217
216
fn fill_bytes ( & mut self , v : & mut [ u8 ] ) {
218
217
// getentropy(2) permits a maximum buffer size of 256 bytes
@@ -230,8 +229,9 @@ mod imp {
230
229
231
230
#[ cfg( target_os = "ios" ) ]
232
231
mod imp {
232
+ use super :: { next_u32, next_u64} ;
233
+
233
234
use io;
234
- use mem;
235
235
use ptr;
236
236
use rand:: Rng ;
237
237
use libc:: { c_int, size_t} ;
@@ -265,14 +265,10 @@ mod imp {
265
265
266
266
impl Rng for OsRng {
267
267
fn next_u32 ( & mut self ) -> u32 {
268
- let mut v = [ 0 ; 4 ] ;
269
- self . fill_bytes ( & mut v) ;
270
- unsafe { mem:: transmute ( v) }
268
+ next_u32 ( & mut |v| self . fill_bytes ( v) )
271
269
}
272
270
fn next_u64 ( & mut self ) -> u64 {
273
- let mut v = [ 0 ; 8 ] ;
274
- self . fill_bytes ( & mut v) ;
275
- unsafe { mem:: transmute ( v) }
271
+ next_u64 ( & mut |v| self . fill_bytes ( v) )
276
272
}
277
273
fn fill_bytes ( & mut self , v : & mut [ u8 ] ) {
278
274
let ret = unsafe {
0 commit comments