验证流程
Manifest 组成与作用
在安全启动的验证流程中,芯片需要从固件中读取各种信息来完成验证: 版本号、算法、公钥、签名等。这些信息全部被组织在 Manifest 中。Manifest 可以理解为固件的"身份描述文件":它是一个二进制格式的元数据块,被附加在可执行固件的头部。 以下三个部分均拥有独立的 Manifest:
Image1(Bootloader):引导程序,负责验证密钥证书和应用固件;
Cert(Key Certificate):密钥证书,用于传递应用固件的公钥哈希值;
Image2(Application):应用固件,用户的应用程序。
验证流程详解
安全启动建立在"信任链"机制之上,信任链从不可篡改的硬件 ROM 和 OTP 开始, 通过逐级验证延伸至最终的应用固件。下图展示了完整的三级验证流程:
芯片启动验证过程根据模式略有差异: 标准 ECC 模式仅验证 ECC 签名,PQC 混合模式需同时验证 ECC 和 PQC 两种签名。但无论哪种模式,每级验证都包含三个核心步骤:
首先校验公钥可信性:计算 Manifest 中公钥的哈希值,与 OTP 中烧录的公钥哈希值对比;
再验证 Manifest 可靠性:使用公钥验证 Manifest 签名;
最后验证固件可靠性:计算实际固件的哈希值,与 Manifest 中的编译后处理阶段生成的固件哈希值对比。
任一步骤失败,芯片都将终止启动。具体流程如下:
第一级 :Boot ROM → Bootloader(image1)
Boot ROM 从 OTP 读取公钥哈希值,计算 Bootloader Manifest 中公钥的哈希值并对比。 两者一致后,使用公钥验证 Manifest 签名(被签名的内容是除 Signature 外的所有 Manifest 字段)。 验签成功后,读取 Manifest 中的固件哈希,计算实际固件哈希并进行对比,验证通过后跳转执行 Bootloader。
第二级 :Bootloader → Key Certificate(cert)
Bootloader 使用 OTP 中的公钥来验证密钥证书,确认证书的公钥与 OTP 匹配后再验证证书签名。 验签通过后从证书提取应用固件的公钥哈希值,建立后续验证的信任锚点。 证书不包含可执行固件,无需验证固件可靠性。
第三级 :Bootloader → Application Firmware(image2)
Bootloader 使用证书中的公钥哈希验证应用固件公钥,后续流程与第一级验证相同。
明确验证流程后,下面介绍公钥哈希和算法配置方法。
参数配置
参数配置总览
安全启动涉及多个关键参数,涵盖签名密钥、哈希算法和存储位置等。下表汇总了主要参数:
参数名称 |
功能 |
IC 存储位置 |
|
|---|---|---|---|
私钥 |
对固件进行数字签名 |
sboot_private_key |
IC 端不存储 |
公钥 |
IC 启动时用于验证固件签名 |
sboot_public_key |
|
公钥哈希 |
信任根锚点,验证公钥合法性 |
sboot_public_key_hash |
|
RMA 公钥哈希 |
RMA 模式下的备用公钥哈希 |
sboot_public_key_hash |
|
HMAC 密钥 |
固件哈希计算密钥(仅 HMAC 模式) |
sboot_hmac_key |
|
签名算法 |
指定签名类型(如 ed25519) |
sboot_algorithm |
|
哈希算法 |
指定固件摘要算法(如 sha256) |
sboot_hash_alg |
|
安全启动使能 |
启用安全启动功能 |
sboot_enable |
了解整体参数配置后,下面详细介绍各参数的存储位置和配置方法:
公钥哈希存储详解
安全启动通过 OTP 存储公钥哈希值,形成不可篡改的硬件信任根。 芯片启动时,Boot ROM 计算 Manifest 中公钥的哈希值并与 OTP 中存储的公钥哈希值对比, 验证通过后继续执行启动流程。三级验证流程中使用的公钥哈希值分别存储在不同位置:
Image1(Bootloader):公钥哈希默认存储在 OTP 的 PK1 区域(物理地址 0x320~0x33F)
Cert(Key Certificate):
SDK 默认配置下,密钥证书使用与 Bootloader 相同的 PK1 密钥对。
Bootloader 和应用固件由不同团队开发时,使用 PK2 实现密钥隔离,确保证书密钥泄露不影响 Bootloader 安全。使用 PK2 时,公钥哈希需存储在 OTP 的 PK2 区域(物理地址 0x340~0x35F),并修改
{SDK}/component/soc/amebaxxx/usrcfg/ameba_bootcfg.c文件:
/* 默认使用 PK1。如使用 PK2 独立密钥,请改为 SEC_PKKEY_PK2_0 */ u32 Cert_PKHash_OTP_ADDR = SEC_PKKEY_PK1_0;
Image2(Application):公钥哈希存储在密钥证书中,不需要烧录到 OTP。除默认密钥哈希外,可修改
manifest.json5文件增加自定义密钥哈希到证书中。
不同芯片的 OTP 配置如下:
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_HW_DIS |
物理地址 0x368[4] |
1 |
|
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_HW_DIS |
物理地址 0x368[4] |
1 |
|
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_HW_DIS |
物理地址 0x368[4] |
1 |
|
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_HW_DIS |
物理地址 0x368[4] |
1 |
|
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_HW_DIS |
物理地址 0x368[4] |
1 |
|
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
模式 |
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|---|
常规 |
PK1 |
物理地址 0x320~0x33F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
PK2 |
物理地址 0x340~0x35F |
256 |
为兼容不同算法与曲线,公钥哈希值(SHA256)存储于 OTP |
|
PK1_W_Forbidden_EN |
物理地址 0x365[1] |
1 |
烧录后 PK1 不可修改 |
|
PK2_W_Forbidden_EN |
物理地址 0x365[2] |
1 |
烧录后 PK2 不可修改 |
|
SECURE_BOOT_EN_PHY |
物理地址 0x368[3] |
1 |
任意使能位烧录后即启用安全启动
|
|
SECURE_BOOT_EN_LOG |
逻辑地址 0x3[2] |
1 |
||
RMA |
RMA_PK |
物理地址 0x720~0x73F |
256 |
RMA 模式下安全启动公钥的哈希值 出于安全考虑,用户可维护与 PK1/PK2 不同的 RMA 密钥 |
RMA_PK_W_Forbidden_EN |
物理地址 0x702[2] |
1 |
烧录后 RMA_PK 不可修改 |
完成公钥哈希的 OTP 配置后,接下来需要选择签名和哈希算法。
认证与哈希算法
签名和哈希算法配置项会被写入 Manifest,作为算法标识。支持两种配置方式:
开发阶段:OTP 中未指定算法时,芯片依据固件 Manifest(
manifest.json5)中的配置进行验签。量产阶段:在 OTP 中永久锁定哈希与签名算法。
不同芯片支持的算法及 OTP 配置如下:
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
名称 |
OTP 地址 |
长度(比特) |
描述 |
|---|---|---|---|
SECURE_BOOT_AUTH_ALG |
物理地址 0x36B[3:0] |
4 |
指定签名曲线
|
SECURE_BOOT_HASH_ALG |
物理地址 0x36B[7:4] |
4 |
指定哈希算法
|
一旦在 OTP 锁定算法配置, manifest.json5 中的 auth_alg 和 hash_alg 设置必须与 OTP 完全一致,否则芯片将无法启动。
该限制将同时应用于 Bootloader、密钥证书和应用固件。
HMAC 密钥
本章节仅适用于采用 HMAC 进行固件哈希校验的场景。HMAC 通过密钥增强哈希计算的安全性,需在 OTP 中预先配置统一密钥用于所有固件的哈希校验。 存储位置及保护设置如下:
名称 |
OTP 地址 |
大小(比特) |
描述 |
|---|---|---|---|
S_IPSEC_Key2 |
物理地址 0x220~0x23F |
256 |
HMAC 密钥存储位置。 |
S_IPSEC_Key2_R_Protection_EN |
物理地址 0x365[5] |
1 |
置 1 后,CPU 无法读取密钥(防止密钥被窃取)。 |
S_IPSEC_Key2_W_Protection_EN |
物理地址 0x365[6] |
1 |
置 1 后,密钥不可再被修改(防止密钥被篡改)。 |
使用方法
完成上述参数配置后,按以下步骤完成安全启动的完整配置流程。整个使用流程分为三个阶段:
开发阶段:由开发者完成,包括密钥生成、项目配置和固件编译;
量产阶段:由产线完成,包括固件烧录和 OTP 配置;
运行阶段:由芯片执行,包括设备复位和日志验证。
开发阶段
1. 生成密钥对
密钥对是安全启动的基础:私钥用于签名固件,公钥写入 Manifest 用于验证签名。 进入 SDK
{SDK}/tools/scripts目录,根据不同的签名算法,使用不同的密钥生成命令:$ python axf2bin.py encrypt keypair -a ed25519 -o keypair.json5
支持的 ECC 曲线:ed25519、secp192r1、secp224r1、secp256r1、bp256r1、secp192k1、secp224k1、secp256k1
支持的 PQC 算法:ml_dsa_65
脚本执行后会生成
keypair.json5文件。 建议为应用固件(image2)和 Bootloader(image1)分别生成不同的密钥对,以实现密钥隔离。
keypair.json5文件中,各算法的密钥字节序和公钥哈希计算方式如下:
算法
私钥字节序
公钥字节序
公钥哈希算法
哈希基于的公钥字节序
ECDSA
大端
大端
SHA-256
大端
Ed25519
小端
小端
SHA-256
小端
ML-DSA-65
小端
小端
SHA-256
小端
{
sboot_algorithm: ed25519,
sboot_private_key: "6AA34203018334474B25A0600996CA0968AA6228B886FF234B4EB9628B703C0A",
sboot_public_key: "E2A0D6500BBF1DD8DC212098C230EB731ECE3A81AA11D0E6E538FA36BBA4FF6E",
sboot_public_key_hash: "72B2E1CB0E8F715262AF38DFA0E522C95660D0EBFD920F4B1A229845E599C697",
}
{
sboot_pqc_algorithm: "ml_dsa_65",
sboot_pqc_private_key: "3502621252147CB758DEEABDBF029A0F655CD4A15B0F11FE378A6F99AFA23B6CE6D473E79F817C0866F9F4CBE6297135BC47B4C0A80231CBEB6CD8EAFDE9992228DEC448703592C8E2F59C37E0D09EF31832C929D6A84FACB9A93249F3B9A4CCDDBFE170D2FD77A33FFD5CC8A6967DA96AC10A37D4A9AC98FBE0003CDC6BE9955475437680243730813388872282081873583157442027348103385655505250303377286068215108687033267305286063402086470512026566306613384520044041547810005644162812664804207047560066674416888877235482885480020426452526742585783230177814472834570608845852345317204620185870443766465831555220486677761162774780563418377815567674774281205511868618252168706665186665644510108183340185510248884813513286704461125717052813165084308761444465256423686723441676020203647187604842271748644646043217074567144647337358771780283065808131746625825001455711260413223122875150413188102487021424132650050626282721871264887781303548458326284050740264176376330020172770172532642365251825471727800246871886573511265152802417470310078885084814864462335854384350444863375382664002544504451751076757347068185451478776783227026436061781721702063861417506247230054706856408431428018713012506231216561080023762422010070102257353515868713446861071028760378828733027083823040466076157434851523488713022007316585101783605607528856356157153573336855337237557115030330642846868052236277468675758103308163378716084532813622448272528304648778787683175301708070534137221204164467846083434218154840418678170080170442455335820501030763607318487722876702207820058278732642661788070440812851165645705152734071210205010723287447806308165476023671804221821223572131522770061418071481768354864613235461571648755554658384615530485733676137450275644134730215586312647118121358215138152341088301733317160146065208200253543588204550037553108041275418362642545774336330761637502415210132177334736358307052384836682003714372438420725187328213156824873441263016618486268074525635263833726621626744387464737334444573534164227758218374632031087572215275188013464464028155012284487257865878720766172850543877670041066430033676108744743018543520125035664531210343620156681426633204136126327723711165226146486102007853432756842470314087547173884486038527124671334865881787221731857185540483540022484305210224514562540765512848747036577624537723235201170851533680544528767764248022466844637783521274414252681503637752542103882668615810577842838320632524363648685141814802487141863448406177686613887558117571625088482118087640415157508566316205021120545508580085760460133317505435870645447572870046523332364536248564580076701402445478204877840128760487366788836727641541707024770070435663420655826450766326162432153516777652832447544004148865038212242741442520304652886340545384264352852550776353550551652367242057313840484337786205765522103208370400723616758107332358873138024234825031245033182358250516026125770621413630848140110260588217816754054513653105520816310651461406714431723068658113381256336838545480865637204536460047642363877071804870403233036784667866705581207108707281250458500644680257007205218726885024532505056044364037050633245123324773754000671606456620304623528CA5380756813FD09803F2ADE26CD8D843ECD5930A1616008870D07A3F985EBF53AB2C3FD26D31A5B9B7EF16A5CA2733719448ABC8C4BD4EA1FBA32C41E27E363F99CF6F1540759FE7793416079831955FBF11E95A9956C2DBB582C899448FE3834E045D0E97E4DC05C6DB4C794A5F250C423EF77C43185E70F6F2D2DAF325516C5BAB18219030762F78DF17623791869366B135BF2DC7F6183DC7FBCE32A113F5D7E7C42EE8E6AC03CA9851320D7D3F933A5BF8E7C335344279E8DDDBD8A19AFFFA73A3756CD0FE922EC37EFA16F40917B0490B5B2E2A33D1A01C5402F5AF3BBFE93CC186E00F7D6219350EB0BF93FAA08EA24BBDA6F371FAA20C128DABDB472F16CEF5DAC809D12BE983CAD453AEF09D74BCCFE8A0DA327B111DCA6F0932127870CA3FE5574519A8149D94C30B0581E9AD9A9AA241190960292BD0B06AC589A097FF5B3DEECA163F74F643CA6F172D857025852A6DFFB47908010E8E6C3008EA4CEE45E4FB258F1B09664913293B0054B016581346E59C404560E6C27C6A36F3619ECB0D9F68C78AAB41BD70DF684199BB44FDABA691E893083DC84ADAE5A84BCBB4F73C48B085FE39EDAD8D8F9FC51FCA6E4E19C788505D06FBA398513FE40FBECD53BB915C6980026E5BBEEC094F378CC067B339093D50D9BF50A323534F42B3AD14092794D9308116C1482D58A7C83CFB3FD71CEFF6A96772ECD75D827EEFE3F8B9E8F5DFC7214E65400C55A61046B27BCBB92F69E08C0D4B0E28C539EE9D42A2E0FD1E784A5082A54265912EA367EBFBE4F1A9F9D9AB4B828167B9A13F5BF171761F3850DD8DD8B5576225D38E098A84138FE0E72124BDCCEC66D031DC6F70615B774AF0E2FF64343D8C4F56EE853074F272DAFB56333F7D6AF2E11FE556A6D6C9AAD3811156E39BCE4E716DA34518776D0EB632180EDBBEF4F4A71084DC7FA7275F0BF6682769D3D707E6169DB1132DB85E501429F0CF846FDB67120079B81A335C4B5B7F780E6996D1ADCCA4816A9026F6E702212F3FEB41812FB2879B16CE6177B75C1859293DFD55D14E33A034402F54CBF60A78C562800C6F066A088C98DAA97DBC0D8384D5BAA869AD174BFA5B27139FB88C74412713731B6684F06D9562D39A7E608FD4B98AA411FB2A92EC071D285FB09D25EB613BD18A3D47B141BEB20D32E3688A108743DBE20B2552D3888AF3DA8ECF507C25EF1B1EDC94568AB3C0C74848665334A9D4488A651327B21208B1A8D31B83DDF7E383481AA231B86BF58B1D63502C2D9621F40F134436DB43BAC11087F7CBF14CE0603BF53EE756B45B1658F90ECB0D8DDAE82597E1E5A0352C833EF90D814DC31BEDE58D0660E62CD119DD59F8464DBA34BA8EB2B11F5A361124E456099D18D85DFC78D4DBD41E33EA8F3A018D20689F0E50BE33F0777A864D281DA9AE87CA122CE18EEFF0A44621542EBEBEC41C5736DE378D11E4AB8AC906921D425D26E176FA86C8925E65CB7E0B8B6E4626415A2E1365C83F86E23E03470B4027E58D685612F680E72BF911BD244CFDE163DD6F82B3E527A61DDACD4A0D60F45B494DDD1995066B2A1FB5F7345C64A95B85455243923FC13DDDE5FAD531C452CE253B6A3BD45BACAA32076C46C29DB99BF83463833EFAAA04AA5D712FBF1BC7594B35DD2B64DC8217C4EA47A2037E7FC57D8656DB7BB89168C53853C885385B5BCCA39622C428EC52EC3F88C8121EBDF3CDDB30E4997A20D0C437F3CD8970B57B8FBE463DB37D967706A9510607B686424AC6C910785423081E2DAC7E0708CD23FBCBB3845B8EBE7F7324B6EA81B0D0474D35F7CE64073464A9FF9F5F995A0C511636F6B846839F481D71039B5DA42EFD21CB216721116A42F0E5E6DE840DA22D98A6A6DF9039F6A0E0A17FCA1BF336CBC781707653021C9DF558592D7C58B7DD9EC4F10CD27682E496645DE7F661099CAFC92CDA1B9BE94BDB6169F96D23316799B39BA491F655D3EDE6343EEB7DFFDD320C194F6A700C874C1BD5F70B20BE44D1653D03525A2D78C8BD23636449266175380AECCA1B339668E2633A18F28C626E8E397E05E5E4DF8050418014ED262144F1142D5F01AF52FCA7C2C6F8AA0639889996B263B31299D29EF70669BA3ADA62919AC1ABEFFAFCAFBF2BC509B271210141B0CDB0D3075C5BFD06FBB4D5C9B94EFCE832CAA806BB417E3199170BA502E17F623E27CE5D6157FEC85B08B3EBD6410A36A4E7E3C7D78D2661837427F07D33B668FE38CF2A028738BC4913205583075DF08417B758D22B8D42AE137B9D0782FBCC1FA0DBF8C902FA1A03A1EC571AE5D0BE78E735B2D3FFB17A422C72F79FA5E42A99594832322A006E5AA84BB6B8E78063FDF4E1BA2EA58F06D8C4A5426381CCAE3E96B97DBD9E46344C9E1F229128BABF815F6AF98952B790379A1BF130981F5EE73FEFE2A9DBBBDC74AB44829A476B5E922672465D6CD52FBAEF7737C8F2BE89568008BAE41933A60A327C9F09431681D9B71F050A756FCA06A611E0CEEF3BFA79C75EC597B6A8652BBF1B10AA505190D8791A71368EA89C727E0C95609FCFC6510C3266B707B0788CA41B4080CE0D1BAC662C252C285460F4F60CD08538D1C17D409869AAA2A2049E98C220A5920ADAA39EBCE6FA7EE3064268CDAC8202B5FBE2F8355686AF3EAC6E3A2888EE14CF366F11D485B587C9A262BC51F87EA95850E96A35C9F2EA1BCE73B15CBD1CD120539057590B2C9A893B6B97F2FC762BF3396984E2989B555F7407844D71DF0FADAC5A85E07ABDCA4D4079EF8A455033F8F2434CF8571074740248D196E68F636C17431F22070E7FA1FE9CFCC0F0CF335DD99392EAA9F61CEB5105A54A78E176C96D9CBF74D29A907E7FB60CE8383133808C71AA98FEF67AB4714B77971FD88D6A128EF602EB8F76EC3013EA715F3F9AE6F4C217E76CA6DFF5FDF0311C05D26BF6EAA02E8895F210B577282D12666A70811B06EAD96D09062B9FE602E11DE0D50496E3FF6B3E5E9313D8A90C67802E74C23B8A5AC0E0E45BE1057EB5D4E035EB742AB8A0CFE061FFC35C093B98A5CDE1FAF85C71F126FAA37597782F5EF1C15F667B9B944197C1291CC970C250948F858E9CD53552A40478BD5F8AF77F743579CD3E41EFF21BF6392749701DC79BD94A6E55A0E714A4EF7A7ACD781AEDD3092BE25D2E472AC547CB08D7D779A9C72229794DF812E0292B420BB60665795EB36DF7E224D71D822BA8C0B5C21002A2BBC294E51426C38029E77F8593E24B3F82591F10FAF3016E9792A20FAC65F564095BF3EE1B5E091327A646E26F93D4E833CE7600764A6E367DA047CA43934FAD9ABA7B76C7D58CC777310ABBD3F2D89A7266CB8B8E0A56E4E2ACA5FDC3210EE443D3F56E8E15B2B031AE28693EC3E9F47B54B9A365C1F86E3E383692A30C588345FF6E445C12D3F28B34380D6784D53DF4CDE94BBC5A8C40C993AF679117746013FB520E231084E18A5CB3E7DA5DDD3DCF09CEE42219A847B9646FE5A0726E8A5674E2D22D6A434873B",
sboot_pqc_public_key: "3502621252147CB758DEEABDBF029A0F655CD4A15B0F11FE378A6F99AFA23B6C850DCFCD8185CC617CE8480A5A1AAC88FB6D434C2B6F2F48C827867647A52FCAC5251F9464DDE6C1E67577DC74007D81EE11C1467BD1D74D1A50885AB8CE1416B34DBC2348DC31934753E8BBA4042326A262DFFE4434317099DE88244691686FA9E72FE45DFF33302DE60AC34AFA4439909FF573BC9879AF36FC30EB06A23B233FF9546A754FBC164EAA619338E7B1D9F98286079B8CA13281657BDB6FA3E6A7B7F7DAA50E48A085995EF0A3EFB04A7E1144796D9A530667CDC04D26306D73F14B28FCEC7F9B75A9F846F678E02E95FAC00519AE81E69785D08379A491A3F08DEDB2ECC3C6753CA0608E9DEC16D6C0857321CBAD2BFBB6BF24706E41C140A8A24FD62764894D5B5FD2BA6DFEC1C7F0EF63CFAB43D8313F0F4364DF46774B05E671B4EFCCE47826BCA57B03987879A0FEBFABD8D70396777FFBC64D4F804A4925E3C395394F648315C7C4B20D12FB07E5F7B73959479F86DDA10188553CC46C03689A49413B1947369AED0594D1E9AF4B572451F7167C124378A9814D71404888D1DE1BF6839B20B17F48C97EBCBD808E5C84DEAC216C9B7E5EF35940D45B915FF83EECE7FB5F88CC2C100A4908E19B15B1397137E1F04C4F7832B3D2B152FAB69CAD593EE50C226221C845A9439DC5DABA6CB9BAB2C112BA0AD709D951FBBB09A1E3439D5B1DB6DE393F91E0C2DB81B05D49F8869A7734BBD057835F6CEDABE3200A5CAAFEDC9AE01DE887E5F05B9C401C329155DB59A726F97688E361E26666AFD7647C36A9DB3DD867F045DBAAEC4B80DA4FFE9284268C3CEDF5FB90E3EFD9FEADFAEF458390DB4608662C651D7D97C0ABF2E330AA597B58EE113D6FB592F779195C96D178976D50D3EE3F0B8B71908B7122B2BD59D80561755106FCC4067C48997487F65A95D4DE4AACDE458DA47F9DDE7265D9D04B6884909A1D22B973358B7B155E69C5905CA45FFD8F18BC8CA48EA3927CBA3D14AB51781BADB7FF330E02F2C85170CC353E8758705BD5E33A39AF0F6FBEFB2E89515EAE5CE1CD753390338C71921D1B66EDE0FFA23B4D1A5A29682DAB296A0A89B2C5C6068C117F54E0C98534D30E312D1E554F99727B7464DEA17167B08AE7745750CF6BB6CBE8E561B87564DBE4C247A80B73158DF94A1F2EBE6BE407A74A20697AAF3F2F322A083C7E78FF0C7A08227EA63169C9B1283A603DD7B9A04F85C27C922D5810DA5D50E39789466A182BBAB3EEC73C96E3884BA8359E9A0854F2F8EBAE4D7F575D8E5C6FC1C0C2C26460375AB1ECEC09FFDC9836583BEBC0975C39C19142F6C6FB7BC5B5C220E3C25868BE8F6C941AA1C5D97D4F86BC512F77405315BBD674777A74D45EFBF6641AF0B99279E531B36FAFA127D130F6BAE45E1552755010BC2718141E4A4E6175A115EBFFD6F6CFFD401AB2130800F1606B69AE86C381620A394357D71AD2F222BBB7C29F1708275480B8B4AE84EC6FD285DC72853F1C37CBC3128D09603166EAC64BA603D5263A8A030A69550354BA2B12877FD675F0CAD27625E31D6603D013828D4D9A74C35290618BB5E1E2FB16A49308ED61CF05A42D5B8EA3E2793023074343971B382640E536D2DE9F16046F21FFE9839A51D52C1EF7C31171DC2FB809743A75510E5267D5F3B54E3F022E1A7B246A412B547B1EE17FA40B2CEE77203230DCCF5A05C6A6260D2DC5F0944D576C69083D304E28A2CFC866EA23BCBDA7E31391733FC79BB5A6C5589284C91BE9E77F188FEBC929D69F10593CAD730F9D75F485C6450167A7834E6C825EE3B629A40AA270408940EC861A7787CF7479622D42758384B8DD8A7A4274969C2282CAC518490FD15C58FEBBC8807C2D66DA580766B1303383B6E0880A279A08A753D47EC729E2AEDE1AD3D7DFD2A07DABF0031F796D27B123F544FE960625D7A41C476C017DACC1E626BC5F62101EBFC8ABB82BA2FFFFAB5AB62D244661528BA5054B83A01641D3D8441E50C54D6071ED049325844D99763B1E9F4CF546500369E27A3916660F67E86D8F21E269242CC458DFD0B28CD965062C054F1FF3016BC1539E9ADC80A509F1634DDAC8DBA550D1862BAB841C27F0D7BFBC231E3DE63ECAD700AFCC237575E0CCAF9D540146C4D16067ED05090D40A4A6ACACBC2AA76631DFBCFE87814034DA777B570BD27C213AE4982993D3B9B8E42536BAF244D117890F7F27421B04FBE3F0720DA5238F3690256B064678664098AE7460A811491EEFCDEFEFDBFDF0694553574F92E51EC2E5ACF11532A42D883DA3BFBD7BD776CD37BD9AB4B6094BB39FCF88A90C6D767F5A8C600FBE9670D47830238786C11055D9CC5BF90D28EDD270C7CA8494C09C1C66ADA312FBCF3FA5B4339F4BC01A39E9BB2487CD6E90635F43914DA741DAEE6B7DB1573F6AC2947A5ED5552F3E65BF652015EAE65318C257310B44AA2A5FC718BA16F8EAD6E328F548FD3ACD620B7E51A0AD34E87966FC62000C4E401792FD1E1B4CAE01FE685BF2A80A00777923F5DFC4EB875EC9AC3C6823FA6925CEA414737C337BAD7B64A8DD85AE067EFA1CC9135FF444CBB4CB48637E666DADA247EBA196F3459FF9D9B26C39813CE3087A18AB07E855F775E6FE7FAD76BF6D226209607EE15C76BA2CBAA4B327AE96632139A05734E63EBE6B0DE635ABB20A20A77DAA751D2399DC3436696DA38FE27406F5988FE24D5D1F440A84FF38AD172A7DD38974",
sboot_pqc_public_key_hash: "4DA9F7BA1F56F642CB9AD842605D672F503D87CBDC6CC7407261EAACBC108279",
}
2. 修改安全启动配置脚本
将密钥和算法配置写入
SDK/component/soc/amebaxxx/project/manifest.json5。 编译后处理脚本将使用文件中的密钥和算法进行固件签名,并将公钥等信息写入固件的 Manifest。manifest.json5的不同字段对应不同的验签阶段:
image1:第一级验证(Boot ROM 验证 Bootloader),存储 Bootloader 的签名配置;
cert:第二级验证(Bootloader 验证证书),存储密钥证书的签名配置;
image2:第三级验证(Bootloader 验证应用固件),存储应用固件的签名配置。ECC 配置说明:将
keypair.json5中的密钥内容复制并覆盖到manifest.json5的对应位置,并使能安全启动(sboot_enable: true)。 下面的示例中,image1和cert使用相同的 PK1 密钥对,image2使用不同的密钥对:{ version: 1, image1: { sboot_private_key: "6AA34203018334474B25A0600996CA0968AA6228B886FF234B4EB9628B703C0A", sboot_public_key: "E2A0D6500BBF1DD8DC212098C230EB731ECE3A81AA11D0E6E538FA36BBA4FF6E", sboot_public_key_hash: "72B2E1CB0E8F715262AF38DFA0E522C95660D0EBFD920F4B1A229845E599C697", }, /* cert/image2 share img_id/img_ver, cert and image3 img are packed in app.bin */ cert: { sboot_private_key: "6AA34203018334474B25A0600996CA0968AA6228B886FF234B4EB9628B703C0A", sboot_public_key: "E2A0D6500BBF1DD8DC212098C230EB731ECE3A81AA11D0E6E538FA36BBA4FF6E", sboot_public_key_hash: "72B2E1CB0E8F715262AF38DFA0E522C95660D0EBFD920F4B1A229845E599C697", }, image2: { sboot_private_key: "9FC60C4CB6162E49C54FB94511497E16F5EB605167836F15DECBB8363B18E243", sboot_public_key: "45BABD665908AD5576D9DA4A80287262A4CB1475ACAD543E27A9C2598579FC72", sboot_public_key_hash: "1DFC2FE01CA8274F06E2E112D027C3C6FF9CED59EE79944BED46ADE35C44B422", }, ... /* ============================ Secure Boot globle settings ============================ */ sboot_enable: true, sboot_algorithm: "ed25519", sboot_hash_alg: "sha256", sboot_hmac_key: ["otp_key_0x220"], ... /* =================================== OTP key value =================================== */ /* 仅在使用 HMAC 时配置 */ otp_key_0x220: "9874918301909234686574856692873911223344556677889900aabbccddeeff", }PQC 配置说明:RTL8720F 芯片支持 PQC 签名或混合签名(ECC + PQC)。需要进行额外配置:
在
manifest.json5开头设置version: 2以启用 PQC 支持。添加 PQC 密钥字段:
image2: { /* ECC 密钥配置(原有) */ sboot_private_key: "9FC60C4CB6162E49...", sboot_public_key: "45BABD665908AD55...", sboot_public_key_hash: "1DFC2FE01CA8274F...", /* PQC 密钥配置(新增) */ sboot_pqc_private_key: "D0E042A21B549C77E...", sboot_pqc_public_key: "D0E042A21B549C77E...", sboot_pqc_public_key_hash: "891D4F2F989A9255...", }
使能安全启动,并在文件末尾添加全局 PQC 设置:
/* ============================ Secure Boot global PQC settings ============================ */ sboot_enable: true, /* ECC 设置(原有) */ sboot_algorithm: "ed25519", sboot_hash_alg: "sha256", /* PQC 设置(新增) */ sboot_pqc_algorithm: "ml_dsa_65", sboot_pqc_private_key: "3502621252147CB758...", sboot_pqc_public_key: "3502621252147CB758...", sboot_pqc_public_key_hash: "4DA9F7BA1F56F642CB9...",
3. 编译固件
为防止 TOCTOU 攻击,Bootloader(IMG1)不支持 XIP,需要在 menuconfig 中配置 IMG1 运行在 SRAM:
$ ameba.py menuconfig (Top) → CONFIG Link Option → IMG1(Bootloader) running on FLASH or SRAM执行编译命令,SDK 脚本会自动根据
manifest.json5的配置对固件进行签名:$ ameba.py build
4. 生成 Flash Loader
使能安全启动后,芯片只能从已授权的固件启动。因此用于下载固件的工具固件(Flash Loader)也必须经过签名,这是安全启动信任链的延伸。 每次更换密钥或修改签名、哈希算法后,需要重新生成 Flash Loader,以确保其签名配置与目标固件一致:
$ ameba.py build -g gen_imgtool_floader签名后的 Flash Loader 文件路径为:
{SDK}/component/soc/amebaxxx/project/project_km4tz (or project_hp)/gnu_utility/image_tool_flashloader/amebagreen2_acut/floader_amebaxxx.bin。 将此文件拷贝到 ImageTool 烧录工具路径下的{ImageTool}/Devices/Floaders文件夹中,覆盖原有文件。
量产阶段
5. 烧录安全启动相关 OTP 位
警告
使用 AT+SEC 命令前需在 menuconfig 中使能
CONFIG_ATCMD_SECURE(默认关闭),路径:CONFIG SHELL → Enable ATCMD SECURE。OTP 烧录前提:设备 Flash 中需已存在一个可正常启动的固件,以便通过串口发送 AT 命令。以下命令中的密钥字符串仅作为示例,勿用于生产。
OTP 区域只能写入一次,无法擦除或撤销。请在执行写入命令前,仔细核对地址和数据。
量产阶段建议先在少量样机上验证通过后,再进行批量操作。
特别注意 OTP 地址是逻辑区还是物理区。具体的 OTP 操作方法请参考 OTP 串口编程章节。
Step 5.1: 烧录 ROT 公钥哈希
将公钥哈希烧录到 OTP,建立不可篡改的信任锚点。
ECC 配置说明:在
manifest.json5中找到 image1 -> sboot_public_key_hash,将其写入 PK1 区域:AT+SEC=SBOOT_PK,pk1,72B2E1CB0E8F715262AF38DFA0E522C95660D0EBFD920F4B1A229845E599C697若配置了独立的证书密钥(使用 PK2 校验 Cert),还需将 cert 公钥哈希值写入 PK2 并修改
ameba_bootcfg.c配置文件:AT+SEC=SBOOT_PK,pk2,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX注意,在 PQC 或混合签名模式下 PK2 固定用于 PQC 公钥哈希。
PQC 配置说明:烧录 PQC 公钥哈希:在
manifest.json5中找到 sboot_pqc_public_key_hash,将其写入 PK2 区域:AT+SEC=SBOOT_PK,pk2,4DA9F7BA1F56F642CB9AD842605D672F503D87CBDC6CC7407261EAACBC108279混合模式下还需要烧录 ECC 公钥哈希:在
manifest.json5中找到 image1 -> sboot_public_key_hash,将其写入 PK1 区域:AT+SEC=SBOOT_PK,pk1,72B2E1CB0E8F715262AF38DFA0E522C95660D0EBFD920F4B1A229845E599C697Step 5.2: 烧录 HMAC 密钥(仅 HMAC 模式需要)
当
manifest.json5的 sboot_hash_alg 设置为 HMAC 时才需要执行此步骤。写入 HMAC 密钥:AT+SEC=SBOOT_HMAC,9874918301909234686574856692873911223344556677889900aabbccddeeff写入后命令会自动回读 OTP 并校验。
Step 5.3: 启用安全启动
根据当前阶段选择合适的启用方式:
开发调试阶段:开发调试阶段用于验证签名流程,允许失败后关闭安全启动。只需临时使能对应功能:
ECC 安全启动:
AT+SEC=SBOOT_EN,tempPQC 安全启动:
AT+SEC=SBOOT_PQC,temp混合签名模式:同时使能 ECC 和 PQC:
AT+SEC=SBOOT_EN,temp AT+SEC=SBOOT_PQC,temp关闭上述临时使能(若已通过
perm永久使能,则此命令无效):AT+SEC=SBOOT_EN,temp_off AT+SEC=SBOOT_PQC,temp_off量产出货阶段:量产出货阶段需要永久锁定安全启动,不可篡改。
永久使能安全启动:
ECC 安全启动:
AT+SEC=SBOOT_EN,permPQC 安全启动:
AT+SEC=SBOOT_PQC,perm混合签名模式:同时使能 ECC 和 PQC:
AT+SEC=SBOOT_EN,perm AT+SEC=SBOOT_PQC,perm锁定 PK1 和 PK2 区域,防止密钥哈希值被篡改:
AT+SEC=SBOOT_PROT,pk1 AT+SEC=SBOOT_PROT,pk2各芯片完整 OTP 位定义请参考 参数配置,。
6. 下载固件
使用 ImageTool 和已签名的 Flash Loader 将固件下载至设备。 启动时芯片会读取这些签名信息进行验证。
运行阶段
7. 复位验证
启动后检查串口日志以确认安全启动状态。
ECC 验证日志:ECC 安全启动使能日志:
IMG1 SBOOT ENPQC 验证日志:PQC 安全启动使能日志:
IMG1 SBOOT PQC EN混合签名模式下,ECC 和 PQC 验证日志会同时显示。
RMA 状态下的安全启动
上述步骤涵盖了正常量产流程下的安全启动配置。当产品因故障需要返厂分析时,会进入 RMA 退货授权状态 。
RMA 状态下,OTP 安全区域不可读写,可保障密钥等用户机密信息不外泄。 Realtek 提供了独立的 RMA 安全启动机制,芯片仅检测当前固件是否由 "RMA 私钥" 签名,常规模式下的安全启动验证机制失效。
根据是否烧录 RMA 公钥哈希值,RMA 模式存在两种运行状态:
已烧录 RMA 公钥哈希值:RMA 模式下强制启用安全启动,仅允许运行由对应 RMA 私钥签名的固件。
未烧录 RMA 公钥哈希值:RMA 模式下安全启动禁用,可运行任意代码。
建议维护与常规安全启动密钥(PK1 和 PK2)不同的 RMA 密钥,通过烧录 OTP 设置一组专门用于 RMA 模式的公钥哈希(物理地址 0x720~0x73F),以实现权限隔离。
启用 RMA 安全启动的步骤:
烧录 RMA 公钥哈希值(物理地址 0x720):
AT+OTP=WRAW,0x720,0x20,<RMA 公钥哈希值>
锁定 RMA 公钥哈希(物理地址 0x702):
AT+OTP=WRAW,0x702,0x1,FB
小心
在 RMA 状态下,PQC 安全启动验证将自动跳过,仅执行 RMA ECC 安全启动验证。
Flash Loader:在 RMA 模式中用于下载固件的 Flash Loader, 也必须使用 RMA 密钥重新签名。
HMAC 限制:若量产时锁定了 HMAC 算法,RMA 模式下也必须遵循该限制。但由于 RMA 状态下的用户信息保护机制,软件无法读取 OTP 区域中的正确的 HMAC 密钥,只能读到 0xFF 。因此在编译 RMA 固件时,需将
manifest.json5的 HMAC 密钥字段填充为全 0xFF。
备注
进入 RMA 状态后,如果启动了 RSIP ,此时读到的 RSIP 解密密钥为全 F ,无法正确解密固件,启动会报错。可以在编译固件时将密钥改成全 F 以临时规避此问题。