盗铃何须掩耳 发表于 2021-12-27 10:33

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

前言
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中。并且该字符串由用
户制作一个对应的二进制文件 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。
然后点击生成按钮,就可以生成相应的安全固件的头信息以及数据文件。

盗铃何须掩耳 发表于 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 的各项安全功能。


小明的同学 发表于 2022-8-14 08:33

总结很全面

tail066 发表于 2022-8-15 20:02

上次谁说固件不能更新的?

zhuomuniao110 发表于 2022-8-19 16:45

谢谢,步骤很详细

match007 发表于 2022-8-21 13:32

感觉高大尚来了

Uriah 发表于 2022-9-30 08:23


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

Bblythe 发表于 2022-9-30 11:22


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

Pulitzer 发表于 2022-9-30 14:21


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

万图 发表于 2022-12-25 07:20


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

Uriah 发表于 2022-12-25 08:23


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

帛灿灿 发表于 2022-12-25 10:19


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

Bblythe 发表于 2022-12-25 11:22


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

公羊子丹 发表于 2022-12-25 13:18


函数指针初始化

Pulitzer 发表于 2022-12-25 14:21


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

公羊子丹 发表于 2022-12-25 15:24


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

公羊子丹 发表于 2022-12-25 16:17


速的印制线或器件与参考接地板之间的容性耦合
页: [1] 2
查看完整版本: 一步一步使用 STM32 安全启动与固件更新