2个稳定版本
1.1.0 | 2023年3月27日 |
---|---|
1.0.0 | 2023年3月25日 |
596 在 加密学 中排名
每月202次下载
用于 mc-oblivious-map
19KB
138 行
mc-rand
提供加密随机数生成器(McRng)的平台抽象层。
示例用法
示例用法
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)
}
它做什么
随着Cargo修复了更多错误和添加了更多功能,该项目已经发生了很大变化。
现在,它的作用是
- 在具有CPU特性
rdrand
的目标上,McRng
解析为RdRandRng
,该解析器使用CPU内建函数直接调用RDRAND
。此实现已由NCC小组审核。 - 当此功能不存在,但目标架构为
wasm_32
时,McRng
解析为来自rand crate的OsRng
。(这是因为ThreadRng
在wasm中不可用。) - 当这两种情况都不适用时,
McRng
解析为ThreadRng
。(ThreadRng
是在主要Rust平台上推荐使用的通用加密随机数生成器。)
在具有 rdrand
的目标上,此crate不包含标准库。在未具有 rdrand
的目标上,将启用 rand/std
功能。
动机
McRng
最初创建的原因是MobileCoin在严格的no_std
环境中构建SGX enclave软件。根据SGX安全模型,enclaves通常应通过RDRAND
从CPU获取随机数,而不是从操作系统获取,因为操作系统在SGX安全模型中是不受信任的。
这产生了以下需求
- 在enclave实现中需要存在一个解析为
RDRAND
的RNG。 - 理想情况下,如果你在x86上工作,同一RNG也应在enclave-impl crate的单元测试构建中工作,无需进一步配置。
- 一些库旨在同时由服务器中的enclaves和客户端(可能不是x86)使用。例如,“common” crate,它也提供了一个hashmap用于enclaves内和enclaves外,并需要随机数以避免HASH-DOS。
- 四年前,在
resolver = 2
创新之前,Cargo会统一构建依赖和目标依赖中的功能,所以如果你的build.rs
中拉入了rand
,那么你会得到标准库,这使得像rand
这样的常用库对我们的enclaves构建变得有毒。
我们希望有一个RNG类型,任何这些用户都可以使用,它将在每个平台上安全并正确地执行,而无需开发者的明确配置或其他劳作。
由于现有的RNG库没有完全提供这一点,我们创建了mc-rand
。
未来方向
McRng
填补了一个没有被OsRng
、ThreadRng
或其他流行crate完全填补的空白,并且已经经过多年的生产审计和实战测试。
请放心使用mc-rand
,因为它通常都会做正确的事情。
- 在x86的enclaves实现上工作的时候,这很好,因为你的cargo测试和基准测试将使用与你代码在生产中使用的相同的实现。
- 在其他目标上,它仍然将使用该平台最普遍推荐的加密RNG。
随着其他感兴趣的目标出现,我们很高兴提高对这些目标的支持。
依赖项
~240–425KB