1个不稳定版本
0.1.0 | 2024年1月19日 |
---|
#1515 在 加密学
29KB
492 行
RP2040熵源
这是一个为RP2040设计的随机数生成器。它需要一个硬件组件,即一个GPIO引脚和地之间的电容器。它应被视为一个概念验证,在使用有后果的应用程序之前需要进一步分析。
这是基于Peter Allan的twocent,组件和引脚数量减半。
最终程序将使用带有custom
特性的getrandom
,请参阅rand示例。
caprand::setup(&mut p.PIN_10).expect("RNG setup failed");
getrandom::register_custom_getrandom!(caprand::random);
// ...
let mut key = [0u8; 32];
getrandom::getrandom(&key).unwrap();
操作
GPIO引脚和地之间有一个电容器。电容器通过GPIO引脚拉低(1周期)进行短暂放电,然后RP2040内部上拉该引脚再次将电容器拉高。它在一个紧密的循环中旋转,等待引脚读取为“高”输入。
测量时间以精确的系统时钟周期(默认为125MHz),以5位(受寄存器数量的限制)的突发形式进行。上拉时间低阶部分输出为噪声样本。将样本哈希在一起形成种子,该种子用于ChaCha20密码学DRBG。
安全性
噪声源尚未得到充分量化。经验测试似乎表明每个样本1-2位。作为权宜之计,它采用每比特输出100个噪声样本,将25600个输入噪声样本哈希在一起以初始化DRBG。
(来自usbnoise示例的典型25600个样本)
应用基本健康测试(自适应比例和重复)。
硬件方案没有防止局部干扰的保护(类似于RP2040本身)。
硬件
测试是在一个Pico W板上进行的,使用一个10nF Y5V SMD芯片电容器焊接在GP10焊盘和相邻的GND焊盘之间。其他电容器值也应该可以正常工作 - 测试了100nF,1nF可能也可以工作。
示例
示例必须使用--features defmt
构建。
rand像正常程序一样使用getrandom。
usbnoise将原始样本作为十六进制值输出,作为USB串行设备
sernoise将原始样本作为十六进制值输出,通过rp2040 uart
依赖关系
~12–22MB
~316K SLoC