STM32H5 OEMiROT 之體驗(yàn)
01 前言
本文引用地址:http://butianyuan.cn/article/202402/455435.htm本文檔通過(guò)一個(gè)動(dòng)手實(shí)驗(yàn), 詳細(xì)演示了如何在 STM32H563 上運(yùn)行一個(gè) OEMiROT 的功能. 旨在針對(duì)那些 OEM 想自己實(shí)現(xiàn)一個(gè)基于 STM32H563 上的 iROT 功能而又不知如何開(kāi)始的開(kāi)發(fā)者.
02 準(zhǔn)備工作
開(kāi)發(fā)板 : NUCLEO-H563ZI
軟件包 : STM32Cube_FW_H5_V1.1.0
工具:
? STM32CubeProgrammer v2.14.0
? Tera Term 串口終端顯示
? Trust Package Creator(安裝 STM32CubeProgrammer 時(shí)一并安裝, 注意勾選)
IDE: STM32CubeIDE v1.13.0
03 燒錄 OEMiROT 固件并運(yùn)行
3.1. 腳本環(huán)境配置板編程基礎(chǔ)
本動(dòng)手實(shí)驗(yàn)基于 STM32CubeH5 固件包, 此包必須位于一個(gè)沒(méi)有中文且沒(méi)有空格的路徑下, 于是我們將此包拷貝到 C:workspace 目錄, 在此包路徑 STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_Provisioning 目錄下有一個(gè) env.bat 文件, 用文本編輯器(如記事本)打開(kāi)此文件:
檢查上面兩行, STM32CubeProgrammer_CLI.exe, 以及 STM32TrustedPackageCreator_CLI.exe 這兩個(gè)工具的安裝路徑是否跟你電腦中的安裝路徑符 合, 如果不符, 則需要進(jìn)行相應(yīng)的修改.
3.2. 運(yùn)行 OEMiROT 預(yù)配置(provisioning)腳本
再進(jìn)入到 cube 包下的目錄 STM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningOEMiROT 目錄下, 有一個(gè)名為 provisioning.bat 的腳本, 雙擊運(yùn)行它:
如上圖, 系統(tǒng)會(huì)自動(dòng)打開(kāi)一個(gè) DOS 命令終端窗口, 在此動(dòng)手實(shí)驗(yàn)過(guò)程中, 如無(wú)特別說(shuō)明, 此窗口將一直保持, 我們將通過(guò)此窗口的提示信息進(jìn)行每一步的操作.
如上圖, 信息提示我們打開(kāi)TrustedPackageCreator 工具, 生成 OEMiROT_Config.obk 文件.
3.3. 生成 OEMiROT_Config.obk
打開(kāi) TrustedPackageCreator 工具:
如上圖, 在最左邊 ①處點(diǎn)擊 “H5”, 然后在②處選項(xiàng)”O(jiān)BKey”, 接下來(lái)在③處選擇STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningOEMiROTConfig 目錄下的 OEMiRoT_Config.xml 文件, 此文件為生成 OEMiROT 對(duì)應(yīng) obk 文件的配置文檔. 然后下面會(huì)顯示 3 個(gè)密鑰對(duì), 從上到下分別為 :
? OEMiRoT_Authentication_S.pem: Secure APP 對(duì)應(yīng)的認(rèn)證密鑰(使用公鑰)
? OEMiRoT_Authentication_NS.pem: Non Secure APP 對(duì)應(yīng)的認(rèn)證密鑰(使用公鑰)
? OEMiRoT_Encryption.pem : Secure APP+Non Secure APP 固件加密密鑰對(duì)應(yīng)的解包密鑰(使用私鑰)
這三個(gè)密鑰其實(shí)都是成對(duì)的, 即公鑰私鑰對(duì). 位于 Keys 目錄下. STM32CubeH5 包下已經(jīng)自帶了默認(rèn)的密鑰對(duì), 如果你不想使用默認(rèn)的, 則可以點(diǎn)擊上圖中的4中的 “Regenerate” 重新生成這三個(gè)密鑰對(duì). 一旦重新生成, 則需要注意保存這三個(gè)密鑰對(duì).
接下來(lái)就要生成 OEMiROT 對(duì)應(yīng)的 obk 文件了, 在右邊的輸出路徑下, 選擇一個(gè)路徑, 比如Binary 目錄. 最后點(diǎn)擊生成. 則將在 Binary 目錄下生成 OEMiRoT_Config.obk 文件.
3.4. 生成 DA 對(duì)應(yīng)的 obk 文件
回到腳本終端窗口, 輸入回車(chē)鍵 :
如上圖, 提示你通過(guò) TPC 工具生成 DA_Config.obk 文件. 有關(guān)如何生成 DA_Config.obk 文件,之前已有其它文檔講述, 且 STM32CubeH5 包下STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningDABinary 此目錄中已經(jīng)有現(xiàn)存的 DA 對(duì)應(yīng)的 obk 文件, 其對(duì)應(yīng)的私鑰和證書(shū)分別位于上一級(jí)目錄下的 Keys 目錄和 Certificates 目錄下, 這些文件均可直接使用, 所以這里不再重復(fù)講述它們的生成過(guò)程.
直接按下回車(chē)鍵..
3.5. 編譯 OEMiROT_Boot 工程
如上圖, 提示用戶打開(kāi) OEMiROT_Boot 工程并編譯.
于是用 STM32CubeIDE 打開(kāi)工程, 路徑為: STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIApplicationsROTOEMiROT_BootSTM32CubeIDE 目錄下, 編譯過(guò)后,會(huì)在工程下的 Binary 目錄下生成 OEMiROT_Boot.bin 文件.
再回到終端窗口按下回車(chē)鍵…
3.6. 編譯 OEMiROT_Appli_TrustZone 工程
用 STM32CubeIDE 打開(kāi)工程: STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIApplicationsROTOEMiROT_Appli_TrustZoneSTM32CubeIDE
此工程下有兩個(gè)子工程 :
如上圖所示, 先編譯 Secure 工程, 再編譯 NonSecure 工程. 編譯通過(guò)后, postbuild 腳本會(huì)在Binary 目錄下生成原始 bin 文件和加密后的固件.
原始 bin 文件是用來(lái)初始安裝的, 而加密后的固件是用來(lái)做升級(jí)的. 加密和簽名過(guò)程正是postbuild 腳本來(lái)實(shí)現(xiàn)的, 其對(duì)應(yīng)的固件加密密鑰是此次編譯過(guò)程中腳本隨機(jī)產(chǎn)生的密鑰. 此密鑰會(huì)通過(guò) 3.3 節(jié)中所產(chǎn)生的 OEMiRoT_Encryption.pem 對(duì)應(yīng)的公鑰來(lái)進(jìn)行打包并放入 header 中.而簽名所用的私鑰并正是 3.3 節(jié)中所產(chǎn)生的 OEMiRoT_Authentication_S.pem 私鑰, 它對(duì)應(yīng)Secure 工程簽名, OEMiRoT_Authentication_NS.pem 則對(duì)應(yīng) Non Secure 工程簽名.
3.7. 手動(dòng)生成加密且簽名的映像文件(可選)
除了通過(guò) postbuild 腳本來(lái)自動(dòng)生成固件加密且簽名的映像文件外, 你也可以通過(guò)手動(dòng)的方式來(lái)生成它.如下圖, 我們可通過(guò) TPC 手動(dòng)將原始 bin 文件加密且簽名.
如上圖, 打開(kāi) TPC, 左邊①處選擇 “H5”, 然后在②處選擇”Image Gen”, 在③處輸入配置文件 : STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningOEMiROTImages OEMiROT_S_Code_Image.xml. 然后在Firmware area size 處保持默認(rèn)的 0x6000, version :1.0.0, Firmware binary input file 處導(dǎo)入S App 生成的明文固件映像. Image Out File 處即可生成的加密且簽名的固件。加密的密鑰是隨機(jī)的, 它通過(guò)打包進(jìn) header 中, 如之前描述. 這就是手動(dòng)生成加密且簽名的固件映像方法. 由于App 工程的 postbuild 腳本會(huì)自動(dòng)完成, 所以, 這一步驟并不是必須的.
此外需要注意地是, 在 STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningOEMiROTImages 目錄下還有其它幾個(gè)用來(lái)手動(dòng)生成加密簽名映像的配置文件, 如下圖所示 :
通過(guò)這幾個(gè)文件名, 顧名思義, 分別對(duì)應(yīng)著 Secure App 的固件, 數(shù)據(jù), NonSecure App 的固件,數(shù)據(jù)映像, 如果需要手動(dòng)生成這四種加密且簽名的映像文件, 則通過(guò) TPC 手動(dòng)導(dǎo)入對(duì)應(yīng)的 xml配置文件. 在 Firmware binary input file 輸入原始 bin 文件, 在 Image Out File 處輸入導(dǎo)出文件, 然后點(diǎn)擊 Generate Image, 生成最終的加密且簽名的映像文件(如rot_tz_s_app_enc_sign.hex, 或者 rot_tz_ns_app_enc_sign.hex).
3.8. 生成加密簽名的數(shù)據(jù)映像(可選)
回到終端窗口按下回車(chē)鍵, 如下所示 :
提示我們通過(guò) TPC 手動(dòng)生成加密數(shù)據(jù)映像. 工程中默認(rèn)是未定義任何 Data image 的(flash_layout.h 頭文件):
因此, 此步驟默認(rèn)我們是可以跳過(guò). 如果工程中此宏修改成 1, 則需要手動(dòng)通過(guò) TPC 來(lái)生成加密的數(shù)據(jù)映像. 方法類(lèi)似于 3.6 節(jié)的手動(dòng)生成環(huán)節(jié), 只不過(guò)配置文件換成 xxx_Data_Image.xml.
這一步驟, 我們直接在終端窗口中按下回車(chē)鍵…
接下來(lái)再次提示生成 NS APP 對(duì)應(yīng)的 Data Image, 同理, 在工程中默認(rèn)宏中是沒(méi)有配置的, 因此直接按下回車(chē)鍵…
3.9. 預(yù)配置(provisioning)
在做預(yù)配置之前, 提示你是否已將 BOOT0 引腳拉低. 確認(rèn) NUCLEO-H563ZI 板上的 BOOT0引腳沒(méi)有連到 VDD(CN4 的 BOT0 引腳未接任何東西即可). 確認(rèn)后按下回車(chē)鍵…
如上圖, 這此過(guò)程中, 腳本會(huì)自動(dòng)燒錄 boot, S APP, NS APP 三個(gè) bin 文件, 以及配置 option bytes, 接下來(lái)提示你輸入芯片最終的 product state, 這里我們輸入”CLOSED”…(千萬(wàn)別設(shè)置為 LOCKED 狀態(tài)!)
如上圖所示, 在此過(guò)程中, 腳本會(huì)先將芯片的 product state 切換到 provisioning 狀態(tài), 然后再做預(yù)配置, 這里會(huì)預(yù)配置 OEMiROT 的 obk 文件,以及 DA 的 obk 文件, 然后最終將芯片的product state 設(shè)置為你上一步輸入的最終芯片狀態(tài). 最后系統(tǒng)提供已完成. 到這一步, 腳本的整個(gè)流程結(jié)束. 接下來(lái), 我們驗(yàn)證下燒錄后的芯片是否工作正常.
3.10.檢查程序運(yùn)行狀態(tài)
打開(kāi) Tera Term, 設(shè)置串口波特率為 115200 bps, 然后復(fù)位板子, 查看打印信息…
如上圖所示, 當(dāng)打印信息顯示 User App #A 時(shí), 表示 NS APP 已經(jīng)運(yùn)行成功, 所有程序運(yùn)行結(jié)果均正常!
04 固件更新
接下來(lái), 我們將演示通過(guò) NS APP 觸發(fā)程序跳轉(zhuǎn)到內(nèi)置的 bootloader 中, 并通過(guò)串口下載新的加密固件, 復(fù)位后并安裝它.
4.1. 修改代碼, 并重新編譯工程
打開(kāi) NS APP 的工程, 在 main.c 文件中將 NS APP 的版本號(hào)從 “A”改成”B”:
然后重新編譯 NS APP 工程.
Postbuild 腳本將重新生成 S APP 和 NS APP 的加密固件 :
如上圖所示, 這四個(gè)文件均將重新生成.
接下來(lái)我們將升級(jí) APP 固件.
4.2. 跳轉(zhuǎn)到 loader 程序
在串口終端中我們輸入”1”:
如上圖所示, 輸入 1 后, 程序跳轉(zhuǎn)到芯片內(nèi)置的 bootloader 中.
斷開(kāi) Tera Term 的串口連接 :
4.3. 通過(guò) STM32CubeProgrammer 下載新固件
打開(kāi) STM32CubeProgrammer, 并通過(guò)串口模式連接芯片:
將新生成 NS APP 的加密后的固件 rot_tz_ns_app_enc_sign.hex 拖入到STM32CubeProgrammer 中 :
如上圖點(diǎn)擊下載.
同樣的, 也可以將 S APP 的加密固件 rot_tz_s_app_enc_sign.hex 拖入STM32CubeProgrammer 中并下載 :
下載成功后, 斷開(kāi) STM32CubeProgrammer 的串口連接, 并使 Tera Term 重新連接串口 , 然后再重啟 NUCLEO-H563ZI 板, 于是可以看到如下打印信息 :
如上圖所示, NS APP 的版本打印信息從 “A”已經(jīng)改成”B”了, 這說(shuō)明固件(加密且簽名的)已經(jīng)更新成功.
05 還原
5.1. DA 回退
打開(kāi) STM32CubeProgrammer, 采用 ST-Link 模式, 在未連接的情況下,在左邊選擇盾牌圖標(biāo), 然后再選擇”DA”選項(xiàng)卡, 再點(diǎn) Discover 按鍵….
界面變成如下所示 :
如上圖所示, 第一個(gè)紅框內(nèi)輸入 DA 私鑰文件 :
STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningDAKeyskey_1_root.pem,
第二個(gè)紅模式內(nèi)輸入證書(shū) : STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningDACertificates cert_root.b64
然后擊點(diǎn) continue 按鍵, 然后界面變成如下所示 :
如上圖所示, 在左邊選擇”Full Regression”, 然后再點(diǎn)擊 Execute 按鍵…
然后如上圖所示, DA 回退成功. 此時(shí),查看 option bytes 值 , product state 已經(jīng)變成Open(0xED), TZEN 依然使能(TZEN=0xB4) :
5.2. 關(guān)閉 trustzone
如果需要也可以將 TZEN 關(guān)閉(TZEN=0xC3, 可直接修改, 這點(diǎn)與U5必須伴隨 RDP回退操作不同), 這樣芯片就完成恢復(fù)成原始狀態(tài)了.
評(píng)論