4. HAB安全启动实战
HAB(High Assurance Boot)是i.MX系列芯片ROM中固化的一段不可修改的验证代码。芯片上电后,Boot ROM首先执行,它会读取启动介质中的镜像头部,判断是否启用了安全启动。如果启用了,ROM会使用芯片内部熔丝(eFuse)中烧录的SRK哈希值来验证镜像中的CSF(Command Sequence File)签名,只有验证通过才会继续执行镜像。理解这个链条,是掌握整个安全启动流程的基础。
CSF与CST:签名机制的核心
CSF是一个二进制命令序列文件,它告诉HAB如何验证镜像。CSF中包含SRK(Super Root Key)证书、镜像的哈希值、签名值以及一系列HAB命令。CST(Code Signing Tool)是NXP提供的签名工具,它负责生成CSF文件并对镜像进行签名。CST的核心输入包括:私钥(用于签名)、SRK证书(包含公钥)、以及待签名的镜像文件。
CST的工作流程大致如下:首先,CST读取配置文件(.cst格式),该文件描述了签名算法、密钥路径、镜像路径等参数。然后,CST计算镜像的哈希值,用私钥对哈希值进行签名,生成CSF二进制文件。最后,CST将CSF附加到镜像的指定位置,形成最终的签名镜像。整个过程可以用以下命令概括:
./cst --o CSF.bin --i IMG.csf
./cst --o CSF.bin --i IMG.csf --s SRK_1_2_3_4.pem
其中,IMG.csf是配置文件,SRK_1_2_3_4.pem是私钥文件。生成的CSF.bin需要被嵌入到镜像的CSF区域中。
签名镜像的生成与烧录
生成签名镜像通常需要以下步骤:
- 准备未签名的镜像文件(如U-Boot、Kernel等)。
- 使用CST生成CSF文件。
- 将CSF文件附加到镜像的指定偏移处,形成签名镜像。
- 使用
mkimage工具为镜像添加IVT(Image Vector Table)和Boot Data结构。 - 将最终镜像烧录到启动介质(如SD卡、eMMC)的指定位置。
烧录时需要注意,签名镜像必须与芯片的启动模式匹配。例如,如果芯片设置为从SD卡启动,则镜像必须烧录到SD卡的启动分区。烧录完成后,可以通过串口查看HAB事件日志,确认验证是否通过。
HAB事件日志分析
HAB事件日志是调试安全启动问题的重要工具。芯片在验证过程中会记录一系列事件,包括验证成功、失败原因、SRK索引等。日志通常通过串口输出,格式如下:
HAB Events:
Event 0x1: SRK index 0, verified
Event 0x2: CSF signature verified
Event 0x3: Image hash verified
Event 0x4: HAB_SUCCESS
如果验证失败,日志会显示具体的错误码。例如,HAB_FAILURE表示验证失败,HAB_WARNING表示警告。常见的失败原因包括:SRK哈希不匹配、签名无效、镜像被篡改等。通过分析日志,可以快速定位问题所在。
实战中的关键注意事项
在实际操作中,有几个容易出错的点需要特别注意。第一,SRK哈希必须与eFuse中烧录的值完全一致,否则验证会直接失败。第二,CSF文件中的镜像偏移地址必须与IVT中的地址匹配,否则HAB无法找到正确的镜像区域。第三,签名算法(如RSA-2048、SHA-256)必须与芯片支持的算法一致。第四,烧录时要注意字节序和对齐要求,i.MX系列通常要求镜像按4字节对齐。
如果验证失败,可以通过以下步骤排查:首先检查串口日志中的错误码,确认是SRK不匹配还是签名无效;然后检查CSF配置文件中的路径和参数是否正确;最后确认eFuse是否已正确烧录。对于开发阶段,可以使用HAB的“开放”模式(Open Configuration)来跳过验证,方便调试。
提示:在量产阶段,务必关闭HAB的开放模式,并将SRK哈希烧录到eFuse中。一旦烧录,eFuse不可逆,因此建议先在开发板上充分验证后再进行量产烧录。
警告:错误地烧录eFuse可能导致芯片永久无法启动。在烧录SRK哈希之前,请确保私钥和证书已妥善备份,并且CSF文件已通过CST正确生成。
总结来说,HAB安全启动的核心在于“信任链”的建立:Boot ROM信任CSF中的SRK证书,CSF信任镜像的哈希值,最终形成从芯片到应用的完整验证路径。掌握CST工具的使用、CSF文件的生成、签名镜像的烧录以及HAB事件日志的分析,是每个i.MX安全启动工程师必备的技能。