Crates.io | mc-rand |
lib.rs | mc-rand |
version | 1.1.0 |
source | src |
created_at | 2023-03-25 17:33:31.380897 |
updated_at | 2023-03-27 17:31:16.833005 |
description | A platform abstraction layer providing a cryptographic RNG, `McRng` |
homepage | |
repository | https://github.com/mobilecoinfoundation/rand |
max_upload_size | |
id | 820416 |
size | 55,602 |
A platform abstraction layer providing a cryptographic RNG, McRng
.
Example usage:
use mc_rand::{McRng, RngCore}
pub fn my_func() -> (u64, u64) {
let mut rng = McRng::default();
let k0 = rng.next_u64();
let k1 = rng.next_u64();
(k0, k1)
}
This project has evolved considerably as cargo has gotten more bug fixes and features.
Today, what it does is:
rdrand
, McRng
resolves to RdRandRng
, which uses
CPU intrinsics to call RDRAND
directly. This implementation was audited by NCC group.wasm_32
, McRng
resolves to OsRng
from rand crate. (This is because ThreadRng
is not available in wasm.)McRng
resolves to ThreadRng
. (ThreadRng
is the generically recommendable cryptographic RNG on major rust platforms.)On targets with rdrand
, this crate does not pull in the standard library.
On targets without rdrand
, the feature rand/std
will be enabled.
McRng
was created initially because MobileCoin builds SGX enclave software in
a strict no_std
environment. Enclaves are generally supposed to get randomness
from the CPU via RDRAND
and not from the OS, because the OS is untrusted in the
SGX security model.
This creates the following needs:
RDRAND
.resolver = 2
innovation, cargo would unify features across build-dependencies and target dependencies,
so if anything in your build.rs
pulled in rand
then you would get the standard library, which made common libraries like rand
toxic to our enclave builds.We wanted to have an RNG type that any of these users can consume, that will be secure and do the right thing on each platform without requiring explicit configuration or other toil from developers.
Because none of the existing RNG libraries quite provided this, we made mc-rand
.
McRng
fills a niche that isn't quite filled by OsRng
or ThreadRng
or other popular crates, and has been audited and battle-tested in production for years.
Feel free to use mc-rand
knowing that it will usually do the right thing:
As other targets arise that are of interest, we are happy to improve support for them.