【ESP32 ECO V3】使用 Flash 下载工具完成 Secure Boot V2 功能

news2024/11/26 18:48:29

ESP32 ECO3 及以上版本 的芯片支持 Secure Boot V1 和 Secure Boot V2。使用 ESP32 ECO3 版本的芯片推荐使用 Secure Boot V2, 此篇文档记录基于 ESP32 ECO3 芯片通过 Flash 下载工具开启 Secure Boot V2 的实现。

支持 Secure Boot V2 的产品如下:

芯片型号Secure Boot 版本
ESP32 ECO3 及以上版本Secure Boot V1 & Secure Boot V2 ( RSA-PSS)
ESP32-S2 所有版本Secure Boot V2 ( RSA-PSS)
ESP32-S3 所有版本Secure Boot V2 ( RSA-PSS)
ESP32-C2 所有版本Secure Boot V2 ( ECDSA)
ESP32-C3 ECO3 及以上版本Secure Boot V2 ( RSA-PSS)
ESP32-C6 所有版本Secure Boot V2 (RSA-PSS or ECDSA)
ESP32-H2 所有版本Secure Boot V2 (RSA-PSS or ECDSA)

Secure Boot V2 概述

基于 ESP32 ECO3 芯片开启Secure Boot V2 功能要求用户自行添加用于 Secure Boot V2 签名的私钥,且 ESP32 Secure Boot V2 需要使用 rsa3072 类型的私钥 Key。

用户可以通过如下方式生成用于 Secure Boot V2 签名的私钥 Key

  • 通过 esptool 工具,运行如下指令生成 Secure Boot V2 签名的私钥 key
espsecure.py generate_signing_key secure_boot_signing_key.pem --version 2 --scheme rsa3072
  • secure_boot_signing_key.pem 为生成的(自定义名称)的 key file 文件
  • --version 2 为选择 secure boot V2 版本
  • --scheme rsa3072 指定 Key 的类型
    在这里插入图片描述

在这里插入图片描述

  • 也可以安装 OpenSSL 环境,运行如下指令生成 RSA 3072 类型的指定 secure boot V2 签名的私钥 key
openssl genrsa -out my_secure_boot_signing_key.pem 3072

在这里插入图片描述

使用 Secure Boot V2 私钥 Key 给固件进行签名时,会基于 Secure Boot V2 的私钥 Key 生成 公钥公钥的摘要

  • 公钥公钥的摘要会保存在签名块中,签名块写在 bootloader.binapp.bin 的固件的末尾,即 Secure Boot V2 仅对 bootloader.binapp.bin 的固件进行签名。
  • Secure Boot V2 功能开启后,在固件启动时,会检查 二级引导程序(bootloader.bin )是否被签名,然后被签名的二级引导程序(bootloader.bin )将用来验证被签名app.bin , 验证通过,则固件会正常启动。

如果您正在使用 ESP32 ECO3 版本的芯片,并且希望开启 Secure Boot V2 的功能,从量产生产环境的角度考虑,我们推荐使用 Flash 下载工具(V3.9.6 及以上版本)来开启 Secure Boot V2 过程。

通过 Flash 下载工具 完成 Secure Boot V2 功能的实现流程如下:

  • 基于Flash 下载工具导入公钥的摘要
  • 在下载固件过程直接将公钥的摘要写入芯片的 eFuse BLOCK2
  • 同时写 eFuse 控制位(ABS_DONE_1)来开启 Secure Boot V2 的功能。
  • 烧录开启 Secure Boot V2 功能的签名固件

通过 Flash 下载工具完成 Secure Boot V2 功能,从操作流程上具有如下优点:

  • 固件下载完成后,即完成了 Secure Boot V2 的全部流程
  • 可规避在 Secure Boot V2 流程中出现掉电供电不稳带来的风险

使用 Flash 下载工具(v3.9.6)开启 Secure Boot V2 的具体流程如下:

1. 软件配置

  • 在 esp-idf SDK 编译环境中运行如下指令生成 Secure Boot V2 私钥 Key,参见:Enable Secure Boot V2 Externally

    espsecure.py generate_signing_key secure_boot_signing_key.pem --version 2 --scheme rsa3072
    

    在这里插入图片描述

  • 基于 Secure Boot V2 私钥 Key 生成 公钥的摘要,参见:Enable Secure Boot V2 Externally

    espsecure.py digest_rsa_public_key --keyfile secure_boot_signing_key.pem --output public_key_digest.bin
    

    在这里插入图片描述

  • 在软件配置中,将芯片版本设置为 ECO3 版本,如下:

    → Component config → Hardware Settings → Chip revision → Minimum Supported ESP32 Revision
    在这里插入图片描述

  • 需要开启 Secure Boot V2 的软件配置,指定私钥 Key 文件路径
    在这里插入图片描述

  • 同时,注意 UART ROM download mode 的设置,如果不希望禁用下载模式,推荐选择 UART ROM download mode (Enabled (not recommended)) 模式

    → Security features → UART ROM download mode
    在这里插入图片描述

  • 由于 Secure Boot V2 功能将加大 Bootloader 固件,因此需要增大分区表的偏移地址的设置,如下:

    默认是 0x8000 , 可以调大为 0xF000

    idf.py menuconfig —> Partition Table
    在这里插入图片描述

2. 然后编译工程,获取编译固件:

  • 使用如下指令编译当前工程

    idf.py build
    
  • 编译完成后会同时生成如下固件:

    • 未签名的 bootloader-unsigned.bin
    • 未签名的 blink-unsinged.bin
    • 不被签名的 partition-table.bin
    • 已被签名的 bootloader.bin
    • 已被签名的 blink.bin

    如下:
    在这里插入图片描述

    • 编译后的文件可以在本地路径下找到:

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

  • 通过编译完成的日志打印,可以看到固件对应的下载地址如下:

    0x1000 : bootloader.bin
    0xf000 : partition-table.bin
    0x20000 : blink.bin

    需要下载被签名的 bootloader.bin被签名的 blink.bin

3. Flash 下载工具 配置

  • 在 Flash 下载工具 中的 configure\esp32\security.conf 配置文件中, 开启 Secure Boot V2 的配置选项,如下:
	[SECURE BOOT]
	secure_boot_en = True
	secure_boot_version = 2
	public_key_digest_path = .\bin\public_key_digest.bin

其中,public_key_digest_path = .\bin\public_key_digest.bin 是指定 Secure boot V2 Key 的公钥的摘要

注意:此路径( .\bin\public_key_digest.bin)是基于 Flash 下载工具的路径为当前路径

将公钥的摘要文件放到 Flash 下载工具 中的 bin 文件夹下

在这里插入图片描述


4. 重新启动 Flash 下载工具

开启 Flash 下载工具 后 ,将会读取 configure\esp32\security.conf 配置文件信息,如下:

在这里插入图片描述

5. 导入待下载的固件

按照不同的分区添加待下载的固件,并设置对应的下载地址,如下:

不支持直接导入合并的固件

在这里插入图片描述

  • bootloader.binblink.bin已签名的固件。

6. 烧写固件

固件将在下载过程中会将公钥的摘要写入到芯片 eFuse BLOCK2 中,并使能对应的 Secure Boot V2 的 eFuse 控制位(ABS_DONE_1),如下黑框日志:

test offset :  61440 0xf000
case ok
test offset :  131072 0x20000
case ok
..
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 115200
Changed.
NO XMC flash  detected!
FLASH_CRYPT_CNT 0
ABS_DONE_0 False
ESP32 secure boot v2 skip generate key
burn secure key ...
Burn keys to blocks:
 - BLOCK2 -> [bf f7 73 1f b7 3c 4c 38 bc f7 68 f1 c6 8f 8e 2a d5 14 7d b6 78 b4 7d b9 9f 37 e8 5d 4f 86 68 78]
        Disabling write to key block

Burn keys in efuse blocks.
The key block will be read and write protected


Check all blocks for burn...
idx, BLOCK_NAME,          Conclusion
[00] BLOCK0               is not empty
        (written ): 0x0000000400100000000004310000a20000af94e68629432c00000000
        (to write): 0x00000000000000000000000000000000000000000000000000000100
        (coding scheme = NONE)
[02] BLOCK2               is empty, will burn the new value
.
This is an irreversible operation!
BURN BLOCK2  - OK (write block == read block)
BURN BLOCK0  - OK (all write block bits are set)
Reading updated efuses...
Successful
The efuses to burn:
  from BLOCK0
     - ABS_DONE_1

Burning efuses:

    - 'ABS_DONE_1' (Secure boot V2 is enabled for bootloader image) 0b0 -> 0b1


Check all blocks for burn...
idx, BLOCK_NAME,          Conclusion
[00] BLOCK0               is not empty
        (written ): 0x0000000400100000000004310000a20000af94e68629432c00000100
        (to write): 0x00000020000000000000000000000000000000000000000000000000
        (coding scheme = NONE)
.
This is an irreversible operation!
BURN BLOCK0  - OK (all write block bits are set)
Reading updated efuses...
Checking efuses...
Successful
Compressed 45056 bytes to 25294...
Compressed 3072 bytes to 104...
Compressed 200704 bytes to 104344...

 is stub and send flash finish

固件下载完成后,整个 Secure Boot V2 的流程也完成。

7. 运行固件:

固件将在第一次上电启动时:

  • 检查 Secure Boot V2 功能是否被开启
  • 然后验证被签名的固件
  • 验证成功,则固件正常运行

在这里插入图片描述

运行日志如下:

ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:2, clock div:2
secure boot v2 enabled
secure boot verification succeeded
load:0x3fff00b8 len:0x32ac
load:0x40078000 len:0x5afc
load:0x40080400 len:0x4
0x40080400: _init at ??:?

load:0x40080404 len:0xf24
entry 0x4008064c
I (56) boot: ESP-IDF v5.1.2-dirty 2nd stage bootloader
I (56) boot: compile time Mar 27 2024 16:41:29
I (56) boot: Multicore bootloader
I (60) boot: chip revision: v3.0
I (64) boot.esp32: SPI Speed      : 40MHz
I (69) boot.esp32: SPI Mode       : DIO
I (73) boot.esp32: SPI Flash Size : 2MB
I (78) boot: Enabling RNG early entropy source...
I (83) boot: Partition Table:
I (87) boot: ## Label            Usage          Type ST Offset   Length
I (94) boot:  0 nvs              WiFi data        01 02 00010000 00006000
I (102) boot:  1 phy_init         RF data          01 01 00016000 00001000
I (109) boot:  2 factory          factory app      00 00 00020000 00100000
I (117) boot: End of partition table
I (121) esp_image: segment 0: paddr=00020020 vaddr=3f400020 size=09d90h ( 40336) map
I (144) esp_image: segment 1: paddr=00029db8 vaddr=3ffb0000 size=02070h (  8304) load
I (148) esp_image: segment 2: paddr=0002be30 vaddr=40080000 size=041e8h ( 16872) load
I (157) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=15910h ( 88336) map
I (190) esp_image: segment 4: paddr=00045938 vaddr=400841e8 size=07bach ( 31660) load
I (204) esp_image: segment 5: paddr=0004d4ec vaddr=00000000 size=02ae4h ( 10980)
I (208) esp_image: Verifying image signature...
I (208) secure_boot_v2: Verifying with RSA-PSS...
I (215) secure_boot_v2: Signature verified successfully!
I (223) boot: Loaded app from partition at offset 0x20000
I (223) secure_boot_v2: enabling secure boot v2...
I (229) secure_boot_v2: secure boot v2 is already enabled, continuing..
I (236) boot: Disabling RNG early entropy source...
I (253) cpu_start: Multicore app
I (253) cpu_start: Pro cpu up.
I (253) cpu_start: Starting app cpu, entry point is 0x400810b8
0x400810b8: call_start_cpu1 at E:/esp/Espressif/frameworks/esp-idf-v5.1.2/components/esp_system/port/cpu_start.c:157

I (0) cpu_start: App cpu up.
I (271) cpu_start: Pro cpu start user code
I (271) cpu_start: cpu freq: 160000000 Hz
I (271) cpu_start: Application information:
I (276) cpu_start: Project name:     blink
I (280) cpu_start: App version:      v5.1.2-dirty
I (286) cpu_start: Compile time:     Mar 27 2024 16:41:11
I (292) cpu_start: ELF file SHA256:  51a4c7d0b141e070...
I (298) cpu_start: ESP-IDF:          v5.1.2-dirty
I (303) cpu_start: Min chip rev:     v3.0
I (308) cpu_start: Max chip rev:     v3.99
I (313) cpu_start: Chip rev:         v3.0
I (318) heap_init: Initializing. RAM available for dynamic allocation:
I (325) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (331) heap_init: At 3FFB2968 len 0002D698 (181 KiB): DRAM
I (337) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (343) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (350) heap_init: At 4008BD94 len 0001426C (80 KiB): IRAM
I (357) spi_flash: detected chip: generic
I (361) spi_flash: flash io: dio
W (365) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (379) app_start: Starting scheduler on CPU0
I (383) app_start: Starting scheduler on CPU1
I (383) main_task: Started on CPU0
I (393) main_task: Calling app_main()
I (393) example: Example configured to blink GPIO LED!
I (393) gpio: GPIO[5]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
I (403) example: Turning the LED OFF!
I (1413) example: Turning the LED ON!
I (2413) example: Turning the LED OFF!
I (3413) example: Turning the LED ON!

8. 检查 eFuse 信息

使用 esptool 工具运行如下指令来获取芯片的 eFuse 信息

espefuse.py -p COM4 summary
  • 获取的芯片安全信息如下:
Security fuses:
UART_DOWNLOAD_DIS (BLOCK0)                         Disable UART download mode. Valid for ESP32 V3 and = False R/W (0b0)
                                                    newer; only
ABS_DONE_0 (BLOCK0)                                Secure boot V1 is enabled for bootloader image     = False R/W (0b0)
ABS_DONE_1 (BLOCK0)                                Secure boot V2 is enabled for bootloader image     = True R/W (0b1)
DISABLE_DL_ENCRYPT (BLOCK0)                        Disable flash encryption in UART bootloader        = False R/W (0b0)
DISABLE_DL_DECRYPT (BLOCK0)                        Disable flash decryption in UART bootloader        = False R/W (0b0)
KEY_STATUS (BLOCK0)                                Usage of efuse block 3 (reserved)                  = False R/W (0b0)
SECURE_VERSION (BLOCK3)                            Secure version for anti-rollback                   = 0 R/W (0x00000000)
BLOCK1 (BLOCK1)                                    Flash encryption key
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W
BLOCK2 (BLOCK2)                                    Security boot key
   = bf f7 73 1f b7 3c 4c 38 bc f7 68 f1 c6 8f 8e 2a d5 14 7d b6 78 b4 7d b9 9f 37 e8 5d 4f 86 68 78 R/-
BLOCK3 (BLOCK3)                                    Variable Block 3
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W

在这里插入图片描述


说明

  • 开启 Secure Boot V2 功能后,支持读取芯片 eFuse 信息。
  • 只要软件配置中没有禁用下载模式,也支持重新烧录固件。
  • 重新下载的固件要求使用相同的 Secure Boot V2 的 私钥 Key 进行签名。
  • 做 OTA 应用时,要求 OTA 固件被相同的 Secure Boot V2 的 私钥 Key 进行签名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

号称史上最全的PostgreSQL备份恢复,送给有缘人...

📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜😜😜 中国DBA联盟(ACD…

【Linux】ubuntu安装google gtest框架

本文首发于 ❄️慕雪的寒舍 ubuntu 22.04.03 LTS 安装 google gtest 框架 1.依赖项 首先在ubuntu中安装如下包 sudo apt install -y unzip g gcc cmake make automake2.下载软件包 进入google gtest的github页面,下载源码包 Releases google/googletest https…

使用 PDManer 对数据库表建模(建表语句生成,代码生成)

目录 前言 基本使用教程 新建项目 创建表 关系图 建表语句 生成代码 导入 前言 在软件开发中过程中,一般分为几个过程:需求分析、概要设计、详细设计、编码实现、软件测试和软件交付。 在概要设计和详细设计过程中,则需要对业务进…

Java学习11

目录 一.类变量和类方法: 1.类变量定义访问: 2.类变量的使用细节: 3.类方法: 4.静态main方法(public static void main(String [] args)): 二.代码块: 1.基本语法:…

Chatgpt掘金之旅—有爱AI商业实战篇|文案写作|(三)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、前言 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&…

搜索与图论——Prim算法求最小生成树

在最小生成树问题里&#xff0c;正边和负边都没问题 朴素版prim算法 时间复杂度O(n^2) 生成树&#xff1a;每一次选中的t点&#xff0c;它和集合的距离对应的那条边&#xff0c;就是生成树的一条边 算法流程和dijkstra算法非常相似 #include<iostream> #include<cs…

漏洞扫描神器:Netsparker 保姆级教程(附链接)

一、介绍 Netsparker是一款专业的网络安全扫描工具&#xff0c;用于自动化地发现和修复网站和Web应用程序中的安全漏洞。它提供了全面的安全测试&#xff0c;包括SQL注入、跨站脚本攻击、远程文件包含、命令注入等常见的安全漏洞。 Netsparker具有以下特点&#xff1a; 自动化…

kubeEdge安装初探

1.准备k8s集群 1. 准备一台机器用来部署单节点kubernetes,机器地址192.168.1.10 2. 使用kubekey安装1.27.0版本的kubernetes&#xff1a; apt install conntrack socat export KKZONEcn kk create cluster --with-kubernetesv1.27.0 --container-managercontainerd 2. 安装…

Maplesoft Maple 2024(数学科学计算)mac/win

Maplesoft Maple是一款强大的数学计算软件&#xff0c;提供了丰富的功能和工具&#xff0c;用于数学建模、符号计算、数据可视化等领域的数学分析和解决方案。 Mac版软件下载&#xff1a;Maplesoft Maple 2024 for mac激活版 WIn版软件下载&#xff1a;Maplesoft Maple 2024特别…

C语言第三十八弹---编译和链接

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理&#xff08;预编译&#xff09; 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…

Mysql 常用SQL语句

1、查看mysql中所有的数据库&#xff0c; show databases; 2、创建库 create database 库名;&#xff08;也可以用 create database if not exists 库名; 表示如果库不存在再创建&#xff09; 例&#xff1a;create database if not exists ecology; 3、删除库 …

Visual Studio安装遇到的问题

因为在安装pytorch3d0.3.0时遇到问题&#xff0c;提示没有cl.exe&#xff0c;VS的C编译组件&#xff0c;查了下2019版比2022问题少&#xff0c;下载安装时遇到的问题记录&#xff1a; 查看搜素栏搜时间&#xff0c;查看系统日志&#xff0c;报错为&#xff1a; 创建 TLS 客户端…

农业信息管理(源码+文档)

农业信息管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明功能项目截图客户端首页我的今日动态动态详情登录修改资料今日价格今日报价注册页 后端管理文章管理用户管理分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库…

从智能驾驶全技术供应链看智能驾驶“灵魂”

从智能驾驶全技术供应链看智能驾驶“灵魂” 附赠自动驾驶学习资料和量产经验&#xff1a;链接 智能驾驶主机厂与技术供应链的灵魂之争伴随着智能驾驶技术兴起而来&#xff0c;也伴随着技术供应链的繁荣虽然嘴上很少提起但是行动却很雷厉&#xff0c;首先是扛起民族大旗的华为…

全网营销:提升知名度与市场份额的有效策略

一、什么是全网整合营销&#xff1f; 是指整合产品规划、产品开发、网站建设、网上商店运营、品牌推广、产品分销等一系列电子商务内容的新营销模式&#xff0c;是传统网络、移动互联网、个人电脑互联网的整合。根据目前的观点&#xff0c;是个人电脑移动集成、在线和离线集成…

vue2 列表一般不使用索引删除的原因

在 Vue 中使用索引来删除列表项可能会导致一系列问题&#xff0c;尤其是在处理动态列表时。以下是一些可能的问题和相应的例子&#xff1a; 1. 数据不一致问题 当你使用索引来删除列表中的某个项时&#xff0c;如果列表中的其他项发生了变化&#xff08;比如新增或重新排序&a…

SSM框架学习——Spring事务管理

Spring事务管理 概念 事务&#xff08;Transaction&#xff09;是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行&#xff0c;要么都不执行&#xff0c;是一个不可分割的工作单元。 事务有如下特性&#xff1a; 原子性隔离性一致性持久性 …

有单片机基础,准备过一遍freertos,之后再学linux

应届生我觉得继续把单片机深入一下比较好。 站在公司的角度思考一下&#xff0c;个人觉得应该有以下结论&#xff1a; 1 大公司具备技术资金等优势&#xff0c;因此喜欢学历好&#xff0c;理论扎实能够攻坚的人。倾向于培养各个领域的专家&#xff0c;共同构建自己产品的竞争…

全流程基于GIS、python机器学习技术的地质灾害风险评价与信息化建库实践应用

将结合项目实践案例和科研论文成果进行讲解。入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重…