• 正文
  • 相关推荐
申请入驻 产业图谱

G32R501 安全启动完整指南:AES-CMAC 身份校验 + 加密启动一步到位

04/27 10:44
1046
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

G32R501 内置硬件级安全启动机制,由 BootROM 固化代码实现128 位 AES-CMAC 固件身份认证,上电自动校验用户程序合法性,未签名固件拒绝执行,从根源防止固件破解、篡改与盗版。AN1139 是官方唯一安全启动实施手册,覆盖原理、权限、链接脚本、工具签名、调试量产全流程,照着做就能快速实现高等级固件安全。

资料获取:AN1139_G32R501 安全启动应用笔记

1. 安全启动核心原理(看懂就不会配错)

G32R501 安全启动分为两级校验,全部由硬件保障:

  1. 主要安全启动(强制)
    • BootROM 校验 Flash 前 8KB(0x2000)代码
    • 算法:AES‑CMAC 128 位
    • 校验通过才跳转到用户程序
    • 入口扇区必须设为Zone1‑ExeOnly(只允许执行,禁止读取)
  2. 扩展安全启动(可选)
    • 用户代码自主校验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 重点)

  1. 安全启动失败 / 不运行:CMAC Tag 位置错误、密钥不匹配、Flash 权限错误
  2. 进不了加密区:中断向量表放 ExeOnly 区,数据段被加密
  3. 签名后无法运行:入口地址与 - tag 参数不一致,未先生成主要启动再扩展
  4. 调试无法下程序:DCS 安全区未解锁,需先解除保护再烧录

AN1139 是 G32R501安全启动唯一官方实施标准,核心就四步:双向量表设计 → 脚本分区 → Geehy_Bin 签名 → 烧录启动。配合 Zone1‑ExeOnly 与 AES‑CMAC 硬件认证,可实现高等级固件保护,满足工业、车规、新能源等高安全需求项目。

相关推荐