1 前言
NXP厂商的IMX系列芯片支持secure boot,包括uboot和linux kernel的签名和加密。其提供了HAB工具,方便生成密钥以及使用私钥对uboot和kernel签名的操作。本文对该功能进行介绍和讲解。
2 HAB介绍
i.MX系列应用处理器在芯片上提供了HAB(High Assurance Boot)功能。ROM负责从引导介质加载初始程序映像(U-Boot),而HAB使ROM能够通过使用密码学操作对程序映像进行验证和解密。
此功能在i.MX 50、i.MX 53、i.MX 6、i.MX 7系列和i.MX 8M系列(i.MX 8M、i.MX 8MM、i.MX 8MN、i.MX 8MP设备)中受支持。对于i.MX9x芯片,NXP提供了HAB的升级版AHAB(Adanced High Assurance Boot)来对uboot和kernel签名加密。
2.1 HABv4安全引导架构
HABv4安全引导功能使用数字签名来防止在设备引导序列期间执行未经授权的软件。如果恶意软件控制了引导序列,则可能影响敏感数据、服务和网络。
HAB认证基于使用RSA算法的公钥密码学,在此过程中,镜像数据使用一系列私钥进行离线签名。然后,在i.MX处理器上使用相应的公钥验证签名后的镜像数据。公钥包含在CSF二进制文件中,SRK哈希被编程到SoC efuse中以建立信任链的根。下图说明了安全引导的流程:
要编程到引导介质中的U-Boot映像需要正确构造,即必须包含适当的命令序列文件(Command Sequence File, CSF)。
CSF是一个二进制数据结构,由HAB解释以指导认证过程,这是由代码签名工具(CST)生成的。CSF结构包含命令、SRK表、签名和证书。有关CSF的语法和细节可以在CST用户指南中找到,CST工具可在NXP官网上下载。
3 生成PKI Tree
要对uboot或kernel签名,首先需要生成私钥和公钥证书。HAB架构基于公钥基础设施树(Public Key Infrastructure (PKI) tree)。代码签名工具包含一个基于OpenSSL的密钥生成脚本,位于keys/目录下。hab4_pki_tree.sh脚本能够生成一个PKI树,其中包含最多4个超级根密钥(SRK),以及它们的下级IMG和CSF密钥。
以下是生成一个PKI tree的参考:
- Generating 2048-bit PKI tree on CST (starting from v3.1.0):
$ ./hab4_pki_tree.sh
...
Do you want to use an existing CA key (y/n)?: n
Do you want to use Elliptic Curve Cryptography (y/n)?: n
Enter key length in bits for PKI tree: 2048
Enter PKI tree duration (years): 5
How many Super Root Keys should be generated? 4
Do you want the SRK certificates to have the CA flag set? (y/n)?: y
下图为生成的PKI tree结构
运行脚本后,用户可以在keys/目录下检查私钥,并在crts/目录下找到相应的X.509v3公钥证书。这些文件将在签名和认证过程中使用。
3.1 生成SRK Table和SRK Hash
下一步是根据上述步骤中创建的SRK公钥证书生成SRK表及其相应的SRK表哈希。
在HAB架构中,SRK表包含在CSF二进制文件中,而SRK哈希则被编程到SoC的SRK_HASH[255:0]熔丝中。
在目标设备上,在认证过程中,HAB代码会将SRK表与SoC的SRK_HASH熔丝进行验证,如果验证成功,则建立了信任链的根,并且HAB代码可以继续进行镜像认证。
srktool可用于生成SRK表及其相应的SRK表哈希。
- Generating SRK Table and SRK Hash in Linux 64-bit machines:
$ ../linux64/bin/srktool -h 4 -t SRK_1_2_3_4_table.bin -e \
SRK_1_2_3_4_fuse.bin -d sha256 -c \
SRK1_sha256_2048_65537_v3_ca_crt.pem,\
SRK2_sha256_2048_65537_v3_ca_crt.pem,\
SRK3_sha256_2048_65537_v3_ca_crt.pem,\
SRK4_sha256_2048_65537_v3_ca_crt.pem
SRK_1_2_3_4_table.bin和SRK_1_2_3_4_fuse.bin文件可以在后续步骤中使用。
4 HABv4 secure boot 配置过程
4.1 构建支持安全引导的u-boot-dtb.imx映像
U-Boot提供对安全引导配置的支持,并且提供对ROM向量表显示的HAB API的访问,可以通过选择CONFIG_IMX_HAB选项来启用该支持。
使用此配置构建时,U-Boot提供了额外的HAB函数,例如通过hab_status命令检索HAB状态日志以及支持扩展信任链。
U-Boot还通过将最终镜像正确填充为下一个0xC00地址来对其进行正确的填充,以便CST生成的CSF签名数据可以连接到镜像中。
4.2 使能secure boot support
第一步是生成支持上述HAB功能的U-Boot镜像,可以通过将CONFIG_IMX_HAB添加到构建配置中来实现:
- Defconfig:
CONFIG_IMX_HAB=y
- Kconfig:
ARM architecture -> Support i.MX HAB features
4.3 生成CSF描述文件
CSF包含了HAB在安全引导期间执行的所有命令。这些命令指示HAB对镜像的哪些内存区域进行验证,安装哪些密钥,使用哪些密钥等。有关构建CSF文件的更多信息,请参阅CST包的doc目录中的CST用户指南。
CSF示例可在doc/imx/habv4/csf_examples/目录下找到。
在U-Boot构建后,包含“Authenticate Data”参数的构建日志可用。以下是针对mx7dsabresd_defconfig目标的示例日志:
- mkimage build log:
$ cat u-boot-dtb.imx.log
Image Type: Freescale IMX Boot Image
Image Ver: 2 (i.MX53/6/7 compatible)
Mode: DCD
Data Size: 667648 Bytes =