热度 12
2022-8-30 12:12
4110 次阅读|
0 个评论
B y Toradex 秦海 1). 简介 由于 NXP 从 iMX8/iMX8x 处理器开始引入了 SCU/SECO 等底层控制模块来进行包含启动管理等多项底层初始化功能,因此对于 Secure Boot 功能支持,也同样升级为 Advanced High Assurance Boot (AHAB) 特性来配合,以区别于 iMX6/iMX8MM/iMX8MP 处理器所使用的 HABv4 特性; AHAB 和 HABv4 都是基于公共密钥加密 (Public Key Cryptography) 和数字签名 (Digital Signature) 技术来实现 Secure Boot 的, SCU 负责协调各个启动组件和流程, SECO 用于验证签名的 Image 文件并授权加载运行,一个简单的流程图参考如下。 本文就 基于 NXP iMX8 平台测试部署 Secure Boot 功能 。 本文所演示的平台来自于 Toradex Apalis iMX 8 嵌入式平台,这个平台是基于 近年发布的 NXP iMX 8 系列 ARM 处理器,核心为 Cortex-A 72/A53 。 2. 准备 a). Apalis iMX8 ARM 核心版配合 Ixora 载板, 并连接调试串口用于测试 。 b). 参考 这里 下载 Toradex Ycoto Linux BSP5 Image 用于后续测试,目前最新的是 5.7 版本。 3). 生成 PKI Tree 文件 a). 从 NXP 官方网站下载 Code Signing Tools 软件包(需注册),目前最新版本是 3.3.1 版本,然后解压后使用预设的脚本生成 Public Key Infrastructure (PKI) tree ,用于后面签名 U-boot/Linux Kernel Image 文件 -------------------------------- $ cp .../cst-3.3.1.tgz ~/. $ cd ~ $ tar xvf cst-3.3.1.tgz $ tree -L 1 cst-3.3.1/ cst-3.3.1/ ├── ca ├── code ├── crts ├── docs ├── keys ├── LICENSE.bsd3 ├── LICENSE.hidapi ├── LICENSE.openssl ├── linux32 ├── linux64 ├── mingw32 ├── osx ├── Release_Notes.txt └── Software_Content_Register_CST.txt -------------------------------- b). 生成 PKI TREE ./ 修改 CST 工具默认的 serial 和 key_pass ,本文因为仅测试需要则保持默认没有修改,实际应用可以根据需要自行修改以保证安全 -------------------------------- $ cd ~/cst-3.3.1/keys ### default serial number for OpenSSL certification ### $ cat serial 1234567C ### default key_pass for protection of private keys $ cat key_pass.txt test test -------------------------------- ./ 运行 CST 工具预制脚本通过交互方式生成 PKI TREE ,这里生成一个 P384 ECC SRK PKI TREE 示例,还可以选择其他选项或者生成包含下级 SGK Key 的 PKI TREE ,更多可以参考如下 U-Boot 源代码中的文档说明 https://git.toradex.cn/cgit/u-boot-toradex.git/tree/doc/imx/ahab/introduction_ahab.txt?h=toradex_imx_v2020.04_5.4.70_2.3.0 -------------------------------- ### generate P384 ECC PKI TREE ### $ ./ahab_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)?: y Enter length for elliptic curve to be used for PKI tree: Possible values p256, p384, p521: p384 Enter the digest algorithm to use: sha384 Enter PKI tree duration (years): 5 Do you want the SRK certificates to have the CA flag set? (y/n)?: n ### check generated SRK keys ### $ ls SRK * SRK1_sha384_secp384r1_v3_usr_key.der SRK2_sha384_secp384r1_v3_usr_key.pem SRK4_sha384_secp384r1_v3_usr_key.der SRK1_sha384_secp384r1_v3_usr_key.pem SRK3_sha384_secp384r1_v3_usr_key.der SRK4_sha384_secp384r1_v3_usr_key.pem SRK2_sha384_secp384r1_v3_usr_key.der SRK3_sha384_secp384r1_v3_usr_key.pem ### generate SRK Table 和 SRK Hash ### $ cd ../crts/ $ ../linux64/bin/srktool -a -s sha384 -t SRK_1_2_3_4_table.bin \ -e SRK_1_2_3_4_fuse.bin -f 1 -c \ SRK1_sha384_secp384r1_v3_usr_crt.pem,\ SRK2_sha384_secp384r1_v3_usr_crt.pem,\ SRK3_sha384_secp384r1_v3_usr_crt.pem,\ SRK4_sha384_secp384r1_v3_usr_crt.pem ### check SRK Table and SRK Hash ### $ ls SRK_* SRK_1_2_3_4_fuse.bin SRK_1_2_3_4_table.bin -------------------------------- c ). 上面最后生成的两个文件就是我们后面签名和 fuse 设备需要用到的, ”SRK_1_2_3_4_table.bin” 文件是 SRK Table ,用于签名 Container Image ; ”SRK_1_2_3_4_ fuse .bin” 文件是 SRK Hash ,用于 fuse 到 Apalis iMX8 设备的 eFuse 。更多 CST 工具使用说明可以参考如下 CST User Guide 文档 cst-3.3.1/docs/CST_UG.pdf 4). Boot Container 配置和签名 a). 参考 这里 说明下载 Toradex Ycoto Linux BSP 5.x.y 版本 U- boot 源代码, 默认配置并未使能 AHAB 功能支持,需要在 config 中使能如下选项,并重新编译生成新的 U-Boot 文件 ” u-boot.bin ” -------------------------------- → ARM architecture Support i.MX8 AHAB features -------------------------------- b). 参考上面 U-boot 源码下载编译文章以及下面参考文档,使用编译生成的 U-Boot 文件生成 Apalis iMX8 Boot Container Image 文件 ” flash.bin ” https://www.toradex.cn/blog/nxp-imx8-scfw-heboot-container-image-bian-yi c). 此时先将上一步骤生成的 “ flash.bin ” 文件重命名为 “ imx-boot ” ,然后通过 这里 的说明通过 Toradex Easy Installer 更新到 Apalis iMX8 模块并启动进入 U-Boot 命令行,通过如下命令可以查看 AHAB 功能以及使能成功,但是由于 Boot Container Image 并未签名,因此提示 “ 0xEE ” 事件。 -------------------------------- ### check AHAB enable status ### Apalis iMX8 # ahab_status Lifecycle: 0x0020, NXP closed SECO Event = 0x0087 EE 00 CMD = AHAB_AUTH_CONTAINER_REQ (0x87) IND = AHAB_NO_AUTHENTICATION_IND (0x EE ) sc_seco_get_event: idx: 1, res:3 -------------------------------- d). 通过 CST 工具对上一步骤使用 imx-mkimage 生成的 Boot Container Image “ flash.bin ” 文件进行签名 -------------------------------- ### copy boot container image file to CST tool containing folder ### $ cp .../imx-mkimage/iMX8QM/flash.bin ~/ ### copy CSF template to CST tool containing folder ### $ cp u-boot-toradex/doc/imx/ahab/csf_examples/csf_boot_image.txt ~/ ### modify csf_boot_image.txt to adopt your settings ### vi csf_boot_image.txt Target = AHAB Version = 1.0 # SRK table generated by srktool File = "./cst-3.3.1/crts/SRK_1_2_3_4_table.bin" # Public key certificate in PEM format Source = "./cst-3.3.1/crts/SRK1_sha384_secp384r1_v3_usr_crt.pem" # Index of the public key certificate within the SRK table (0 .. 3) Source index = 0 # Type of SRK set (NXP or OEM) Source set = OEM # bitmask of the revoked SRKs Revocations = 0x0 # Binary to be signed generated by mkimage File = "flash.bin" # Offsets = Container header Signature block (printed out by mkimage) Offsets = 0x400 0x590 ### sign boot container image ### ./cst-3.3.1/linux64/bin/cst -i csf_boot_image.txt -o flash_signed.bin Install SRK Authenticate data CSF Processed successfully and signed image available in flash_signed.bin -------------------------------- e ). 此时再将上一步骤签名成功的 “ flash_signed.bin ” 文件重命名为 “ imx-boot ” 并更新到 Apalis iMX8 模块上面,此时 AHAB 状态命令变化如下,因为并未将对应的 Hash 烧写到 Apalis iMX8 eFuse ,因此提示 “ 0xEA ” 事件。 -------------------------------- ### check AHAB enable status ### Apalis iMX8 # ahab_status Lifecycle: 0x0020, NXP closed SECO Event = 0x0087FA00 CMD = AHAB_AUTH_CONTAINER_REQ (0x87) IND = AHAB_BAD_KEY_HASH_IND (0xFA) sc_seco_get_event: idx: 1, res:3 -------------------------------- f). 烧写 SRK Hash ./ 签名的 Boot Container Image 文件要通过 iMX8 SOC SRK_HASH fuse 烧写的 SRK Hash 进行校验 ./ 导出 SRK HASH fuse 对应数值 -------------------------------- ### dump SRK HASH fuse value ### $ od -t x4 ~/ cst-3.3.1/crts/SRK_1_2_3_4_fuse.bin 0000000 7ef8ad2a 4a3e54b6 ffa3df87 1774beb6 0000020 6f7b4d2e a9e90a59 c5fa9ea2 55c59bf4 0000040 b55aa0b9 8b30c2ec 519814df 26a0f058 0000060 52c0edda 7e686983 4bf5f8d7 27d7727a -------------------------------- ./ 进入 Apalis iMX8 U-Boot 命令行,通过如下命令写入 fuses ,注意这些 fuses 都是一次写入的,因此请务必保证一次写入正确。另外不同的 SOC 有不同的地址,如下只适用于 iMX8QM ,如果是 iMX8X 要参考文档修改。 -------------------------------- Apalis iMX8 # fuse prog 0 722 7ef8ad2a Apalis iMX8 # fuse prog 0 72 3 4a3e54b6 Apalis iMX8 # fuse prog 0 72 4 ffa3df87 Apalis iMX8 # fuse prog 0 72 5 1774beb6 Apalis iMX8 # fuse prog 0 72 6 6f7b4d2e ... Apalis iMX8 # fuse prog 0 7 36 4bf5f8d7 Apalis iMX8 # fuse prog 0 7 37 27d7727a -------------------------------- 为了操作方便,可以将上述命令生成 U-Boot 脚本文件来执行,或者可以通过类似如下 NXP Universal Update Utility (UUU) 工具脚本来进行操作 -------------------------------- # This command will be run when ROM support stream mode # i.MX8QXP, i.MX8QM SDPS: boot -f imx-boot # refer related module tezi image recovery folder uuu.auto file CFG: FB: -vid 0x0525 -pid 0x4000 CFG: FB: -vid 0x0525 -pid 0x4025 CFG: FB: -vid 0x0525 -pid 0x402F CFG: FB: -vid 0x0525 -pid 0x4030 CFG: FB: -vid 0x0525 -pid 0x4031 SPDU: delay 1000 FB: ucmd setenv cmd 'fuse prog -y 0' FB: ucmd ${cmd} 722 0x7ef8ad2a FB: ucmd ${cmd} 723 0x.... .. ... FB: ucmd ${cmd} 737 0x27d7727a FB: done -------------------------------- e ). SRK HASH 烧写完成后, AHAB 状态命令变化如下,只有如下状态下 close 设备才是安全的,否则设备就无法启动了。 -------------------------------- ### check AHAB enable status ### Apalis iMX8 # ahab_status Lifecycle: 0x0020, NXP closed sc_seco_get_event: idx: 1, res:3 No SECO Events Found! -------------------------------- f). 更多关于此步骤的说明请参考如下文档 ./ U-Boot documentation https://git.toradex.cn/cgit/u-boot-toradex.git/tree/doc/imx/ahab/guides/mx8_mx8x_secure_boot.txt?h=toradex_imx_v2020.04_5.4.70_2.3.0 ./ NXP Application Note - AN12312 Secure Boot on i.MX 8 and i.MX 8X Families using AHAB 5). 签名包含 Linux kernel 和 D evice T ree 文件的 OS Container Image a). 此步骤为可选步骤,如果不需要 Linux Kernel Secure Boot 功能则无需操作直接 close 设备即可。 b ). 解压 Toradex Ycoto Linux BSP 5.7 Multimedia Image ,获得 LInux Kernel 和需要加载的 Device Tree 文件 -------------------------------- ### uncompress BSP Image package ### $ tar xvf Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.7.0+build.20.tar $ cd Apalis-iMX8_Reference-M ultimedia -Image-Tezi_5.7.0+build.20/ ### uncompress boot filesystem ### $ mkdir bootfs/ $ tar Jxf Reference-Minimal-Image-apalis-imx8.bootfs.tar.xz -C bootfs/ ### copy Kernel and Device Tree files to imx-mkimage tools related device folder ### $ cd bootfs/ $ gzip -d Image.gz $ cp Image imx8qm-apalis-v1.1-eval.dtb .../imx-mkimage/iMX8QM/ -------------------------------- b). 使用 imx-mkimage 工具生成 OS Container Image ./ 如下修改默认配置,将 Linux Kernel 和 Device Tree 文件的命名和加载地址修改为适合你当前设备定义的配置, Toradex U-Boot 默认配置 Kernel 加载地址为 “ 0x96000000 ” , Device Tree 加载地址为 “ 0x83000000 ” 。 -------------------------------- --- a/iMX8QM/soc.mak 2022-08-19 17:31:57.488554800 +0800 +++ b/iMX8QM/soc.mak 2022-08-22 15:15:45.393002799 +0800 @@ -140,8 +140,8 @@ flash_scfw: $(MKIMG) $(AHAB_IMG) scfw_tcm.bin ./$(MKIMG) -soc QM -rev B0 -dcd skip -append $(AHAB_IMG) -c -scfw scfw_tcm.bin -out flash.bin -flash_kernel: $(MKIMG) Image fsl-imx8qm-mek.dtb - ./$(MKIMG) -soc QM -rev B0 -c -ap Image a53 0x80280000 --data fsl-imx8qm-mek.dtb 0x83000000 -out flash.bin +flash_kernel: $(MKIMG) Image imx8qm-apalis-v1.1-eval.dtb + ./$(MKIMG) -soc QM -rev B0 -c -ap Image a53 0x96000000 --data imx8qm-apalis-v1.1-eval.dtb 0x83000000 -out flash_os.bin flash_ca72: $(MKIMG) $(AHAB_IMG) scfw_tcm.bin u-boot-atf.bin ./$(MKIMG) -soc QM -rev B0 -append $(AHAB_IMG) -c -scfw scfw_tcm.bin -ap u-boot-atf.bin a72 0x80000000 -out flash.bin -------------------------------- ./ 生成 OS Container Image 文件 “ flash_os.bin ” ,并记录生成记录最后的 IVT_OFFSET + IMAGE_OFFSET 数值用于后续 CSF 文件定义。 -------------------------------- $ cd .../imx-mkimage/ $ make SOC=iMX8QM flash_kernel ... CST: CONTAINER 0 offset: 0x0 CST: CONTAINER 0: Signature Block: offset is at 0x110 DONE. Note: Please copy image to offset: IVT_OFFSET + IMAGE_OFFSET -------------------------------- c). 使用 CST 工具签名刚才生成的 OS Container Image ./ 准备 CSF 文件 -------------------------------- ### copy CSF template to CST tool containing folder ### $ cp u-boot-toradex/doc/imx/ahab/csf_examples/csf_linux_img.txt ~/ ### modify csf_linux_img.txt to adopt your settings ### vi csf_linux_img.txt Target = AHAB Version = 1.0 # SRK table generated by srktool File = "./cst-3.3.1/crts/SRK_1_2_3_4_table.bin" # Public key certificate in PEM format Source = "./cst-3.3.1/crts/SRK1_sha384_secp384r1_v3_usr_crt.pem" # Index of the public key certificate within the SRK table (0 .. 3) Source index = 0 # Type of SRK set (NXP or OEM) Source set = OEM # bitmask of the revoked SRKs Revocations = 0x0 # Binary to be signed generated by mkimage File = "flash_os.bin" # Offsets = Container header Signature block (printed out by mkimage) Offsets = 0x0 0x110 -------------------------------- ./ 签名,获得签名好的 OS Container Image 文件 “os_cntr_signed.bin” -------------------------------- $ cp .../imx-mkimage/iMX8QM/flash_os.bin ~/ $ ./cst-3.3.1/linux64/bin/cst -i csf_linux_img.txt -o os_cntr_signed.bin -------------------------------- 6 ). 部署 OS Container Image a ). 将 OS Container Image 重新部署到刚才解压的 Ycoto Linux Multimedia BSP5.7 bootfs 中,并重新创建 bootfs 压缩包 -------------------------------- ### copy signed os container image to bsp rootfs folder ### $ cp os_cntr_signed.bin ... /Apalis-iMX8_Reference- Multimedia -Image-Tezi_5.7.0+build.20/bootfs/ ### remove default boot script and linux kernel/device tree files ### $ cd ... /Apalis-iMX8_Reference- Multimedia -Image-Tezi_5.7.0+build.20/ bootfs/ $ rm boot.scr Image *.dtb ### check bootfs files ### $ tree -L 2 . ├── dpfw.bin ├── hdmitxfw.bin ├── os_cntr_signed.bin ├── overlays │ ├── apalis-imx8_ar0521_overlay.dtbo │ ├── apalis-imx8_atmel-mxt_overlay.dtbo │ ├── apalis-imx8_hdmi_overlay.dtbo │ ├── apalis-imx8_lvds_overlay.dtbo │ ├── apalis-imx8_mezzanine-can_overlay.dtbo │ ├── apalis-imx8_mezzanine_lvds_overlay.dtbo │ ├── apalis-imx8_mezzanine_ov5640_overlay.dtbo │ ├── apalis-imx8_ov5640_overlay.dtbo │ ├── apalis-imx8_resistive-touch_overlay.dtbo │ ├── display-dpi-lt170410_overlay.dtbo │ ├── display-edt5.7_overlay.dtbo │ ├── display-edt7_overlay.dtbo │ ├── display-fullhd_overlay.dtbo │ ├── display-lt161010_overlay.dtbo │ ├── display-lt170410_overlay.dtbo │ ├── display-vga_overlay.dtbo │ └── touch-atmel-mxt_overlay.dtbo └── overlays.txt 1 directory, 21 files ### compress new bootfs package ### $ tar Jcf ../Reference-Minimal-Image-apalis-imx8.bootfs.tar.xz * ### clear bootfs $ cd .. $ rm -rf bootfs/ -------------------------------- b ). 修改 BSP package 中的 “u-boot-initial-env-sd” 文件,增加如下环境变量用于 Secure Boot ./ 命令方式格式 -------------------------------- ### set boot device info mmc 0:1 ### Apalis iMX8 # setenv pre_boot 'devnum=0; if mmc dev ${devnum}; then devtype=mmc; setenv load_cmd \"load ${devtype} ${devnum}:1\"; fi' ### signed os container image loading info ### Apalis iMX8 # setenv cntr_addr '0x98000000' Apalis iMX8 # setenv cntr_file 'os_cntr_signed.bin' Apalis iMX8 # setenv cntr_load '${load_cmd} ${cntr_addr} ${cntr_file}' ### authenticate signed os container image ### Apalis iMX8 # setenv auth_os 'auth_cntr ${cntr_addr}' ### device tree overlay apply ### Apalis iMX8 # setenv overlays_file 'overlays.txt' Apalis iMX8 # setenv overlays_prefix 'overlays/' Apalis iMX8 # setenv load_overlays_file '${load_cmd} ${loadaddr} ${overlays_file} && env import -t ${loadaddr} ${filesize}' Apalis iMX8 # setenv fdt_resize 'fdt addr ${fdt_addr_r} && fdt resize 0x20000' Apalis iMX8 # s etenv apply_overlays 'for overlay_file in ${fdt_overlays}; do echo Applying Overlay: ${overlay_file} && ${load_cmd} ${loadaddr} ${overlays_prefix}\${overlay_file} && fdt apply ${loadaddr}; env set overlay_file; done; true' Apalis iMX8 # setenv bootcmd_overlays 'run load_overlays_file && run fdt_resize && run apply_overlays' ### kernel/dtb loading ### Apalis iMX8 # setenv bootcmd_boot 'echo "Bootargs: \${bootargs}" && booti ${kernel_addr_r} - ${fdt_addr_r}' ### config for all boot process ### Apalis iMX8 # setenv bootcmd_run 'run pre_boot && run cntr_load && run auth_os && run bootcmd_overlays && run finduuid && run setup && run bootcmd_boot; echo "Booting from ${devtype} failed!" && false' ### auto run config ### Apalis iMX8 # setenv bootcmd 'run bootcmd_run' -------------------------------- ./ 文件方式定义 -------------------------------- --- a /u-boot-initial-env-sd 2022-08-29 17:22:27.668166883 +0800 +++ b/ u-boot-initial-env-sd 2022-08-29 17:52:18.795402902 +0800 @@ -1,4 +1,4 @@ -bootcmd=run distro_bootcmd +bootcmd=run bootcmd_run bootdelay=1 baudrate=115200 ipaddr=192.168.10.2 @@ -71,4 +71,16 @@ video=imxdpufb5:off video=imxdpufb6:off video=imxdpufb7:off setup=run loadhdp; hdp load ${hdp_addr}; run mmcargs defargs=pci=nomsi - +pre_boot=devnum=0; if mmc dev ${devnum}; then devtype=mmc; setenv load_cmd "load ${devtype} ${devnum}:1"; fi +cntr_addr=0x98000000 +cntr_file=os_cntr_signed.bin +cntr_load=${load_cmd} ${cntr_addr} ${cntr_file} +auth_os=auth_cntr ${cntr_addr} +overlays_file=overlays.txt +overlays_prefix=overlays/ +load_overlays_file=${load_cmd} ${loadaddr} ${overlays_file} && env import -t ${loadaddr} ${filesize} +fdt_resize=fdt addr ${fdt_addr_r} && fdt resize 0x20000 +apply_overlays=for overlay_file in ${fdt_overlays}; do echo Applying Overlay: ${overlay_file} && ${load_cmd} ${loadaddr} ${overlays_prefix}${overlay_file} && fdt apply ${loadaddr}; env set overlay_file; done; true +bootcmd_overlays=run load_overlays_file && run fdt_resize && run apply_overlays +bootcmd_boot=echo "Bootargs: ${bootargs}" && booti ${kernel_addr_r} - ${fdt_addr_r} +bootcmd_run=run pre_boot && run cntr_load && run auth_os && run bootcmd_overlays && run finduuid && run setup && run bootcmd_boot; echo "Booting from ${devtype} failed!" && false -------------------------------- c). 需要注意的是由于 Kernel 阶段的 Secure Boot 相关认证和加载都是基于 U-Boot 命令行来实现的, 因此如果要让这个启动机制更加安全可靠,则要让 U-Boot 保持在上述安全启动路径,而不能通过其他启动介质或者脚本来启动而绕开 Secure Boot ,比如 Toradex U-Boot 默认是使能 Distro Boot 功能的,可以自动扫描外设介质的启动脚本,那么这个功能就需要关闭掉,类似这样的 U-Boot 定制化需要自行根据实际使用场景来配置。 7 ). 部署 测试 a). 参考 这里 将上述制作的支持 Secure Boot 的 Image 通过 Toradex Easy Installer 更新到 Apalis iMX8 模块 ./ 启动后首先进入 U-Boot 命令行下,测试 AHAB 状态 -------------------------------- Apalis iMX8 # ahab_status Lifecycle: 0x0020, NXP closed sc_seco_get_event: idx: 0, res:3 No SECO Events Found! -------------------------------- ./ 然后重新启动,查看启动 log , Secure Boot 成功完整加载 U-Boot 、 Linux Kernel 和 Rootfs -------------------------------- U-Boot 2020.04-06964-g33bb8e9683 (Aug 15 2022 - 15:32:22 +0800) CPU: NXP i.MX8QM RevB A53 at 1200 MHz DRAM: 4 GiB MMC: FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2 Loading Environment from MMC... OK In: serial Out: serial Err: serial Model: Toradex Apalis iMX8 QuadMax 4GB Wi-Fi / BT IT V1.1B, Serial# 06738378 BuildInfo: - SCFW 216a2c2e, SECO-FW c9de51c0, IMX-MKIMAGE fe124bce, ATF 2fa8c63 - U-Boot 2020.04-06964-g33bb8e9683 switch to partitions #0, OK mmc0(part 0) is current device flash target is MMC:0 Net: eth0: ethernet@5b040000 Fastboot: Normal Normal Boot Hit any key to stop autoboot: 0 switch to partitions #0, OK mmc0(part 0) is current device 25877504 bytes read in 787 ms (31.4 MiB/s) Authenticate OS container at 0x98000000 43 bytes read in 12 ms (2.9 KiB/s) Applying Overlay: apalis-imx8_hdmi_overlay.dtbo 2177 bytes read in 31 ms (68.4 KiB/s) 106496 bytes read in 16 ms (6.3 MiB/s) Loading hdp firmware from 0x000000009c000000 offset 0x0000000000002000 Loading hdp firmware Complete Bootargs: console=ttyLP1 earlycon,115200 root=PARTUUID=e8daf485-02 rootwait mmcdev=0 ## Flattened Device Tree blob at 83000000 Booting using the fdt blob at 0x83000000 Loading Device Tree to 00000000fd5fc000, end 00000000fd648fff ... OK Starting kernel ... Booting Linux on physical CPU 0x0000000000 Linux version 5.4.193-5.7.0+git.f78299297185 (oe-user@oe-host) (gcc version 9.2 ... Started Start a wayland application. Reached target Multi-User System. Reached target Graphical Interface. Starting Update UTMP about System Runlevel Changes... Started Update UTMP about System Runlevel Changes. TDX Wayland with XWayland 5.7.0+build.20 (dunfell) apalis-imx8-06738378 ttyLP1 Apalis-iMX8_Reference-Multimedia-Image apalis-imx8-06738378 login: -------------------------------- b). Close 设备 经过上述测试已经确认从 U-Boot 到 Linux Kernel Secure Boot 正常,即可以在 U-Boot 命令行下面执行下面命令 Close 设备,请注意此操作之后,没有签名的 Image 就无法再在此模块加载运行了,因此请谨慎操作。 -------------------------------- Apalis iMX8 # ahab_close -------------------------------- 10 ). 总结 本文 基于 NXP iMX8 处理器演示了基于 AHAB 的 Secure Boot 功能,设计 U-Boot 和 Linux Kernel 、 Device Tree 等,至于 Rootfs 的加密,则需要配置类似 Squashfs 只读文件系统配合 initramfs 最小启动镜像进行加解密挂载启动,可以结合参考如下两篇文章,本文不做具体测试。 ./ 嵌入式 ARM 平台使用 dm-crypt 加密磁盘分区 ./ 使用 Squashfs 和 Overlayfs 提高嵌入式 Linux 文件系统可靠性 参考文档 https://git.toradex.cn/cgit/u-boot-toradex.git/tree/doc/imx/ahab/introduction_ahab.txt?h=toradex_imx_v2020.04_5.4.70_2.3.0 https://git.toradex.cn/cgit/u-boot-toradex.git/tree/doc/imx/ahab/guides/mx8_mx8x_secure_boot.txt?h=toradex_imx_v2020.04_5.4.70_2.3.0 NXP Application Note AN12312 Secure Boot on i.MX 8 and i.MX 8X Families using AHAB