通过 QEMU 试用 ESP32-C3 的安全功能

news2025/1/6 20:44:40

概述 

ESP32-C3 系列芯片支持可信启动、flash 加密、安全存储等多种安全功能,还有专用外设来支持 HMAC 和数字签名等用例。这些功能所需的私钥和配置大多存储在 ESP32-C3 的 eFuse 存储器中。 

启用安全功能时需要谨慎,因为使用到的 eFuse 存储器是一次性可编程存储器,烧写过程不可逆,安全功能最好先在试验场(比如模拟器)中测试,然后再转移到真实硬件上。 

本文讨论了如何在 QEMU(模拟器)中试用 ESP32-C3 中的不同安全功能。 

QEMU 

QEMU 是快速模拟器(Quick EMUlator)的缩写,它是一种开源虚拟化工具,能够让用户在主机系统上创建和运行虚拟机(VMs)。QEMU 可以模拟各种架构,包括 x86、ARM、RISCV等,使用户能够运行针对不同硬件平台设计的操作系统和软件。 

乐鑫使用 QEMU,开发了基于 RISC-V 的 ESP32-C3 的系统级仿真器,最新版本已支持 ESP32-C3 的所有安全功能。该仿真器确保二进制文件兼容,可以直接运行针对 ESP32-C3 目标芯片构建的固件。 

使用模拟器可以迭代各种安全配置,而且没有硬件砖化的风险,在 QEMU下建立的工作流程简单修改后便能适用于真实硬件。 

如何通过 QEMU 试用安全功能? 

QEMU 是系统级模拟器,由指令集模拟、内存和 MMU 模拟以及外设模拟组成。它还支持各种虚拟磁盘格式和网络配置。 

使用软件模拟代替硬件试验 

QEMU 可以模拟完整的硬件 SoC,包括外设模拟。eFuse、XTS-AES 和 RSA 等外设是实现安全功能的关键。 

我们将在下文深入探讨在 QEMU 中如何使用模拟主机文件。 

试用安全功能 

乐鑫的安全指南中介绍过,启用安全功能有两种流程: 

  • 内部首次启用的流程 

  • 基于主机的流程​​​​​

接下来我们会通过示例,试用所有支持的安全功能: 

  • 安全启动 V2

  • Flash 加密

  • NVS 加密(基于 HMAC 的方案) 

下面一起来看看内部首次启用的流程 。

安装 QEMU 发布版本 

  • 1.您可在发布版本页面获取已编译的 QEMU 二进制文件,根据您的平台下载特定的 ESP32-C3 二进制文件 (qemu-riscv32-softmmu-esp_develop-),或是使用下列命令直接在 Downloads 目录中下载并提取包: 

  • # Linux 
    wget https://github.com/espressif/qemu/releases/download/esp-develop-8.2.0-20240122/qemu-riscv32-softmmu-esp_develop_8.2.0_20240122-x86_64-linux-gnu.tar.xz -P ~/Downloads 
    tar xvf ~/Downloads/qemu-riscv32-softmmu-esp_develop_8.2.0_20240122-x86_64-linux-gnu.tar.xz -C ~/Downloads 
     
    # MacOS (M1 silicon) 
    wget https://github.com/espressif/qemu/releases/download/esp-develop-8.2.0-20240122/qemu-riscv32-softmmu-esp_develop_8.2.0_20240122-aarch64-apple-darwin.tar.xz -P ~/Downloads 
    tar xvf ~/Downloads/qemu-riscv32-softmmu-esp_develop_8.2.0_20240122-aarch64-apple-darwin.tar.xz -C ~/Downloads 

    您也可以考虑将文件路径添加至环境变量 $PATH 以便使用。如果使用 Linux 或 MacOS 平台,可在将二进制文件下载至 Downloads 目录并提取文件后,运行下列命令添加变量: 

  • export PATH=$PATH:~/Downloads/qemu/bin 

    2.如果您想尝试开发中的版本,可以选择乐鑫在 GitHub 上的 QEMU 仓库分支,根据文档中的配置指南创建进行克隆和编译。 

  • 3.如果您使用的是 ESP-IDF master 分支开发固件,那么安装 QEMU 最简单的方式是运行以下命令,获取与 ESP-IDF (msater) 打包发布的二进制文件。 

  • python $IDF_PATH/tools/idf_tools.py install qemu-riscv32 

    上述命令会将与 ESP-IDF 打包发布的 QEMU 二进制文件路径导出至 $PATH 变量中。 

内部首次启用流程 

  • 该流程中,安全功能会在引导加载程序第一次启动期间逐步开启。 

      1. 克隆演示项目 

  • 打开一个新的终端窗口,使用 ESP-IDF 安装指南中介绍的 . ./export.sh  激活 ESP-IDF 环境。 

  • 使用下列命令克隆演示项目: 

  • git clone https://github.com/Harshal5/esp-idf-security-example.git 
    cd esp-idf-security-example 

    2.启用安全相关配置 

  • 首先,输入以下命令将项目目标芯片设置为 esp32c3: 

  • idf.py set-target esp32c3 

    示例项目已默认启用下列所有安全配置(sdkconfig.defaults),无需再自行启用。 

  •  已启用的安全相关配置: 

# Secure Boot related configs 
CONFIG_SECURE_SIGNED_ON_BOOT=y 
CONFIG_SECURE_SIGNED_ON_UPDATE=y 
CONFIG_SECURE_SIGNED_APPS=y 
 
CONFIG_SECURE_BOOT_V2_RSA_ENABLED=y 
CONFIG_SECURE_SIGNED_APPS_RSA_SCHEME=y 
CONFIG_SECURE_BOOT=y 
CONFIG_SECURE_BOOT_V2_ENABLED=y 
CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES=y 
CONFIG_SECURE_BOOT_SIGNING_KEY="secure_boot_signing_key.pem" 
CONFIG_SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT=y 
 
# Flash Encryption related configs 
CONFIG_SECURE_FLASH_ENC_ENABLED=y 
CONFIG_FLASH_ENCRYPTION_ENABLED=y 
CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE=y 
CONFIG_SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE=y 
CONFIG_SECURE_FLASH_ENCRYPT_ONLY_IMAGE_LEN_IN_APP_PART=y 
CONFIG_SECURE_FLASH_CHECK_ENC_EN_IN_APP=y 
CONFIG_SECURE_ENABLE_SECURE_ROM_DL_MODE=y 
 
# NVS Encryption related configs 
CONFIG_NVS_ENCRYPTION=y 
CONFIG_NVS_SEC_KEY_PROTECT_USING_HMAC=y 
CONFIG_NVS_SEC_HMAC_EFUSE_KEY_ID=3 

上述配置的前提是安全启动密钥 secure_boot_signing_key.pem 已事先生成, flash 加密密钥将由设备(esp32c3)生成,用于生成 NVS 加密密钥的 HMAC 密钥(如 hmac_key.bin)已事先烧写至 eFuse KEY_BLOCK3 中。 

安全启动签名的密钥是 RSA 密钥,可以用以下命令生成: 

espsecure.py generate_signing_key --version 2 secure_boot_signing_key.pem 

NVS 加密密钥是 AES 密钥,可以用以下命令生成: 

dd if=/dev/random of=hmac_key.bin bs=1 count=32 

3. 生成 flash 镜像 

配置完成后,使用以下命令构建固件: 

idf.py build 

运行这个命令会在 build 目录中分别创建引导加载程序、分区表和应用程序镜像。 

QEMU flash 镜像通过项目 build 目录中的 bootloader、分区表和应用程序二进制镜像合并生成。生成 flash 镜像最简单的方法是使用 esptool.py merge_bin 命令和 flash_args  参数文件,该参数文件中包含所有需要用 idf.py flash 命令烧录的二进制镜像条目。 

使用下列命令生成固件所需的完整 flash 镜像 (flash_image): 

(cd build; esptool.py --chip esp32c3 merge_bin --fill-flash-size 4MB -o flash_image.bin @flash_args) 

由于我们已经启用了 CONFIG_SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT 配置,引导加载程序的条目也会添加到 flash_args  文件中。这一步是安全启动指南中的必要步骤,因为安全启动开启时运行 idf.py flash  命令默认不会烧录引导加载程序。 

4. 准备 eFuse 文件 

使用以下命令可以创建简单的 eFuse 文件: 

dd if=/dev/zero bs=1K count=1 of=build/qemu_efuse.bin 

这个命令会创建一个 1 KB(1024字节)大小的文件,与 ESP32-C3 eFuse 块的总大小相同,所有块都用零填充。

 准备好 eFuse 文件后,可以在下载模式下运行 QEMU ESP32-C3 并附加此前生成的 eFuse 文件,从而查看 eFuse 摘要。在更新过 PATH 变量的终端中执行下列命令,以便在下载模式下运行 QEMU: 

qemu-system-riscv32 -nographic \ 
                    -machine esp32c3 \ 
                    -global driver=esp32c3.gpio,property=strap_mode,value=0x02 \ 
                    -drive file=build/qemu_efuse.bin,if=none,format=raw,id=efuse \ 
                    -global driver=nvram.esp32c3.efuse,property=drive,value=efuse \ 
                    -serial tcp::5555,server,nowait 
qemu-system-riscv32 -nographic \ 
                    -machine esp32c3 \ 
                    -global driver=esp32c3.gpio,property=strap_mode,value=0x02 \ 
                    -drive file=build/qemu_efuse.bin,if=none,format=raw,id=efuse \ 
                    -global driver=nvram.esp32c3.efuse,property=drive,value=efuse \ 
                    -serial tcp::5555,server,nowait 

(运行上述命令后,可以查看 QEMU 二进制文件的版本,格式是 QEMU 8.2.0 monitor。请确保版本 ≥ 8.2.0) 

QEMU 在下载模式下运行时,可在 ESP-IDF 环境终端中用 espefuse.py  查看 eFuse 摘要: 

export ESPPORT=socket://localhost:5555 
 
espefuse.py -p $ESPPORT --before=no_reset summary export ESPPORT=socket://localhost:5555 
 
espefuse.py -p $ESPPORT --before=no_reset summary 

注意:下载模式下运行 QEMU 时,串口输出可以重定向到 TCP 端口。上述 QEMU 命令中使用的是 5555 端口,因此需要将变量 ESPPOR 设置为 socket://localhost:5555,或者直接将端口用于所有所有相关操作。 

现在, eFuse 摘要 应该是空白或干净的,和芯片硬件类似。 

您还需要根据要求设置 ECO 版本。 

例如,如果使用 ESP32-C3 v0.3,则需要将 eFuse 设置为 WAFER_VERSION_MINOR_LO 3。 

espefuse.py -p $ESPPORT --before=no_reset burn_efuse WAFER_VERSION_MINOR_LO 3 

最后,将用于 NVS 加密的 HMAC 密钥烧写至 KEY_BLOCK3  中,密钥用途为 HMAC_UP : 

espefuse.py -p $ESPPORT --before=no_reset burn_key BLOCK_KEY3 hmac_key.bin HMAC_UP 

需要的 eFuse 都烧写完成后,输入“quit”命令关闭 QEMU。 

5. 使用 QEMU 运行固件 

执行以下命令,在启动模式下用 QEMU 运行固件: 

qemu-system-riscv32 -nographic \ 
                    -M esp32c3 \ 
                    -drive file=build/flash_image.bin,if=mtd,format=raw \ 
                    -drive file=build/qemu_efuse.bin,if=none,format=raw,id=efuse \ 
                    -global driver=nvram.esp32c3.efuse,property=drive,value=efuse \ 
                    -serial mon:stdio 

注意:请使用前几步合并的 flash 镜像和生成的 eFuse 文件更新版。 

由于串口数据输出到 stdio,现在应该可以看到成功启用安全启动、flash 加密、NVS 加密的日志,eFuse 文件中烧写的对应 eFuse,以及合并 flash_image 的加密过程: 

> qemu-system-riscv32 -nographic \
                    -M esp32c3 \      
                    -drive file=build/flash_image.bin,if=mtd,format=raw \       
                    -drive file=build/qemu_efuse.bin,if=none,format=raw,id=efuse \
                    -global driver=nvram.esp32c3.efuse,property=drive,value=efuse \
                    -serial mon:stdio
       
Adding SPI flash device
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5990,len:0x3b48
load:0x403cc710,len:0xb9c
load:0x403ce710,len:0x5b78
entry 0x403cc71a
I (1) boot: ESP-IDF v5.3-dev-2547-g8b3821ca67 2nd stage bootloader
I (2) boot: compile time Mar 14 2024 15:09:57
I (5) boot: chip revision: v0.3
I (7) boot.esp32c3: SPI Speed      : 80MHz
I (7) boot.esp32c3: SPI Mode       : SLOW READ
I (8) boot.esp32c3: SPI Flash Size : 2MB
I (11) boot: Enabling RNG early entropy source...
I (17) boot: Partition Table:
I (17) boot: ## Label            Usage          Type ST Offset   Length
I (18) boot:  0 nvs              WiFi data        01 02 0000e000 00006000
I (18) boot:  1 storage          Unknown data     01 ff 00014000 00001000
I (19) boot:  2 factory          factory app      00 00 00020000 00100000
I (19) boot:  3 nvs_key          NVS keys         01 04 00120000 00001000
I (20) boot:  4 custom_nvs       WiFi data        01 02 00121000 00006000
I (20) boot: End of partition table
I (22) esp_image: segment 0: paddr=00020020 vaddr=3c030020 size=0c1d8h ( 49624) map
I (36) esp_image: segment 1: paddr=0002c200 vaddr=3fc8b600 size=01548h (  5448) load
I (38) esp_image: segment 2: paddr=0002d750 vaddr=40380000 size=028c8h ( 10440) load
I (42) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=21034h (135220) map
I (76) esp_image: segment 4: paddr=0005105c vaddr=403828c8 size=08c84h ( 35972) load
I (86) esp_image: segment 5: paddr=00059ce8 vaddr=00000000 size=062e8h ( 25320) 
I (93) esp_image: Verifying image signature...
I (95) secure_boot_v2: Secure boot V2 is not enabled yet and eFuse digest keys are not set
I (97) secure_boot_v2: Verifying with RSA-PSS...
I (103) secure_boot_v2: Signature verified successfully!
I (104) boot: Loaded app from partition at offset 0x20000
I (105) secure_boot_v2: enabling secure boot v2...
I (109) efuse: Batch mode of writing fields is enabled
I (110) esp_image: segment 0: paddr=00000020 vaddr=3fcd5990 size=03b48h ( 15176) 
I (114) esp_image: segment 1: paddr=00003b70 vaddr=403cc710 size=00b9ch (  2972) 
I (116) esp_image: segment 2: paddr=00004714 vaddr=403ce710 size=05b78h ( 23416) 
I (122) esp_image: Verifying image signature...
I (124) secure_boot_v2: Secure boot V2 is not enabled yet and eFuse digest keys are not set
I (125) secure_boot_v2: Verifying with RSA-PSS...
I (127) secure_boot_v2: Signature verified successfully!
I (127) secure_boot_v2: Secure boot digests absent, generating..
I (141) secure_boot_v2: Digests successfully calculated, 1 valid signatures (image offset 0x0)
I (141) secure_boot_v2: 1 signature block(s) found appended to the bootloader.
I (142) secure_boot_v2: Burning public key hash to eFuse
I (143) efuse: Writing EFUSE_BLK_KEY0 with purpose 9
I (208) secure_boot_v2: Digests successfully calculated, 1 valid signatures (image offset 0x20000)
I (209) secure_boot_v2: 1 signature block(s) found appended to the app.
I (210) secure_boot_v2: Application key(0) matches with bootloader key(0).
I (210) secure_boot_v2: Revoking empty key digest slot (1)...
I (211) secure_boot_v2: Revoking empty key digest slot (2)...
I (211) secure_boot_v2: blowing secure boot efuse...
I (212) secure_boot: Enabling Security download mode...
I (212) secure_boot: Disable hardware & software JTAG...
I (215) efuse: BURN BLOCK4
I (236) efuse: BURN BLOCK4 - OK (write block == read block)
I (236) efuse: BURN BLOCK0
I (256) efuse: BURN BLOCK0 - OK (all write block bits are set)
I (259) efuse: Batch mode. Prepared fields are committed
I (259) secure_boot_v2: Secure boot permanently enabled
I (260) boot: Checking flash encryption...
I (263) efuse: Batch mode of writing fields is enabled
I (264) flash_encrypt: Generating new flash encryption key...
I (265) efuse: Writing EFUSE_BLK_KEY1 with purpose 4
I (266) flash_encrypt: Disable UART bootloader encryption...
I (266) flash_encrypt: Disable UART bootloader cache...
I (266) flash_encrypt: Disable JTAG...
I (267) efuse: BURN BLOCK5
I (293) efuse: BURN BLOCK5 - OK (write block == read block)
I (293) efuse: BURN BLOCK0
I (313) efuse: BURN BLOCK0 - OK (all write block bits are set)
I (316) efuse: Batch mode. Prepared fields are committed
I (316) esp_image: segment 0: paddr=00000020 vaddr=3fcd5990 size=03b48h ( 15176) 
I (321) esp_image: segment 1: paddr=00003b70 vaddr=403cc710 size=00b9ch (  2972) 
I (322) esp_image: segment 2: paddr=00004714 vaddr=403ce710 size=05b78h ( 23416) 
I (329) esp_image: Verifying image signature...
I (331) secure_boot_v2: Verifying with RSA-PSS...
I (333) secure_boot_v2: Signature verified successfully!
I (479) flash_encrypt: bootloader encrypted successfully
I (492) flash_encrypt: partition table encrypted and loaded successfully
I (493) flash_encrypt: Encrypting partition 1 at offset 0x14000 (length 0x1000)...
I (505) flash_encrypt: Done encrypting
I (505) esp_image: segment 0: paddr=00020020 vaddr=3c030020 size=0c1d8h ( 49624) map
I (518) esp_image: segment 1: paddr=0002c200 vaddr=3fc8b600 size=01548h (  5448) 
I (520) esp_image: segment 2: paddr=0002d750 vaddr=40380000 size=028c8h ( 10440) 
I (524) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=21034h (135220) map
I (558) esp_image: segment 4: paddr=0005105c vaddr=403828c8 size=08c84h ( 35972) 
I (567) esp_image: segment 5: paddr=00059ce8 vaddr=00000000 size=062e8h ( 25320) 
I (574) esp_image: Verifying image signature...
I (575) secure_boot_v2: Verifying with RSA-PSS...
I (577) secure_boot_v2: Signature verified successfully!
I (577) flash_encrypt: Encrypting partition 2 at offset 0x20000 (length 0x100000)...
I (3532) flash_encrypt: Done encrypting
I (3532) flash_encrypt: Encrypting partition 3 at offset 0x120000 (length 0x1000)...
I (3544) flash_encrypt: Done encrypting
I (3545) flash_encrypt: Setting CRYPT_CNT for permanent encryption
I (3548) efuse: BURN BLOCK0
I (3568) efuse: BURN BLOCK0 - OK (all write block bits are set)
I (3573) flash_encrypt: Flash encryption completed
I (3574) boot: Resetting with flash encryption enabled...
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x3 (RTC_SW_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
Valid secure boot key blocks: 0
secure boot verification succeeded
load:0x3fcd5990,len:0x3b48
load:0x403cc710,len:0xb9c
load:0x403ce710,len:0x5b78
entry 0x403cc71a
I (3657) boot: ESP-IDF v5.3-dev-2547-g8b3821ca67 2nd stage bootloader
I (3658) boot: compile time Mar 14 2024 15:09:57
I (3662) boot: chip revision: v0.3
I (3664) boot.esp32c3: SPI Speed      : 80MHz
I (3664) boot.esp32c3: SPI Mode       : SLOW READ
I (3665) boot.esp32c3: SPI Flash Size : 2MB
I (3668) boot: Enabling RNG early entropy source...
I (3673) boot: Partition Table:
I (3673) boot: ## Label            Usage          Type ST Offset   Length
I (3674) boot:  0 nvs              WiFi data        01 02 0000e000 00006000
I (3674) boot:  1 storage          Unknown data     01 ff 00014000 00001000
I (3675) boot:  2 factory          factory app      00 00 00020000 00100000
I (3675) boot:  3 nvs_key          NVS keys         01 04 00120000 00001000
I (3676) boot:  4 custom_nvs       WiFi data        01 02 00121000 00006000
I (3676) boot: End of partition table
I (3678) esp_image: segment 0: paddr=00020020 vaddr=3c030020 size=0c1d8h ( 49624) map
I (3694) esp_image: segment 1: paddr=0002c200 vaddr=3fc8b600 size=01548h (  5448) load
I (3698) esp_image: segment 2: paddr=0002d750 vaddr=40380000 size=028c8h ( 10440) load
I (3704) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=21034h (135220) map
I (3741) esp_image: segment 4: paddr=0005105c vaddr=403828c8 size=08c84h ( 35972) load
I (3752) esp_image: segment 5: paddr=00059ce8 vaddr=00000000 size=062e8h ( 25320) 
I (3761) esp_image: Verifying image signature...
I (3765) secure_boot_v2: Verifying with RSA-PSS...
I (3767) secure_boot_v2: Signature verified successfully!
I (3768) boot: Loaded app from partition at offset 0x20000
I (3769) secure_boot_v2: enabling secure boot v2...
I (3769) secure_boot_v2: secure boot v2 is already enabled, continuing..
I (3770) boot: Checking flash encryption...
I (3770) flash_encrypt: flash encryption is enabled (0 plaintext flashes left)
I (3771) boot: Disabling RNG early entropy source...
I (3776) cpu_start: Unicore app
I (3802) cpu_start: Pro cpu start user code
I (3802) cpu_start: cpu freq: 160000000 Hz
I (3803) app_init: Application information:
I (3803) app_init: Project name:     security
I (3803) app_init: App version:      26b03ca
I (3803) app_init: Compile time:     Mar 14 2024 15:09:53
I (3803) app_init: ELF file SHA256:  5ed173a2f...
I (3804) app_init: ESP-IDF:          v5.3-dev-2547-g8b3821ca67
I (3804) efuse_init: Min chip rev:     v0.3
I (3804) efuse_init: Max chip rev:     v1.99 
I (3804) efuse_init: Chip rev:         v0.3
I (3805) heap_init: Initializing. RAM available for dynamic allocation:
I (3806) heap_init: At 3FC8DCD0 len 00032330 (200 KiB): RAM
I (3806) heap_init: At 3FCC0000 len 0001C710 (113 KiB): Retention RAM
I (3806) heap_init: At 3FCDC710 len 00002950 (10 KiB): Retention RAM
I (3806) heap_init: At 50000010 len 00001FD8 (7 KiB): RTCRAM
I (3815) spi_flash: detected chip: gd
I (3815) spi_flash: flash io: dio
W (3816) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (3817) flash_encrypt: Flash encryption mode is RELEASE
I (3820) nvs_sec_provider: NVS Encryption - Registering HMAC-based scheme...
I (3821) sleep: Configure to isolate all GPIO pins in sleep state
I (3822) sleep: Enable automatic switching of GPIO sleep configuration
I (3827) main_task: Started on CPU0
I (3827) main_task: Calling app_main()

Example to check Flash Encryption status
This is esp32c3 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.3, 2MB external flash
FLASH_CRYPT_CNT eFuse value is 7
Flash encryption feature is enabled in RELEASE mode
Erasing partition "storage" (0x1000 bytes)
Writing data with esp_partition_write:
I (3827) example: 0x3fc8fa00   00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
I (3827) example: 0x3fc8fa10   10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|
Reading with esp_partition_read:
I (3837) example: 0x3fc8fa20   00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
I (3837) example: 0x3fc8fa30   10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|
Reading with esp_flash_read:
I (3837) example: 0x3fc8fa20   75 75 ca b0 e6 09 a7 c1  bd c0 8a 08 e3 24 25 47  |uu...........$%G|
I (3837) example: 0x3fc8fa30   a5 e7 94 b4 04 1e 55 d5  ff 04 c9 b8 55 a7 0a 7f  |......U.....U...|
I (3847) nvs: NVS partition "nvs" is encrypted.
I (3857) example: NVS partition "custom_nvs" is encrypted.
I (3857) main_task: Returned from app_main()

现在可以同时按 control+A , 然后再按下 X,终止 QEMU 会话。 

验证: 

我们选择使用 flash 加密的发布模式,因此如果在下载模式下运行 QEMU 查看 eFuse 摘要,可能会遇到以下错误: 

eFuse 文件可以随时修改,用不同的 eFuse 组合测试固件,提供更多可能性。 

展望 

现在通过运行 idf.py qemu 命令,便可以使用 QEMU 轻松试用基于 ESP-IDF(master 分支)的任意应用程序。这个命令可以处理生成 eFuse 文件和合并二进制文件等中间步骤,但是还不支持使用预编程的 eFuse 文件,而是为每个运行实例创建一个新的 eFuse 文件。使用预编程的 eFuse 文件必然会改进模拟器对于此类用例的用户体验,我们也在努力提供支持。 

小结 

使用模拟器有利于迭代和调试各种安全配置,加快测试过程,最终开发出可在真实硬件上测试的配置,且不会有错误配置导致砖化的风险。 

下一篇博文会介绍如何基于主机在 QEMU 中启用安全功能。 

如果您不确定如何用引导加载程序启用安全功能,可以先尝试使用 ESP32-C3 QEMU 这一安全的方式,避免硬件损坏。 如果您不确定如何用引导加载程序启用安全功能,可以先尝试使用 ESP32-C3 QEMU 这一安全的方式,避免硬件损坏。 

我们正在积极支持 ESP32-C3 的其他外设。如有反馈意见或遇到问题,欢迎在 GitHub 仓库中开启讨论、创建问题。 

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

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

相关文章

【leetcode面试经典150题】75. 二叉树展开为链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

LINUX系统编程:动静态库的制作

目录 1.为什要有库 2.库的制作 2.1静态库的制作 1.为什要有库 主要有两个原因 提高效率 隐藏源码 例:我写了一个函数,我想让别人使用,但是并不像让使用者看到我写的代码,就可以把我的代码制作成一个库,提供给使用…

了解ASK模块STX883Pro和超外接收模块SRX883Pro的独特之处 STX883Pro模块具有以下特点:

高发射功率:STX883Pro具有较高的发射功率,可实现长距离的信号传输,适用于需要覆盖广泛区域的应用场景。 高频率稳定性:具备稳定的频率输出,确保信号传输的可靠性和一致性,避免频率漂移导致的通信故障。 大…

【07-探索性数据分析(EDA):利用Scikit-learn高效掌握数据特性】

文章目录 前言为何EDA至关重要?使用Scikit-learn进行EDA数据导入与初步检查缺失值检测数据可视化特征分布与转换特征选择多变量分析未来的步骤结论前言 探索性数据分析(EDA)是数据科学的基石之一,它使我们在建模之前可以深入了解数据的本质。本篇博文会带你了解如何使用Sci…

Kafka 消费者应用解析

目录 1、Kafka 消费方式 2、Kafka 消费者工作流程 2.1、消费者工作流程 2.2、消费组者说明 1、消费者组 2、消费者组初始化流程 3、消费者 API 3.1、独立消费者-订阅主题 3.2、独立消费者-订阅分区 3.3、消费组 4、分区的分配策略以及再平衡 4.1、Range 策略 1、R…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.6-1.8

目录 第一门课:第二门课 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周:深度学习的 实践层面 (Practical aspects of Deep Learning)…

基于JavaWEB的学生考勤管理系统(含论文)

本系统是用Java语言写的,基于JavaWEB的学生考勤管理系统 主要有三大模块,学生,教师和管理员模块,功能如下: 学生模块 教师模块: 管理员模块

Allure精通指南(05)定制化报告内容(环境信息、图标、缺陷类别)

文章目录 Allure 自定义测试环境信息Allure 自定义缺陷类别信息Allure 自定义图标步骤一步骤二步骤三 Allure 自定义测试环境信息 步骤 1:创建 environment.properties 文件 在项目根目录或任何其他不会被--clean-alluredir参数影响的目录下创建 environment.proper…

Redis事务以及Watch监听(通俗易懂)

在执行事务时,要不全执行,要不全不执行。Redis 事务我个人认为不是严格意义上的事务,只是用于帮助用户在一个步骤中执行多个命令。它是通过multi[mʌlti] 表示开启事务,EXEC执行事务,discard 丢失任务。当我们开启事务…

动手学深度学习14 数值稳定性+模型初始化和激活函数

动手学深度学习14 数值稳定性模型初始化和激活函数 1. 数值稳定性2. 模型初始化和激活函数3. QA **视频:**https://www.bilibili.com/video/BV1u64y1i75a/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 **电子书:**https://zh-v…

如何利用人工智能加速临床试验

如何利用人工智能加速临床试验 Matthew Hutson 著 李升伟 译 从研究设计到患者招募,研究人员正在研究如何运用AI技术加速临床试验过程。 几十年来,计算能力遵循摩尔定律(Moore’s law),以可预测的速度前进。集成电路上…

Linux:服务器间同步文件的脚本(实用)

一、功能描述 比如有三台服务器,hadoop102、hadoop103、hadoop104,且都有atguigu账号 循环复制文件到所有节点的相同目录下,且脚本可以在任何路径下使用 二、脚本实现 1、查看环境变量 echo $PATH2、进入/home/atguigu/bin目录 在该目录下…

结合创新!LSTM+Transformer新成果登Nature,精度高达95.65%

推荐一个能发表高质量论文的好方向:LSTM结合Transformer。 LSTM通过门控机制有效捕捉序列中的长期依赖关系,防止梯度消失或爆炸,在处理具有长期依赖性的时间序列数据时有显著优势。而Transformer通过自注意力和多头注意力机制全面捕捉序列依…

OpenHarmony实战开发-媒体查询 (@ohos.mediaquery)

概述 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(比如显示区域、深浅色、分辨率)&#xff0…

21.基础乐理-等音调扩展篇、为何一共十五个大调

首先 等音调 的概念是基于 等音 的概念,比如下图中的音名:因为用的按键相同,音名不同,所以被称为等音调 然后音名一共有35个,如下图:所以在理论上它会有35个大调,但是人总是倾向于选择简单、简洁…

一个不太好用的弹出层jquery.colorbox第二次点击不出来的解决方法

使用jquery.colorbox的时候第一次正常显示,但第二次的时候不显示。 需要先移除,再重新点击即可,代码如下 $.colorbox.remove();$.colorbox({href: url,iframe: true,width: options.width || 800,height: options.height || 600 });

企业应该如何选择适合的ERP?

今天跟大家聊一点不一样的。一直写了很多关于企业内部系统集成的文章和案例,很多人私信我又或者是很多客户在做数字化选型的时候会问到我一个问题,那就是“ERP改如何去选择,金蝶跟用友该怎么选?”。因为做集成这个领域也有十多年了…

宁盾2FA双因子认证助力某城商行TCE平台达到密评要求

《密码法》规定,法律、行政法规和国家有关规定要求使用商用密码进行保护的关键信息基础设施,其运营者应当使用商用密码进行保护,自行或者委托商用密码检测机构开展商用密码应用安全性评估。商用密码应用安全性评估(简称&#xff1…

小红书KOL推广应该注意什么?

小红书上的KOL往往具有极大影响力,可以协助品牌快速构建产品形象,并短时间内为品牌带来大量热度和搜索量,引导消费。品牌通过与达人进行合作推广,也可以借鉴达人的影响力,提高品牌的信任度和转化率。 不过网红达人推广…

SpringBoot源码阅读2-自动配置

SpringBoot源码阅读2-自动配置 在传统的Spring应用中,开发者需要手动配置一系列Web应用的核心组件,例如DispatcherServlet用于处理请求分发、ViewResolver用于视图解析、CharacterEncodingFilter用于字符编码过滤等。 然而在SpringBoot中只要引入了spr…