3. 安全启动链的密码学基础

NVIDIA DRIVE 的安全启动并不是“把固件加密后烧进芯片”这么简单,它本质上是一条由密码学原语串起来的信任链:每一级固件在被执行前,都要先证明自己确实由可信方签发、内容未被篡改,然后才有资格去验证下一级。理解这条链,需要先掌握四类基础机制——非对称签名与验签、哈希链、证书链、密钥派生与密钥封装,再看它们如何映射到 DRIVE 的实际启动阶段。

一、非对称签名与验签:信任的起点

非对称密码使用一对密钥:私钥签名、公钥验签。签名过程并不直接对整段固件做运算,而是先对固件做哈希,得到固定长度的摘要,再用私钥对摘要签名。验签方用公钥解出摘要,并自行对固件重新哈希,两者一致才通过。这样做的关键收益是:签名长度固定、计算量可控,且任何 1 bit 改动都会导致摘要雪崩式变化。

在 DRIVE 上,常见的算法组合是 ECDSA P-256 配 SHA-256,或 RSA-3072/4096 配 SHA-384。以 ECDSA P-256 为例,签名约 64 字节(r、s 各 32 字节),公钥约 64 字节,非常适合写入芯片内的一次性可编程(OTP)区域或只读 ROM。验签时若使用 SHA-256,摘要为 32 字节,签名验证失败通常意味着三种情况之一:固件被改动、签名与公钥不匹配、或签名本身格式/曲线参数错误。

验签失败不要急于怀疑“密钥烧错了”。先确认哈希算法、曲线、签名编码(DER 还是 raw r||s)三者是否与签名端一致,这三项不一致是工程中最常见的失败原因。

二、哈希链:把每一级固件“锁”在一起

哈希链解决的是“下一级固件是否可信”的问题。做法是:上一级固件中保存下一级固件的哈希值(或哈希的签名),启动时先计算下一级固件的实际哈希,与保存值比对,一致才跳转执行。这样,信任从不可变的 BootROM 开始,逐级向下传递,任何一级被替换都会在进入前被拦截。

哈希链有两种常见形态:一种是“哈希表”,即一级固件里存多个组件的哈希;另一种是“链式”,即 A 的哈希签在 B 里,B 的哈希签在 C 里。DRIVE 的启动通常混合使用:BootROM 验证引导加载程序,引导加载程序再验证多个固件分区。哈希链的价值在于它把“完整性”变成了可传递的属性,而不是每级各自为政。

三、证书链:让公钥本身也可信

如果每一级固件都直接内置下一级的公钥,密钥管理会非常僵硬。证书链用“根证书—中间证书—叶证书”的层级解决这个问题:根公钥固化在芯片中,根私钥离线保存;根签发中间证书,中间证书再签发具体固件的叶证书。验签时,从叶证书逐级向上验证签名,直到根公钥。

在 DRIVE 启动中,证书链通常与签名一起打包成签名头(signed header),包含叶证书、中间证书、签名和元数据。BootROM 只信任根公钥,其余公钥通过证书链动态获得。这样,即使某台设备的中间密钥泄露,也只需吊销对应中间证书,而不必更换芯片内的根密钥。

四、密钥派生与密钥封装:从根密钥到会话密钥

安全启动不仅验证“能不能启动”,还要为后续的加密启动、安全存储、TEE 提供密钥。密钥派生(KDF)用根密钥和上下文信息(如芯片唯一 ID、固件版本、用途标签)派生出不同用途的子密钥。常见做法是 HKDF-SHA256:先提取(Extract)再扩展(Expand),保证不同用途的密钥相互独立。

密钥封装(Key Wrap)则用于保护密钥本身。例如用 AES-KW 把固件加密密钥封装后随镜像分发,设备端用派生出的密钥解封。这样,即使镜像被复制到另一台设备,由于芯片唯一 ID 不同,派生密钥不同,也无法解封。密钥派生与封装把“信任”从启动阶段延伸到了运行阶段。

NVIDIA DRIVE 安全启动链的密码学映射 启动阶段 BootROM 固化根公钥 引导加载程序 BL / MB1 固件分区 TEE / 安全OS 操作系统 Linux / QNX 应用与容器 运行时 密码学机制 非对称签名与验签 ECDSA P-256 / RSA-3072 + SHA-256/384 私钥签名 → 公钥验签,摘要比对 哈希链 上一级保存下一级哈希,逐级比对 任何 1 bit 改动 → 摘要雪崩 证书链 根证书 → 中间证书 → 叶证书 根公钥固化,其余动态验证 密钥派生与密钥封装 HKDF-SHA256 派生用途子密钥 AES-KW 封装固件加密密钥 信任锚 芯片 OTP / ROM 中的根公钥与根密钥 验证与结果 通过 摘要一致,签名有效 跳转执行下一级 失败 摘要不匹配 / 签名无效 停止启动,进入恢复模式 常见失败原因 哈希算法不一致 曲线/签名编码不匹配 密钥用途 加密启动 / 安全存储 TEE 会话密钥 信任从 BootROM 根公钥逐级向下传递,任一级失败即终止启动

五、映射到 DRIVE 启动流程

把上述机制放到 DRIVE 的实际启动顺序中,可以看到清晰的对应关系。BootROM 是信任根,内部固化根公钥和根密钥,它首先验证引导加载程序(BL/MB1)的签名头。签名头里包含叶证书、中间证书和签名,BootROM 用根公钥验证证书链,再用叶公钥验证 BL 的哈希签名。通过后,BL 获得执行权。

BL 接着验证多个固件分区,包括 TEE、安全 OS、Hypervisor 等。这里通常使用哈希表:BL 中保存各分区的哈希,逐个计算比对。同时,BL 会利用根密钥和芯片唯一 ID 通过 HKDF 派生出加密启动所需的密钥,并用 AES-KW 解封固件加密密钥,对加密镜像解密后再验签。这样,机密性和完整性同时得到保障。

进入操作系统后,安全启动的成果继续被使用:TEE 用派生出的会话密钥与安全世界通信,安全存储用另一组子密钥加密数据。整个链条中,任何一级验签失败都会导致启动终止,设备进入恢复模式,并可通过串口日志或调试接口读取失败原因。

六、工程实践中的关键参数与判断

在实际调试中,以下参数和判断点最值得关注:

环节关键参数/对象判断依据
BootROM 验签根公钥、叶证书、签名算法证书链可回溯到根,签名验证通过
BL 验证分区分区哈希表、哈希算法实际哈希与表中值一致
密钥派生芯片唯一 ID、用途标签、HKDF 盐派生密钥可解封对应镜像
加密启动AES-KW 封装密钥、加密镜像解封成功且解密后验签通过
失败处理恢复模式、日志接口能定位到具体失败级别
密钥派生时,用途标签和盐必须与签名端严格一致。工程中曾出现因标签字符串大小写不同导致派生密钥不一致、解封失败的情况,这类问题不会在签名验证阶段暴露,只会在解密时表现为乱码或校验失败。

理解这四类机制及其映射关系后,就能在遇到启动失败时快速定位:是签名算法不匹配、哈希链断裂、证书链过期,还是密钥派生上下文错误。安全启动的可靠性,正来自这些密码学原语在每一级启动中的严格、一致执行。