2. RA 系列 MCU 硬件安全基础

在讨论安全启动与固件升级之前,必须先理解 RA 系列 MCU 在硬件层面提供了哪些安全能力。安全启动不是纯软件算法,它依赖芯片内部的信任根、密钥存储、加解密引擎以及启动阶段的固件代码。如果这些硬件基础没有正确启用或配置,后续的签名验证、镜像解密和防回滚机制都会失去根基。本节从 RA 产品线的安全特性分布入手,逐层说明 TrustZone、安全存储、加密加速器和启动 ROM 各自承担的角色,以及它们之间的协作关系。

RA 产品线的安全能力分层

RA 系列覆盖 RA0、RA2、RA4、RA6、RA8 等多个子系列,不同型号在安全能力上并非完全一致。总体来看,安全特性可以按三个层次理解:第一层是基础安全外设,包括唯一 ID、闪存访问保护、寄存器写保护、时钟与复位监控等,几乎所有 RA 型号都具备;第二层是加密与密钥管理能力,包括真随机数发生器(TRNG)、AES 加解密引擎、SHA 哈希引擎、密钥管理单元等,通常出现在 RA4 及以上带 S 或 Security 后缀的型号中;第三层是 TrustZone 与安全启动支持,主要出现在 RA6M4、RA6M5、RA8M1、RA8D1 等较新且面向安全应用的型号上。选型时如果计划实现完整的安全启动链,应优先确认目标型号是否具备 TrustZone、安全存储和启动 ROM 验证能力,而不是仅看主频和封装。

TrustZone:把一颗 MCU 分成两个世界

Arm TrustZone 在 Cortex-M33 和 Cortex-M85 内核上提供了一种硬件隔离机制。它把处理器、内存和外设划分为安全世界(Secure World)和非安全世界(Non-secure World)。安全世界运行安全启动代码、密钥管理、固件验证等敏感逻辑;非安全世界运行普通应用、通信协议栈和用户任务。两者之间的切换通过安全网关(Secure Gateway, SG)指令完成,非安全代码不能直接访问安全资源,必须通过预定义的安全服务接口调用。

在 RA 系列中,TrustZone 的配置通常通过 FSP(Flexible Software Package)中的 TrustZone 设置完成。开发者需要为每个内存区域和外设分配安全属性:例如将启动 ROM、密钥存储区、安全外设寄存器划为安全属性,将应用 Flash、SRAM 和普通外设划为非安全属性。一个常见的教学示例是:把 RA6M4 的 0x0000_0000 到 0x0000_FFFF 划为安全 Flash,用于存放安全启动代码和公钥;把 0x0800_0000 起始的应用区划为非安全 Flash,用于存放待验证的固件镜像。这样即使非安全固件被篡改,也无法直接改写安全区的验证逻辑。

安全存储:密钥和敏感数据的落脚点

安全启动的核心是密钥。公钥用于验证固件签名,私钥用于签名,对称密钥用于解密固件镜像。这些密钥不能以明文形式放在普通 Flash 中,否则攻击者读取 Flash 即可获得密钥。RA 系列提供了多种安全存储手段:部分型号内置安全密钥存储区,只能由安全世界访问;部分型号支持将密钥加密后存储在普通 Flash 中,由加密加速器在运行时解密使用;还有型号提供一次性可编程(OTP)区域,用于存放不可更改的根密钥或设备唯一密钥。

实际配置时,需要明确哪些密钥放在哪里。例如,根公钥可以放在安全 Flash 中,由启动 ROM 直接读取;固件解密密钥可以放在安全密钥存储区,由安全世界在验证通过后加载到加密加速器;设备唯一密钥可以放在 OTP 中,用于生成设备绑定密钥。安全存储不是简单的“找个地方放密钥”,而是要保证密钥的机密性、完整性和可用性,同时避免非安全世界通过侧信道或调试接口获取密钥。

加密加速器:让验证和解密在可接受时间内完成

安全启动过程中,启动 ROM 需要对固件镜像做哈希计算和签名验证,可能还需要对加密镜像做 AES 解密。如果全部用软件实现,在 MCU 上会消耗大量时钟周期,导致启动时间过长。RA 系列集成了加密加速器,包括 AES 引擎、SHA 哈希引擎、TRNG 和部分型号的 ECC/RSA 加速单元。以 RA6M4 为例,其安全加密引擎支持 AES-128/256、SHA-256、TRNG,并可通过 SCE(Secure Crypto Engine)接口调用。

一个典型的验证流程是:启动 ROM 读取固件镜像,调用 SHA 引擎计算镜像哈希,再调用 ECC 或 RSA 引擎用公钥验证签名。如果镜像经过加密,则先调用 AES 引擎解密,再计算哈希和验证签名。加密加速器的存在使得这些操作可以在毫秒级完成,而不是秒级。配置时需要注意 DMA 通道、时钟使能和中断优先级,避免加密引擎与其它外设争用总线导致启动超时。

启动 ROM:信任根的起点

启动 ROM 是芯片出厂时固化在只读存储区中的一段代码,它在上电复位后最先执行。启动 ROM 的职责包括:初始化基本时钟和电源、读取启动模式引脚、判断从哪个存储介质启动、加载并验证一级引导程序(如 BL2 或安全启动加载器)。在支持安全启动的 RA 型号中,启动 ROM 还包含验证逻辑,可以用芯片内固化的根公钥验证一级引导程序的签名。由于启动 ROM 不可修改,它构成了整个信任链的根。

信任链的传递关系是:启动 ROM 验证一级引导程序,一级引导程序验证二级引导程序或应用固件,应用固件再验证外部通信固件或升级包。每一级都使用上一级提供的公钥或哈希值进行验证,任何一级失败都会停止启动或进入恢复模式。理解这一点后,后续配置安全启动时,就需要明确每一级的镜像格式、签名算法、公钥存放位置和验证失败后的行为。

RA MCU 硬件安全基础与信任链 启动 ROM 固化信任根 · 不可修改 上电首执行 · 验证一级引导 安全世界 (Secure World) 安全启动代码 · 密钥管理 固件签名验证 · 安全服务 安全外设访问 · 安全中断 非安全世界 (Non-secure World) 应用固件 · 通信协议栈 用户任务 · 普通外设 升级包接收 · 数据缓冲 SG 网关 加密加速器 (SCE) AES-128/256 · SHA-256 TRNG · ECC/RSA 验证 DMA 通道 · 中断驱动 安全存储 安全密钥存储区 OTP 根密钥 · 设备唯一 ID 加密 Flash 密钥区 信任链传递 启动 ROM → 一级引导 → 二级引导 → 应用固件 → 升级包验证 关键配置要点: ① 确认型号支持 TrustZone 与安全启动(如 RA6M4/RA6M5/RA8 系列) ② 在 FSP 中划分安全/非安全内存与外设属性,配置 SAU/IDAU 区域 ③ 将根公钥、解密密钥分别放入安全 Flash、安全密钥存储区或 OTP,禁止明文暴露

各组件如何协同完成一次安全启动

把上述组件串起来看,一次典型的安全启动过程如下:上电复位后,启动 ROM 首先运行,初始化时钟和基本外设,然后从安全 Flash 中读取一级引导程序的头部信息,包括镜像长度、签名算法和签名值。启动 ROM 调用 SHA 引擎计算镜像哈希,再调用 ECC 引擎用固化在 ROM 中的根公钥验证签名。如果验证通过,启动 ROM 跳转到一级引导程序;如果失败,则根据配置进入恢复模式或停止启动。

一级引导程序运行在安全世界,它负责初始化 TrustZone 的 SAU 和 IDAU 区域,配置安全存储和加密加速器,然后验证二级引导程序或应用固件。验证通过后,一级引导程序通过安全网关跳转到非安全世界的应用入口。应用固件在非安全世界运行,当需要执行安全操作(如解密升级包、写入安全存储)时,通过安全服务接口请求安全世界处理。这样,即使非安全应用被攻击,攻击者也无法直接访问密钥或篡改验证逻辑。

配置时容易忽略的细节

在实际项目中,有几个细节经常被忽略。第一,TrustZone 的内存属性划分必须与链接脚本一致,否则安全代码可能被链接到非安全区域,导致启动失败。第二,加密加速器的时钟使能和 DMA 配置需要在启动 ROM 阶段就完成,否则验证时间会显著增加。第三,安全存储区的访问权限要同时考虑安全世界和非安全世界的读写需求,避免非安全世界完全无法读取必要的状态信息。第四,启动 ROM 的验证失败策略需要与产品需求匹配:是停止启动、进入恢复模式,还是回退到备份镜像,不同策略对应不同的硬件配置和软件流程。

理解硬件安全基础的关键,是把“信任根—验证链—密钥存储—加解密执行”看作一个整体。启动 ROM 提供不可篡改的起点,TrustZone 提供隔离边界,安全存储保护密钥,加密加速器保证验证效率。四者缺一不可,后续的安全启动配置和固件升级流程都建立在这个基础之上。