HWRNG Core 注册、选择与熵注入

HWRNG Core 注册、选择与熵注入

1. Core对象

硬件driver填充struct hwrng

  • name
  • init/cleanup
  • read,或data_present/data_read
  • quality
  • list、kref和completion。

通过hwrng_register()devm_hwrng_register()加入Core。

2. /dev/hwrng

Core注册miscdevice:

1
2
3
major 10 / HWRNG_MINOR
node /dev/hwrng
fops rng_chrdev_ops

只允许read open;write返回无效。Read从当前selected RNG取原始数据,并支持O_NONBLOCK

3. 多RNG选择

Core维护rng_listcurrent_rng

  • 默认选择quality最高者;
  • 用户可写rng_current固定选择;
  • 当前RNG注销时自动切到最佳剩余源;
  • 同名RNG禁止重复注册。

Sysfs属性:

1
2
3
4
rng_available
rng_current
rng_selected
rng_quality

具体路径位于hwrng misc device对应sysfs节点。

4. Quality

quality范围0–1024,表示每1024位输入估计可credit的entropy bit数。它不是吞吐率,也不是统计测试分数。

设置过高会让内核过度信任硬件,设置为0则后台输入仍可mix但不credit。

Rockchip driver在本树声明quality=999,这是一项强信任假设,应结合硬件认证和健康检测评估。

5. 后台填充线程

选择current RNG后启动hwrng kthread:

1
2
3
4
rng_get_data(wait=1)
-> bytes * quality计算credit
-> add_hwgenerator_randomness
-> mix到内核pool并按quality credit

读取失败或无数据时使用hwrng_msleep()等待,也能被设备注销的dying completion唤醒。

6. Early Randomness

新RNG注册时,Core可能非阻塞读取32字节并调用add_device_randomness()。这只mix,不按quality直接credit。

7. 并发

  • rng_mutex:list和current选择;
  • reading_mutex:硬件read、共享buffer和data_avail;
  • kref:当前RNG跨read生命周期;
  • cleanup_done:等待最后引用cleanup;
  • dying:中断driver sleep。

Driver unregister会从list移除、切换current、停止fill线程并等待cleanup完成。

8. Driver回调

.read(rng, buf, max, wait)

  • 返回生成字节数;
  • 0表示暂时无数据;
  • 负值表示错误;
  • 不得写超过max;
  • wait=false不应长时间阻塞。

Core串行调用当前RNG read,但driver的probe/PM/error IRQ仍需自行同步。

9. PM

HWRNG Core不管理厂商clock。Driver应在read/init/cleanup或runtime PM中:

  • enable clock/power;
  • 等待ready;
  • 读取并清状态;
  • 停止generator;
  • autosuspend。

10. 故障

硬件timeout不能回退为伪随机0数据。应返回errno,使Core可停止使用或切换其它RNG。

产品还应关注:

  • 连续值检测;
  • stuck-at故障;
  • reset后重复序列;
  • 低温/低压;
  • virtualization伪造;
  • 多源是否真正独立。

文章互动

阅读 --

留言

0 条留言

正在加载留言…