"); //-->
By Toradex 胡珊逢
简介
Arm 处理器的 Secure Boot 安全启动功能能够有效防止在设备上运行非授权的或者恶意窜改的固件。Secure Boot 系统在启动时会使用烧录的处理器上的密钥验证 Bootloader,Bootloader 会验证 kernel FIT 镜像,而 kernel 继续验证 rootfs 的有效性。这一逐个验证的流程成为 Chain of Trust。用户如果使用传统方法使用启动功能需用需要依次实现上述的每个环节。借助meta-toradex-securitylayer,只要几行简单的配置即可实现。
生成密钥
安全启动依赖于匹配的密钥对来验证软件。要启用安全启动,您需要将公钥烧录到设备的 OTP 存储器中。该密钥必须与用于签名已验证固件的私钥相匹配。
TI 设备使用三组密钥对实现安全启动:
MEK(Manufacture Encryption Key):由 TI 提供并永久烧录至 SoC 中,用于验证 TI 签名软件且不可更改。
SMPK(Secondary Manufacture Public Key):由用户创建并烧录到设备中,用于验证用户生成的引导加载程序的签名。
BMPK(Backup Manufacture Public Key):可选的用户生成备份密钥。若 SMPK 丢失或遭泄露,系统可重新配置为使用 BMPK 来验证引导加载程序的签名。
SMPK 和 BMPK 用于签名引导加载程序,因此该密钥的生成和管理必须谨慎处理,并做和完善的备份。
在写该文章时生成密钥需要使用 OpenSSL 1.1.1 版本,除非 TI 在后续新版本软件中注明,否则请使用openssl version命令查看当前系统的 OpenSSL 版本。如果本版不匹配,可以使用下面命令在 Linux 系统安装。
$ wget https://ftp.debian.org/debian/pool/main/o/openssl/
openssl_1.1.1w-0+deb11u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/o/openssl/
libssl1.1_1.1.1w-0+deb11u1_amd64.deb
$ sudo apt install ./libssl1.1_1.1.1w-0+deb11u1_amd64.deb
./openssl_1.1.1w-0+deb11u1_amd64.deb
设置环境变量。由于后续的 TI MCU SDK 和 OPT Keywriter 的编译也需要使用到这些密钥,请勿更新这些变量的参数。
$ export KEYS_DIR=~/keys/ti
$ export SMPK_NAME=custMpk
$ export BMPK_NAME=backMpk
创建密钥生成的路径。
$ mkdir -p "${KEYS_DIR}" && cd "${KEYS_DIR}"
生成 RSA-4096 的 SMPK 密钥对 SSL 证书。
$ openssl genrsa -F4 -out ${SMPK_NAME}.key 4096
$ cp ${SMPK_NAME}.key ${SMPK_NAME}.pem
$ openssl req -batch -new -x509 -key ${SMPK_NAME}.key -out ${SMPK_NAME}.crt
生成 RSA-4096 的 BMPK 密钥对 SSL 证书。
$ openssl genrsa -F4 -out ${BMPK_NAME}.key 4096
$ cp ${BMPK_NAME}.key ${BMPK_NAME}.pem
$ openssl req -batch -new -x509 -key ${BMPK_NAME}.key -out ${BMPK_NAME}.crt
生成 ti-degenerate-key。
$ openssl genrsa -F4 -out ti-degenerate-key.pem 4096
生成 AES-256 加密密钥。
$ openssl rand -out aes256.key 32
$ openssl rand -out bmek.key 32
$ openssl rand -out smek.key 32
删除密钥和证书的可写权限。
$ chmod a-w *
Yocot Project 配置
和之前的文章一样,首先需要搭建Yocto Project 编译环境。这里我们将以基于 TI AM62 SoC 的 Verdin AM62 模块为例进行介绍。在 local.conf 的结尾添加下面两行配置即可。
INHERIT += "tdx-signed"
TDX_K3_SECBOOT_TARGET_HSSE_DEVICE = "1"
在编译镜像时,用于签名启动引导程序的密钥默认从 Ycoto 编译目录的 ${TOPDIR}/keys/ti 位置寻找。可以在 Yocto 的 build 目录下创建 keys/ti 目录,将上面在 ~/keys/ti 中生成的所有文件都复制过来。在 build 目录下会有以下文件夹。
tree -L 1
.
|-- buildhistory
|-- cache
|-- conf
|-- deploy
|-- keys
|-- tmp
`-- tmp-k3r5
INHERIT可以使用tdx-signed和tdxref-signed两个参数。
tdxref-signed:生成的镜像将启用 Bootloader 签名验证、U-Boot 安全加固、FIT 镜像签名验证、Rootfs 签名验证所有功能。
tdx-signed:除"Rootfs 签名校验"外,其余功能全部启用。若无需通过 dm-verity 保护根文件系统,此类模式可能比 tdxref-signed 更适用。
用于 FIT 镜像签名的密钥位于 ${TOPDIR}/keys/ti/fit 目录下。同样建议妥善管理这些密钥。
tree keys -L 1
keys
|-- fit
`-- ti
TDX_K3_SECBOOT_TARGET_HSSE_DEVICE设置为 0 时,编译的镜像能够在没有 fuse 的 AM62 模块上运行。这通常用于前期开发测试阶段。当设置为 1 时,生成的镜像只能运行在 fused AM62 模块上。生产环节批量烧录系统时,则使用该镜像。为了后续演示整个流程,这里编译镜像时设置为 1。
然后使用 bitbake 命令编译镜像即可。整个过程就这么简单,
bitbake tdx-reference-minimal-image
编译 OTP Keywriter
AM62 SoC 借助 OTP Keywriter 固件将用于安全启动期间使用的密钥烧录到处理器的寄存器。这些寄存器是一次性烧录,且不可撤销,请谨慎操作。
编译 OTP keywriter 需要安装下面软件,其中 OTP Keywriter 需要向 TI 申请,通常数个工作日可以通过。具体下载地址参考该网页。主要注意的是,在写该文章时编译 OTP keywriter 需要使用 MCU Plus SDK v9 版本,v10 版本编译的 OTP keywriter 还无法在 AM62 上运行。安装时请使用默认安装路径,否则可能导致编译失败。
MCU Plus SDK
Code Composer Studio
SysConfig
OTP Keywriter
进入 OTP keywriter 编译目录
$ cd ~/ti/mcu_plus_sdk_am62x_09_01_00_43/source/security/
sbl_keywriter/am62x-sk/r5fss0-0_nortos
下载并打上下面补丁。
$ wget https://docs.toradex.cn/private/116128-verdin-am62v1.2-vpp.patch
$ git apply 116128-verdin-am62v1.2-vpp.patch
进入 ti-arm-clang 目录即可编译。成功后可以看到 tiboot3.bin 文件。
$ cd ~/ti/mcu_plus_sdk_am62x_09_01_00_43/source/security/
sbl_keywriter/am62x-sk/r5fss0-0_nortos/ti-arm-clang
$ make -sj clean PROFILE=debug
$ make -sj PROFILE=debug
运行 OTP Keywriter
Verdin AM62 模块上可以通过恢复模式或者从 eMMC 上加载 bootloader 并运行 OTP Keywriter 烧录密钥寄存器。恢复模式需要将 Verdin AM62 通过 USB OTG 接口连接到电脑,并在电脑上运行相关指令。Bootloader 也可以通过 Toradex Easy Installer 写入到 eMMC 上启动分区,模块上电启动后从 eMMC 加载 bootloader。前者适合开发期间使用,后者由于无需 PC,更适合于批量烧写流程。
从恢复模式加载 bootloader
在 PC 上安装 dfu-util。
$ sudo apt install dfu-util
然后运行:
$ sudo dfu-util -c 1 -i 0 -a bootloader -D tiboot3.bin
运行成功后 Verdin AM62 将从 HS-FS 变为 HS-SE 模式,即启用安全启动功能。在下一次启动时将会加载前面生成的签名镜像。
从 eMMC 加载 bootloader
Verdin AM62 的 eMMC 具有两个启动分区,mmcblk0boot0 和 mmcblk0boot1。包含 OTP Keywriter 的 tiboot3.bin bootloader 首先会被烧录在 mmcblk0boot0。常规启动的 bootloader tiboot3-am62x-hs-verdin.bin 会被烧录到 mmcblk0boot1 分区,其包含在 Yocto Project 生成的镜像中。首次启动时加载 mmcblk0boot0 上的 bootloader 运行 OTP Keywriter 完成密钥寄存器烧录。同时配置 eMMC EXTCSD register[179],将 设置 mmcblk0boot1 为默认启动分区。这样在下一次启动时,即可加载 mmcblk0boot1 上常规 bootloader,随后加载 U-boot。
MCU SDK 中已经有 MMC 的驱动,因此,只需要在 OTP Keywritter 代码中调用MMCSD_enableBootPartition()即可。在之前的 OTP Keywritter 中打上下面补丁并重新编译。
$ wget https://docs.toradex.cn/117166-verdin-am62-fuse-switch-bootpart2.patch
$ git apply 117166-verdin-am62-fuse-switch-bootpart2.patch
修改 Yocto Project 生成的签名镜像中的 image.json 文件,将原来的 "name": "mmcblk0boot0"改为 "name": "mmcblk0boot1",。
{
"name": "mmcblk0boot1",
"erase": true,
"content": {
"filesystem_type": "raw",
"rawfiles": [
{
"filename": "tiboot3-am62x-gp-verdin.bin",
"dd_options": "seek=0",
"product_ids": "0069"
在新加一个 "name": "mmcblk0boot0"分区配置,"product_ids": "0074"时需要烧录的 PID4,"filename": "tiboot3.bin"为重新编译生成的 bootloader。
{
"name": "mmcblk0boot0",
"erase": true,
"content": {
"filesystem_type": "raw",
"rawfiles": [
{
"filename": "tiboot3.bin",
"dd_options": "seek=0",
"product_ids": "0074"
}
]
}
},
烧录完成后,Verdin AM62 第一次启动时将从 HS-FS 变为 HS-SE 模式,即启用安全启动功能。在下一次启动时将会从 mmcblk0boot1 加载前面生成的签名镜像。在 Linux 系统启动后,可以删除 mmcblk0boot0 上的 bootloader 文件。
总结
借助 meta-toradex-security,用户能够轻松地使用模块的安全启动功能。更多来自 meta-toradex-security 实用功能,我们将在后续文章介绍,敬请关注。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
Arm CEO:AI智能体将推动CPU核心数升至 512
Linux内核源代码的阅读和工具介绍(aqian转)
Arm遭遇监管危机:FTC针对其技术授权启动反垄断调查
基于Linux平台的温度传感器DS18B20驱动程序设计
边缘 AI 加速的 Arm Cortex‑M0+ MCU 如何为电子产品注入更强智能
基于ARM-Linux的MiniGUI的仿真与移植
三步搞定隔离式放大器选择|隔离、供电、量程
uClinux系统分析
uClinux系统分析
Arm宣布推出Performix,为开发者带来 AI 时代必备的可扩展性能
Linux系统的DS18B20驱动程序源代码
最新ARM技术和嵌入式技术发展动态 下
Arm 宣布推出 Performix,为开发者带来 AI 时代必备的可扩展性能
人形机器人的触觉与语音能力正飞速提升
arm学习资料
WinCE+ARM开发及关键技术 下
TIP120,TIP121,TIP122,TIP125,TIP126,TIP127引脚图
AI 数据中心继续扩张,电源和光互连都在升级
ARM嵌入式软件编程经验谈
Arm财报过山车:营收创纪录,股价跌7%
倾情奉献:MSP430汇编指令集(中文),详解带实例!
WinCE+ARM开发及关键技术 上
ARM Axion 处理器加持谷歌第八代 TPU,云端全面转向智能体 AI 架构
嵌入式LINUX开发套件常见问题解答
ARM开发详解
Linux系统下USB摄像头驱动开发
ARM 展示小型低功耗上网本样品
MSP430 IAR 3.42环境使用指南(中文完整版!)
最新ARM技术和嵌入式技术发展动态 中
[转帖]NeuLinux嵌入式Linux开发平台