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

TI 設(shè)備使用三組密鑰對(duì)實(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ù)新版本軟件中注明,否則請(qǐng)使用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 的編譯也需要使用到這些密鑰,請(qǐng)勿更新這些變量的參數(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 密鑰對(duì) 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 密鑰對(duì) 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ā)測(cè)試階段。當(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)期間使用的密鑰燒錄到處理器的寄存器。這些寄存器是一次性燒錄,且不可撤銷,請(qǐng)謹(jǐn)慎操作。

編譯 OTP keywriter 需要安裝下面軟件,其中 OTP Keywriter 需要向 TI 申請(qǐng),通常數(shù)個(gè)工作日可以通過。具體下載地址參考該網(wǎng)頁。主要注意的是,在寫該文章時(shí)編譯 OTP keywriter 需要使用 MCU Plus SDK v9 版本,v10 版本編譯的 OTP keywriter 還無法在 AM62 上運(yùn)行。安裝時(shí)請(qǐng)使用默認(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ù)文章介紹,敬請(qǐng)關(guān)注。

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

提交

查看更多評(píng)論
其他資訊

查看更多

定制 Linux Kernel Driver 編譯示例

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

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

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

NXP iMX8MP ARM 平臺(tái)多屏幕克隆顯示測(cè)試