G32R501 内置硬件级安全启动机制,由 BootROM 固化代码实现128 位 AES-CMAC 固件身份认证,上电自动校验用户程序合法性,未签名固件拒绝执行,从根源防止固件破解、篡改与盗版。AN1139 是官方唯一安全启动实施手册,覆盖原理、权限、链接脚本、工具签名、调试量产全流程,照着做就能快速实现高等级固件安全。
资料获取:AN1139_G32R501 安全启动应用笔记
1. 安全启动核心原理(看懂就不会配错)
G32R501 安全启动分为两级校验,全部由硬件保障:
- 主要安全启动(强制)
- BootROM 校验 Flash 前 8KB(0x2000)代码
- 算法:AES‑CMAC 128 位
- 校验通过才跳转到用户程序
- 入口扇区必须设为Zone1‑ExeOnly(只允许执行,禁止读取)
- 扩展安全启动(可选)
- 用户代码自主校验8KB 以外区域
- 权限可配置:Unsecure / Zone1‑Secure / Zone1‑ExeOnly
- 用于整固件完整性保护
核心规则:参与 CMAC 校验的区域严禁设为 Zone2 权限。
2. 4 种安全启动入口配置(直接查表)
安全启动仅支持CPU0 启动,BootMode 固定为0x0A/0x2A/0x4A/0x6A:
| 选项 | BootMode | 入口地址 | CMAC Tag 存放地址 |
|---|---|---|---|
| 0 | 0x0A | 0x08000000 | 0x08000008 |
| 1 | 0x2A | 0x00100000 | 0x00100008 |
| 2 | 0x4A | 0x08020000 | 0x08020008 |
| 3 | 0x6A | 0x00120000 | 0x00120008 |
3. 工程设计 3 条铁律(不满足必死机)
3.1 Golden CMAC Tag 位置固定
- 主要安全启动:入口地址 + 8 字节
- 占用 4×32bit=16 字节
- 必须放在向量表第 2~5 项(SP、PC 之后)
3.2 Flash 权限严格分区
- 仅代码段(.text)可加密设为 ExeOnly
- 数据段禁止加密:
- const 只读数据 (RO‑DATA)
- 已初始化变量 (RW)
- 拷贝用初始值存储段
3.3 双向量表设计(关键)
- 第 1 张向量表(放启动地址):仅含SP+PC+CMAC 占位
- 第 2 张向量表:放全部中断函数,存在非加密区
4. MDK 工程实战配置
4.1 安全启动向量表(必须放 0x08000000)
const PINT __VECTOR_TABLE_CMAC[6] __attribute__((at(0x08000000))) = {
(PINT)&__INITIAL_SP, // [0] SP
Reset_Handler, // [1] PC
(PINT)0xFFFFFFFF, // [2] CMAC[0]
(PINT)0xFFFFFFFF, // [3] CMAC[1]
(PINT)0xFFFFFFFF, // [4] CMAC[2]
(PINT)0xFFFFFFFF // [5] CMAC[3]
};
4.2 分散加载脚本.sct(分区关键)
; 加密区:仅放代码 + 第一张向量表
LR_SECURE_ROM 0x08000000 0x2000 {
ER_SECURE_ROM 0x08000000 0x2000 {
*.o (RESET, +First) ; 安全向量表
.ANY (+RO) ; 代码段
}
}
; 非加密区:存放数据、第二张向量表
LR_UNSECURE_ROM 0x08002000 0x7E000 {
ER_UNSECURE_ROM 0x08002000 0x7E000 {
*(InRoot$$Sections)
.ANY (+CONST) ; 只读数据
.ANY (+RW) ; 已初始化数据
}
}
5. Geehy_Bin 签名工具使用(一步生成合法固件)
5.1 准备文件
key.txt:存放 128 位密钥(出厂默认全 F)test_major.cmd:配置主要启动入口与长度test_extend.cmd:配置扩展启动范围
5.2 生成主要安全启动固件
Geehy_Bin.exe test_major.cmd -m --load_image --cmac=key.txt app.bin -tag=0x08000008 -o app_signed.bin
5.3 生成扩展安全启动固件
Geehy_Bin.exe test_extend.cmd -e --load_image --cmac=key.txt app_signed.bin -tag=0x08008000 -o app_final.bin
6. 调试启动设置(JLink 切换安全模式)
w4 0x50020000 0x5AFFFFFF ; 写入BootKey
w4 0x50020004 0xFFFFFF0A ; 设置BootMode=0x0A
w4 0x50020008 0xFFFFFFFF
- 下载
app_final.bin,复位即进入安全启动 - 校验通过:LED 正常闪烁
- 校验失败:芯片停留在 BootROM,无运行
7. 常见问题速解(AN1139 重点)
- 安全启动失败 / 不运行:CMAC Tag 位置错误、密钥不匹配、Flash 权限错误
- 进不了加密区:中断向量表放 ExeOnly 区,数据段被加密
- 签名后无法运行:入口地址与 - tag 参数不一致,未先生成主要启动再扩展
- 调试无法下程序:DCS 安全区未解锁,需先解除保护再烧录
AN1139 是 G32R501安全启动唯一官方实施标准,核心就四步:双向量表设计 → 脚本分区 → Geehy_Bin 签名 → 烧录启动。配合 Zone1‑ExeOnly 与 AES‑CMAC 硬件认证,可实现高等级固件保护,满足工业、车规、新能源等高安全需求项目。
阅读全文
1047