|
我们都知道STM32WB是双核多协议无线微控制器,即主频为64 MHz的 Arm®Cortex®‐M4内核(应用处理器)和主频为32 MHz的Arm®Cortex®‐M0+内核(网络处理器),支持Bluetooth™ 5和IEEE 802.15.4无线标准。双核的好处是可以优化对资源的安全使用,保证和RF协议栈相关处理的实时性,并可同时提供电源管理的灵活性。& o- l' j$ l8 X+ u U+ \4 g2 Z STM32WB的信息安全是以双核隔离为基础的。 STM32WB双核架构和双核间的隔离机制
8 g7 `$ e9 d) [0 g k( q+ k ! C8 Z6 i7 ? w9 b( M+ I 6 l7 |9 }! @! M! z1 _, `4 ^ 调试端口访问:6 ]+ _- k! i7 X4 I # g; H1 `- H' `+ r# B7 s1 n 出厂的芯片缺省关闭CM0+一侧的调试端口访问,即使在RDP0的状态下也只能调试CM4内核。 Option Byte: ! O$ @4 Q: d- X7 w$ s. A/ N2 [ OptionByte中包含双核隔离相关的安全设置,例如CM0+才能访问的Flash区间等等。这些OptionByte受到保护,无法随意被修改。缺省出厂芯片已经使能CM0+的保护,相关的一些OptionByte设置无法通过调试端口或CM4进行修改。 片上Flash: ( `4 g" S5 `, ?9 |6 P 8 K. k* G/ f* Z4 V1 u. w3 X Flash的一部分只能由CM0+访问,CM4无法对该部分Flash进行读、写、擦。 ) H/ ^+ R" M) S" I5 M! S; M 片上SRAM:3 ]' f$ m0 \- |, u 5 P" o+ }5 [' Y) j! Z5 b7 r5 Q SRAM的一部分只能由CM0+访问,CM4无法对该部分SRAM进行读、写。0 L/ _9 C9 Z! w9 | ' m3 z2 j6 n9 l1 v9 c CRYPTO硬件资源:如AES,TRNG,PKA. T% f0 @. b, A u9 Z* _: W 0 `: Q4 {* U$ v0 P0 e) b, Q1 [ 系统上电复位时,缺省CRYPTO相关的硬件CM4可以使用。CM0+内核可以通过修改SystemConfig相应的寄存器使得这些硬件资源只能由CM0+内核进行控制,也称为把这些硬件资源配置成Secure访问模式。其中当AES1被配置为Secure时,CM4内核无法访问密钥寄存器,但是依旧可以访问AES1的其他寄存器使用AES1硬件单元进行加解密操作。 CKS (Customer Key Storage) AES算法是应用程序中经常用到的一种保障数据机密性和完整性的方法,例如用于隐私数据的加密存储、加密通信等。其中,密钥作为最敏感的信息也需要受到保护。( M8 ~% D. N! j& E+ Z |: ?+ h. b 6 Q, Y0 I) P2 D) |' n/ V' V STM32WB的CKS功能提供在MCU上的密钥安全存储和安全使用方法 :3 c. ^0 L8 \# _$ F# x- q 存储在片上安全Flash的密钥无法通过调试端口获取(即使在RDP0条件下)& D& @: v" l* m+ V+ {. \$ v 0 V, L, x A9 Y$ U ' r+ [, h, U4 c' C9 c6 t# G* h/ |2 H 运行在CM4内核的应用程序代码也无法获得片上安全Flash中存储的密钥,避免软件漏洞带来的风险 5 d J5 s# b6 r1 o 应用程序代码依旧能够通过CKS和AES1硬件模块使用存储的密钥进行加解密操作 ; c; n5 A& Z8 v+ @1 n; U ; }/ ~5 O: ]+ L( B0 H/ ~, p " O: m6 X. ? ~" ~) r CKS能够存储多组密钥,应用程序代码可以通过密钥索引来指定AES运算所使用的密钥
用户密钥存储 2 E5 x* p* ?' n2 q: {+ u% x 用户密钥存储在"安全"Flash区域,用户代码和调试端口不可访问 ) b$ V7 U9 g2 F* r # H4 C# o M0 l% ` CKS最多可以存储100个用户应用密钥(用于AES运算) ) U' K- b, r' Y, T 6 k/ U9 J! Q+ k+ d, W" b S j 允许存储128位或者256位的AES密钥 7 J1 M; l) g5 v 对密钥的操作只能通过用户代码调用FUS接口完成 ~, F! f z2 D W! g- B9 u% q 3 d) F* V, `+ a' h) ` 9 e+ I6 p* C* o7 X 把密钥写到“安全”Flash区域,需要安全的操作环境 " {3 d6 j c- q
' q) r& ?6 {% m" d' v# ^& q' T 用户密钥的写入 (Key Provisioning) 可以通过用户代码完成,也可以通过CubeProgrammer的GUI或者命令行完成 % ?2 P" v0 p! G 写入应用密钥的明文//simple key,需要安全的操作环境 写入应用密钥的密文//encrypted key,无需安全的操作环境 ! b9 m5 d2 |7 H 基于AES-128 GCM 写入用于解密encrypted key的密钥的明文//master key,需要安全的操作环境 9 O; {; [' M J7 S! U 该操作在手册中用“write”或“load”表示
7 ~$ }' L$ {/ r" ^4 A* T 用户密钥的写入通过应用代码实现 / W* ?! M0 N8 H9 m m7 d: y: \# j% y; G" P j, r p 参考例程: STM32Cube_FW_WB_Vxxx\Projects\P-NUCLEO-WB55.Nucleo\Applications\CKS\ - d" \* E- m$ p + r, f M* R8 l% p* d" Z6 N 给CKS_param赋值
调用FUS服务:SHCI_C2_FUS_StoreUsrKey 输入:CKS_param结构体 # M0 ]1 X6 R1 _4 Y9 @$ o 输出:芯片为该密钥分配的索引; Q' s' f: `7 h8 ]( S
0 C* K5 X7 m" F0 o4 U- J$ \ 用户密钥的写入使用STM32CubeProgrammer GUI实现 * {3 O7 j1 B9 v8 M0 y6 z STM32CubeProgrammer 从2.4版本开始支持 8 z" y4 o- l0 U: G 芯片切换到系统 Bootloader 启动运行DFU, . {: U3 V; d" _# d( Z2 t% S 3 A- C5 i4 t) b% ] STM32CubeProgrammer 以USB方式连接芯片
步骤:选择KEY文件 ——> 指定KEY类型 ——> 写入KEY2 a/ p4 a! P( G& z& z4 H
& m; K2 N8 P* y( | 注意:GUI界面没有返回为该密钥分配的索引,需要用户自己记录 * ?& M6 C( v7 ]( h8 M& v 应用密钥的装载和使用 Load:AES1的密钥装载 8 g Y S% t7 H. L, ?5 N- R: t) H SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx) 该操作会把AES1密钥寄存器配置成Secure : t; f% T, h6 l/ B' B3 \# F& _ SAES1@SYSCFG_SIPCR 只能由运行在CM0+上的FUS来配置 运行在CM4上的用户代码可以读取其状态 6 t! {6 A# @8 E7 h 安全状态和AES1时钟是否使能没有关系) Q4 N0 ~! {) s7 n& Z* s
% K8 I6 f. r7 z9 B' W Y3 u/ [ / \/ X; H [5 Y+ q, Q# v 使用步骤 6 S$ ?6 d( m8 U9 A1 k$ k ( m6 c: o$ G6 B8 q- Z. P, ^" f Step1:AES1模块初始化 " q1 u5 \7 d) @2 Y 5 H. ?8 [# d5 y0 k4 ?& r/ y 初始化结构体的pKey,设置为空指针即可 6 i9 S! \ q: [; J ! z p2 A0 _( A" F& ^4 v 0 H) Y0 l5 a9 \0 e! S& D. C% v- Q 使能AES1时钟 1 y+ S9 b* A- E Step2:密钥装载 . D# b! Q* B2 |7 @ ! x% U2 Q+ H T4 j* u- } 要在AES1模块disable1的时候 (EN=0) 7 \4 z, S) | X9 o2 r0 N& D% Y * g1 E3 i" o" a( M2 ~# a( @5 A & N) W X- T, C4 g Step3:使用AES1做加解密8 _7 d( t9 d- d+ |; x: ]5 P ( K) ]% e/ T: c$ n. q% ]
应用密钥的使用 Lock: $ s3 W2 P) d& l; a4 b( e ·SHCI_C2_FUS_LockUsrKey (key_simple_128_idx) ·对某个key lock之后,将无法再对该key进行 Load操作,再次Load该Key时FUS API返回 错误代码0xFF;但是不影响已经在AES1密 钥寄存器中的key ·对该key load的禁止操作,会一直生效直到 下次系统复位: `" R& ^# A. ^/ q! J# x& F 注意事项:关于后续更新 2 \6 m0 }# r8 a) k& l. _ {* }# { 7 v6 |$ D5 J4 h; k$ E ·为了避免有效密钥一直存在于AES1密钥寄存 器中,建议使用完毕后Load一个dummy key 或者disable AES1 ·后续FUS版本(从 STM32CUbeWB1.11开始)会增加API:Unload/ c. j X7 p( A, g8 z5 z& T: f ·早期出厂芯片预装的FUS版本较老,在FUS 升级的时候,通过CSK存储在芯片里的用户 key会被擦除 ' X+ _4 c+ s" B. B% l* E2 ] ·从FUS1.1.1.1或者FUS1.2.0开始,再做FUS升 级,不会影响到已经存在的用户key 应用密钥的使用& F h) m$ k* r/ Z: z- y+ p) T7 \ 小结
. A ?" q( G' _+ i6 `3 l4 @ ' \! ?) ^" W9 Z3 u! h" f- i) A 使用CKS对AES密钥进行保护,与传统的直接将AES密钥存储在Flash中的做法有明显的优势:6 y* I; t- h2 ~, F CKS存储的密钥数据无法通过调试端口获取,已经存储的密钥数据,即使在RDP为0的情况下也不能通过调试端口访问。 ; C4 L& f# n8 ^" Q 密钥使用过程中应用程序代码虽然可以使用密钥进行加解密操作,但是始终无法直接获取密钥数据本身,降低了软件漏洞可能带来的风险。4 ]0 e/ v+ T* p# t9 V + y8 t1 |% k' i9 ^ ; J/ ?$ ^) `, g; G4 _ 4 d3 U- ?4 X, b* {/ O2 p |
|
详实、详尽、详细。学无止境! |
【STM32WB55MM-DK | Zephyr】1、创建zephyr_shell工程
低功耗蓝牙无线升级:STM32WB OTA 固件更新技术解析
STM32WB Zigbee 自定义集群开发实战:AN5491 应用笔记深度解读
吃透:STM32WB 上 Zigbee 睡眠终端设备开发攻略
STM32 无线 MCU HSE 频率与启动时间精确调谐实战指南
深度解读:STM32WB 2.4GHz 低成本 PCB 蛇形天线设计实战指南
经验分享 | STM32WB 双核无线 MCU 开发全流程实战指南
STM32WB 基于 Custom Template 实现 BLE 私有协议 实操开发指南
详解STM32单片机的堆栈
STM32单片机进行除零运算,为何程序不崩溃?
微信公众号
手机版