工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

Yocto layer 使用 TI AM62 安全啟動(dòng)功能

Yocto layer 使用 TI AM62 安全啟動(dòng)功能

簡介

Arm 處理器的 Secure Boot 安全啟動(dòng)功能能夠有效防止在設(shè)備上運(yùn)行非授權(quán)的或者惡意竄改的固件。Secure Boot 系統(tǒng)在啟動(dòng)時(shí)會(huì)使用燒錄的處理器上的密鑰驗(yàn)證 Bootloader,Bootloader 會(huì)驗(yàn)證 kernel FIT 鏡像,而 kernel 繼續(xù)驗(yàn)證 rootfs 的有效性。這一逐個(gè)驗(yàn)證的流程成為 Chain of Trust。用戶如果使用傳統(tǒng)方法使用啟動(dòng)功能需用需要依次實(shí)現(xiàn)上述的每個(gè)環(huán)節(jié)。借助meta-toradex-securitylayer,只要幾行簡單的配置即可實(shí)現(xiàn)。

生成密鑰

安全啟動(dòng)依賴于匹配的密鑰對來驗(yàn)證軟件。要啟用安全啟動(dòng),您需要將公鑰燒錄到設(shè)備的 OTP 存儲(chǔ)器中。該密鑰必須與用于簽名已驗(yàn)證固件的私鑰相匹配。

TI 設(shè)備使用三組密鑰對實(shí)現(xiàn)安全啟動(dòng):

  • MEK(Manufacture Encryption Key):由 TI 提供并永久燒錄至 SoC 中,用于驗(yàn)證 TI 簽名軟件且不可更改。

  • SMPK(Secondary Manufacture Public Key):由用戶創(chuàng)建并燒錄到設(shè)備中,用于驗(yàn)證用戶生成的引導(dǎo)加載程序的簽名。

  • BMPK(Backup Manufacture Public Key):可選的用戶生成備份密鑰。若 SMPK 丟失或遭泄露,系統(tǒng)可重新配置為使用 BMPK 來驗(yàn)證引導(dǎo)加載程序的簽名。

SMPK 和 BMPK 用于簽名引導(dǎo)加載程序,因此該密鑰的生成和管理必須謹(jǐn)慎處理,并做和完善的備份。

在寫該文章時(shí)生成密鑰需要使用 OpenSSL 1.1.1 版本,除非 TI 在后續(xù)新版本軟件中注明,否則請使用openssl version命令查看當(dāng)前系統(tǒng)的 OpenSSL 版本。如果本版不匹配,可以使用下面命令在 Linux 系統(tǒng)安裝。

$ 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

設(shè)置環(huán)境變量。由于后續(xù)的 TI MCU SDK 和 OPT Keywriter 的編譯也需要使用到這些密鑰,請勿更新這些變量的參數(shù)。

$ export KEYS_DIR=~/keys/ti $ export SMPK_NAME=custMpk $ export BMPK_NAME=backMpk

創(chuàng)建密鑰生成的路徑。

$ 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

刪除密鑰和證書的可寫權(quán)限。

$ chmod a-w *

Yocot Project 配置

和之前的文章一樣,首先需要搭建Yocto Project 編譯環(huán)境。這里我們將以基于 TI AM62 SoC 的 Verdin AM62 模塊為例進(jìn)行介紹。在 local.conf 的結(jié)尾添加下面兩行配置即可。

INHERIT += "tdx-signed" TDX_K3_SECBOOT_TARGET_HSSE_DEVICE = "1"

在編譯鏡像時(shí),用于簽名啟動(dòng)引導(dǎo)程序的密鑰默認(rèn)從 Ycoto 編譯目錄的 ${TOPDIR}/keys/ti 位置尋找。可以在 Yocto 的 build 目錄下創(chuàng)建 keys/ti 目錄,將上面在 ~/keys/ti 中生成的所有文件都復(fù)制過來。在 build 目錄下會(huì)有以下文件夾。

tree -L 1 . |-- buildhistory |-- cache |-- conf |-- deploy |-- keys |-- tmp `-- tmp-k3r5

INHERIT可以使用tdx-signed和tdxref-signed兩個(gè)參數(shù)。

  • tdxref-signed:生成的鏡像將啟用 Bootloader 簽名驗(yàn)證、U-Boot 安全加固、FIT 鏡像簽名驗(yàn)證、Rootfs 簽名驗(yàn)證所有功能。

  • tdx-signed:除"Rootfs 簽名校驗(yàn)"外,其余功能全部啟用。若無需通過 dm-verity 保護(hù)根文件系統(tǒng),此類模式可能比 tdxref-signed 更適用。

用于 FIT 鏡像簽名的密鑰位于 ${TOPDIR}/keys/ti/fit 目錄下。同樣建議妥善管理這些密鑰。

tree keys -L 1 keys |-- fit `-- ti

TDX_K3_SECBOOT_TARGET_HSSE_DEVICE設(shè)置為 0 時(shí),編譯的鏡像能夠在沒有 fuse 的 AM62 模塊上運(yùn)行。這通常用于前期開發(fā)測試階段。當(dāng)設(shè)置為 1 時(shí),生成的鏡像只能運(yùn)行在 fused AM62 模塊上。生產(chǎn)環(huán)節(jié)批量燒錄系統(tǒng)時(shí),則使用該鏡像。為了后續(xù)演示整個(gè)流程,這里編譯鏡像時(shí)設(shè)置為 1。

然后使用 bitbake 命令編譯鏡像即可。整個(gè)過程就這么簡單,

bitbake tdx-reference-minimal-image

編譯 OTP Keywriter

AM62 SoC 借助 OTP Keywriter 固件將用于安全啟動(dòng)期間使用的密鑰燒錄到處理器的寄存器。這些寄存器是一次性燒錄,且不可撤銷,請謹(jǐn)慎操作。

編譯 OTP keywriter 需要安裝下面軟件,其中 OTP Keywriter 需要向 TI 申請,通常數(shù)個(gè)工作日可以通過。具體下載地址參考該網(wǎng)頁。主要注意的是,在寫該文章時(shí)編譯 OTP keywriter 需要使用 MCU Plus SDK v9 版本,v10 版本編譯的 OTP keywriter 還無法在 AM62 上運(yùn)行。安裝時(shí)請使用默認(rèn)安裝路徑,否則可能導(dǎo)致編譯失敗。

  • MCU Plus SDK

  • Code Composer Studio

  • SysConfig

  • OTP Keywriter

進(jìn)入 OTP keywriter 編譯目錄

$ cd ~/ti/mcu_plus_sdk_am62x_09_01_00_43/source/security/ sbl_keywriter/am62x-sk/r5fss0-0_nortos

下載并打上下面補(bǔ)丁。

$ wget https://docs.toradex.cn/private/116128-verdin-am62v1.2-vpp.patch $ git apply 116128-verdin-am62v1.2-vpp.patch

進(jìn)入 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

運(yùn)行 OTP Keywriter

Verdin AM62 模塊上可以通過恢復(fù)模式或者從 eMMC 上加載 bootloader 并運(yùn)行 OTP Keywriter 燒錄密鑰寄存器。恢復(fù)模式需要將 Verdin AM62 通過 USB OTG 接口連接到電腦,并在電腦上運(yùn)行相關(guān)指令。Bootloader 也可以通過 Toradex Easy Installer 寫入到 eMMC 上啟動(dòng)分區(qū),模塊上電啟動(dòng)后從 eMMC 加載 bootloader。前者適合開發(fā)期間使用,后者由于無需 PC,更適合于批量燒寫流程。

從恢復(fù)模式加載 bootloader

在 PC 上安裝 dfu-util。

$ sudo apt install dfu-util

然后運(yùn)行:

$ sudo dfu-util -c 1 -i 0 -a bootloader -D tiboot3.bin

運(yùn)行成功后 Verdin AM62 將從 HS-FS 變?yōu)?HS-SE 模式,即啟用安全啟動(dòng)功能。在下一次啟動(dòng)時(shí)將會(huì)加載前面生成的簽名鏡像。

從 eMMC 加載 bootloader

Verdin AM62 的 eMMC 具有兩個(gè)啟動(dòng)分區(qū),mmcblk0boot0 和 mmcblk0boot1。包含 OTP Keywriter 的 tiboot3.bin bootloader 首先會(huì)被燒錄在 mmcblk0boot0。常規(guī)啟動(dòng)的 bootloader tiboot3-am62x-hs-verdin.bin 會(huì)被燒錄到 mmcblk0boot1 分區(qū),其包含在 Yocto Project 生成的鏡像中。首次啟動(dòng)時(shí)加載 mmcblk0boot0 上的 bootloader 運(yùn)行 OTP Keywriter 完成密鑰寄存器燒錄。同時(shí)配置 eMMC EXTCSD register[179],將 設(shè)置 mmcblk0boot1 為默認(rèn)啟動(dòng)分區(qū)。這樣在下一次啟動(dòng)時(shí),即可加載 mmcblk0boot1 上常規(guī) bootloader,隨后加載 U-boot。

MCU SDK 中已經(jīng)有 MMC 的驅(qū)動(dòng),因此,只需要在 OTP Keywritter 代碼中調(diào)用MMCSD_enableBootPartition()即可。在之前的 OTP Keywritter 中打上下面補(bǔ)丁并重新編譯。

$ 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"

在新加一個(gè) "name": "mmcblk0boot0"分區(qū)配置,"product_ids": "0074"時(shí)需要燒錄的 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 第一次啟動(dòng)時(shí)將從 HS-FS 變?yōu)?HS-SE 模式,即啟用安全啟動(dòng)功能。在下一次啟動(dòng)時(shí)將會(huì)從 mmcblk0boot1 加載前面生成的簽名鏡像。在 Linux 系統(tǒng)啟動(dòng)后,可以刪除 mmcblk0boot0 上的 bootloader 文件。

總結(jié)

借助 meta-toradex-security,用戶能夠輕松地使用模塊的安全啟動(dòng)功能。更多來自 meta-toradex-security 實(shí)用功能,我們將在后續(xù)文章介紹,敬請關(guān)注。

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

定制 Linux Kernel Driver 編譯示例

在 NXP i.MX 95 上運(yùn)行 Zephyr 實(shí)現(xiàn)非對稱多核處理

HDMI 顯示器熱插拔對應(yīng)顯示應(yīng)用啟停測試

Yocto meta-toradex-security layer 創(chuàng)建加密數(shù)據(jù)分區(qū)應(yīng)用說明

NXP iMX8MP ARM 平臺多屏幕克隆顯示測試