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

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

[复制链接]
STMCU小助手 发布时间:2022-2-19 16:44
前言. T+ |* \) ~6 O6 `0 P: S
STM32 X-CUBE-SBSFU 软件包已经发布,提供了安全启动(Secure Boot)和安全固件更新(Secure Firmware Update)功能。安全启动和安全固件更新使用了 STM32 内建的各种软硬件安全技术,构建了从启动开始的根信任链,可以用来防止固件克隆、恶意软件下载以及固件破坏。本文则是带领读者一步一步来体验 STM32 安全启动与安全固件更新。
( M2 }& `  Q; O硬件" @9 L6 k" u' L# M5 s
 STM32 NUCLEO-L476RG 开发板0 j5 M2 N& g  a; y* ^3 S6 u& A( M7 U
 Mini USB 连接线6 \8 W% r1 }& @; p+ z5 B! x6 e$ P' J
" C: ]3 x( j2 }
X-CUBE-SBSFU 1.0.0$ u, o& G2 O/ b
X-CUBE-SBSFU 1.0.0 安全启动以及安全更新组件。因为是安全相关的组件,下载需要发送请求并且需要得到批准。读者需要注册成为 my.st.com 用户。
5 ?, h$ D1 N" {6 p; Y: J7 U$ p  e
0 ?. r8 q: n0 c( |4 |: p XQ5H`CR1OZZR37G_G]Y8K94.png
6 ~$ V! K8 ]# m5 ^6 P3 k( M: [" k# ]1 {3 f& l
填写相关信息,就会进入等待批准的状态。
6 D- V% ^3 w# N. n
5 U; \& N# B" ~& V4 U( ~. f6 W DD)N2TB]I0~Y38K%Y6JIEIC.png ) Y8 v7 j0 {) S1 G! P6 {

: t  x2 `% u  O! V批准通过后,你会收到一份邮件,邮件里会包含下载连接。$ t6 ~$ S7 Z/ }

+ j- w0 }4 a( _+ A+ y 4Z(1LBY4RORWOWZD[AN4T.png
: r9 n% a7 W; U6 F$ T
" B* S7 K& A- n0 ^, e4 c7 HSBSFU 简介# o- v0 C+ R' \) ]) P( P
STM32 安全启动(secure boot,简称 SB)功能检查并使能 STM32 安全功能。在执行应用程序前,“安全启动”检查应用程序的完整性以及合法性。若应用程序被非法修改,或者应用程序不具有有效的签名,则应用程序将不会被执行。“安全启动”这段代码的执行,则利用 STM32 的安全 IP,被设计成不可被跳过。
; z% o; |/ U- ^: X' q( ^0 X7 l9 p9 G9 U
QKL7MMQBHX{517TB}N(}A.png + h. ?: t6 }. m) Z' ^* O7 D
$ }4 f8 Q% w4 Y+ l6 D, u7 a
STM32 安全固件更新(secured firmware update,简称 SFU)则接收经过加密的固件,对它进行解密,在烧写升级的固件前验证它的完整性以及合法性。不完整或者非法来源的固件将不会用来升级。
5 w# m. @2 C  J* U% R
& R/ @% w  t: J! y  u0 y# {% E ~~U5TL]@EZBZ@YN$R`CG1TM.png
; i' B) c& {5 d' M
+ {1 l# K7 D; w) V( W- m) }SBSFU 安全技术概述
: C" m6 i3 W8 o0 f$ M现实世界中 MCU 产品并非部署在安全的环境里,总是会面临各种各样的威胁和攻击。SBSFU 使用各类STM32 IP 来构建安全防线,包括:8 P+ H, K; A$ r3 ]  j
 使用加解密工具来保证系统的完整性,合法性以及保密性。SBSFU 使用了对称密钥 AES-GCM 算法工具来进行固件的解密以及验证。解密算法可由软件实现,也可由 STM32 内建的加解密硬件IP 引擎实现。
5 a- {; f  r2 D" X% e& c 使用 STM32 内建安全功能诸如内存保护技术来阻止外部通过 JTAG 或者内部恶意代码的攻击。
" x, [4 t1 Y+ {: Y; aSBSFU 使用了以下 STM32 安全功能来确保安全启动和安全固件更新的目标。% W5 r8 l  P5 _9 @
" o/ n# G. |- M2 _, j$ n! s
~1MT%%QFX`JI0EZUWS3EF5C.png
5 q9 y2 ^) h6 e% B' ?
5 r0 Z) ^+ }8 qSBSFU 的架构6 q' Z3 F5 ^  M# v
SBSFU 整体架构如下。应用层分为两大部分,一部分是安全启动,检查固件的合法性,进行固件下载和烧写;一部分是用户固件,功能则由用户定制。' F" V* S& ~, @8 D$ Z

) O: f) E5 e; Q" _# c) i 7``KRPTGDZYZ@}17XH@QFG1.png $ u1 Y  G. |2 e% b. d* T, s
& H2 h6 R* U  ?* i0 {
安全启动中的安全引擎(SE)中间件,提供了一个受保护的环境,来保护所有的关键数据和操作---包括进行加解密操作时时访问密钥等。受保护的代码和数据都是通过唯一的调用门进行访问,不可能在调用门之外来执行受保护代码或者访问关键数据。
" Z+ \% {. T, L  a/ G
( M% i% h# j" G2 i9 B* w7 E& M7 HSBSFU 编译
' b+ G8 k" k1 d. @5 F需要按顺序对下列工程进行编译,因为他们之间存在依赖关系。
5 A0 ^! o) ?5 k# V1.SE_KeyLib
) x7 ^5 O7 T; ~, m$ k. @+ \; |编译成功后的输出是一个库,SE_Key_CM4_IAR.a。这个库提供获取密钥的功能。这个密钥是由 SBSFU用来解密和验证后续应用程序合法性的。密钥在这里不是以”数据“的形式出现,而是以”一段可执行代码“的形式存储,被 STM32 安全机制(PCROP)保护。
; [& i$ p! o' i/ oX-CUBE-SBSFU 固件包里提供了一个专门的工具 KeysInject,来进行密钥到代码的转换,位于STM32CubeExpansion_SBSFU_V1.0.0\Middlewares\ST\STM32_Secure_Engine\Utilities\KeysInject\Binary\KeysInject.exe。在 windows 的命令行窗口输入以下命令:其中两个参数是用户指定的密钥字符串(在这里使用相同的密钥)。( j* o# e9 U" ?0 B0 y# f- x
  1. KeysInject.exe OEM_KEY_COMPANY1 OEM_KEY_COMPANY1
复制代码
: O' n+ i6 s1 I9 m0 B; Y
生成的 key_table.txt 的内容应被复制到 SE_Key.c 的数组 SE_ReadKeyCode[44]中。并且该字符串由用户制作一个对应的二进制文件 OEM_KEY_COMPANY1_key.bin,后面再生成加密的用户固件时需要。
* p6 |5 l- r$ ]2.SE_CoreBin
  W5 M, U! i, k% i安全引擎的核心二进制文件。它作为安全引擎中间件,提供唯一的调用门(Calling gate,参见STM32L4 参考手册中的“防火墙(Firewall)“一章)给 SBSFU 示例应用来调用加解密函数。SE_KeyLib 的输出 SE_Key_CM4_IAR.a,会被该工程使用。
1 V& @+ A7 _. k$ c8 M( n  l$ X+ Q3.SB_SFU: j* h  \9 w* m1 n1 r
安全启动与安全固件更新示例应用。它使用之前生成的 SE_CoreBin。在启动时,(安全启动程序“SB”)验证用户固件的签名或者认证码(MAC)来决定是否跳到用户程序执行。(安全固件更新“SFU”)如果在启动时检测到有新的固件更新,则下载加密固件,验证,以及解密安装。
! w$ h5 @' x' J4.UserAppExample
! ^) V1 u3 E/ k  u* i用户程序。编译输出是一个可执行程序。它也可以用来进行新版本固件(用户程序)下载,但是,它不会进行验证与安装。验证与安装时通过重启后的安全启动程序(SecureBoot)完成的。
4 R$ E! H8 u" u( p( z$ g
3 x$ e5 M1 M# M5 [" Z. X' c% W6 l0 t固件加密与包装
1 ]5 I# y$ g, \; s. Z要创建加密的固件,需要使用 STM32 Trusted Package Creator tool。该软件安装时勾选 STM32 Trusted Package Creator tool 即可。
" l3 I4 a* D* n1 g& j  C! e% L# l& a6 {7 ^1 g9 ?: m* e/ \) }& F
8@56HSQ~1[L8)WQ8(JKT}8H.png 4 w1 R9 |) J5 [" L* k9 c' m
2 N+ E4 g! s3 |7 R
打开 STM32 Trusted Package Creator tool,选择“SFU”标签项,随后做如下设置1 t5 y+ l  T( p( E+ f# H% k; W& l7 \  H
 固件路径:' P& R9 C( E8 h
这是之前编译的用户程序输出,即之前需要编译的四个文件中的“4. UserAppExample”
: H. |% T4 U: {, f例如:STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/EWARM/UserAppExample_A/Exe/UserAppExample_A.bin
6 Y5 I8 q: _6 j$ V: P3 C: G  E 密钥文件路径:
1 S4 j* V% C( [* N( u$ R这是之前通过 KeysInject 工具产生的密钥二进制文件。SBSFU 软件包里已经提供了一个。
/ h6 F. K: H8 K. \% x0 r例如:STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/Binary/OEM_KEY_COMPANY1_key.bin; x( Q& y0 T3 z0 e
 96-bits Nonce 随机数文件路径:& E  D9 J7 W* K# g/ v2 ^( c/ W/ J
用户可根据需要进行定制,软件包里已经提供了一个。
# A8 \$ k5 [8 Y, ^: i& T例如:STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/Binary/nonce.bin
0 f: t$ n8 H( t) G: p- H* s) h8 N. C 固件版本:
. P* a! ^3 J, Q* A我们设置成 1.0。
; U" S7 _$ A* f5 I. _( G以下是加密的用户应用程序对应的两部分(文件头和文件体)对应的路径。* a2 W  _# m# O
 SFU 头的输出路径:
2 C. }4 o' R# V1 {3 c5 Y. V可任意设置,这里设置为工作目录 STM32CubeExpansion_SBSFU_V1.0.0。
" n( q% b' l4 c  K SFU 文件的输出路径:
: o) R- d# y  ]& i0 i9 |* F3 J可任意设置,这里设置为工作目录 STM32CubeExpansion_SBSFU_V1.0.0。* C$ B. x: N6 S
然后点击生成按钮,就可以生成相应的安全固件的头信息以及数据文件。
( K, Z1 |9 B9 n: D  u4 p" T1 p6 Y5 o) C* n
II50}PN4$G{$HSGU12]Y((N.png 7 z7 L- N! F! e7 d

6 V3 ]" }2 H6 l+ f) }. |下载用户固件, `* L+ O  S# r
首先是下载 SBSFU。SBSFU 是直接编译后的结果。注意,不要选择调试,因为安全启动内部配置成不可调试。然后根据提示信息,对板子电源进行下拔插。我们使用的串口工具是 TeraTerm。如何配置Teraterm,请参考其他 STM32 文档。
( B1 S- ]! l3 v7 o+ C
* u! z9 g! x: X% p& C% k' ~1 c FN]2}]6H885TYV{Y2S8$NM1.png , q. t: c; }+ o8 s: y; c6 `

! x5 d! ]/ _6 A* d) V8 g1 w9 j重新连接串口中断,比如 TeraTerm,你就可以看到安全启动与安全固件更新示例正在运行。我们还没有把用户应用编译下载下去,所以这里发现不了有效的固件。
8 a' [+ b. T6 w, _% y. T: ~1 o# N( L8 |( B* H" E* \
UO@_RFB@QIRGE(EWVKJ)U@K.png 8 _6 R5 @" q) G4 G4 G3 X
/ g) B- V2 _) W( w; k6 _4 \  r
接下来就是下载用户的安全固件。在进行这一步之前,先要确保已经如前所述,使用 STM32 Trusted Package Creator tool 工具生成了用户安全固件。然后,再重启开发板,按住蓝色用户按钮。然后在串口就可以看到如下输出:& }9 X& O  O& @; |# s2 W; A5 N7 V1 l7 N
4 U" _/ v3 I( b" z8 }) {1 N( }
U@%EU2IE_2W{H~[}0EP]UYM.png
" [& D* K) d3 v" y4 \) O& W; R9 W! H$ p2 s- o  }. Y
第一步是下载用户固件的头信息,即之前在 STM32 Trusted Package Creator 这个工具中生成的”UserAppExample_A.sfuh”。选择 Teraterm 的 File->Send。选择前面生成的固件头信息文件。注意要勾选 Binary 选项。' \( k& m1 y1 n

5 \0 L- g9 B3 V, N6 I- j- v8 d P8{K~}0`%]KI8A2M9HZ97R0.png
: h8 T# W' b) ]7 Y& [" L8 t; ?8 F% ?2 k* u" Y& x( C. s
第二步才是用户的安全固件,即之前在 STM32 Trusted Package Creator 这个工具中生成的”UserAppExample_A.sfu”:选择 YMODEM 协议来传输文件
  U6 p  a: Z, x& |; ]; ]3 K# Y; k3 [4 Q( W! u! X3 p2 I
_AM(9J]WAH{47%SUCZ_D3ZE.png # U0 Y8 v0 o' L

& x& Z& k1 `( w% r! i& A固件下载时,Teraterm 会弹出一个界面显示进度3 S7 @$ ~5 W8 w" n
8 ^# T6 [$ P+ w6 H. k/ i1 z
1@}7WF%TA{TPA9EV4{@IMD2.png . @$ C& Y! q$ H5 h4 ?; N

' Q3 y/ Q4 P4 {1 k) v7 J下载完成后,STM32 会自动重启,进行安全启动流程,进入到用户程序。
/ P! i6 L5 z( j8 N' i0 Y; ^
% a8 n8 p. Z4 |1 r" I/ u* x( S T%}LEKUEYCYLU2S481(@`G9.png
: g7 {9 ?& a8 n# A; V
  F3 }: c# R% M值得一提的是,安全启动会自动设置读保护,写保护等。若想重新烧入安全启动而不是用户固件,则需要将 RDP1 改为 RDP0,同时去除写保护。/ U& {: q1 L3 B8 Q
; n+ ?( y( c: [* \
总结0 O1 X( G( Y8 t
STM32 X-CUBE-SBSFU 软件包的发布,为开发 STM32 安全程序提供了最重要的模块:安全启动与固件更新,可以让用户从高层次来使用 STM32 的各项安全功能。
% i  l+ ^3 \1 y' e
; C4 Z7 S& n3 @; f
收藏 评论0 发布时间:2022-2-19 16:44

举报

0个回答

所属标签

相似分享

官网相关资源

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