|
我们都知道STM32WB是双核多协议无线微控制器,即主频为64 MHz的 Arm®Cortex®‐M4内核(应用处理器)和主频为32 MHz的Arm®Cortex®‐M0+内核(网络处理器),支持Bluetooth™ 5和IEEE 802.15.4无线标准。双核的好处是可以优化对资源的安全使用,保证和RF协议栈相关处理的实时性,并可同时提供电源管理的灵活性。 STM32WB的信息安全是以双核隔离为基础的。 STM32WB双核架构和双核间的隔离机制
调试端口访问: 出厂的芯片缺省关闭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运算所使用的密钥
用户密钥存储 用户密钥存储在"安全"Flash区域,用户代码和调试端口不可访问 CKS最多可以存储100个用户应用密钥(用于AES运算) 允许存储128位或者256位的AES密钥 对密钥的操作只能通过用户代码调用FUS接口完成 把密钥写到“安全”Flash区域,需要安全的操作环境
用户密钥的写入 (Key Provisioning) 可以通过用户代码完成,也可以通过CubeProgrammer的GUI或者命令行完成 写入应用密钥的明文//simple key,需要安全的操作环境 写入应用密钥的密文//encrypted key,无需安全的操作环境 基于AES-128 GCM 写入用于解密encrypted key的密钥的明文//master key,需要安全的操作环境 该操作在手册中用“write”或“load”表示
用户密钥的写入通过应用代码实现 参考例程: STM32Cube_FW_WB_Vxxx\Projects\P-NUCLEO-WB55.Nucleo\Applications\CKS\ 给CKS_param赋值
调用FUS服务:SHCI_C2_FUS_StoreUsrKey 输入:CKS_param结构体 输出:芯片为该密钥分配的索引
用户密钥的写入使用STM32CubeProgrammer GUI实现 STM32CubeProgrammer 从2.4版本开始支持 芯片切换到系统 Bootloader 启动运行DFU, STM32CubeProgrammer 以USB方式连接芯片
步骤:选择KEY文件 ——> 指定KEY类型 ——> 写入KEY
注意:GUI界面没有返回为该密钥分配的索引,需要用户自己记录 应用密钥的装载和使用 Load:AES1的密钥装载 SHCI_C2_FUS_LoadUsrKey (key_simple_128_idx) 该操作会把AES1密钥寄存器配置成Secure SAES1@SYSCFG_SIPCR 只能由运行在CM0+上的FUS来配置 运行在CM4上的用户代码可以读取其状态 安全状态和AES1时钟是否使能没有关系
使用步骤 Step1:AES1模块初始化 初始化结构体的pKey,设置为空指针即可 使能AES1时钟 Step2:密钥装载 要在AES1模块disable1的时候 (EN=0) Step3:使用AES1做加解密
应用密钥的使用 Lock: ·SHCI_C2_FUS_LockUsrKey (key_simple_128_idx) ·对某个key lock之后,将无法再对该key进行 Load操作,再次Load该Key时FUS API返回 错误代码0xFF;但是不影响已经在AES1密 钥寄存器中的key ·对该key load的禁止操作,会一直生效直到 下次系统复位 注意事项:关于后续更新 ·为了避免有效密钥一直存在于AES1密钥寄存 器中,建议使用完毕后Load一个dummy key 或者disable AES1 ·后续FUS版本(从 STM32CUbeWB1.11开始)会增加API:Unload ·早期出厂芯片预装的FUS版本较老,在FUS 升级的时候,通过CSK存储在芯片里的用户 key会被擦除 ·从FUS1.1.1.1或者FUS1.2.0开始,再做FUS升 级,不会影响到已经存在的用户key 应用密钥的使用 小结
使用CKS对AES密钥进行保护,与传统的直接将AES密钥存储在Flash中的做法有明显的优势: CKS存储的密钥数据无法通过调试端口获取,已经存储的密钥数据,即使在RDP为0的情况下也不能通过调试端口访问。 密钥使用过程中应用程序代码虽然可以使用密钥进行加解密操作,但是始终无法直接获取密钥数据本身,降低了软件漏洞可能带来的风险。 |
|
详实、详尽、详细。学无止境! |
吃透:STM32WB 上 Zigbee 睡眠终端设备开发攻略
STM32 无线 MCU HSE 频率与启动时间精确调谐实战指南
深度解读:STM32WB 2.4GHz 低成本 PCB 蛇形天线设计实战指南
经验分享 | STM32WB 双核无线 MCU 开发全流程实战指南
STM32WB 基于 Custom Template 实现 BLE 私有协议 实操开发指南
详解STM32单片机的堆栈
STM32单片机进行除零运算,为何程序不崩溃?
从照明到楼宇:STM32WBx5 BLE Mesh 落地指南
STM32WB ZigBee 配网:从“按键入网”到“安全运营”的六边形战士养成记
STM32云连接 干货都在这里!
微信公众号
手机版