
我们都知道STM32WB是双核多协议无线微控制器,即ArmCortex‐M4内核(应用处理器)主频64 MHz,ArmCortex‐M0内核(网络处理器)主频32 MHz,支持蓝牙5和IEEE 802.15.4无线标准。双核的优势在于可以优化资源的安全使用,保证射频协议栈相关的实时处理,同时提供电源管理的灵活性。
STM32WB的信息安全基于双核隔离。
STM32WB双核架构及双核间隔离机制
调试端口访问:
出厂芯片默认关闭CM0侧的调试端口访问,即使在RDP0状态下,也只能调试CM4内核。
选项字节:
OptionByte包含双核隔离相关的安全设置,比如CM0可以访问的Flash间隔等等。这些选项字节受到保护,不能随意修改。默认出厂芯片已启用CM0保护,一些相关的OptionByte设置不能通过调试端口或CM4修改。
片内闪存:
部分闪存只能由CM0访问,但CM4不能读取、写入或擦除这部分闪存。
片内SRAM:
SRAM的一部分只能由CM0访问,但CM4不能读写这部分SRAM。
加密硬件资源:如AES,TRNG,PKA
当系统通电并复位时,可以使用默认的加密相关硬件CM4。CM0内核只能通过修改SystemConfig的相应寄存器来控制这些硬件资源,也就是把这些硬件资源配置成安全访问模式。其中,当AES1被配置为安全时,CM4内核不能访问密钥寄存器,但它仍然可以访问AES1的其他寄存器,并使用AES1硬件单元进行加密和解密。
CKS(客户密钥存储)
AES算法常用于保证数据的机密性和完整性的应用中,例如私有数据的加密存储和加密通信。其中,密钥作为最敏感的信息也需要得到保护。
STM32WB的CKS功能提供MCU上密钥的安全存储和安全使用:
存储在芯片上的安全闪存的密钥不能通过调试端口获得(即使在RDP0的情况下)
CM4内核中运行的应用程序代码可以获取存储在片上安全Flash中的密钥,避免软件漏洞带来的风险。
应用程序代码仍然可以通过CKS和AES1硬件模块使用存储的密钥进行加密和解密。
CKS可以存储多组密钥,应用程序代码可以通过密钥索引指定AES运算中使用的密钥。
用户密钥存储
用户密钥存储在安全闪存区,用户代码和调试端口不可访问。
CKS最多可以存储100个用户应用密钥(用于AES操作)
允许存储128位或256位AES密钥。
按键操作只能通过用户代码调用FUS接口来完成。
书写安全闪光区域需要一个安全的操作环境。
用户密钥的写入(密钥供应)
可以通过用户代码,或者CubeProgrammer的GUI或者命令行来完成。
编写应用程序密钥//简单密钥的明文需要安全的操作环境。
在没有安全操作环境的情况下,写入应用密钥//加密密钥的密文。
基于AES-128 GCM
用于解密加密密钥的明文//主密钥需要安全的操作环境。
该操作由写或者加载在手册里。
用户的密钥是由应用程序代码编写的。
参考例程:
STM 32 cube _ FW _ WB _ vxxxxprojectsp-NUCLEO-WB55。核应用软件
为CKS参数赋值
typedef PACKED _ STRUCT { uint 8 _ t key type;uint8 _ t KeySizeuint 8 _ t key data[32 12];} SHCI _ C2 _ FUS _ StoreUsrKey _ Cmd _ Param _ t;SHCI C2 FUS StoreUsrKey Cmd Param CKS Param;CKS参数。key type=…;CKS参数。KeySize=…;memcpy(CKS _参数。KeyData,pKeySimple_128,16
调用FUS服务:C2 SHCI C2 FUS StoreUsrKey
输入:CKS参数结构
输出:芯片为此键分配的索引。
SHCI _ C2 _ FUS _ StoreUsrKey(CKS _ param,key _ simple _ 128 _ idx);
用户 key是用STM32CubeProgrammer GUI写的。
STM32CubeProgrammer从版本2.4开始就受到支持
将芯片切换到系统引导程序,开始运行DFU,
STM32CubeProgrammer通过USB连接芯片
步骤:选择密钥文件—— 指定密钥类型3354 来写密钥。
注意:GUI界面不返回为该键分配的索引,所以需要用户自己记录。
应用程序密钥的加载和使用
加载:键加载加载:AES1
SHCI C2 FUS LoadUsrKey(key _ simple _ 128 _ idx)
此操作会将AES1密钥寄存器配置为安全。
SAES1@SYSCFG_SIPCR
它只能由运行在CM0上的FUS配置
CM4上运行的用户代码可以读取其状态。
安全状态与AES1时钟是否使能无关。
使用步骤
步骤aes1模块的初始化
初始化结构的pKey,并将其设置为空指针。
使能AES1时钟
第二步:密钥加载
AES1模块禁用1时(EN=0)
步骤3:使用AES1进行加密和解密
hcryp1。init . DataType=CRYP _数据类型_ 8Bhcryp1。init . key size=CRYP _ key size _ 128B;hcryp1。init . Algorithm=CRYP _ AES _ CBC;hcryp1。Init.pKey=NULLhcryp1。Init.pInitVect=AESIV哈尔_ CRYP _ Init(hcryp 1);SHCI _ C2 _ FUS _ LoadUsrKey(key _ simple _ 128 _ idx);哈尔CRYP加密(加密1,明文,大小,加密缓冲区,超时)
应用密钥的使用
锁定:
SHCI C2 FUS洛克斯尔基(key_simple_128_idx)
锁定密钥后,就不能再加载该密钥了。再次加载密钥时,FUS API返回错误代码0xFF;但是不影响已经在AES1密钥寄存器中的密钥。
键负载的禁止操作将保持有效,直到下一次系统复位。
注:关于后续更新
为避免AES1密钥寄存器中始终存在有效密钥,建议在使用后加载一个伪密钥或禁用AES1。
FUS的后续版本(来自STM32CUbeWB1.11)将增加API:Unload。
早期出厂芯片中预装的FUS版本较旧,当FUS升级时,通过CSK存储在芯片中的用户密钥将被擦除。
从FUS1.1.1.1或FUS1.2.0升级FUS不会影响现有用户密钥应用程序密钥的使用。
总结
与将AES密钥直接存储在闪存中的传统方法相比,使用CKS来保护AES密钥具有明显的优势:
存储在CKS的关键数据可以通过调试端口获取,存储的密钥数据可以即使RDP为0,也不能通过调试端口访问。
在使用密钥的过程中,虽然应用程序代码可以使用密钥进行加密和解密,但是它可以一直直接获取关键数据本身,降低了软件漏洞可能带来的风险。
原标题:信息安全专题|安全存储(二)用户密钥存储(2)STM 32 web的CKS
来源:【微信微信官方账号:STM32 MCU】欢迎关注!请注明文章出处。









