STMCU小助手
发布时间:2024-2-29 16:02
|
01前言 本文档通过一个动手实验, 详细演示了如何在 STM32H563 上运行一个 OEMiROT 的功能. 旨在针对那些 OEM 想自己实现一个基于 STM32H563 上的 iROT 功能而又不知如何开始的开发者. 02准备工作" j# G5 U6 E/ X' L3 }
4 [- g6 X+ g8 Q+ N 软件包 : STM32Cube_FW_H5_V1.1.0 工具: • STM32CubeProgrammer v2.14.0 • Tera Term 串口终端显示 • Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)4 y x7 i2 O, H1 _! A6 C5 ^. e" J ; O9 I$ H! b: n0 L2 Z# Q% C/ f. ` 4 n F& D! y3 A: p; E* f IDE: STM32CubeIDE v1.13.0" q; }& q4 l$ r% p% C) U 03烧录 OEMiROT 固件并运行 3.1. 脚本环境配置板编程基础 本动手实验基于 STM32CubeH5 固件包, 此包必须位于一个没有中文且没有空格的路径下, 于是我们将此包拷贝到 C:\workspace 目录, 在此包路径 \STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning 目录下有一个 env.bat 文件, 用文本编辑器(如记事本)打开此文件: - D# f+ G! n+ X l W 9 ^5 l9 E- c; w
& _0 r. D6 V* L' p. W 2 V# t k; K# L 检查上面两行, STM32CubeProgrammer_CLI.exe, 以及 STM32TrustedPackageCreator_CLI.exe 这两个工具的安装路径是否跟你电脑中的安装路径符 合, 如果不符, 则需要进行相应的修改.; O9 J2 y1 U: u$ O# a9 G, @0 r 3.2. 运行 OEMiROT 预配置(provisioning)脚本* `5 P' z% f s' a! B7 C9 j! ? 再进入到 cube 包下的目录 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\OEMiROT 目录下, 有一个名为 provisioning.bat 的脚本, 双击运行它:
9 r8 ?5 h: u( e/ m 如上图, 系统会自动打开一个 DOS 命令终端窗口, 在此动手实验过程中, 如无特别说明, 此窗口将一直保持, 我们将通过此窗口的提示信息进行每一步的操作.) |1 A; [, V u2 C6 h # c1 `/ q0 |6 X7 E$ G% U' {4 n2 x 如上图, 信息提示我们打开TrustedPackageCreator 工具, 生成 OEMiROT_Config.obk 文件.$ [* h; B' I. ]- p1 `# O " O& F- w2 y" l5 c, Q5 E 3.3. 生成 OEMiROT_Config.obk: \6 P$ @, E J, R 打开 TrustedPackageCreator 工具:7 C% C. Y, L4 C$ S; Q' A # }& a! s$ k- L& [. o: o6 X
如上图, 在最左边 ①处点击 “H5”, 然后在②处选项”OBKey”, 接下来在③处选择STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Config 目录下的 OEMiRoT_Config.xml 文件, 此文件为生成 OEMiROT 对应 obk 文件的配置文档. 然后下面会显示 3 个密钥对, 从上到下分别为 :# I o# D3 V5 V n) {' `+ w0 @ • OEMiRoT_Authentication_S.pem: Secure APP 对应的认证密钥(使用公钥)- Q! a# V. }+ j q& n • OEMiRoT_Authentication_NS.pem: Non Secure APP 对应的认证密钥(使用公钥) • OEMiRoT_Encryption.pem : Secure APP+Non Secure APP 固件加密密钥对应的解包密钥(使用私钥) # s- k: J0 X7 h: O 6 b4 a) n, ]* K) z, Z6 p3 y" g. j 这三个密钥其实都是成对的, 即公钥私钥对. 位于 Keys 目录下. STM32CubeH5 包下已经自带了默认的密钥对, 如果你不想使用默认的, 则可以点击上图中的4中的 “Regenerate” 重新生成这三个密钥对. 一旦重新生成, 则需要注意保存这三个密钥对.7 r; Y) u, E( V6 n % x: U6 |8 e7 Q R! M: c 3 ^' _7 c7 G( k/ Y8 s 接下来就要生成 OEMiROT 对应的 obk 文件了, 在右边的输出路径下, 选择一个路径, 比如Binary 目录. 最后点击生成. 则将在 Binary 目录下生成 OEMiRoT_Config.obk 文件.0 ^% c- E: P4 V7 v, `( n+ l0 F ( j# L8 q6 G1 N1 B" P 3.4. 生成 DA 对应的 obk 文件2 N* F) }# I$ o( q9 r% F6 m2 y 回到脚本终端窗口, 输入回车键 :+ `1 y# G& b4 u* F7 p8 Z
如上图, 提示你通过 TPC 工具生成 DA_Config.obk 文件. 有关如何生成 DA_Config.obk 文件,之前已有其它文档讲述, 且 STM32CubeH5 包下STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary 此目录中已经有现存的 DA 对应的 obk 文件, 其对应的私钥和证书分别位于上一级目录下的 Keys 目录和 Certificates 目录下, 这些文件均可直接使用, 所以这里不再重复讲述它们的生成过程. 直接按下回车键.. 3.5. 编译 OEMiROT_Boot 工程 ; s% S! k9 J, Q
0 F, X8 O3 j l5 l + D7 O; D% c' j; N' { 如上图, 提示用户打开 OEMiROT_Boot 工程并编译./ Y5 ^) x8 c' a9 F0 O p6 W O& y 3 l* }5 t" |1 m 于是用 STM32CubeIDE 打开工程, 路径为: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Boot\STM32CubeIDE 目录下, 编译过后,会在工程下的 Binary 目录下生成 OEMiROT_Boot.bin 文件.1 c, `- `. d" o! h) \' J) \+ N. ?/ a " f2 H7 Z" E) `" Y* z/ ] 再回到终端窗口按下回车键… 3.6. 编译 OEMiROT_Appli_TrustZone 工程 % W% x A6 N! u4 a$ ~ V 用 STM32CubeIDE 打开工程: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Appli_TrustZone\STM32CubeIDE' N6 P8 r; E9 N9 i3 L$ J7 A , ^7 [. W2 j! D" Y: R% X: y1 \6 W 此工程下有两个子工程 : $ K- j ]7 i0 Y : `# @9 a0 [0 T7 _# p! L; Q
如上图所示, 先编译 Secure 工程, 再编译 NonSecure 工程. 编译通过后, postbuild 脚本会在Binary 目录下生成原始 bin 文件和加密后的固件.. _8 _6 n% I( W C; P6 c + M6 `% `+ i; o9 c& @( _- c" x $ X- z- p# H$ |2 L4 D& i$ G$ Y
原始 bin 文件是用来初始安装的, 而加密后的固件是用来做升级的. 加密和签名过程正是postbuild 脚本来实现的, 其对应的固件加密密钥是此次编译过程中脚本随机产生的密钥. 此密钥会通过 3.3 节中所产生的 OEMiRoT_Encryption.pem 对应的公钥来进行打包并放入 header 中.而签名所用的私钥并正是 3.3 节中所产生的 OEMiRoT_Authentication_S.pem 私钥, 它对应Secure 工程签名, OEMiRoT_Authentication_NS.pem 则对应 Non Secure 工程签名. 3.7. 手动生成加密且签名的映像文件(可选) 除了通过 postbuild 脚本来自动生成固件加密且签名的映像文件外, 你也可以通过手动的方式来生成它.如下图, 我们可通过 TPC 手动将原始 bin 文件加密且签名.5 \" V% ^$ r3 @: @3 M' n. J
" y+ Y+ D, G" @; Z c4 A2 b1 H 如上图, 打开 TPC, 左边①处选择 “H5”, 然后在②处选择”Image Gen”, 在③处输入配置文件 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images\ OEMiROT_S_Code_Image.xml. 然后在Firmware area size 处保持默认的 0x6000, version :1.0.0, Firmware binary input file 处导入S App 生成的明文固件映像. Image Out File 处即可生成的加密且签名的固件。加密的密钥是随机的, 它通过打包进 header 中, 如之前描述. 这就是手动生成加密且签名的固件映像方法. 由于App 工程的 postbuild 脚本会自动完成, 所以, 这一步骤并不是必须的. 7 C) }5 r& g. B; ~% q+ X 此外需要注意地是, 在 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images 目录下还有其它几个用来手动生成加密签名映像的配置文件, 如下图所示 :9 j `5 x$ G4 v 5 E9 w( ~/ H# X/ r
( s3 S0 t( U8 V0 A! {! s 通过这几个文件名, 顾名思义, 分别对应着 Secure App 的固件, 数据, NonSecure App 的固件,数据映像, 如果需要手动生成这四种加密且签名的映像文件, 则通过 TPC 手动导入对应的 xml配置文件. 在 Firmware binary input file 输入原始 bin 文件, 在 Image Out File 处输入导出文件, 然后点击 Generate Image, 生成最终的加密且签名的映像文件(如rot_tz_s_app_enc_sign.hex, 或者 rot_tz_ns_app_enc_sign.hex). 7 |3 d3 n, b3 u! D) R 3.8. 生成加密签名的数据映像(可选)( |, G. ^+ l+ V9 E: j2 I- D5 [ 回到终端窗口按下回车键, 如下所示 : , T& {% p) u7 ~
! R' Z2 N, _3 R5 P& B$ T 8 x% Z6 W0 a# t2 [* p, V 提示我们通过 TPC 手动生成加密数据映像. 工程中默认是未定义任何 Data image 的(flash_layout.h 头文件):' G# A' ]3 P( W& j4 X& y0 I ; [1 @! g5 D6 H6 Q: d6 _
! n# M$ N7 n" H* C5 L" B1 A* a: a 因此, 此步骤默认我们是可以跳过. 如果工程中此宏修改成 1, 则需要手动通过 TPC 来生成加密的数据映像. 方法类似于 3.6 节的手动生成环节, 只不过配置文件换成 xxx_Data_Image.xml. 这一步骤, 我们直接在终端窗口中按下回车键… " l: e% L/ X3 J' Q8 O+ r $ A# x, b, P5 \
接下来再次提示生成 NS APP 对应的 Data Image, 同理, 在工程中默认宏中是没有配置的, 因此直接按下回车键… 3.9. 预配置(provisioning)! ?" Q4 F m! @$ | h& j4 k
9 Y/ {( P7 [+ M# w3 c 7 ]' s& L+ f. T) `/ o0 q 在做预配置之前, 提示你是否已将 BOOT0 引脚拉低. 确认 NUCLEO-H563ZI 板上的 BOOT0引脚没有连到 VDD(CN4 的 BOT0 引脚未接任何东西即可). 确认后按下回车键…! G- J$ C) K, k6 t 8 i5 t+ C9 T% H* R/ C
6 [8 s4 I, w; B8 z: v 如上图, 这此过程中, 脚本会自动烧录 boot, S APP, NS APP 三个 bin 文件, 以及配置 option bytes, 接下来提示你输入芯片最终的 product state, 这里我们输入”CLOSED”…(千万别设置为 LOCKED 状态!)
* ~: Y- v1 r- Q8 _( { 如上图所示, 在此过程中, 脚本会先将芯片的 product state 切换到 provisioning 状态, 然后再做预配置, 这里会预配置 OEMiROT 的 obk 文件,以及 DA 的 obk 文件, 然后最终将芯片的product state 设置为你上一步输入的最终芯片状态. 最后系统提供已完成. 到这一步, 脚本的整个流程结束. 接下来, 我们验证下烧录后的芯片是否工作正常. 3.10.检查程序运行状态 打开 Tera Term, 设置串口波特率为 115200 bps, 然后复位板子, 查看打印信息…6 R# ]2 {' J1 |1 h( `; k : Z' P9 A5 `0 G7 X2 J, r
如上图所示, 当打印信息显示 User App #A 时, 表示 NS APP 已经运行成功, 所有程序运行结果均正常! l8 ^: T: B- [- E4 W u 04固件更新 接下来, 我们将演示通过 NS APP 触发程序跳转到内置的 bootloader 中, 并通过串口下载新的加密固件, 复位后并安装它. 4.1. 修改代码, 并重新编译工程$ A$ m6 h8 l; f* w 打开 NS APP 的工程, 在 main.c 文件中将 NS APP 的版本号从 “A”改成”B”: & g9 z; z# `2 m- A, f) E+ Y6 v 2 x% h+ T2 G8 d8 B! Z9 I. W8 r8 j* G' f
然后重新编译 NS APP 工程.& t" C( Z% `: ~0 |' f0 D5 @8 ~0 b 5 }" R* I$ }6 e6 x, Y5 A* Q o Postbuild 脚本将重新生成 S APP 和 NS APP 的加密固件 : ) f6 _* {- C: x4 E; {
; z! i. {! ~9 l Y: { - y. {& |+ f% M! M8 X 如上图所示, 这四个文件均将重新生成.6 S% L# F) v' u 接下来我们将升级 APP 固件. ; \) _3 D; ]' o; Q % B" z, l" @$ x R1 J7 v 4.2. 跳转到 loader 程序 7 T' D+ C( z/ r, J 在串口终端中我们输入”1”: " z. i9 a3 j& H+ k8 t' k- v; o& D# O
' K4 A% F+ [# |* ~4 E; x 如上图所示, 输入 1 后, 程序跳转到芯片内置的 bootloader 中. 7 p: k/ m& |7 N4 c3 n1 Q 断开 Tera Term 的串口连接 :
4.3. 通过 STM32CubeProgrammer 下载新固件 打开 STM32CubeProgrammer, 并通过串口模式连接芯片:4 \; U2 m3 i9 j" b # n5 n. W2 F: g + p4 n% ~/ V+ m( g
将新生成 NS APP 的加密后的固件 rot_tz_ns_app_enc_sign.hex 拖入到STM32CubeProgrammer 中 : 5 r' W/ H1 h- G( S7 J' B
0 o7 B6 g a1 ?6 g# S 如上图点击下载.7 u5 `4 v/ |. B) D 6 N- Z9 g- f1 w" s1 z7 [0 G: ] 2 B* J" ~2 l; h: e 同样的, 也可以将 S APP 的加密固件 rot_tz_s_app_enc_sign.hex 拖入STM32CubeProgrammer 中并下载 :: z8 K# w" Y, v( e & U6 E8 V( {$ B# p
0 c* r1 T& J: i* e/ ?) j 下载成功后, 断开 STM32CubeProgrammer 的串口连接, 并使 Tera Term 重新连接串口 , 然后再重启 NUCLEO-H563ZI 板, 于是可以看到如下打印信息 :0 N* X# w, q; H" i" l, X
9 k' r2 N( l# C/ l ! r- N5 J: D/ f' Z8 q i$ q 如上图所示, NS APP 的版本打印信息从 “A”已经改成”B”了, 这说明固件(加密且签名的)已经更新成功. 05还原3 Y2 ^! A3 B4 p- @3 E# h 5.1. DA 回退 打开 STM32CubeProgrammer, 采用 ST-Link 模式, 在未连接的情况下,在左边选择盾牌图标, 然后再选择”DA”选项卡, 再点 Discover 按键….7 g: U! f: d/ {+ k' R : u. ?, d9 ^) Y, a D: Y
界面变成如下所示 :) L+ d! u9 R+ l+ A* h8 y1 Y ) N* q# z1 \- ]$ b
- n7 ~( Y7 X$ U7 m y y9 w! F ( [5 ~: | N9 u( X) D& B 如上图所示, 第一个红框内输入 DA 私钥文件 :; a0 }9 P9 q: P& w7 \ 2 ]* m/ O2 `5 }3 i1 m9 m( R0 W1 P 2 z+ K: A0 B. I: U STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,( {! P+ H) ^# C+ r/ F# r 6 n, l8 F2 ^6 n; r* ? 第二个红模式内输入证书 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\ cert_root.b64( m& O, ]7 ^+ ] 然后击点 continue 按键, 然后界面变成如下所示 :7 ~. @* s8 e/ B+ k' V8 K" W
! q* S; k/ V, R" Y: F4 B. h& D' l4 [ 如上图所示, 在左边选择”Full Regression”, 然后再点击 Execute 按键… 9 u; p) A, {- d! \9 h6 g ' N9 j1 g' j& G8 v
) |) _0 x3 }* i; G" t/ Z 然后如上图所示, DA 回退成功. 此时,查看 option bytes 值 , product state 已经变成Open(0xED), TZEN 依然使能(TZEN=0xB4) : - K7 }! I& j3 i0 N: d ; a. G" n6 u8 V% j6 q
5.2. 关闭 trustzone 如果需要也可以将 TZEN 关闭(TZEN=0xC3, 可直接修改, 这点与U5必须伴随 RDP回退操作不同), 这样芯片就完成恢复成原始状态了. 8 A( T; d1 m7 y. E9 |
" z# s% v' l$ R! E , g' @. [6 T" ^6 S; t 转载自: STM32单片机 如有侵权请联系删除 |
【STM32H5 评测】1、开发板资源和程序开发
NUCLEO-H5E5ZJ 以太网(Ethernet)移植记录
【STM32H5 评测】1、移植记录(LED / Shell)
H5E5开发板评测-1
H5E5评测-4
H5E5评测-3
H5E5评测-2
【NUCLEO-H533RE评测】-01-开箱及资料准备
【STM32H503评测】+基于STM32CubeMX生成工程点灯
实战经验 | LAT1585 STM32H5在使能TrustZone下实现High-Cycle的数据存储
微信公众号
手机版
值得收藏