你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】一步一步使用 STM32 安全启动与固件更新

[复制链接]
STMCU小助手 发布时间:2022-2-19 16:44
前言
5 o2 V; @  z0 G2 VSTM32 X-CUBE-SBSFU 软件包已经发布,提供了安全启动(Secure Boot)和安全固件更新(Secure Firmware Update)功能。安全启动和安全固件更新使用了 STM32 内建的各种软硬件安全技术,构建了从启动开始的根信任链,可以用来防止固件克隆、恶意软件下载以及固件破坏。本文则是带领读者一步一步来体验 STM32 安全启动与安全固件更新。5 {. N' s) Z. y5 c. H7 z
硬件# Z$ _7 k0 n( o& J3 B4 t  P9 D3 e
 STM32 NUCLEO-L476RG 开发板% U0 t1 w: f8 t7 p$ ]2 X: N0 d
 Mini USB 连接线7 z+ W8 p) Q8 O
6 t8 g% j# }. a, t. @- }
X-CUBE-SBSFU 1.0.0
$ l: \$ h, C# ~8 V, E+ hX-CUBE-SBSFU 1.0.0 安全启动以及安全更新组件。因为是安全相关的组件,下载需要发送请求并且需要得到批准。读者需要注册成为 my.st.com 用户。
  y! J% a- U& w5 Z5 D6 P& ]( f* G7 u8 Y
XQ5H`CR1OZZR37G_G]Y8K94.png ; X$ G% U% }3 C7 w# p

$ x2 r3 D1 J* B, [& _( }填写相关信息,就会进入等待批准的状态。0 l4 g0 g" W% j0 N' b7 F8 k
# W( T/ z. F) t8 K1 H1 x: q! y
DD)N2TB]I0~Y38K%Y6JIEIC.png
. b% P; n8 n3 |8 e* C. C7 ~& a( e- g4 r% I$ M
批准通过后,你会收到一份邮件,邮件里会包含下载连接。; P) w' g8 t% I# Y0 ?
; R& _+ E+ M. Y% G' ~
4Z(1LBY4RORWOWZD[AN4T.png
# s( M; g/ d8 l1 F5 b' a  m$ i! b  q' X: A5 v& W
SBSFU 简介3 {! g) a" @1 _3 {; Y8 ]
STM32 安全启动(secure boot,简称 SB)功能检查并使能 STM32 安全功能。在执行应用程序前,“安全启动”检查应用程序的完整性以及合法性。若应用程序被非法修改,或者应用程序不具有有效的签名,则应用程序将不会被执行。“安全启动”这段代码的执行,则利用 STM32 的安全 IP,被设计成不可被跳过。, B' F1 ~* x% l3 q0 O/ o

6 I/ k2 t+ B7 `( L QKL7MMQBHX{517TB}N(}A.png
: N  N5 t1 K9 z9 e; i
  s5 V" w  [  `5 a/ zSTM32 安全固件更新(secured firmware update,简称 SFU)则接收经过加密的固件,对它进行解密,在烧写升级的固件前验证它的完整性以及合法性。不完整或者非法来源的固件将不会用来升级。
. R8 A' h2 g* a- M& J: a) \! n1 I: z  W+ q( |0 ?8 z' d
~~U5TL]@EZBZ@YN$R`CG1TM.png
! y9 X7 C4 U7 q5 \
( |3 e+ p% Z6 aSBSFU 安全技术概述
/ c4 q$ @( Q' o+ V现实世界中 MCU 产品并非部署在安全的环境里,总是会面临各种各样的威胁和攻击。SBSFU 使用各类STM32 IP 来构建安全防线,包括:; I4 W/ ?) E' E
 使用加解密工具来保证系统的完整性,合法性以及保密性。SBSFU 使用了对称密钥 AES-GCM 算法工具来进行固件的解密以及验证。解密算法可由软件实现,也可由 STM32 内建的加解密硬件IP 引擎实现。8 J# T% I9 a9 G8 X1 g  r: v# e
 使用 STM32 内建安全功能诸如内存保护技术来阻止外部通过 JTAG 或者内部恶意代码的攻击。5 h! Y( d9 A4 j+ N# r" Z% l
SBSFU 使用了以下 STM32 安全功能来确保安全启动和安全固件更新的目标。
" b+ K6 s$ A$ A8 B$ ]1 s% W6 |  o1 u: U
~1MT%%QFX`JI0EZUWS3EF5C.png - A9 q5 S  R" a. r  J& ~! l
6 r& p' ]2 z% z  ~, P. t
SBSFU 的架构4 _8 L+ o. a' g
SBSFU 整体架构如下。应用层分为两大部分,一部分是安全启动,检查固件的合法性,进行固件下载和烧写;一部分是用户固件,功能则由用户定制。
. a; c5 M' F8 A1 G# t/ M- K+ ^/ s& ?3 r) V& d' q( }1 n
7``KRPTGDZYZ@}17XH@QFG1.png 3 A1 L1 J! O: P0 i+ _1 n
6 `3 P4 l/ n0 y( q" r3 j
安全启动中的安全引擎(SE)中间件,提供了一个受保护的环境,来保护所有的关键数据和操作---包括进行加解密操作时时访问密钥等。受保护的代码和数据都是通过唯一的调用门进行访问,不可能在调用门之外来执行受保护代码或者访问关键数据。
; d# s7 x& P# e7 Z2 a
0 c8 w- S" }  A$ C# b7 k/ P" vSBSFU 编译
+ V/ l  z% `4 E9 w9 Q: R需要按顺序对下列工程进行编译,因为他们之间存在依赖关系。
+ C  Y2 D) D: X5 [6 q+ v1.SE_KeyLib
5 s! H' m! I. v编译成功后的输出是一个库,SE_Key_CM4_IAR.a。这个库提供获取密钥的功能。这个密钥是由 SBSFU用来解密和验证后续应用程序合法性的。密钥在这里不是以”数据“的形式出现,而是以”一段可执行代码“的形式存储,被 STM32 安全机制(PCROP)保护。% J3 p4 J) V' Q5 k. ~
X-CUBE-SBSFU 固件包里提供了一个专门的工具 KeysInject,来进行密钥到代码的转换,位于STM32CubeExpansion_SBSFU_V1.0.0\Middlewares\ST\STM32_Secure_Engine\Utilities\KeysInject\Binary\KeysInject.exe。在 windows 的命令行窗口输入以下命令:其中两个参数是用户指定的密钥字符串(在这里使用相同的密钥)。
4 p! f$ H9 f  v( o1 I: A9 ?
  1. KeysInject.exe OEM_KEY_COMPANY1 OEM_KEY_COMPANY1
复制代码
- f1 C1 `- ^% J' ]
生成的 key_table.txt 的内容应被复制到 SE_Key.c 的数组 SE_ReadKeyCode[44]中。并且该字符串由用户制作一个对应的二进制文件 OEM_KEY_COMPANY1_key.bin,后面再生成加密的用户固件时需要。! v3 K) G1 F- H( \5 E' ~
2.SE_CoreBin
6 x# E* I2 D7 k. p/ K7 R- @  u安全引擎的核心二进制文件。它作为安全引擎中间件,提供唯一的调用门(Calling gate,参见STM32L4 参考手册中的“防火墙(Firewall)“一章)给 SBSFU 示例应用来调用加解密函数。SE_KeyLib 的输出 SE_Key_CM4_IAR.a,会被该工程使用。, h$ j! }) M( J5 i
3.SB_SFU# H. i, m1 a4 i( c' g) V: J
安全启动与安全固件更新示例应用。它使用之前生成的 SE_CoreBin。在启动时,(安全启动程序“SB”)验证用户固件的签名或者认证码(MAC)来决定是否跳到用户程序执行。(安全固件更新“SFU”)如果在启动时检测到有新的固件更新,则下载加密固件,验证,以及解密安装。
$ C6 n! B  C; t4 G. g4.UserAppExample
/ ]: @/ V3 \- U( S用户程序。编译输出是一个可执行程序。它也可以用来进行新版本固件(用户程序)下载,但是,它不会进行验证与安装。验证与安装时通过重启后的安全启动程序(SecureBoot)完成的。
% f5 v' I, }( n2 g+ O! H7 q. q
! [9 i& m4 s: ?# o固件加密与包装1 U) {6 I7 T* A) F# W
要创建加密的固件,需要使用 STM32 Trusted Package Creator tool。该软件安装时勾选 STM32 Trusted Package Creator tool 即可。
: G% ~# G* [* Z7 V+ Q2 _* [3 m& o. v6 x& _
8@56HSQ~1[L8)WQ8(JKT}8H.png   E* g; H! F3 W8 S
' E  V4 P- s' X- G* A$ w4 U
打开 STM32 Trusted Package Creator tool,选择“SFU”标签项,随后做如下设置
. J! P! }  W) @+ T4 F 固件路径:
; j/ Y2 Q; T8 m4 `这是之前编译的用户程序输出,即之前需要编译的四个文件中的“4. UserAppExample”' w+ I$ Y: o( ^) ~% ^4 ^
例如:STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/EWARM/UserAppExample_A/Exe/UserAppExample_A.bin
* o( k2 Z( j0 V4 ^" w6 J. W7 p 密钥文件路径:2 F3 g5 n5 v3 ]: [- r
这是之前通过 KeysInject 工具产生的密钥二进制文件。SBSFU 软件包里已经提供了一个。% [5 u( ?" J  k  X
例如:STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/Binary/OEM_KEY_COMPANY1_key.bin6 m2 o/ j6 Q1 o9 D2 w
 96-bits Nonce 随机数文件路径:; r  P/ e1 [1 @% E0 w: w6 q; h
用户可根据需要进行定制,软件包里已经提供了一个。9 V* q: v; i2 j$ S( \$ q0 I
例如:STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/Binary/nonce.bin
2 ~- D) e; b* a  k9 ~4 `3 l# v 固件版本:8 D/ I: b6 I5 D& e( \- M: w+ u
我们设置成 1.0。
! r0 x/ ?$ R5 r1 q- y: P& I* I以下是加密的用户应用程序对应的两部分(文件头和文件体)对应的路径。- |* i6 z" e( Y1 h. W  a
 SFU 头的输出路径:
6 b0 A3 M7 Y/ ^( h可任意设置,这里设置为工作目录 STM32CubeExpansion_SBSFU_V1.0.0。7 ^/ g4 _- v3 M- f; X0 l
 SFU 文件的输出路径:
$ h* j1 ?! R! x. b- U. s可任意设置,这里设置为工作目录 STM32CubeExpansion_SBSFU_V1.0.0。1 i3 e" c  L; C' j3 s4 ?) n
然后点击生成按钮,就可以生成相应的安全固件的头信息以及数据文件。
7 t% Q7 Q2 k, P: K: v# J# u1 G5 ?) c2 [5 ]  V0 b
II50}PN4$G{$HSGU12]Y((N.png
) R" Q' X( d, r0 m5 ^7 t. D% K2 u) ?1 d4 E0 g3 M5 [
下载用户固件+ o' F  z0 A* ?) w
首先是下载 SBSFU。SBSFU 是直接编译后的结果。注意,不要选择调试,因为安全启动内部配置成不可调试。然后根据提示信息,对板子电源进行下拔插。我们使用的串口工具是 TeraTerm。如何配置Teraterm,请参考其他 STM32 文档。
8 e5 ?& {( h+ u2 _9 j* U' D8 M7 t0 u% b3 \4 N- D+ {$ E
FN]2}]6H885TYV{Y2S8$NM1.png
0 V% j. U9 e' M( s/ ]
# g7 y5 h, \1 }" V) t' y+ X) l) i重新连接串口中断,比如 TeraTerm,你就可以看到安全启动与安全固件更新示例正在运行。我们还没有把用户应用编译下载下去,所以这里发现不了有效的固件。
4 J" T5 B% x2 ~: o' N1 t: @  v# |- X
UO@_RFB@QIRGE(EWVKJ)U@K.png 2 F+ c' J9 x+ R! {9 z# S2 ]0 v
/ A( j% H! y+ v  B0 j; s
接下来就是下载用户的安全固件。在进行这一步之前,先要确保已经如前所述,使用 STM32 Trusted Package Creator tool 工具生成了用户安全固件。然后,再重启开发板,按住蓝色用户按钮。然后在串口就可以看到如下输出:  \  L3 N* U) ?* z2 ?8 }

# k7 C1 b) e' W3 d( u6 k. Z: Q; y3 A U@%EU2IE_2W{H~[}0EP]UYM.png
. C2 s3 |4 O0 ]# S0 _" W) H; f' D0 Y$ L' ]8 h
第一步是下载用户固件的头信息,即之前在 STM32 Trusted Package Creator 这个工具中生成的”UserAppExample_A.sfuh”。选择 Teraterm 的 File->Send。选择前面生成的固件头信息文件。注意要勾选 Binary 选项。& D; ~* E# b5 ^' Z9 v
7 h2 n& I$ n" _! i( ^
P8{K~}0`%]KI8A2M9HZ97R0.png
+ ^4 d; z7 ?# c3 ?% j5 G  ~/ K/ f- o+ L1 ?/ W: [2 n
第二步才是用户的安全固件,即之前在 STM32 Trusted Package Creator 这个工具中生成的”UserAppExample_A.sfu”:选择 YMODEM 协议来传输文件- }, k! c! k6 U

4 f3 g/ X9 w  ^$ o0 t/ P, y5 P, [ _AM(9J]WAH{47%SUCZ_D3ZE.png
5 v& x" R+ ~! F  K# Z; K( \+ y. [3 W" D- i0 l$ g- y
固件下载时,Teraterm 会弹出一个界面显示进度
4 y( E* o5 d1 _8 n4 i& c
+ {  t2 `6 P( E! _ 1@}7WF%TA{TPA9EV4{@IMD2.png
/ O/ U9 P9 N, q) D$ S! @
, h( [7 d* t5 N4 ~下载完成后,STM32 会自动重启,进行安全启动流程,进入到用户程序。
% O8 W/ ]2 D1 Q6 |' U. h& }+ \; r% A! D' M) u1 T$ A5 [0 n1 f
T%}LEKUEYCYLU2S481(@`G9.png ' c( z: h* _  |+ z% {

4 R* v, `9 \& i4 c  a5 E: G( c, k值得一提的是,安全启动会自动设置读保护,写保护等。若想重新烧入安全启动而不是用户固件,则需要将 RDP1 改为 RDP0,同时去除写保护。4 s0 H7 z, d, c# G1 S8 t) ^: c0 t2 P
/ @. V0 x. t  y) B$ T$ }) m/ c
总结
  |0 H5 G; _) W  B2 i- ?STM32 X-CUBE-SBSFU 软件包的发布,为开发 STM32 安全程序提供了最重要的模块:安全启动与固件更新,可以让用户从高层次来使用 STM32 的各项安全功能。
* p$ l; j( @- E+ \
/ R* X. P' @& A2 `
收藏 评论0 发布时间:2022-2-19 16:44

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版