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

基于STM32将移植 SBSFU 到 STM32G070过程分享

[复制链接]
STMCU小助手 发布时间:2023-12-11 14:02
01前言
" Z) U) j. k  B! ~) }& ^客户使用 STM32G070RBT6 给海外用户开发产品,由于当地新需求,产品需要增加安全启动的功能。但是由于 X-Cube-SBSFU 包提供的示例中,只有基于 STM32G071 的示例。客户因此询问该怎么移植。本文将讲解这个移植过程。
* h  |6 Z9 q* {
: p& O+ j4 r( o4 b9 x6 C& F$ W
+ Q6 a8 M3 z* Y
02基于STM32G070和STM32G071的SBSFU 实现差异
& y4 W  |: g/ H4 J/ H2 J在正式讲解之前,我们首先来看一看 STM32G070 和 STM32G071 的 SBSFU 实现差异。 5 X+ @; \. _/ F9 {. d( A, j& S

4 @% u1 {5 E0 ~  D1 T3 l* zSTM32G070 是一个 value line 产品,首先,我们要意识到,有一些安全特性,相比于STM32G071,它是没有的,比如:PCROP,BOOT_LOCK 和 Secure User Memory。那么,缺少了这些安全特性的 STM32G070,是否还能实现安全启动的功能呢 ? 答案是肯定的。我们先来看 PCROP,BOOT_LOCK,以及 Secure User Memory 在 STM32G071 上的 SBSFU 实现中所扮演的角色是什么?
2 b7 d' g7 g! L9 ]8 Y% T5 s5 I: \0 U2 Z% l2 e4 M
微信图片_20231211140158.jpg
  ~4 f' n: z( P. m) M0 E! x7 x5 ]
; W5 C; M0 }- W; a- K) ^
图1.STM32G0 的 SBSFU 安全实现
# q5 B; S: g2 n2 z9 m# i" y0 c) W
, F, u6 v9 E' X: Z
如上图,在 STM32G071 中,在安全启动的实现中,BOOT_LOCK 用来参与实现唯一启动入口,Secure User Memory 则用来参与实现信任根。PCROP 在安全固件升级实现中用来与MPU 配合实现密钥的安全存储,同时在安全升级过程中涉及到一些密钥的加解密操作,借助于Secure User Memory 和 MPU 的功能, 将 App 与 SBSFU 本身实现完美隔离。
9 {* y6 N, E' c# B* N. h
- b9 \/ `" ]( g  W. R
微信图片_20231211140155.jpg
$ c0 R' J) Y$ \
图2.STM32G0 内存安全映射(运行 SBSFU 时)
& T3 L  g# y% O
8 U% x1 l+ v$ @5 q/ P% X, @# g" H
回到当前问题,一旦 BOOT_LOCK,PCROP,以及 Secure User Memory 缺少的情况下,这些功能还能实现吗?
$ K4 @5 [( U9 D; T; B& s
* L/ \( O+ \' {我们再来看下对于安全启动而言, 它需要实现哪些基本功能?$ J1 J  S" h3 s4 |( x! R
1> 不可更改不可绕过的一段启动代码9 i- _0 i4 R5 o5 X
2> 每次复位必先执行安全启动代码
. T' H4 b/ g5 ?. E( k) d3> 验证系统配置的完整性8 S0 }# H* N8 y) N+ W- e
    • 时钟配置( @4 P% ?2 z% |- L5 L  b* n5 U  l
    • 寄存器配置; r3 J  r+ B' t: D
    • 存储器保护设置, ….# c5 j7 T$ E* {
4> 启动信任根服务' F1 y/ w- B; o& R6 i
    • 通过密码学算法与密钥,校验 App 的完整性与合法性(来源可信,未经篡改) / }$ M* X: f$ m8 l$ |2 `
$ }% P( @1 x; l1 Y
这里需要注意地是,上面提到的某一项安全属性也只是参与实现某一项功能,比如BOOT_LOCK,它只是”参与”实现了唯一启动入口这个功能。从图 1 可知, 除了BOOT_LOCK,还有 RDP,那么在缺少 BOOT_LOCK 的情况下,RDP 是否也可以实现唯一入口启动的功能。很明显,在 RDP2 时,MCU 的入口是唯一的。也就是说,没有 BOOT_LOCK的参与下,RDP2 一样可以实现安全启动对唯一入口启动的需求。RDP2+WRP 就可以实现安全启动的前两条基本要求。而第三条基本要求,完全是 SBSFU 内的纯软件实现。第四条要求,通过 RDP2+WRP+MPU 也可以实现。其实, 在缺少了 PCROP,BOOT_LOCK 和Secure User Memory 后,STM32G070 的安全特性其实跟 STM32F4 差不多,我们不妨来看下STM32F4 是如何来实现 SBSFU 功能的。7 v$ v& |+ A% }% z' N2 S

% ^% J& D% `; |4 R9 n& C  M3 X
微信图片_20231211140151.jpg
, k* P+ v! w% |& X7 M) _  B5 h
图3.STM32F4 的 SBSFU 安全实现
. C: \' `: z) H* P

0 d: |' H- o% j$ C8 N; m) _' Y如上图所示,在 STM32F4 中,借助于 RDPL2,WRP,MPU 就实现了 SBSFU 的全部功能。
, w5 G% I2 c' F$ Q" ?5 K$ j8 e/ W4 G+ }9 \
微信图片_20231211140148.jpg
5 [& E# C, E6 U: _, F1 u7 D- F
图4.STM32F4 的 SBSFU 内存映射
$ S* y; g1 r5 _- {+ k0 v
, |! b. C7 V8 Y( |
到这里,我们完全可以确信,在缺少了 BOOT_LOCK,PCROP 和 Secure User Memory这些安全特性之后,STM32G070 完全可以按照 STM32F4 实现 SBSFU 的方式来进行! 4 e# i% y# z8 i- _: M
7 Z4 \* c3 q' S- ^. J
在确立了大方向后, 我们接下来看具体如何实现。* F7 s$ a7 G9 X

0 R" f4 C: P1 @6 ]8 j- _0 V0 X3 S03开始移植
  \4 A' |9 c$ B8 p2 W$ I3 D第一步 : 确保原始工程运行正常6 \; _$ K  V5 D, I1 V# P
从 ST 官网上下载最新了 SBSFU 包(v2.6.1),打开STM32CubeExpansion_SBSFU_V2.6.1\Projects\NUCLEO-G071RB\Applications\2_Images目录,其下有三个工程,2_Images_SECoreBin(后续简称 SECoreBin 工程),2_Images_SBSFU(后续简称 SBSFU 工程),2_Images_UserApp(后续简称 UserApp 工程)。使用对应 IDE 按顺序依次编译, 然后将 SBSFU 工程生成的 bin 文件烧录到 NUCLEO-G071RB板内,打开 Tera Term 串口终端, 通过 Tera Term 烧录 APP 进去。目的是首先确认原始工程一切运行正常。接下来就开始修改了。
9 b% u9 w3 [9 [& e
, [" o: ]& G  u* ^7 d9 X1 a# |7 \第二步 : 将与 BOOT_LOCK, PCROP, Secure User Memory 相关的宏全部关闭" i( r& m- u! H% g# U
打开 SBSFU 工程的 app_sfu.h 头文件,找到并关闭下面三个宏 :7 J, J" @9 c& ~9 I# @# a% h

5 ~. K( i8 T/ |% k% O* r% _
微信图片_20231211140145.jpg
: x& N, A7 b  R- n" P" m
# w' x# v' t  f- l0 j+ L* y$ Q4 X
重新依次编译 SBCoreBin,SBSFU,UserApp 三个工程,并重新测试通过。 . p$ J! l/ d- G/ X, P

0 H2 X' N! _% l- f: d至此, NUCLEO-G071RB 板上运行的是移除了 BOOT_LOCK, PCROP,Secure User Memory 三个安全特性后的 SBSFU 程序,这个原理上与 STM32G070 上原则上是一致的。接下来就是要移植到 NUCLEO-G070RB 板上了,剩下的就只有 STM32G070 与 STM32G071 的非安全特性方面的差异了。
& \% W$ V- F; |# d$ M
. T6 @! j) ]/ G7 o第三步 : 移植到 STM32G070RB
! d/ o! j7 A( e# C- t) J首先得准备下一块 NUCLEO-G070RB 板。接着将三个工程 SBCoreBin,SBSFU,UserApp 的 device 修改成目标 MCU STM32G070RB,然后将三个工程的 C++预定义宏STM32G071xx 修改成 STM32G070xx。
7 [. |& I4 K3 t# `2 Q0 B; j- B: t; f2 E+ ?- f8 D
以 Keil 为例 :9 f; @% A0 |+ l7 v5 ?- n/ z& ~
微信图片_20231211140142.jpg

" `, H& N* _" f$ v: E# G; f
图5.device 选择 STM32G070RBTx
, y2 r9 ]5 f5 l4 F5 ?

; O7 u/ }  t) C# T5 r
微信图片_20231211140139.jpg

! A0 k$ N, w% C, @' H0 p
图6.C++编译宏修改

8 N# p' z: x: x) M" \1 }1 a
2 T: d2 ]9 L! t, e/ U! L  l" b- Y
STM32CubeIDE 工程的 device 配置比较难修改,因为它原本是灰色的,不允许修改。但我们使用 UE 打开.cproject 一样可以强制修改 : 1 x# |* U5 \. m/ S, A. P
  x& s. H% _! G+ R4 i& H' }8 w
打开对应的.cproject 文件,搜索关键字 G071,将以下几处替换成 G070(修改两处) :
% X3 ^) ]8 q: C4 H9 z8 F  k& j
& V! X0 B& E! p/ @; r
微信图片_20231211140136.jpg
+ c1 K2 `9 u+ E
图7.STM32CubeIDE 下的 device 修改
- Z6 |/ J* Z% Y9 ^! _& o8 q
9 i6 B9 S/ O; N/ _% O
修改完后,打开 STM32CubeIDE 工程,在其 MCU 和 Board 的配置也会有相应的变化:$ l$ d6 S$ }. G$ {. \

2 H- q- L0 m8 T2 X0 t. t  V; _6 u
微信图片_20231211140132.jpg

) J6 p, `: ^( `7 _7 R- D0 Y
图8.STM32CubeIDE 的 MCU 配置
, b0 w2 q5 S" L, t

5 E, @2 z+ Q* B: e5 M4 g( Q5 E由此可见,在 STM32CubeIDE 工程的 MCU 配置也可以做相应的修改了。这是一个小技巧。
" ]; g/ l" X/ `5 l
6 t& B* ]( X% h4 D& U至此,三个工程的工程配置都做完了相应修改。接下来的就是代码方面的修改了。9 t7 C. s# b3 R% Z8 c
3 N4 l4 H# C$ [7 p* @2 ?
首先 STM32G070 的时钟树是没有 PLLQ 输出的,因此,在 SBSFU 和 UserApp 这两个工程内找到 SystemClock_Config()函数,注释掉 PLLQ 的设置,如下所示 :# X+ `! J% n; V  M8 w

" n% x& W+ B) `: F4 K) t
微信图片_20231211140129.jpg ( T6 X& M' x) x& Y. `  [% X

4 C; c3 A* [  {+ {4 [原先 STM32G071 的工程中的打印信息是通过 LPUART1 对应的 PA2,PA3 打印的,换成NUCLEO-G070RB 板后,其引脚虽仍然是 PA2,PA3 引脚用来串口打印,但是 STM32G070中是没有 LPUART1 这个外设的,需要换成 USART2,因此,其对应的代码修改如下 :
5 r$ ?9 c: k+ F& K' Q
6 c3 D$ L4 D' m9 [+ k
在 SBSFU 工程中, 打开 sfu_low_level.h 头文件 , 和 UserApp 工程的 com.h 头文件中:& u3 E6 M. t& {+ `% m  O
2 u) F8 l: H) w, ]& U
微信图片_20231211140125.jpg ) m7 N+ s  H  q, s9 k% \
微信图片_20231211140121.jpg   R* J, q5 U& E, a6 j- v7 Y7 f

# R+ l  c8 m- T4 x- {如上红色部分即为修改处。 4 [. J: B4 C: z

3 N1 u2 O3 D: Q0 e至此,代码部分全部修改完成。重新按顺序依次编译 SBCoreBin,SBSFU,UserApp 三个工程,将 SBSFU 工程首先烧录到 NUCLEO-G070RB 板,然后通过串口终端,按提示,用 YModern 协议将 UserApp 对应的.sfu 文件烧录进去。整个流程都可以正常运行的。这说明软件框架基本已经 OK。接下来运行下 APP 中各种安全测试。( t5 P0 p" T3 Z1 E* S: f  g: I
8 f  I9 A' M! @+ g9 P

3 J0 I2 ~: B2 W7 ^) O$ e04测试安全保护特性
6 D8 \7 k$ ^0 [当程序跳入到 APP 后,显示如下界面
+ ^0 J1 E4 X# H
" z8 o2 z  S  Z' ]5 R( w
微信图片_20231211140118.jpg
9 Q+ ?4 L  H$ u! ]+ {) \
图9.测试主界面

' r3 l2 M  v! @
8 {4 K+ D$ q( a. H; A

: S4 r" l: Q  x% I3 g" T
当选择 2 Test Protection :Secure User Memory 时,结果会出错 :: k/ \1 e- @5 y5 f( u
* K" B/ m" |* x
微信图片_20231211140114.jpg
9 I1 G$ x+ a; X  U  T; L
图10.测试保护
3 ~4 f5 s) O* v3 z9 X) ?6 ?  ~
/ n, R- }% K1 x, ^
很明显,这里需要修改下,因为 STM32G070 是没有 Secure User Memory 的。查看其对应代码:! `2 a7 u, N5 c6 \2 \
- G9 W. a( f5 y- T8 V' s) L4 h
微信图片_20231211140111.jpg : }7 y) N  k9 F3 K( O2 o5 K5 d
微信图片_20231211140108.jpg
* A$ q; }) j) }' f0 w+ e3 L* q- F3 ^% X" g( @
原来 UserApp 是测试直接读取保存在 SECoreBin 内的密钥数据, 测试是否能读出。结果发现是可以的,因此,保护效果是出问题了。, G9 T  R  P1 c# {) T, J' Q
0 L: a0 ]/ ]% d0 P" S2 {1 t; Z( a
首先我们修改下此函数,由于 STM32G070 中 Secure User Memory 是不存在的, 此函数叫 TEST_PROTECTIONS_RunSecUserMem_CODE()已经不再合适, 依照 STM32F4 的SBSFU 实现,将此函数换成 TEST_PROTECTIONS_RunSE_CODE()函数:5 ]( h$ q) X; f1 u

9 q: O2 _/ @/ l
微信图片_20231211140041.jpg
' B. ?  n0 W1 s6 U& y, L: x. i8 s  k9 u0 q
同样的尝试读取密钥:3 e0 T2 t+ V$ j

: f6 ~6 `/ e$ G& Q4 Q
微信图片_20231211140036.jpg
" l$ b7 U- n: E9 b6 t7 @% Y
图11.UserApp 尝试读取密钥
: V8 ?( w! o& U1 t+ m1 _$ N

8 s$ E; b9 t4 e) d+ c8 p7 }. T+ f$ E
测试结果可想而知, 肯定是可以读取的。于是得查看下为什么可以。
) a' j( s& u0 H# \& [1 H
& r8 `2 A  v9 E% u, e' Y仔细查看图 2 的 STM32G071 的 SBSFU 原来实现中,SE Key 是通过 PCROP+Secure User Memory 来保护的,现在换成 STM32G070,原本 Secure User Memory 用来作隔离机制, 现在换成了 MPU, 而原本保护 SE Key 的 PCROP 在 G070 中压根就不存在,于是 SE Key 只剩下 MPU 来保护,因此,我们接下来得着重分析 MPU 对 SE Key 的保护。
" z+ e/ }, o/ f& T  L0 y3 p0 P
! |& A) a- Z1 V$ f8 F$ g3 S为了方便调试,我们首先得将除 MPU 以外的所有保护通通关闭,只剩下 MPU 保护。于是在 SBSFU 工程中,在 app_sfu.h 头文件中,将以下宏通通注释掉:
; b( t3 a/ D  u7 @5 |
/ B3 J. @2 \/ u! v* j/ I" g
微信图片_20231211135943.jpg
( @4 Q1 B* p6 E# U9 Z. h) t
微信图片_20231211135940.jpg
0 X' X+ D: p  v+ g+ {9 J
  Q% T7 d% a+ O9 U8 N然后开始调试。在调试过程中,发现程序在从 SBSFU 跳转到 UserApp 之前,在代码中特意将 MPU 关闭: % y1 r+ Z/ [  y' Z

0 N: ?5 H! m/ D3 P如在 sfu_low_level_security.c 源文件中的内存函数 SFU_LL_SECU_ActivateSecUser()中有这么一行代码:& n+ N7 @& ~, o8 a* ?

  p% j( u; T6 A: ^
微信图片_20231211135937.jpg . N. E6 n' N/ g3 \; _+ M

1 O5 s$ I6 h  O, {8 H* K* t这就是为什么 UserApp 中仍然可以直接读取密钥的原因了。很明显,接下来我们需要将 SEKey 用 MPU 保护起来。但在这之前,我们得首先弄清楚,当程序跳转到 UserApp 后,Flash 和Ram 该如何设置 MPU 保护?* Y& A! \, }+ c. X! R

/ j# j* s: O" [) }在 UM2262 中, 有提到当程序跳转到 UserApp 后 flash 和 RAM 的状态:3 x8 |* c# d0 p

+ G7 i" F  o8 r: _" ?
微信图片_20231211135933.jpg

7 V2 b$ @/ H5 M
图12.UserApp 运行时的 flash 和 RAM 状态

2 y' ]4 {: `8 _- j" x3 U
) E/ e* v9 w* V1 E3 W2 P* ~9 F
从上图可以看出,原本 Secure User Memory 保护的区域,我们得使用 MPU 来替代实现相应功能,包含 SBSFU 整个代码和 Slot#1 内的 header 信息。这也就是在代码跳转到 UserApp之前需要做的事情。而黄色对应的 SRAM 区别已经擦除,当程序跳转到 UserApp 后其实已经没必要再保护。
/ Z( m6 Y5 s, y0 A: b
' X5 Q( b# `8 k
于是在跳转到 UserApp 的内存函数中配置 MPU:
. j) w6 d! T) S) k/ V1 L7 s0 r( l) B8 ~5 g" t- k
微信图片_20231211135929.jpg 6 q2 o5 C& G4 F, j$ |# B* u3 H; k$ H
微信图片_20231211135926.jpg 3 D6 z* Z% F% @3 r5 ^+ |

) V  A. I1 n4 {* M 微信图片_20231211135923.jpg
8 _# S2 V& s/ L) C" G1 @& v  E3 _# v
注意这里是一个内存函数,它所调用的所有子函数也都是内存函数。在这个函数中我们将SBSFU 所在的 64K Flash,再加上 2K 的 Active Slot 的 header 信息保护起来。内存 RAM 我们并没有配置保护,因为跳转到 UserApp 后它就完全开放,且内容已经清空。
- K- _0 ~* B$ F. t( X: `3 u) K$ A( U1 C, \% D9 B9 A8 g
对应的, 我们在 UserApp 中增加对 Header 的测试函数 :
% u: D3 o7 k  \( d) _: ]
4 Q  A, M/ E% f$ B0 C. A2 v5 r
微信图片_20231211135920.jpg
+ P$ b+ j( t/ P: V2 x! K2 N, G  L+ \
3 q9 a+ w4 q" U4 G% \/ @
重新烧录程序,当程序运行后,选择 2 进行 protection 测试,然后再选择 2,测试访问SBSFU 所有的 64K 区域:, @( _  I  ~0 p- K2 O3 m# V

( Q) ?$ l. e0 {( T
2.jpg
) _, S& T, D8 k
图13.测试 SBSFU 的 64K 代码区
2 r1 H) ?* K/ @: V/ m

0 o- S  H* z9 b; x发现会一直卡住, 这说明 MPU 对整个 SBSFU 64K 区域的保护已经生效。同样的,选择’3’测试 header 所在区域:
6 ^. \0 ~9 k! F+ A7 `! n
0 J7 h/ R9 y! ?+ [( ]
微信图片_20231211135908.jpg

# F0 v! F- E" \; v/ g
图14.测试 Header 对应的 2K 区域

; ^1 n1 k+ Z1 X  x  _( N
8 N9 N: m2 M) c& O" Q9 u6 T" {) @5 k% M
发现程序读取 0x0801 0000 地址时会一直卡住,这说明 MPU 对 header 的保护也已经生效。然后再测试了下其它选项,包含下载新固件,还有其它默认的一些安全特性,基本都是OK 的。这说明整个程序基本已经 OK。 ' A, ?8 c/ C  F, h6 I
  k5 {  W3 ]4 I& O4 F% l! y
最后再恢复之前注释掉的除 MPU 之后的保护。/ O5 ~& J) Y' B( r
  l4 m9 n3 A: k
05后述4 k; Z; ?5 I! ]( \0 V# G
本文旨在通过一个相对容易的移植, 让读者对 SBSFU 的移植过程有一个大概了解以起到参考和示范作用。8 ]: g2 u- P' Z$ A1 `4 M5 x4 m
, I/ f( I* N) r( s0 ^# G. \% t* Y/ G
如有侵权请联系删除, s6 P# s% K# y$ y# k
转载自:STM32单片机' Q8 x8 [1 y+ y5 p# \) P  B
" J( ^4 E2 k% s# v- I: H) Q2 d; ]
, ]: ]3 Z. y' u) ~$ S! P/ [5 i

3 G) Z* t1 B( z8 ]' c! s1 I. Q# Q4 }6 z! ^; f* x+ d/ ^
1 收藏 1 评论1 发布时间:2023-12-11 14:02

举报

1个回答
watershade 回答时间:2023-12-13 10:06:30

不明觉厉,SBSFU还真没有涉猎。看来很多东西不知道。

所属标签

相似技术帖

官网相关资源

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