打印
[STM32L4]

一步一步使用 STM32 安全启动与固件更新

[复制链接]
1351|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
STM32 X-CUBE-SBSFU 软件包已经发布, 提供了安全启动(Secure Boot)和安全固件更新(Secure
Firmware Update)功能。安全启动和安全固件更新使用了 STM32 内建的各种软硬件安全技术, 构建了
从启动开始的根信任链, 可以用来防止固件克隆、恶意软件下载以及固件破坏。本文则是带领读者一
步一步来体验 STM32 安全启动与安全固件更新。
硬件
STM32 NUCLEO-L476RG 开发板
Mini USB 连接线  

X-CUBE-SBSFU 1.0.0
http://www.st.com/content/st_com/en/products/embedded-software/mcus-embeddedsoftware/stm32-embedded-software/stm32cube-expansion-packages/x-cube-sbsfu.html 可以下载
X-CUBE-SBSFU 1.0.0 安全启动以及安全更新组件。因为是安全相关的组件,下载需要发送请求并且需
要得到批准。 读者需要注册成为 my.st.com 用户。


填写相关信息,就会进入等待批准的状态。

批准通过后,你会收到一份邮件,邮件里会包含下载连接。

使用特权

评论回复
沙发
盗铃何须掩耳|  楼主 | 2021-12-27 10:45 | 只看该作者
SBSFU 简介
STM32 安全启动( secure boot, 简称 SB) 功能检查并使能 STM32 安全功能。在执行应用程序前,“安
全启动”检查应用程序的完整性以及合法性。若应用程序被非法修改,或者应用程序不具有有效的签
名,则应用程序将不会被执行。“安全启动”这段代码的执行,则利用 STM32 的安全 IP,被设计成不
可被跳过。

STM32 安全固件更新( secured firmware update, 简称 SFU) 则接收经过加密的固件,对它进行解
密,在烧写升级的固件前验证它的完整性以及合法性。不完整或者非法来源的固件将不会用来升级。

使用特权

评论回复
板凳
盗铃何须掩耳|  楼主 | 2021-12-27 10:45 | 只看该作者
SBSFU 安全技术概述
现实世界中 MCU 产品并非部署在安全的环境里,总是会面临各种各样的威胁和攻击。 SBSFU 使用各类
STM32 IP 来构建安全防线,包括:
 使用加解密工具来保证系统的完整性, 合法性以及保密性。 SBSFU 使用了对称密钥 AES-GCM 算
法工具来进行固件的解密以及验证。解密算法可由软件实现,也可由 STM32 内建的加解密硬件
IP 引擎实现。
 使用 STM32 内建安全功能诸如内存保护技术来阻止外部通过 JTAG 或者内部恶意代码的攻击。
SBSFU 使用了以下 STM32 安全功能来确保安全启动和安全固件更新的目标。

SBSFU 的架构
SBSFU 整体架构如下。应用层分为两大部分,一部分是安全启动,检查固件的合法性,进行固件下载和
烧写;一部分是用户固件,功能则由用户定制。

安全启动中的安全引擎(SE)中间件,提供了一个受保护的环境,来保护所有的关键数据和操作---包括
进行加解密操作时时访问密钥等。受保护的代码和数据都是通过唯一的调用门进行访问,不可能在调
用门之外来执行受保护代码或者访问关键数据。

使用特权

评论回复
地板
盗铃何须掩耳|  楼主 | 2021-12-27 10:47 | 只看该作者
SBSFU 编译
需要按顺序对下列工程进行编译,因为他们之间存在依赖关系。
1. SE_KeyLib
编译成功后的输出是一个库, SE_Key_CM4_IAR.a。这个库提供获取密钥的功能。这个密钥是由 SBSFU
用来解密和验证后续应用程序合法性的。 密钥在这里不是以” 数据“的形式出现,而是以” 一段可执
行代码“的形式存储,被 STM32 安全机制(PCROP) 保护。
X-CUBE-SBSFU 固件包里提供了一个专门的工具 KeysInject, 来进行密钥到代码的转换, 位于
STM32CubeExpansion_SBSFU_V1.0.0\Middlewares\ST\STM32_Secure_Engine\Utilities\KeysInject\B
inary\KeysInject.exe。在 windows 的命令行窗口输入以下命令:其中两个参数是用户指定的密钥字
符串(在这里使用相同的密钥) 。
  

KeysInject.exe OEM_KEY_COMPANY1 OEM_KEY_COMPANY1
生成的 key_table.txt 的内容应被复制到 SE_Key.c 的数组 SE_ReadKeyCode[44]中。并且该字符串由用
户制作一个对应的二进制文件 OEM_KEY_COMPANY1_key.bin, 后面再生成加密的用户固件时需要。
2. SE_CoreBin
安全引擎的核心二进制文件。它作为安全引擎中间件,提供唯一的调用门( Calling gate,参见
STM32L4 参考手册中的“防火墙(Firewall) “一章) 给 SBSFU 示例应用来调用加解密函数。
SE_KeyLib 的输出 SE_Key_CM4_IAR.a,会被该工程使用。
3. SB_SFU
安全启动与安全固件更新示例应用。它使用之前生成的 SE_CoreBin。在启动时,(安全启动程序
“SB” ) 验证用户固件的签名或者认证码(MAC) 来决定是否跳到用户程序执行。(安全固件更新
“SFU” ) 如果在启动时检测到有新的固件更新,则下载加密固件,验证,以及解密安装。
4. UserAppExample
用户程序。编译输出是一个可执行程序。它也可以用来进行新版本固件(用户程序)下载,但是,它
不会进行验证与安装。验证与安装时通过重启后的安全启动程序( SecureBoot) 完成的。
固件加密与包装
要创建加密的固件,需要使用 STM32 Trusted Package Creator tool。 该软件,需要先从
http://www.st.com/en/development-tools/stm32cubeprog.html 下载 en.stm32cubeprog.zip,安装
时勾选 STM32 Trusted Package Creator tool 即可。


打开 STM32 Trusted Package Creator tool,选择“SFU” 标签项,随后做如下设置
固件路径:
这是之前编译的用户程序输出,即之前需要编译的四个文件中的“ 4. UserAppExample”
例如: STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/EWARM/UserAppExample_A/Exe/UserAppExample_A.bin
 密钥文件路径:
这是之前通过 KeysInject 工具产生的密钥二进制文件。 SBSFU 软件包里已经提供了一个。
例如: STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/Binary/OEM_KEY_COMPANY1_key.bin
96-bits Nonce 随机数文件路径:
用户可根据需要进行定制,软件包里已经提供了一个。

例如: STM32CubeExpansion_SBSFU_V1.0.0/Projects/STM32L476RGNucleo/Applications/UserAppExample/Binary/nonce.bin
固件版本:
我们设置成 1.0。
以下是加密的用户应用程序对应的两部分(文件头和文件体) 对应的路径。
SFU 头的输出路径:
可任意设置,这里设置为工作目录 STM32CubeExpansion_SBSFU_V1.0.0。
 SFU 文件的输出路径:
可任意设置,这里设置为工作目录 STM32CubeExpansion_SBSFU_V1.0.0。
然后点击生成按钮,就可以生成相应的安全固件的头信息以及数据文件。

使用特权

评论回复
5
盗铃何须掩耳|  楼主 | 2021-12-27 10:49 | 只看该作者
下载用户固件
首先是下载 SBSFU。 SBSFU 是直接编译后的结果。注意,不要选择调试,因为安全启动内部配置成不可
调试。然后根据提示信息,对板子电源进行下拔插。我们使用的串口工具是 TeraTerm。如何配置
Teraterm,请参考其他 STM32 文档。
  


重新连接串口中断,比如 TeraTerm,你就可以看到安全启动与安全固件更新示例正在运行。我们还没
有把用户应用编译下载下去,所以这里发现不了有效的固件。

接下来就是下载用户的安全固件。在进行这一步之前,先要确保已经如前所述,使用 STM32 Trusted
Package Creator tool 工具生成了用户安全固件。然后,再重启开发板,按住蓝色用户按钮。然后在
串口就可以看到如下输出:

第一步是下载用户固件的头信息,即之前在 STM32 Trusted Package Creator 这个工具中生成
的”UserAppExample_A.sfuh” 。选择 Teraterm 的 File->Send。选择前面生成的固件头信息文件。注
意要勾选 Binary 选项。
  
第二步才是用户的安全固件, 即之前在 STM32 Trusted Package Creator 这个工具中生成
的” UserAppExample_A.sfu” :选择 YMODEM 协议来传输文件

固件下载时, Teraterm 会弹出一个界面显示进度

下载完成后, STM32 会自动重启,进行安全启动流程,进入到用户程序。


总结
STM32 X-CUBE-SBSFU 软件包的发布,为开发 STM32 安全程序提供了最重要的模块:安全启动与固件更
新,可以让用户从高层次来使用 STM32 的各项安全功能。



使用特权

评论回复
6
小明的同学| | 2022-8-14 08:33 | 只看该作者
总结很全面

使用特权

评论回复
7
tail066| | 2022-8-15 20:02 | 只看该作者
上次谁说固件不能更新的?

使用特权

评论回复
8
zhuomuniao110| | 2022-8-19 16:45 | 只看该作者
谢谢,步骤很详细

使用特权

评论回复
9
match007| | 2022-8-21 13:32 | 只看该作者
感觉高大尚来了

使用特权

评论回复
10
Uriah| | 2022-9-30 08:23 | 只看该作者

Git官网 下载合适你的安装包

使用特权

评论回复
11
Bblythe| | 2022-9-30 11:22 | 只看该作者

我也将样式更改为快速返回而不是单返回语句

使用特权

评论回复
12
Pulitzer| | 2022-9-30 14:21 | 只看该作者

延时子程序每一行的具体含义先不管他

使用特权

评论回复
13
万图| | 2022-12-25 07:20 | 只看该作者

这么简单,那么程序员大概率就要失业了

使用特权

评论回复
14
Uriah| | 2022-12-25 08:23 | 只看该作者

Git官网 下载合适你的安装包

使用特权

评论回复
15
帛灿灿| | 2022-12-25 10:19 | 只看该作者

HSI、HSE以及PLLCLK经过分频或者倍频作为系统时钟SYSCLK来使用。

使用特权

评论回复
16
Bblythe| | 2022-12-25 11:22 | 只看该作者

我也将样式更改为快速返回而不是单返回语句

使用特权

评论回复
17
公羊子丹| | 2022-12-25 13:18 | 只看该作者

函数指针初始化

使用特权

评论回复
18
Pulitzer| | 2022-12-25 14:21 | 只看该作者

延时子程序每一行的具体含义先不管他

使用特权

评论回复
19
公羊子丹| | 2022-12-25 15:24 | 只看该作者

寄存器是中央处理器内的组成部分。它们可以用来暂存指令、数据和地址。可以将其看作是内存的一种。根据种类的不同,一个 CPU 内部会有 20 - 100个寄存器。

使用特权

评论回复
20
公羊子丹| | 2022-12-25 16:17 | 只看该作者

速的印制线或器件与参考接地板之间的容性耦合

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

376

帖子

0

粉丝