1. 引言
安全啟動與安全更新是嵌入式設備的基本安全要求之一:安全啟動提供信任根,確保每次設備啟動時運行的應用程式的完整性與合法性;安全更新則在韌體升級過程中避免系統軟體被惡意修改或替換。
為了方便客戶在其嵌入式設備的設計中更容易地整合安全啟動和安全更新功能,STM32 提供了相關的參考實現並支援眾多 STM32 MCU 系列。其中 X-CUBE-SBSFU 是針對 Cortex V6/V7M 核心的 STM32 MCU 產品的參考方案,軟體包下載地址:https://www.st.com/x-cube-sbsfu。
在 X-CUBE-SBSFU 使用技巧的第一篇中,我們介紹了軟體包及其軟體架構等內容,讓讀者對這個軟體包有了初步的認識。在這一篇中,我們將介紹 SBSFU 與使用者應用程式整合相關的內容。
2. 應用程式連結檔案
2.1. 閃光
通常,一個不帶有安全啟動或bootloader的應用程式會將內部Flash的基地址作為該應用程式對應向量表的起始地址,並且可以運行於整個內部Flash空間中。而當在應用程式中整合SBSFU參考實現時,就需要調整應用程式在Flash中的佔位。
在X-CUBE-SBSFU使用技巧的第一篇中,我們介紹了以X-CUBE-SBSFU為框架的安全啟動方案的記憶體地址空間佈局,包括單鏡像模式、雙鏡像模式、內部+外部Flash模式等等,可能會有不同的空間佈局。但是對於應用程式來說,只需要關注其中的Active Slot部分,應用程式在Flash中的放置位置由Memory Map中的Active Slot區域決定,如圖1所示。
Active Slot 的地址在 SBSFU 參考實現的 Linker_Common 目錄下的 mapping_fwimg.x 文件中有定義。修改應用程式 Linker file 的方式有兩種:一種方式是根據 mapping_fw.x 中的 Active Slot 定義,直接在應用程式中硬編碼(hard code)相關地址;另一種方式是在應用的 Linker file 中引用 mapping_fw.x 文件,並使用其中的定義來指定向量表(vector table)、ROM 區域的起止地址等。這種方式的好處是,應用程式與 SBSFU 引用相同的 linker 定義文件,當需要調整地址空間時,只需統一修改即可,從而避免地址定義不一致的問題。
2.2. SRAM
通常情況下,安全啟動只在運行期間使用SRAM,跳轉到應用程式之後,SRAM會被釋放給應用程式使用,因此應用程式可以使用所有的SRAM空間。但是在某些平台的SBSFU參考實現中,部分SRAM會保留給安全啟動程式碼使用,主要涉及帶有Firewall硬體的L4/L0系列,以及SBSFU中包含KMS功能,啟動後SecureEngine依舊可能為應用程式提供金鑰管理服務的情況。這時候應用程式的linker file中指定的SRAM空間應該從SE_region_RAM_end地址之後開始,如圖2所示:

3. 固件升級功能的整合
如果使用者選擇了雙鏡像模式,並整合了X-Cube-SBSFU中實現的安全啟動和安全更新方案,那麼應用程式可以根據自身需求實現具備安全啟動的韌體升級。新版本韌體的下載過程可以在應用程式中完成,而完整的升級過程則需要SecureBoot程式碼的參與,因為新版本應用程式韌體的校驗、解密等操作都是在SecureBoot程式碼中完成的。升級的大致過程如圖3所示。
這裡有兩點需要注意,一個是從應用程式下載新版本時,下載內容放置的位置,另一個是升級後新版本的韌體可能需要額外操作才能使其生效。
4. 小結
X-CUBE-SBSFU 是基於 STM32 MCU 的安全啟動和安全更新的參考實現,支援眾多 STM32 系列。X-CUBE-SBSFU 參考實現包含完整的參考程式碼以及配套工具,並以原始碼形式提供給客戶,具備極大的靈活性:使用者既可以直接使用該軟體包與應用程式進行整合,快速為其系統添加安全啟動和安全更新功能;也可以僅將其作為參考,重新撰寫自己的安全啟動和安全更新實現。
本文總結了一些有關如何將SBSFU參考實現與客戶自己的應用程式進行整合的技巧和注意事項,包括Flash和RAM的佈局、應用連結檔的修改、如何生成用戶自己的密鑰、如何使用腳本工具對應用韌體進行加密、簽名和打包處理、如何在應用程式中整合韌體升級以及其他一些注意事項等。
在使用技巧的第三篇中,我們將繼續討論有關將X-CUBE-SBSFU從一個STM32硬體平台移植到另一個STM32硬體平台的話題。
評論