Skip to content

Commit 38a0030

Browse files
Add support for x86_64-fortanix-unknown-sgx target
1 parent aa562a1 commit 38a0030

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,9 @@ libc = { version = "0.2.34" }
286286
[target.'cfg(any(target_os = "redox", all(unix, not(any(target_os = "macos", target_os = "ios")))))'.dependencies]
287287
lazy_static = "1.2"
288288

289+
[target.'cfg(target_env = "sgx")'.dependencies]
290+
rdrand = "0.3.0"
291+
289292
# Keep this in sync with `[dependencies]` in pregenerate_asm/Cargo.toml.
290293
[build-dependencies]
291294
# we do not use the gcc parallel feature because we do the

src/rand.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ pub trait SecureRandom: private::Sealed {
6060
/// On Windows, `fill` is implemented using the platform's API for secure
6161
/// random number generation.
6262
///
63+
/// On SGX, `fill()` is implemented using the `RDRAND` instruction.
64+
///
6365
/// Otherwise, `fill()` is implemented by reading from `/dev/urandom`. (This is
6466
/// something that should be improved for any platform that adds something
6567
/// better.)
@@ -93,7 +95,7 @@ impl SecureRandom for SystemRandom {
9395

9496
impl private::Sealed for SystemRandom {}
9597

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")))]
9799
use self::urandom::fill as fill_impl;
98100

99101
#[cfg(any(
@@ -107,6 +109,9 @@ use self::sysrand_or_urandom::fill as fill_impl;
107109

108110
#[cfg(any(target_os = "macos", target_os = "ios"))]
109111
use self::darwin::fill as fill_impl;
112+
113+
#[cfg(target_env = "sgx")]
114+
use self::rdrandom::fill as fill_impl;
110115
use crate::private;
111116

112117
#[cfg(target_os = "linux")]
@@ -275,6 +280,24 @@ mod darwin {
275280
}
276281
}
277282

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+
278301
#[cfg(test)]
279302
mod tests {
280303
use crate::rand::{self, SecureRandom};

0 commit comments

Comments
 (0)