@@ -60,6 +60,8 @@ pub trait SecureRandom: private::Sealed {
60
60
/// On Windows, `fill` is implemented using the platform's API for secure
61
61
/// random number generation.
62
62
///
63
+ /// On SGX, `fill()` is implemented using the `RDRAND` instruction.
64
+ ///
63
65
/// Otherwise, `fill()` is implemented by reading from `/dev/urandom`. (This is
64
66
/// something that should be improved for any platform that adds something
65
67
/// better.)
@@ -93,7 +95,7 @@ impl SecureRandom for SystemRandom {
93
95
94
96
impl private:: Sealed for SystemRandom { }
95
97
96
- #[ cfg( not( any( target_os = "linux" , target_os = "macos" , target_os = "ios" , windows) ) ) ]
98
+ #[ cfg( not( any( target_os = "linux" , target_os = "macos" , target_os = "ios" , windows, target_env = "sgx" ) ) ) ]
97
99
use self :: urandom:: fill as fill_impl;
98
100
99
101
#[ cfg( any(
@@ -107,6 +109,9 @@ use self::sysrand_or_urandom::fill as fill_impl;
107
109
108
110
#[ cfg( any( target_os = "macos" , target_os = "ios" ) ) ]
109
111
use self :: darwin:: fill as fill_impl;
112
+
113
+ #[ cfg( target_env = "sgx" ) ]
114
+ use self :: rdrandom:: fill as fill_impl;
110
115
use crate :: private;
111
116
112
117
#[ cfg( target_os = "linux" ) ]
@@ -275,6 +280,24 @@ mod darwin {
275
280
}
276
281
}
277
282
283
+ #[ cfg( target_env = "sgx" ) ]
284
+ mod rdrandom {
285
+ use rdrand:: RdRand ;
286
+ use crate :: error;
287
+ use crate :: endian:: LittleEndian ;
288
+
289
+ pub fn fill ( dest : & mut [ u8 ] ) -> Result < ( ) , error:: Unspecified > {
290
+ let rng = RdRand :: new ( ) . map_err ( |_| error:: Unspecified ) ?;
291
+ for dst_chunk in dest. chunks_mut ( 8 ) {
292
+ let src_num = rng. try_next_u64 ( ) . ok_or ( error:: Unspecified ) ?;
293
+ let temp = LittleEndian :: from ( src_num) ;
294
+ let src_chunk = temp. as_ref ( ) ;
295
+ dst_chunk. copy_from_slice ( & src_chunk[ ..dst_chunk. len ( ) ] ) ;
296
+ }
297
+ Ok ( ( ) )
298
+ }
299
+ }
300
+
278
301
#[ cfg( test) ]
279
302
mod tests {
280
303
use crate :: rand:: { self , SecureRandom } ;
0 commit comments