#rng #external #arm #embedded #none-os

no-std exrng

具有本地特性的 RNG crate,但使用外部 RNG 源

3 个版本

0.1.2 2019 年 9 月 4 日
0.1.1 2019 年 9 月 3 日
0.1.0 2019 年 9 月 3 日

#83#external

MIT/Apache

7KB
58

exrng

rust RNG crate,具有本地特性,但使用外部 RNG 源


lib.rs:

exrng

这个 crate 包含了 CryptoRNG 和 RngCore 的所有功能,但只是用外部的 32 字节输入填充 rng 缓冲区。对于不支持 RUST rng 的平台,可以满足其他 crypto crate 对 RNG 的需求,因此 crate 可以编译。请确保输入是真实且良好的随机数。

简单调用示例

    use exrng::ExternalRng;
    use rand_core::RngCore;

    let rng_bytes:[u8;32] = [1u8;32];
    let mut rng = ExternalRng {rng_bytes,len:32};
    let mut zero = [0u8; 32];
    rng.fill_bytes(&mut zero);

我们构建此 crate 的原因

以下是在 crate schnorrkel 中提出此问题的参考。将 CryptoRng 连接到 SigningTranscript 以替换默认的 ThreadRng。例如,有 attach_rng(t,ChaChaRng::from_seed([0u8; 32])) 这样的技巧用于确定性测试。然而,我们警告不要在生产环境中这样做,因为尽管这种去随机化会产生安全的 Schnorr 签名,但我们还实现了诸如多重签名之类的协议,这些协议在去随机化后可能会变得脆弱。

// pub fn attach_rng<T,R>(t: T, rng: R) -> SigningTranscriptWithRng<T,R>
// where T: SigningTranscript, R: RngCore+CryptoRng
// {
//   SigningTranscriptWithRng {
//      t, rng: RefCell::new(rng)
//   }
// }

schnorrkel 调用示例

// rand_core = {version="0.4.2"} //!!! must 0.4.x
// let trng_bytes = slice::from_raw_parts(random, PUB_KEY_LEN);
   // let signature: Signature = keypair.sign(
//       attach_rng(
//           context.bytes(&message_bytes[..]), 
//           exrng::ExternalRng{
//               rng_bytes:ExternalRng::copy_into_array(trng_bytes),
//               len:32}
//              ));

依赖项

~63KB