flash 加密指南

##esp32安全介绍

esp32有两个重要的功能,安全启动(secure boot) flash加密(flash encryption)

esp32信号增强 esp32功能_闪存


secure boot


flash encryption

flash 加密是由eFuse

flash加密分开发模式和生产模式:
开发模式:
生产模式:

flash 加密过程

假设eFuse值处于默认状态,并且第二阶段引导加载程序被编译为支持闪存加密,则闪存加密过程执行如下:

在首次上电复位时,闪存中的所有数据都是未加密的(纯文本)。
第一阶段引导程序(ROM)将在IRAM中加载第二阶段引导程序。
第二阶段引导程序将读取flash_crypt_cnt(= 00000000b)eFuse值,并且由于该值为0(设置了偶数位数),因此它将配置并启用闪存加密块。它还会将FLASH_CRYPT_CFGeFuse编程为值0xF。
闪存加密块将生成AES-256位密钥并存储到BLOCK1 eFuse中。此操作在硬件中执行,密钥无法通过软件访问。
接下来,闪存加密块将加密闪存内容(基于分区表标志值)。就地加密可能需要一些时间(大型分区最多只需一分钟)。
然后,第二阶段引导加载程序设置flash_crypt_cnt(= 00000001b)中的第一个可用位,以将闪存内容标记为已加密(设置奇数位数)。
对于释放模式的第二阶段引导程序将编程download_dis_encryptdownload_dis_decryptdownload_dis_cache的eFuse位为1,以防止引导程序UART从解密闪存内容。它还会写保护FLASH_CRYPT_CNTeFuse位。
对于开发模式,第二阶段引导加载程序将仅编程download_dis_decrypt&download_dis_cacheeFuse位,以允许UART引导加载程序重新刷新加密的二进制文件。此外,FLASH_CRYPT_CNTeFuse位不会被写保护。
然后,第二阶段引导加载程序重新启动设备以开始执行加密映像。它将透明地解密闪存内容并加载到IRAM中。
在开发阶段,经常需要编写不同的明文闪存映像并测试闪存加密过程。这要求UART下载模式能够根据需要多次加载新的纯文本图像。但是,在制造或生产过程中,由于安全原因,不应允许UART下载模式访问闪存内容。因此,这需要两种不同的ESP32配置:一种用于开发,另一种用于生产。以下部分介绍了闪存加密的development模式和release模式以及使用它们的分步过程。


flash 加密步骤

1. Development Mode

利用esp32内部生成的密钥或外部主机生产的密钥来作为开发的flash加密过程进行开发

开发模式的flash加密过程:

  1. 切换到flash例程中:cd $IDF_PATH/examples/get-started/hello_world

make menuconfig->security features->Enable flash encryption on bootPartition Table->offset of partition table设置为0x10000

保存退出后,make -j8 flash monitor就进行第一次烧录。

espfuse.py burn_efuse FLASH_CRYPT_CNT

Example to check Flash Encryption status
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 0, 2MB external flash
FLASH_CRYPT_CNT eFuse value is 0
Flash encryption feature is disabled
Erasing partition "storage" (0x1000 bytes)
Writing data with esp_partition_write:
I (440) example: 0x3ffb4f60   00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
I (440) example: 0x3ffb4f70   10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|
Reading with esp_partition_read:
I (450) example: 0x3ffb4f40   00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
I (460) example: 0x3ffb4f50   10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|
Reading with spi_flash_read:
I (470) example: 0x3ffb4f40   00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
I (480) example: 0x3ffb4f50   10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|

2. Release Mode

XXXXXXXXXX施工中XXXXXXXXX