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