STM32WB的CKS功能提供在MCU上的密钥安全存储和安全使用方法

我们都知道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】欢迎关注!请注明文章出处。