OEMiROT(OEM Integrated Root of Trust)是 STM32H5 系列的核心安全功能,作为信任根支撑安全启动、固件加密签名与安全更新,适用于需要高安全性的嵌入式场景。本文基于 ST 官方 LAT1330 应用笔记,以 NUCLEO-H563ZI 开发板为例,详解 OEMiROT 的固件烧录、预配置、加密固件更新及芯片还原的完整实操流程,助力 OEM 开发者快速落地安全信任根方案。
1. 核心背景与功能价值
1.1 OEMiROT 核心定位
- 信任根基础:为 STM32H5 提供硬件级安全根基,确保启动流程、固件完整性与机密性;
- 核心能力:支持 Secure/NonSecure 双工程加密签名、安全启动校验、串口触发固件更新;
- 密钥体系:包含三套密钥对,分别用于 Secure APP 认证、NonSecure APP 认证、固件加密解包。
1.2 关键术语说明
- Secure APP(S APP):运行在安全域的应用,优先级高,负责核心安全逻辑;
- NonSecure APP(NS APP):运行在非安全域的应用,负责业务功能;
- OBK 文件(OB Key):预配置文件,包含密钥与安全配置,通过 TPC 工具生成;
- Product State:芯片生命周期状态(Open/Provisioning/Closed/Locked),Closed 状态下仅支持授权调试与更新。
2. 准备工作
2.1 硬件与软件清单
- 开发板:NUCLEO-H563ZI;
- 软件包:STM32Cube_FW_H5_V1.1.0(需放置在无中文、无空格路径,示例:C:workspace);
- 工具:STM32CubeProgrammer v2.14.0、Tera Term(串口终端)、Trust Package Creator(TPC,随 CubeProgrammer 安装并勾选);
- IDE:STM32CubeIDE v1.13.0(用于工程编译)。
2.2 环境预处理
- 脚本路径配置:打开
STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_Provisioningenv.bat,核对STM32CubeProgrammer_CLI.exe与STM32TrustedPackageCreator_CLI.exe的安装路径,确保与本地一致。
3. 核心流程:OEMiROT 部署与固件更新
第一步:运行预配置脚本,启动流程引导
- 进入路径
STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningOEMiROT,双击运行provisioning.bat; - 系统弹出 DOS 终端窗口,按提示逐步执行操作,全程保持终端开启。
第二步:生成核心配置文件(OBK 与 DA 文件)
(1)生成 OEMiROT_Config.obk(安全配置文件)
- 打开 TPC 工具,左侧选择 “STM32H5”,上方切换至 “OBKey” 选项卡;
- 点击 “Open DA Config”,选择 XML 模板路径:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningOEMiROTConfigOEMiRoT_Config.xml; - 界面将显示三套默认密钥对(可点击 “Regenerate” 自定义生成,需妥善保存):
- OEMiRoT_Authentication_S.pem:Secure APP 认证公钥;
- OEMiRoT_Authentication_NS.pem:NonSecure APP 认证公钥;
- OEMiRoT_Encryption.pem:固件加密解包私钥;
- 设置输出路径为
Binary目录,点击 “Generate OBkey”,生成OEMiROT_Config.obk。
(2)复用 / 生成 DA_Config.obk(调试认证文件)
- 直接复用 SDK 自带文件:路径
STM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningDABinaryDA_Config.obk; - 自定义生成:通过 TPC 工具 “DA CertifGen” 选项卡生成,需同步更新 Keys 目录下的密钥与 Certificates 目录下的证书。
第三步:编译核心工程(Boot+S APP+NS APP)
(1)编译 OEMiROT_Boot 工程(安全启动引导)
- 用 STM32CubeIDE 打开工程:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIApplicationsROTOEMiROT_BootSTM32CubeIDE; - 编译工程,生成
OEMiROT_Boot.bin(路径:工程 / Binary 目录)。
(2)编译 OEMiROT_Appli_TrustZone 双工程
- 打开工程:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIApplicationsROTOEMiROT_Appli_TrustZoneSTM32CubeIDE; - 先编译
Secure子工程(S APP),再编译NonSecure子工程(NS APP); - 编译后,postbuild 脚本自动生成 4 个核心文件(路径:工程 / Binary 目录):
rot_tz_s_app.bin/rot_tz_s_app_enc_sign.hex:S APP 原始固件 / 加密签名固件;rot_tz_ns_app.bin/rot_tz_ns_app_enc_sign.hex:NS APP 原始固件 / 加密签名固件。
第四步:芯片预配置(Provisioning)
- 确认 NUCLEO-H563ZI 的 BOOT0 引脚未接 VDD(拉低状态);
- 在 DOS 终端按回车键,脚本提示输入最终 Product State,输入 “CLOSED”(禁止非法调试,勿设为 LOCKED);
- 脚本自动执行以下操作:
- 烧录 Boot、S APP、NS APP 固件;
- 配置 Option Bytes;
- 切换 Product State 至 Provisioning,预配置 OEMiROT_Config.obk 与 DA_Config.obk;
- 最终切换 Product State 至 CLOSED,预配置完成。
第五步:验证运行状态
- 打开 Tera Term,配置串口波特率 115200 bps,连接开发板;
- 复位开发板,串口打印 “User App #A”,表示 NS APP 运行正常,安全启动与预配置生效。
第六步:加密固件更新(以 NS APP 为例)
(1)修改并重新编译 NS APP
- 打开 NS APP 工程,在
main.c中修改版本号:const uint8_t UserAppId = 'B';; - 重新编译 NS APP,postbuild 脚本生成新的加密签名固件
rot_tz_ns_app_enc_sign.hex。
(2)跳转到内置 Bootloader
- 在 Tera Term 串口终端输入 “1”,程序跳转至 Bootloader;
- 断开 Tera Term 串口连接。
(3)通过 CubeProgrammer 下载新固件
- 打开 STM32CubeProgrammer,选择 UART 模式连接开发板(COM 口与串口终端一致);
- 将新生成的
rot_tz_ns_app_enc_sign.hex拖入 CubeProgrammer,点击 “Download”; - 下载完成后,断开 CubeProgrammer 连接,重新连接 Tera Term,复位开发板;
- 串口打印 “User App #B”,固件更新成功。
第七步:芯片还原(恢复原始状态)
(1)DA 回退解锁
- 打开 STM32CubeProgrammer,选择 ST-LINK 模式,切换至 “DA” 标签页,点击 “Discover”;
- 配置密钥与证书路径:
- Key File Path:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningDAKeyskey_1_root.pem; - Certificate File Path:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEO-H563ZIROT_ProvisioningDACertificatescert_root.b64;
- Key File Path:
- 点击 “Full Regression”→“Execute”,DA 回退成功,Product State 恢复为 Open(0xED)。
(2)关闭 TrustZone(可选)
在 CubeProgrammer “Option bytes” 标签页,设置 TZEN=0xC3(关闭 TrustZone),芯片完全恢复原始状态。
4. 关键注意事项
- 路径要求:STM32Cube_FW_H5 软件包必须放置在无中文、无空格路径,否则脚本运行失败;
- 密钥管理:自定义生成的密钥对需妥善保存,丢失将导致固件无法更新与调试;
- Product State:严禁设置为 LOCKED 状态,否则芯片将完全锁定,无法还原;
- 编译顺序:必须先编译 Secure 工程,再编译 NonSecure 工程,否则 postbuild 脚本无法生成正确的加密固件;
- 固件类型:原始固件用于初始安装,加密签名固件用于后续安全更新。
阅读全文
235