RK3588 Rockchip TRNG 驱动

RK3588 Rockchip TRNG 驱动

1. 匹配

hw_random/rockchip-rng.c支持四类硬件:

Compatible 实现
rockchip,cryptov1-rng Crypto V1内嵌TRNG
rockchip,cryptov2-rng Crypto V2 RNG window
rockchip,trngv1 独立TRNG V1
rockchip,rkrng 新RKRNG/DRNG接口

RK3588节点使用rockchip,trngv1

2. DTS

SoC定义:

1
2
3
4
5
6
7
8
rng: rng@fe378000 {
compatible = "rockchip,trngv1";
reg = <0x0 0xfe378000 0x0 0x200>;
interrupts = <GIC_SPI 400 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&scmi_clk SCMI_HCLK_SECURE_NS>;
resets = <&scmi_reset SRST_H_TRNG_NS>;
status = "disabled";
};

rk3588-linux.dtsi和Android include将其设为okay。最终板级是否启用取决于实际include和运行DTB。

驱动当前使用MMIO、clock和polling;DTS IRQ/reset属性没有被此文件显式获取。

3. Probe

1
2
3
4
5
6
7
8
9
rk_rng_probe
-> match SoC data
-> devm_of_iomap
-> adjust legacy Crypto V2 offset if needed
-> devm_clk_bulk_get_all
-> setup hwrng(name="rockchip", quality=999)
-> enable runtime PM/autosuspend 100ms
-> devm_hwrng_register
-> optional hardware init under PM reference

每次read通过runtime PM启用clock,结束后mark last busy并autosuspend。

4. TRNG V1初始化

trng_v1_init()

  • 校验VERSION为0x46bc
  • 检查seeded/generating/reseeding;
  • 必要时poll到仅SEEDED;
  • 清ISTAT;
  • 设置auto reseed count 1000。

源码对某次poll返回值没有用于终止后续初始化,调试seed异常时应关注状态是否实际稳定。

5. 读取

trng_v1_read()

  1. 清旧ISTAT;
  2. 选择256-bit mode;
  3. 发RAND命令;
  4. udelay 10us;
  5. 若未ready,poll最多50ms;
  6. 最多读取32字节RAND0–RAND7;
  7. 清status并写NOP停止。

Core请求超过32字节时,外层rk_rng_read()循环多次生成。

6. 寄存器字节序

rk_rng_read_regs()对每个32-bit结果执行be32_to_cpu()。这表示driver按硬件输出字节序重新排列,再写入用户buffer;跨平台统计时不要直接拿寄存器dump与/dev/hwrng字节串逐字节比较。

7. Runtime PM

  • resume:bulk enable clocks;
  • suspend:bulk disable/unprepare;
  • system sleep:pm_runtime_force_suspend/resume

Read用pm_runtime_get_sync(),失败时put_noidle();正常完成put_sync_autosuspend()

8. 超时

Poll周期100us、总超时50ms。Timeout返回负errno并关闭生成器。若/dev/hwrng卡顿:

  • 查secure clock;
  • 查SCMI reset/firmware;
  • 查TRNG version/status;
  • 查runtime PM;
  • 查安全世界是否占用;
  • 查低频/电源域。

9. 安全评估

quality=999使后台线程几乎按满熵credit。产品应确认:

  • 硬件有在线健康测试;
  • secure firmware正确初始化;
  • reset后不会重复输出;
  • 多核并发由Core reading mutex串行;
  • 故障不会返回全0;
  • bootloader seed和TRNG不会共享可预测状态。

10. 运行验证

1
2
3
4
5
cat /sys/class/misc/hw_random/rng_available
cat /sys/class/misc/hw_random/rng_current
dd if=/dev/hwrng bs=32 count=4 2>/dev/null | hexdump -C
cat /proc/sys/kernel/random/entropy_avail
dmesg | grep -i rng

统计测试只能发现部分明显故障,不能证明密码学安全。

文章互动

阅读 --

留言

0 条留言

正在加载留言…