密钥管理单元(Key Management Unit,KMU)是Arm架构中专门设计用于保护密钥材料的硬件安全模块。作为SoC安全体系的核心组件,KMU通过物理隔离和加密传输机制,为系统提供端到端的密钥保护方案。
KMU的核心设计目标是在整个密钥生命周期中实现"不可见性"保护:
典型应用场景包括:
安全防护机制对比表:
| 威胁类型 | 防护措施 | 实现方式 |
|---|---|---|
| 物理探测 | 动态掩码 | LWMF/RWMF联合防护 |
| 时序分析 | 随机延迟 | PRBG生成随机间隔 |
| 故障注入 | 奇偶校验 | 寄存器级奇偶校验 |
| 软件攻击 | 硬件隔离 | 安全APB访问控制 |
KMU采用模块化设计,主要功能单元包括:
密钥存储区
安全传输通道
辅助安全模块
总线接口方面,KMU提供:
硬件密钥槽用于存储不可变更的根密钥,具有以下特性:
硬件密钥加载流程示例:
注意:硬件密钥槽的地址空间与软件密钥槽隔离,任何错误的访问尝试将触发AWBHKSKR(错误硬件密钥槽访问)中断。
软件密钥槽提供更灵活的密钥管理能力:
密钥加载示例代码流程:
c复制// 1. 随机顺序写入密钥片段
KMUKSK0 = key_fragment0;
KMUKSK7 = key_fragment7; // 反序写入增加安全性
...
// 2. 验证写入正确性
if(KMUKSK0 != key_fragment0) {
// 重试或触发安全响应
}
// 3. 配置密钥槽属性
KMUKSC0 = (DPDW_32BIT | NDPW_8 | DPAI_INC);
// 4. 锁定密钥槽
KMUKSC0 |= KSIP_LOCK;
// 5. 验证密钥槽就绪
KMUKSC0 |= VKS_VALIDATE;
while(!(KMUKSC0 & KSR_READY));
密钥槽状态转换图:
锁定 -> 验证 -> 就绪 -> 导出 -> (临时锁定可回到验证状态)
KMU采用三层防护确保密钥传输安全:
典型导出时序:
抗侧信道增强措施:
LWMF工作流程:
python复制masked_data[0:15] = raw_data[0:15] ^ mask[0:15]
masked_data[16:31] = raw_data[16:31] ^ mask[0:15]
RWMF校验流程:
python复制unmasked_data[0:15] = received_data[0:15] ^ user_bits[0:15]
unmasked_data[16:31] = received_data[16:31] ^ user_bits[0:15]
PRBG特性:
初始化示例:
c复制// 使用设备唯一信息作为种子
KMUPRBGSI = boot_counter;
KMUPRBGSI = device_id[0];
KMUPRBGSI = device_id[1];
KMUPRBGSI = entropy_value;
// 锁定种子寄存器
KMUKSC0 |= L_KMUPRBGSI;
三种延迟寄存器:
使用场景:
c复制// 安全关键操作间的随机间隔
read_KMURD_32();
perform_crypto_op1();
read_KMURD_16();
perform_crypto_op2();
安全异常处理流程:
安全子系统参考设计:
code复制[LCM] --私有APB3--> [KMU] --AHB5--> [PPC] --APB--> [Crypto Engine]
| ^
|--RWMF---------|
硬件密钥槽:
总线防护:
时钟配置:
密钥导出时间估算公式:
code复制总周期数 = N * (T_write + T_delay)
其中:
N = 8/16/32(取决于NDPW)
T_write = 基础写入周期(通常2-3周期)
T_delay = KMUKSCn.DPWD配置值
优化方法:
启动流程密钥派生:
加密更新流程:
问题1:密钥导出失败(KSR=0)
问题2:频繁奇偶错误
问题3:性能不达标
我在实际芯片验证中发现三个关键经验: