|
我们都知道STM32WB是双核多协议无线微控制器,即主频为64 MHz的 Arm®Cortex®‐M4内核(应用处理器)和主频为32 MHz的Arm®Cortex®‐M0+内核(网络处理器),支持Bluetooth™ 5和IEEE 802.15.4无线标准。双核的好处是可以优化对资源的安全使用,保证和RF协议栈相关处理的实时性,并可同时提供电源管理的灵活性。 " Q' M! Z! e, ]7 Q1 P: j6 n STM32WB的信息安全是以双核隔离为基础的。2 U8 X% P/ v# W* m3 l , h% W0 {1 F2 D6 m STM32WB双核架构和双核间的隔离机制
- F' s D7 ~0 T! I 调试端口访问:1 l0 ^4 e C1 T / e2 e. O8 J7 q+ _2 n$ w& I 出厂的芯片缺省关闭CM0+一侧的调试端口访问,即使在RDP0的状态下也只能调试CM4内核。. X+ t9 J3 m0 K! F7 z Option Byte: b4 r! M. f! F+ k* |3 m6 ] OptionByte中包含双核隔离相关的安全设置,例如CM0+才能访问的Flash区间等等。这些OptionByte受到保护,无法随意被修改。缺省出厂芯片已经使能CM0+的保护,相关的一些OptionByte设置无法通过调试端口或CM4进行修改。 片上Flash:; c" n, m) I! y. @+ V$ R 3 D0 a, O& @; W Flash的一部分只能由CM0+访问,CM4无法对该部分Flash进行读、写、擦。 片上SRAM:5 F. ~9 |2 i( |$ w7 ^ 1 y- M5 h. ?+ N- a/ n( v SRAM的一部分只能由CM0+访问,CM4无法对该部分SRAM进行读、写。+ r1 V5 }: X4 v3 w4 o& y1 L- Y CRYPTO硬件资源:如AES,TRNG,PKA / E( E1 Z; v$ {! y+ ~ 系统上电复位时,缺省CRYPTO相关的硬件CM4可以使用。CM0+内核可以通过修改SystemConfig相应的寄存器使得这些硬件资源只能由CM0+内核进行控制,也称为把这些硬件资源配置成Secure访问模式。其中当AES1被配置为Secure时,CM4内核无法访问密钥寄存器,但是依旧可以访问AES1的其他寄存器使用AES1硬件单元进行加解密操作。' A' g( |* r! k ( E. {, t$ u4 K3 @) c CKS (Customer Key Storage) AES算法是应用程序中经常用到的一种保障数据机密性和完整性的方法,例如用于隐私数据的加密存储、加密通信等。其中,密钥作为最敏感的信息也需要受到保护。# z& Q D! G6 Y* W* F " m( w v/ ~2 n( b9 H4 m) O 4 S4 y7 W/ R; `3 G9 D7 |7 X STM32WB的CKS功能提供在MCU上的密钥安全存储和安全使用方法 :- Y3 M6 p2 R, j& w w, F $ s0 K7 [- v* O3 C0 O 存储在片上安全Flash的密钥无法通过调试端口获取(即使在RDP0条件下) + d8 E. l% K+ c5 U9 I6 t( f - Z( e. [" ]* x& f, A 运行在CM4内核的应用程序代码也无法获得片上安全Flash中存储的密钥,避免软件漏洞带来的风险 1 A7 e' h* w( F# N 应用程序代码依旧能够通过CKS和AES1硬件模块使用存储的密钥进行加解密操作 ( ~% I5 X" N) x! w/ F x7 W3 W CKS能够存储多组密钥,应用程序代码可以通过密钥索引来指定AES运算所使用的密钥
用户密钥存储 8 O7 t: y( U; V; y* `/ d用户密钥存储在"安全"Flash区域,用户代码和调试端口不可访问 ' D8 L; Y5 t$ F# Y! ` - j$ c. \1 } h! o CKS最多可以存储100个用户应用密钥(用于AES运算) & f# O/ d0 R. I' S / ^" w5 r1 ?8 v9 H- Y 允许存储128位或者256位的AES密钥 8 I' d5 \/ j3 i7 U4 Y; ~ * J5 n* E/ Y' p7 ^9 z d/ v; w 对密钥的操作只能通过用户代码调用FUS接口完成 把密钥写到“安全”Flash区域,需要安全的操作环境 8 e1 r6 B+ Q4 x0 n8 V! T2 W( L
; p5 s$ A+ X% e1 L/ A1 \. V% } 用户密钥的写入 (Key Provisioning) 1 l& Q S$ e, W* y, C 可以通过用户代码完成,也可以通过CubeProgrammer的GUI或者命令行完成 9 i7 \1 r0 M2 H1 G7 }! j 写入应用密钥的明文//simple key,需要安全的操作环境 $ V8 }7 N2 ]: \7 r1 G ' [) w' R$ P* _% ?+ ^% D 9 e% x {$ Y2 N4 y% d1 c, H5 ^ e 写入应用密钥的密文//encrypted key,无需安全的操作环境 * F [' }% |2 q. g$ x3 [! u& J" Q % n; D* G. Y- W4 ` 基于AES-128 GCM * X3 d. E v( m1 w. V $ U, t, w! S8 p$ L, ?3 Z0 _ " }9 [* r, k1 U) O/ H3 X 写入用于解密encrypted key的密钥的明文//master key,需要安全的操作环境 9 X; ?2 c+ r5 S! W) T6 x 该操作在手册中用“write”或“load”表示1 K/ W# J$ K3 q: g+ c" j
, ]$ r/ R3 f$ k/ d8 N# e6 p/ z* r ) X, y- Z$ B9 c: p% Z 用户密钥的写入通过应用代码实现 9 }3 {2 y% m. {8 y2 u; X$ k4 T2 b' z. Z. T% y" J 参考例程: STM32Cube_FW_WB_Vxxx\Projects\P-NUCLEO-WB55.Nucleo\Applications\CKS\ 1 d) f& y& W0 w- c6 T 给CKS_param赋值0 `% c9 X) y% v1 J
调用FUS服务:SHCI_C2_FUS_StoreUsrKey 输入:CKS_param结构体 % b6 l/ w! ~+ l. u4 ]: a 输出:芯片为该密钥分配的索引! W( d' ^) E' m6 X. Z # U$ @- \* {, q/ K
" S% N6 ^, @9 Q- X: I6 U6 o" x3 j h 用户密钥的写入使用STM32CubeProgrammer GUI实现 * c; e& E" k: S7 n$ g* U0 h/ H STM32CubeProgrammer 从2.4版本开始支持 " A* t; g4 `+ `& f' C 芯片切换到系统 Bootloader 启动运行DFU, " m2 B1 U' v& W+ c5 Y7 R5 u* l, O STM32CubeProgrammer 以USB方式连接芯片
步骤:选择KEY文件 ——> 指定KEY类型 ——> 写入KEY9 ?( d3 S4 `/ ?! G4 T
+ _3 r7 c" z5 a4 G 注意:GUI界面没有返回为该密钥分配的索引,需要用户自己记录3 R3 E0 ?$ J# N! h4 q2 Q3 n: _ 7 c' z' ^1 C% ^3 k9 Y- W% m 应用密钥的装载和使用 7 b0 Y/ {$ h$ g" N" Y6 v" {Load:AES1的密钥装载 SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx) * p0 N3 h6 f3 t, {5 i 该操作会把AES1密钥寄存器配置成Secure SAES1@SYSCFG_SIPCR + L0 G( Q0 S% G( n4 C 只能由运行在CM0+上的FUS来配置 运行在CM4上的用户代码可以读取其状态 % i) l! }8 @9 G2 h9 E N! |2 } 安全状态和AES1时钟是否使能没有关系- ]6 d% `2 N1 I) C& q# X L
" L# a0 M. j/ c- u! N* @ 使用步骤 7 @7 W' f$ Y" Y3 ^6 P Step1:AES1模块初始化 8 {- M) O/ G! { 1 z& g& D* S! q$ c7 G( c9 P: t 初始化结构体的pKey,设置为空指针即可 1 S7 t, u$ n3 ^1 Y+ s 6 p8 q \+ W, \/ X& a5 ^5 c' s ! m6 v; ~; [- P0 e- p 使能AES1时钟 6 _& L2 b% F. }* s5 X, u Step2:密钥装载 1 r2 J ^/ G% U4 j & K8 _3 e4 K4 `7 y+ U( ~ 要在AES1模块disable1的时候 (EN=0) ; V# u8 O" d7 Q4 [2 Q % _8 |3 L W7 t Step3:使用AES1做加解密7 }" x9 _2 |4 k, b+ x
应用密钥的使用 Lock:9 u5 d. i, n) F9 Q2 S5 m ·SHCI_C2_FUS_LockUsrKey (key_simple_128_idx) 0 N" A7 `, h0 n& k. h/ ^; o ·对某个key lock之后,将无法再对该key进行 Load操作,再次Load该Key时FUS API返回 错误代码0xFF;但是不影响已经在AES1密 钥寄存器中的key3 G. s# e9 H! v) e* Y R8 r ·对该key load的禁止操作,会一直生效直到 下次系统复位 注意事项:关于后续更新 1 G3 _3 I2 g. Q 2 m0 i- G& N; ^1 t# R( D ·为了避免有效密钥一直存在于AES1密钥寄存 器中,建议使用完毕后Load一个dummy key 或者disable AES1 ! l# e( ^- H( B2 y# e( X& } ·后续FUS版本(从 STM32CUbeWB1.11开始)会增加API:Unload# K3 i$ q" k* \3 M/ e. G! I ·早期出厂芯片预装的FUS版本较老,在FUS 升级的时候,通过CSK存储在芯片里的用户 key会被擦除 " a" U `5 u) E+ A ·从FUS1.1.1.1或者FUS1.2.0开始,再做FUS升 级,不会影响到已经存在的用户key 应用密钥的使用 小结
" x$ C9 I! K( g, U3 t5 |# n! ^ 使用CKS对AES密钥进行保护,与传统的直接将AES密钥存储在Flash中的做法有明显的优势:7 u* u9 S* Z5 c CKS存储的密钥数据无法通过调试端口获取,已经存储的密钥数据,即使在RDP为0的情况下也不能通过调试端口访问。$ s* y1 \) r, S: B0 ^ 密钥使用过程中应用程序代码虽然可以使用密钥进行加解密操作,但是始终无法直接获取密钥数据本身,降低了软件漏洞可能带来的风险。* V; I. {. x; W4 N2 G8 i+ q6 ^( K 6 P% A" Z" ]# j; s7 o' _3 } 0 z. f6 E2 q$ S & Q* D5 n$ ~9 I6 m: n t( f- X; s! ]8 A- A9 A3 L. G+ {2 a |
|
详实、详尽、详细。学无止境!& ^/ O6 A8 g. s) y E& X5 g |
低功耗蓝牙无线升级:STM32WB OTA 固件更新技术解析
STM32WB Zigbee 自定义集群开发实战:AN5491 应用笔记深度解读
吃透:STM32WB 上 Zigbee 睡眠终端设备开发攻略
STM32 无线 MCU HSE 频率与启动时间精确调谐实战指南
深度解读:STM32WB 2.4GHz 低成本 PCB 蛇形天线设计实战指南
经验分享 | STM32WB 双核无线 MCU 开发全流程实战指南
STM32WB 基于 Custom Template 实现 BLE 私有协议 实操开发指南
详解STM32单片机的堆栈
STM32单片机进行除零运算,为何程序不崩溃?
从照明到楼宇:STM32WBx5 BLE Mesh 落地指南
微信公众号
手机版