我們都知道STM32WB是雙核多協議無線微控制器,即主頻為64 MHz的 ArmCortex‐M4內核(應用處理器)和主頻為32 MHz的ArmCortex‐M0+內核(網絡處理器),支持Bluetooth 5和IEEE 802.15.4無線標準。雙核的好處是可以優化對資源的安全使用,保證和RF協議棧相關處理的實時性,并可同時提供電源管理的靈活性。
STM32WB的信息安全是以雙核隔離為基礎的。
STM32WB雙核架構和雙核間的隔離機制
調試端口訪問:
出廠的芯片缺省關閉CM0+一側的調試端口訪問,即使在RDP0的狀態下也只能調試CM4內核。
OptionByte中包含雙核隔離相關的安全設置,例如CM0+才能訪問的Flash區間等等。這些OptionByte受到保護,無法隨意被修改。缺省出廠芯片已經使能CM0+的保護,相關的一些OptionByte設置無法通過調試端口或CM4進行修改。
片上Flash:
Flash的一部分只能由CM0+訪問,CM4無法對該部分Flash進行讀、寫、擦。
片上SRAM:
SRAM的一部分只能由CM0+訪問,CM4無法對該部分SRAM進行讀、寫。
CRYPTO硬件資源:如AES,TRNG,PKA
系統上電復位時,缺省CRYPTO相關的硬件CM4可以使用。CM0+內核可以通過修改SystemConfig相應的寄存器使得這些硬件資源只能由CM0+內核進行控制,也稱為把這些硬件資源配置成Secure訪問模式。其中當AES1被配置為Secure時,CM4內核無法訪問密鑰寄存器,但是依舊可以訪問AES1的其他寄存器使用AES1硬件單元進行加解密操作。
CKS (Customer Key Storage)
AES算法是應用程序中經常用到的一種保障數據機密性和完整性的方法,例如用于隱私數據的加密存儲、加密通信等。其中,密鑰作為最敏感的信息也需要受到保護。
STM32WB的CKS功能提供在MCU上的密鑰安全存儲和安全使用方法 :
存儲在片上安全Flash的密鑰無法通過調試端口獲取(即使在RDP0條件下)
運行在CM4內核的應用程序代碼也無法獲得片上安全Flash中存儲的密鑰,避免軟件漏洞帶來的風險
應用程序代碼依舊能夠通過CKS和AES1硬件模塊使用存儲的密鑰進行加解密操作
CKS能夠存儲多組密鑰,應用程序代碼可以通過密鑰索引來指定AES運算所使用的密鑰
用戶密鑰存儲
用戶密鑰存儲在“安全”Flash區域,用戶代碼和調試端口不可訪問
CKS最多可以存儲100個用戶應用密鑰(用于AES運算)
允許存儲128位或者256位的AES密鑰
對密鑰的操作只能通過用戶代碼調用FUS接口完成
把密鑰寫到“安全”Flash區域,需要安全的操作環境
用戶密鑰的寫入 (Key Provisioning)
可以通過用戶代碼完成,也可以通過CubeProgrammer的GUI或者命令行完成
寫入應用密鑰的明文//simple key,需要安全的操作環境
寫入應用密鑰的密文//encrypted key,無需安全的操作環境
基于AES-128 GCM
寫入用于解密encrypted key的密鑰的明文//master key,需要安全的操作環境
該操作在手冊中用“write”或“load”表示
用戶密鑰的寫入通過應用代碼實現
參考例程:
STM32Cube_FW_WB_VxxxProjectsP-NUCLEO-WB55.NucleoApplicationsCKS
給CKS_param賦值
typedef PACKED_STRUCT{uint8_t KeyType;uint8_t KeySize;uint8_t KeyData[32 + 12];} SHCI_C2_FUS_StoreUsrKey_Cmd_Param_t;SHCI_C2_FUS_StoreUsrKey_Cmd_Param_t CKS_param;CKS_param.KeyType = …;CKS_param.KeySize = …;memcpy(CKS_param.KeyData, pKeySimple_128, 16
調用FUS服務:SHCI_C2_FUS_StoreUsrKey
輸入:CKS_param結構體
輸出:芯片為該密鑰分配的索引
SHCI_C2_FUS_StoreUsrKey (&CKS_param, &key_simple_128_idx );
用戶密鑰的寫入使用STM32CubeProgrammer GUI實現
STM32CubeProgrammer 從2.4版本開始支持
芯片切換到系統 Bootloader 啟動運行DFU,
STM32CubeProgrammer 以USB方式連接芯片
步驟:選擇KEY文件 ——》 指定KEY類型 ——》 寫入KEY
注意:GUI界面沒有返回為該密鑰分配的索引,需要用戶自己記錄
應用密鑰的裝載和使用
Load:AES1的密鑰裝載
SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx)
該操作會把AES1密鑰寄存器配置成Secure
SAES1@SYSCFG_SIPCR
只能由運行在CM0+上的FUS來配置
運行在CM4上的用戶代碼可以讀取其狀態
安全狀態和AES1時鐘是否使能沒有關系
使用步驟
Step1:AES1模塊初始化
初始化結構體的pKey,設置為空指針即可
使能AES1時鐘
Step2:密鑰裝載
要在AES1模塊disable1的時候 (EN=0)
Step3:使用AES1做加解密
hcryp1.Init.DataType = CRYP_DATATYPE_8B;hcryp1.Init.KeySize = CRYP_KEYSIZE_128B;hcryp1.Init.Algorithm = CRYP_AES_CBC;/* Key will be provided by CKS service */hcryp1.Init.pKey = NULL; hcryp1.Init.pInitVect = AESIV;HAL_CRYP_Init (&hcryp1);SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx);HAL_CRYP_Encrypt(&hcryp1, Plaintext, size, EncryptedBuf, timeout)
應用密鑰的使用
Lock:
SHCI_C2_FUS_LockUsrKey (key_simple_128_idx)
對某個key lock之后,將無法再對該key進行Load操作,再次Load該Key時FUS API返回錯誤代碼0xFF;但是不影響已經在AES1密鑰寄存器中的key
對該key load的禁止操作,會一直生效直到下次系統復位
注意事項:關于后續更新
為了避免有效密鑰一直存在于AES1密鑰寄存器中,建議使用完畢后Load一個dummy key或者disable AES1
后續FUS版本(從 STM32CUbeWB1.11開始)會增加API:Unload
早期出廠芯片預裝的FUS版本較老,在FUS升級的時候,通過CSK存儲在芯片里的用戶key會被擦除
從FUS1.1.1.1或者FUS1.2.0開始,再做FUS升級,不會影響到已經存在的用戶key應用密鑰的使用
小結
使用CKS對AES密鑰進行保護,與傳統的直接將AES密鑰存儲在Flash中的做法有明顯的優勢:
CKS存儲的密鑰數據無法通過調試端口獲取,已經存儲的密鑰數據,即使在RDP為0的情況下也不能通過調試端口訪問。
密鑰使用過程中應用程序代碼雖然可以使用密鑰進行加解密操作,但是始終無法直接獲取密鑰數據本身,降低了軟件漏洞可能帶來的風險。
原文標題:信息安全專題 | 安全存儲(2)STM32WB的用戶密鑰存儲 (CKS)
文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
存儲
+關注
關注
13文章
4341瀏覽量
86020
原文標題:信息安全專題 | 安全存儲(2)STM32WB的用戶密鑰存儲 (CKS)
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論