你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

信息安全专题 | 安全存储(2)STM32WB的用户密钥存储 (CKS)

[复制链接]
STMCU小助手 发布时间:2021-5-26 16:55
信息安全专题 | 安全存储(2)STM32WB的用户密钥存储 (CKS)

3 `  ^. {7 k# e$ H  y1 N
我们都知道STM32WB是双核多协议无线微控制器,即主频为64 MHz的 Arm®Cortex®‐M4内核(应用处理器)和主频为32 MHz的Arm®Cortex®‐M0+内核(网络处理器),支持Bluetooth™ 5和IEEE 802.15.4无线标准。双核的好处是可以优化对资源的安全使用,保证和RF协议栈相关处理的实时性,并可同时提供电源管理的灵活性。
STM32WB的信息安全是以双核隔离为基础的。
# z  B; m4 p) g5 l
STM32WB双核架构和双核间的隔离机制
2.png
调试端口访问:
出厂的芯片缺省关闭CM0+一侧的调试端口访问,即使在RDP0的状态下也只能调试CM4内核。
Option Byte:
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运算所使用的密钥% Y# R" g: }9 K4 v1 s; ~
3.png
用户密钥存储
用户密钥存储在"安全"Flash区域,用户代码和调试端口不可访问
  • CKS最多可以存储100个用户应用密钥(用于AES运算)
  • 允许存储128位或者256位的AES密钥
    1 M8 d( l- G0 i& Y: U
对密钥的操作只能通过用户代码调用FUS接口完成
  • 把密钥写到“安全”Flash区域,需要安全的操作环境 ; P9 `+ t5 r% ?. Z8 V& {" g, }
4.png
5.png
用户密钥的写入 (Key Provisioning)
可以通过用户代码完成,也可以通过CubeProgrammer的GUI或者命令行完成
  • 写入应用密钥的明文//simple key,需要安全的操作环境
  • 写入应用密钥的密文//encrypted key,无需安全的操作环境
  • 基于AES-128 GCM
  • 写入用于解密encrypted key的密钥的明文//master key,需要安全的操作环境 4 Z9 H& x6 A! V! o
该操作在手册中用“write”或“load”表示
6.png
用户密钥的写入通过应用代码实现
参考例程:
  • STM32Cube_FW_WB_Vxxx\Projects\P-NUCLEO-WB55.Nucleo\Applications\CKS\
  • 给CKS_param赋值
      F( ?& R7 f. n8 [7 w
  1. typedef PACKED_STRUCT{5 S9 i# ?5 @- M+ v
  2. uint8_t KeyType;# \4 C% G4 P2 P: o. Q0 j- ]
  3. uint8_t KeySize;2 v3 l) k; t5 [, l0 t
  4. uint8_t KeyData[32 + 12];
    ! A, K) }1 X: V' U, d8 P
  5. } SHCI_C2_FUS_StoreUsrKey_Cmd_Param_t;
    6 ~$ c/ U4 j4 ^/ q2 D/ D  v5 R
  6. SHCI_C2_FUS_StoreUsrKey_Cmd_Param_t CKS_param;
    9 a' r& P2 r/ Z
  7. CKS_param.KeyType = …;
    ; p) n2 }' U1 N8 V
  8. CKS_param.KeySize = …;: ~' w: s% `4 A
  9. memcpy(CKS_param.KeyData, pKeySimple_128, 16)
复制代码

' f1 }1 J1 B5 z0 y: o7 q  w* G
7.png
调用FUS服务:SHCI_C2_FUS_StoreUsrKey
  • 输入:CKS_param结构体
  • 输出:芯片为该密钥分配的索引
    . T0 p2 U* K! V
  1. SHCI_C2_FUS_StoreUsrKey (&CKS_param, &key_simple_128_idx );
复制代码
/ |+ Q- H7 Q; b% H7 b( q" k
用户密钥的写入使用STM32CubeProgrammer GUI实现
STM32CubeProgrammer 从2.4版本开始支持
  • 芯片切换到系统 Bootloader 启动运行DFU,
  • STM32CubeProgrammer 以USB方式连接芯片
    # g: G# Q9 X/ F% C
8.png
步骤:选择KEY文件 ——> 指定KEY类型 ——> 写入KEY
9.png
注意:GUI界面没有返回为该密钥分配的索引,需要用户自己记录
应用密钥的装载和使用
Load:AES1的密钥装载
  • SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx)该操作会把AES1密钥寄存器配置成Secure
  • SAES1@SYSCFG_SIPCR& l) `$ |% {" i/ ^9 d% f
  • 只能由运行在CM0+上的FUS来配置
  • 运行在CM4上的用户代码可以读取其状态
  • 安全状态和AES1时钟是否使能没有关系
    , ~! \$ f' b" Z; ]
10.png
使用步骤
Step1:AES1模块初始化
  • 初始化结构体的pKey,设置为空指针即可
  • 使能AES1时钟5 V5 C3 B7 R$ M8 i7 L
Step2:密钥装载
  • 要在AES1模块disable1的时候 (EN=0)
    # `7 M4 U; A6 s6 U* i2 l  c5 s' C
Step3:使用AES1做加解密
  1. hcryp1.Init.DataType = CRYP_DATATYPE_8B;0 R6 I2 R$ ?0 j6 w! s
  2. hcryp1.Init.KeySize = CRYP_KEYSIZE_128B;5 d5 F, S% ?6 A4 l
  3. hcryp1.Init.Algorithm = CRYP_AES_CBC;
    8 J3 i1 h0 Z1 q- |1 X
  4. /* Key will be provided by CKS service */4 {3 s8 f0 r# M" E
  5. hcryp1.Init.pKey = NULL;
    . r- N, f! b( f: j
  6. hcryp1.Init.pInitVect = AESIV;5 J% w. C+ M6 p& B
  7. HAL_CRYP_Init (&hcryp1);
    6 c. I; }& S1 w$ I
  8. SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx);0 @% k& i- ?1 v$ {7 P0 I( [
  9. HAL_CRYP_Encrypt(&hcryp1, Plaintext, size, EncryptedBuf, timeout)
复制代码

7 {& H3 f* }8 e/ M* G3 A8 s
应用密钥的使用
Lock:
  • SHCI_C2_FUS_LockUsrKey (key_simple_128_idx)
  • 对某个key lock之后,将无法再对该key进行 Load操作,再次Load该Key时FUS API返回 错误代码0xFF;但是不影响已经在AES1密 钥寄存器中的key
  • 对该key load的禁止操作,会一直生效直到 下次系统复位
    - c" g0 s& L. f- W3 `7 g, l  F
注意事项:关于后续更新
  • 为了避免有效密钥一直存在于AES1密钥寄存 器中,建议使用完毕后Load一个dummy key 或者disableAES1
  • 后续FUS版本(从STM32CUbeWB1.11开始)会增加API:Unload
  • 早期出厂芯片预装的FUS版本较老,在FUS升级的时候,通过CSK存储在芯片里的用户 key会被擦除
  • 从FUS1.1.1.1或者FUS1.2.0开始,再做FUS升 级,不会影响到已经存在的用户key 应用密钥的使用
    * T: a. Z% Z0 w* c& s& ?6 y
小结
11.png
使用CKS对AES密钥进行保护,与传统的直接将AES密钥存储在Flash中的做法有明显的优势:
  • CKS存储的密钥数据无法通过调试端口获取,已经存储的密钥数据,即使在RDP为0的情况下也不能通过调试端口访问。
  • 密钥使用过程中应用程序代码虽然可以使用密钥进行加解密操作,但是始终无法直接获取密钥数据本身,降低了软件漏洞可能带来的风险。: O) N0 @) q  l+ f* {
© THE END

: o. {* ?3 b" ^3 V1 D
收藏 评论0 发布时间:2021-5-26 16:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版