STM32 SBSFU的实现与应用

发布者:春林初盛最新更新时间:2023-02-07 来源: zhihu关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

STM32安全固件更新

STM32安全固件更新离不开STM32安全启动。

参考上图23,理解STM32安全固件更新的流程。

  • 下载固件头

  • 验证固件头

  • 下载(加密)固件

  • 重启

  • 检查/设置安全环境

  • 检查是否需要固件更新

  • 验证固件头

  • 解密/验证固件并烧入固件

  • 认证固件

  • 执行新固件

从STM32 SBSFU的流程中可以看出,固件的完整性,以及固件header的完整性都很重要,都必须要进行检查。STM32 SBSFU中固件header中包含固件的哈希值或者认证码。为什么这里可以包括一个哈希值而不是一个签名值?因为固件header是被签名或者受ADSGCM认证码TAG保护的。

STM32 SBSFU典型的header如下:

  • SFU Magic数字

  • SFU协议版本

  • 用于加解密的随机数—被AES-GCM作为header或者AES-CBC作为IV

  • 固件版本

  • 固件大小

  • 固件认证码/哈希值

  • 保留字段

  • 头部的认证码/签名

当然这里的流程,选择是固件冗余的方案,也就是双镜像Dual-image。如果是单镜像,Single-image,流程会有些不同。我们前面提到,单镜像是不支持用户固件中的下载,所以只能从Bootloader里下载。在这种情况下,就不需要重启再去进行解密验证操作。

同时,这里的流程选择的是固件带加密的流程。如果,固件是不需要加密,只需要保证完整性,那么,解密是不需要的。而完整可靠性认证在STM32 SBSFU中都是存在的。

参考上图24,理解固件更新后的安全启动流程:

  • 检查/设置安全环境

  • 验证固件头

  • 验证固件

  • 检查固件是否有效

  • 执行固件

STM32 SBSFU中的安全固件更新使用了加解密技术。

参考上图,STM32 SBSFU支持三种加解密技术方案:

  • 对称密钥加密AES128-CBC,非对称密钥认证ECDSA,以及完整性函数SHA256

  • 无加密。非对称密钥认证ECDSA,以及完整性函数SHA256

  • 对称密钥加密AES128-GCM对称密钥认证AES128-GCM

STM32 SBSFU的固件包的制作是由编译器调用工程中的脚本直接完成的。

STM32 SBSFU支持bootloader,支持使用UART串口在用户例程或者在BootLoader里更新用户固件。

STM32 SBSFU支持双image或者单image。单image就不存在固件冗余。

STM32 SBSFU在智能锁中的应用

对于某个特定的应用,只要资源不是受限制,那么安全固件更新的功能总是应该相似的。对于智能锁,我们可以直接应用STM32 SBSFU。应用SBSFU我们需要考虑Flash的大小,加解密模式的配置,以及用户固件的替换。

对于应用STM32 SBSFU需要注意因为安全所带来的flash的额外开销。例如,用户可去查阅STM32 SBSFU的用户手册,可以了解到,如果使用STM32 SBSFU安全启动与安全固件更新,系统大约会增加50K的flash。

STM32 SBSFU的密钥配置是在文本文件里。非对称密钥椭圆曲线ECC的文本文件;

ECCKEY.txt,可在开发包的目录里搜索ECC。对称密钥则是在另外一个文本文件;

OEM_KEY_COMPANY1_key_AES_CBC.bin里,可在开发包里搜索AES,就很容易找到密钥配置文件。建议各位实际的去修改一下这些密钥。

系统默认使用非对称密钥认证固件,也就是对称密钥加密AES128-CBC,非对称密钥认证ECDSA,以及完整性函数SHA256。如果需要改动,可修改配置文件se_crypto_config.h。在开发包中直接搜索config,可以很快找到该文件。

当然,STM32 SBSFU中的用户固件部分是需要进行替换的。默认的SBSFU用户固件只是一个示例,不符合用户的场景。同时例子固件仅支持从UART传输固件。实际中的固件则是需要支持从网络接受固件。这一点在改动时,可以修改固件下载部分。STM32 SBSFU的固件下载部分和固件解密部分是分开的。固件下载可以在用户固件中完成,需要的安全性低。而固件解密则是在安全性高的启动部分完成。

如果是资源敏感的STM32 MCU应用,则应该使用本课程所讲述的原理,定制安全启动与安全固件更新。这样可以得到一个轻量级的实现。STM32 SBSFU应用笔记AN5056是一个很好的定制参考。


关键字:STM32 引用地址:STM32 SBSFU的实现与应用

上一篇:被STM32G0快速编程难倒的,看这里
下一篇:智能锁中用到的加解密以及STM32 Cryptolib

推荐阅读最新更新时间:2024-11-13 11:22

标准库函数与基于HAL库函数的说明
开始学习51的时候有的人会直接选择进行对单片机的寄存器进行操作,可以很好的理解单片机的工作原理,对于代码的编写也会后很好的理解,但是在stm32的时候操作寄存器就不太行了,因为stm32的寄存器是51的数十倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。这是我们就有了其他的操作方式,来简化我们的工作。 一、标准库 STM32有非常多的寄存器,导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx……之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需
[单片机]
STM32睡眠模式低功耗(停止模式)
目前stm32已经非常流行了,那么本文讨论下stm32低功耗模式,不多说先上手册内容! 这是英文文档 不好看懂是吧,下面看中文文档! 我对比了 STM32F0 和 STM32F1 两者进入低功耗是一样的,STM32F4的类似目前没有研究。 低功耗模式有三种, 1.睡眠模式,( CM3 内核停止,外设仍然运行)此功耗是最高的。 2.停止模式,(所有时钟都停止)此功耗较低,典型大概在20uA左右。 3.待机模式,( 1.8V 内核电源关闭)此功耗最低,典型大概在2uA左右。 如果不行那就看手册,上图 一般我们做开发大多都是选择停机模式,因为停机模式功耗较低。而且任一中断或事件都能唤醒,待机模式虽然功耗最低,也就
[单片机]
<font color='red'>STM32</font>睡眠模式低功耗(停止模式)
STM32 I/O口不能正常输出高低电平问题的解决方案
I/O口不能正常输出一般都是端口被复用了造成的,除了检查程序中是否有把端口复用的程序外,还应注意:有些端口在单片机上电时默认就是复用的,如与JTAG相关的PA13,PA14,PA15,PB3,PB4引脚,禁用JTAG或SWD可以释放其中的一些引脚,见表格: 具体做法: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);//重映射需要先使能AFIO时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//只关闭JTAG而保留SWD
[单片机]
STM32开发笔记58: STM32F407特殊引脚连接电路
单片机型号:STM32F407VGT6 本文介绍STM32F407特殊引脚连接电路,见下图: 引脚:49、73 VCAP_1和VCAP_2,按照下列电路设计方法进行设计。这里应该着重看最后1句话,其表明使用2个0.1uF电容对地即可。 引脚:11、22、28、50、75、100 VDD和VDDA,22脚是模拟电源,这些引脚直接加0.1uF电容去耦即可。 引脚:6 VBAT,该引脚连接电池,用以在主电源掉电后,维持芯片部分部件(例如RTC)继续工作,当不使用这些功能时,可按照下述方法进行电路连接。 引脚:21 VREF+,此引脚有2种处理方法,第1种是独立供给参考电压,其参考电路图如
[单片机]
<font color='red'>STM32</font>开发笔记58: STM32F407特殊引脚连接电路
STM32学习探究:流水灯的实现
流水灯的实现 这里我们使用 stm32mini 开发板实现外接流水灯,这里我采用了三个灯(说明问题就可以了)。外接的引脚分别为PA2,PB8,PC13三个引脚,在连接的时候,采用灯的正极接GPIO引脚,负极接GND(这是一种合理的方式)。 注意:虽然接VCC也可以发光,但是这样不是合理的连接方式,而且,发光的情况刚好与接GND的情况相反。 参考的相关资料如下: 时钟使能: 端口配置: 端口输出: 具体实现的代码如下: //led.h文件 #ifndef __LED_H #define __LED_H #include sys.h //LED端口定义 #define LED0 PAout(
[单片机]
<font color='red'>STM32</font>学习探究:流水灯的实现
STM32待机模式测试
环境: 主机:XP 开发环境:MDK4.10 单片机:STM32F103C8 功能: 开启RTC闹钟,然后进入待机模式,用闹钟唤醒后退出. 说明: 1.RTC闹钟唤醒事件发生时,同时进入闹钟中断,必须在初始化时与外部中断线17关联 2.如果仅想退出待机模式,RTC闹钟事件已经足够,不必与外部中断线17关联 3.退出待机模式后,接下来的流程类似于按下复位按键,程序会从头开始执行 源代码: 初始化时钟,配置时钟为内部时钟LSI,配置RTC闹钟唤醒以及外部中断线17 void RTC_Configuration(void) { //定义中断结构体 NVIC_InitT
[单片机]
STM32 Cotex-M3处理器系列编程】按键灯亮
//分别按下S1~S4,D1~D4分别点亮 #include stm32f10x.h void Delay(unsigned int x); int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);//IO口使能设置 GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //LED管脚
[单片机]
STM32的USB固件库中回调函数的使用
一、c语言回调函数的实现 1. 什么是回调函数 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 2. 为什么要使用回调函数 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。 3. 声明函数指针 回调函数是
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved