#secure-random #rp2040 #random #getrandom #gpio-pin

caprand

基于时序电容上拉的RP2040安全随机数生成器

1个不稳定版本

0.1.0 2024年1月19日

#1515加密学

0BSD 许可

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。

Oscilloscope capture

安全性

噪声源尚未得到充分量化。经验测试似乎表明每个样本1-2位。作为权宜之计,它采用每比特输出100个噪声样本,将25600个输入噪声样本哈希在一起以初始化DRBG。

A 160x160 random square
(来自usbnoise示例的典型25600个样本)

应用基本健康测试(自适应比例和重复)。

硬件方案没有防止局部干扰的保护(类似于RP2040本身)。

硬件

测试是在一个Pico W板上进行的,使用一个10nF Y5V SMD芯片电容器焊接在GP10焊盘和相邻的GND焊盘之间。其他电容器值也应该可以正常工作 - 测试了100nF,1nF可能也可以工作。

RP Pico with capacitor

示例

示例必须使用--features defmt构建。

rand像正常程序一样使用getrandom。

usbnoise将原始样本作为十六进制值输出,作为USB串行设备

sernoise将原始样本作为十六进制值输出,通过rp2040 uart

依赖关系

~12–22MB
~316K SLoC