mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'docs/update_out-of-sync_documents' into 'master'
Docs/update out of sync documents See merge request espressif/esp-idf!22600
This commit is contained in:
commit
a8fc7e90c2
@ -44,7 +44,7 @@ Linenoise library does not need explicit initialization. However, some configura
|
||||
|
||||
:cpp:func:`linenoiseSetMaxLineLen`
|
||||
|
||||
Set maximum length of the line for linenoise library. Default length is 4096. The default value can be updated to optimize RAM memory usage.
|
||||
Set maximum length of the line for linenoise library. Default length is 4096 bytes. The default value can be updated to optimize RAM memory usage.
|
||||
|
||||
|
||||
Main loop
|
||||
|
@ -169,8 +169,8 @@ Once custom eFuse MAC address has been obtained (using :cpp:func:`esp_efuse_mac_
|
||||
|
||||
.. _local-mac-addresses:
|
||||
|
||||
Local vs Universal MAC Addresses
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Local Versus Universal MAC Addresses
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
{IDF_TARGET_NAME} comes pre-programmed with enough valid Espressif universally administered MAC addresses for all internal interfaces. The table above shows how to calculate and derive the MAC address for a specific interface according to the base MAC address.
|
||||
|
||||
|
@ -164,6 +164,13 @@ DROM(数据存储在 flash 中)
|
||||
RTC FAST memory(RTC 快速存储器)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. only:: esp32c6 or esp32h2
|
||||
|
||||
.. note::
|
||||
|
||||
对于 {IDF_TARGET_NAME}, RTC 存储器已被重新重命名为 LP(低功耗)存储器。在与 {IDF_TARGET_NAME} 相关的 IDF 代码、文档以及技术参考手册中,可能会出现这两个术语混用的情况。
|
||||
|
||||
|
||||
RTC FAST memory 的同一区域既可以作为指令存储器也可以作为数据存储器进行访问。从深度睡眠模式唤醒后必须要运行的代码要放在 RTC 存储器中,更多信息请查阅文档 :doc:`深度睡眠 <deep-sleep-stub>`。
|
||||
|
||||
.. only:: esp32
|
||||
|
@ -35,7 +35,7 @@
|
||||
|
||||
:SOC_RTC_MEM_SUPPORTED: #. 从深度睡眠模式复位:如果 ``RTC_CNTL_STORE6_REG`` 寄存器的值非零,且 ``RTC_CNTL_STORE7_REG`` 寄存器中的 RTC 内存的 CRC 校验值有效,那么程序会使用 ``RTC_CNTL_STORE6_REG`` 寄存器的值作为入口地址,并立即跳转到该地址运行。如果 ``RTC_CNTL_STORE6_REG`` 的值为零,或 ``RTC_CNTL_STORE7_REG`` 中的 CRC 校验值无效,又或通过 ``RTC_CNTL_STORE6_REG`` 调用的代码返回,那么则像上电复位一样继续启动。 **注意**:如果想在这里运行自定义的代码,可以参考 :doc:`深度睡眠 <deep-sleep-stub>` 文档里面介绍的深度睡眠存根机制方法。
|
||||
|
||||
#. 上电复位、软件 SoC 复位、看门狗 SoC 复位:检查 ``GPIO_STRAP_REG`` 寄存器,判断是否请求自定义启动模式,如 UART 下载模式。如果是,ROM 会执行此自定义加载器模式。否则程会像软件 CPU 复位一样继续启动。请参考 {IDF_TARGET_NAME} 技术规格书了解 SoC 启动模式以及具体执行过程。
|
||||
#. 上电复位、软件 SoC 复位、看门狗 SoC 复位:检查 ``GPIO_STRAP_REG`` 寄存器,判断是否请求自定义启动模式,如 UART 下载模式。如果是,ROM 会执行此自定义加载模式,否则会像软件 CPU 复位一样继续启动。请参考 {IDF_TARGET_NAME} 技术规格书了解 SoC 启动模式以及具体执行过程。
|
||||
|
||||
#. 软件 CPU 复位、看门狗 CPU 复位:根据 EFUSE 中的值配置 SPI flash,然后尝试从 flash 中加载代码,这部分将会在后面一小节详细介绍。
|
||||
|
||||
|
@ -44,7 +44,7 @@ Linenoise 库不需要显式地初始化,但是在调用行编辑函数之前
|
||||
|
||||
:cpp:func:`linenoiseSetMaxLineLen`
|
||||
|
||||
设置 linenoise 库中每行的最大长度。默认长度为 4096。如果需要优化 RAM 内存的使用,则可以通过这个函数设置一个小于默认 4 KB 的值来实现。
|
||||
设置 linenoise 库中每行的最大长度,默认长度为 4096 字节,可以通过更新该默认值来优化 RAM 内存的使用。
|
||||
|
||||
|
||||
主循环
|
||||
|
@ -3,7 +3,7 @@
|
||||
:link_to_translation:`en:[English]`
|
||||
|
||||
{IDF_TARGET_BASE_MAC_BLOCK: default="BLK1", esp32="BLK0"}
|
||||
{IDF_TARGET_CPU_RESET_DES: default="两个 CPU 复位", esp32c3="CPU 复位", esp32c2="CPU 复位"}
|
||||
{IDF_TARGET_CPU_RESET_DES: default="CPU 复位", esp32="两个 CPU 均复位", esp32s3="两个 CPU 均复位"}
|
||||
|
||||
软件复位
|
||||
------------
|
||||
|
@ -3,8 +3,63 @@
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
TODO
|
||||
|
||||
ESP-ROM:esp32s3-20210327
|
||||
Build:Mar 27 2021
|
||||
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
|
||||
SPIWP:0xee
|
||||
mode:DIO, clock div:1
|
||||
load:0x3fcd0270,len:0x2598
|
||||
load:0x403b6000,len:0x878
|
||||
load:0x403ba000,len:0x3dd4
|
||||
entry 0x403b61c0
|
||||
I (27) boot: ESP-IDF v4.4-dev-2003-g72fdecc1b7-dirty 2nd stage bootloader
|
||||
I (28) boot: compile time 14:15:37
|
||||
I (28) boot: chip revision: 0
|
||||
I (32) boot.esp32s3: SPI Speed : 80MHz
|
||||
I (36) boot.esp32s3: SPI Mode : DIO
|
||||
I (41) boot.esp32s3: SPI Flash Size : 2MB
|
||||
I (46) boot: Enabling RNG early entropy source...
|
||||
I (58) boot: Partition Table:
|
||||
I (62) boot: ## Label Usage Type ST Offset Length
|
||||
I (69) boot: 0 nvs WiFi data 01 02 0000a000 00006000
|
||||
I (76) boot: 1 storage Unknown data 01 ff 00010000 00001000
|
||||
I (84) boot: 2 factory factory app 00 00 00020000 00100000
|
||||
I (91) boot: 3 nvs_key NVS keys 01 04 00120000 00001000
|
||||
I (99) boot: End of partition table
|
||||
I (103) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=08118h ( 33048) map
|
||||
I (117) esp_image: segment 1: paddr=00028140 vaddr=3fc8fa30 size=023f4h ( 9204) load
|
||||
I (122) esp_image: segment 2: paddr=0002a53c vaddr=40374000 size=05adch ( 23260) load
|
||||
I (134) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=1a710h (108304) map
|
||||
I (156) esp_image: segment 4: paddr=0004a738 vaddr=40379adc size=05f48h ( 24392) load
|
||||
I (162) esp_image: segment 5: paddr=00050688 vaddr=600fe000 size=00010h ( 16) load
|
||||
I (167) boot: Loaded app from partition at offset 0x20000
|
||||
I (168) boot: Checking flash encryption...
|
||||
I (173) efuse: Batch mode of writing fields is enabled
|
||||
I (179) flash_encrypt: Generating new flash encryption key...
|
||||
I (188) efuse: Writing EFUSE_BLK_KEY0 with purpose 4
|
||||
W (194) flash_encrypt: Not disabling UART bootloader encryption
|
||||
I (197) flash_encrypt: Disable UART bootloader cache...
|
||||
I (203) flash_encrypt: Disable JTAG...
|
||||
I (212) efuse: Batch mode. Prepared fields are committed
|
||||
I (214) esp_image: segment 0: paddr=00000020 vaddr=3fcd0270 size=02598h ( 9624)
|
||||
I (223) esp_image: segment 1: paddr=000025c0 vaddr=403b6000 size=00878h ( 2168)
|
||||
I (230) esp_image: segment 2: paddr=00002e40 vaddr=403ba000 size=03dd4h ( 15828)
|
||||
I (534) flash_encrypt: bootloader encrypted successfully
|
||||
I (578) flash_encrypt: partition table encrypted and loaded successfully
|
||||
I (578) flash_encrypt: Encrypting partition 1 at offset 0x10000 (length 0x1000)...
|
||||
I (628) flash_encrypt: Done encrypting
|
||||
I (629) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=08118h ( 33048) map
|
||||
I (636) esp_image: segment 1: paddr=00028140 vaddr=3fc8fa30 size=023f4h ( 9204)
|
||||
I (640) esp_image: segment 2: paddr=0002a53c vaddr=40374000 size=05adch ( 23260)
|
||||
I (651) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=1a710h (108304) map
|
||||
I (675) esp_image: segment 4: paddr=0004a738 vaddr=40379adc size=05f48h ( 24392)
|
||||
I (679) esp_image: segment 5: paddr=00050688 vaddr=600fe000 size=00010h ( 16)
|
||||
I (680) flash_encrypt: Encrypting partition 2 at offset 0x20000 (length 0x100000)...
|
||||
I (11571) flash_encrypt: Done encrypting
|
||||
I (11571) flash_encrypt: Encrypting partition 3 at offset 0x120000 (length 0x1000)...
|
||||
I (11617) flash_encrypt: Done encrypting
|
||||
I (11618) flash_encrypt: Flash encryption completed
|
||||
I (11623) boot: Resetting with flash encryption enabled...
|
||||
|
||||
------
|
||||
|
||||
@ -12,6 +67,67 @@
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
TODO
|
||||
ESP-ROM:esp32s3-20210327
|
||||
Build:Mar 27 2021
|
||||
rst:0x3 (RTC_SW_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
|
||||
Saved PC:0x403bb1d6
|
||||
SPIWP:0xee
|
||||
mode:DIO, clock div:1
|
||||
load:0x3fcd0270,len:0x2598
|
||||
load:0x403b6000,len:0x878
|
||||
load:0x403ba000,len:0x3dd4
|
||||
entry 0x403b61c0
|
||||
I (35) boot: ESP-IDF v4.4-dev-2003-g72fdecc1b7-dirty 2nd stage bootloader
|
||||
I (35) boot: compile time 14:15:37
|
||||
I (35) boot: chip revision: 0
|
||||
I (39) boot.esp32s3: SPI Speed : 80MHz
|
||||
I (44) boot.esp32s3: SPI Mode : DIO
|
||||
I (48) boot.esp32s3: SPI Flash Size : 2MB
|
||||
I (53) boot: Enabling RNG early entropy source...
|
||||
I (65) boot: Partition Table:
|
||||
I (69) boot: ## Label Usage Type ST Offset Length
|
||||
I (76) boot: 0 nvs WiFi data 01 02 0000a000 00006000
|
||||
I (84) boot: 1 storage Unknown data 01 ff 00010000 00001000
|
||||
I (91) boot: 2 factory factory app 00 00 00020000 00100000
|
||||
I (99) boot: 3 nvs_key NVS keys 01 04 00120000 00001000
|
||||
I (106) boot: End of partition table
|
||||
I (110) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=08118h ( 33048) map
|
||||
I (126) esp_image: segment 1: paddr=00028140 vaddr=3fc8fa30 size=023f4h ( 9204) load
|
||||
I (129) esp_image: segment 2: paddr=0002a53c vaddr=40374000 size=05adch ( 23260) load
|
||||
I (141) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=1a710h (108304) map
|
||||
I (166) esp_image: segment 4: paddr=0004a738 vaddr=40379adc size=05f48h ( 24392) load
|
||||
I (172) esp_image: segment 5: paddr=00050688 vaddr=600fe000 size=00010h ( 16) load
|
||||
I (177) boot: Loaded app from partition at offset 0x20000
|
||||
I (178) boot: Checking flash encryption...
|
||||
I (183) flash_encrypt: flash encryption is enabled (1 plaintext flashes left)
|
||||
I (190) boot: Disabling RNG early entropy source...
|
||||
I (214) cpu_start: Pro cpu up.
|
||||
I (214) cpu_start: Starting app cpu, entry point is 0x40374fa8
|
||||
0x40374fa8: call_start_cpu1 at /home/marius/esp-idf_3/components/esp_system/port/cpu_start.c:160
|
||||
|
||||
I (0) cpu_start: App cpu up.
|
||||
I (228) cpu_start: Pro cpu start user code
|
||||
I (228) cpu_start: cpu freq: 160000000
|
||||
I (228) cpu_start: Application information:
|
||||
I (231) cpu_start: Project name: flash_encryption
|
||||
I (237) cpu_start: App version: v4.4-dev-2003-g72fdecc1b7-dirty
|
||||
I (244) cpu_start: Compile time: Jul 12 2021 14:15:34
|
||||
I (250) cpu_start: ELF file SHA256: a7e6343c6a1c2215...
|
||||
I (256) cpu_start: ESP-IDF: v4.4-dev-2003-g72fdecc1b7-dirty
|
||||
I (263) heap_init: Initializing. RAM available for dynamic allocation:
|
||||
I (270) heap_init: At 3FC92810 len 0004D7F0 (309 KiB): D/IRAM
|
||||
I (277) heap_init: At 3FCE0000 len 0000EE34 (59 KiB): STACK/DRAM
|
||||
I (283) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
|
||||
I (290) spi_flash: detected chip: generic
|
||||
I (294) spi_flash: flash io: dio
|
||||
W (298) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
|
||||
I (311) flash_encrypt: Flash encryption mode is DEVELOPMENT (not secure)
|
||||
I (318) cpu_start: Starting scheduler on PRO CPU.
|
||||
I (0) cpu_start: Starting scheduler on APP CPU.
|
||||
|
||||
Example to check Flash Encryption status
|
||||
This is esp32s3 chip with 2 CPU core(s), WiFi/BLE, silicon revision 0, 2MB external flash
|
||||
FLASH_CRYPT_CNT eFuse value is 1
|
||||
Flash encryption feature is enabled in DEVELOPMENT mode
|
||||
|
||||
------
|
||||
|
@ -1,4 +1,4 @@
|
||||
Flash 加密
|
||||
flash 加密
|
||||
============
|
||||
|
||||
{IDF_TARGET_CRYPT_CNT:default="SPI_BOOT_CRYPT_CNT",esp32="FLASH_CRYPT_CNT"}
|
||||
@ -45,13 +45,13 @@ flash 加密功能用于加密与 {IDF_TARGET_NAME} 搭载使用的片外 flash
|
||||
相关 eFuses
|
||||
------------------------------
|
||||
|
||||
Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这些 eFuse 列表及其描述,下表中的各 eFuse 名称也在 espefuse.py 工具中使用,为了能在 eFuse API 中使用,请在名称前加上 ``ESP_EFUSE_``,如:esp_efuse_read_field_bit(ESP_EFUSE_DISABLE_DL_ENCRYPT)。
|
||||
flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这些 eFuse 列表及其描述,下表中的各 eFuse 名称也在 espefuse.py 工具中使用,为了能在 eFuse API 中使用,请在名称前加上 ``ESP_EFUSE_``,如:esp_efuse_read_field_bit(ESP_EFUSE_DISABLE_DL_ENCRYPT)。
|
||||
|
||||
.. Comment: As text in cells of list-table header rows does not wrap, it is necessary to make 0 header rows and apply bold typeface to the first row. Otherwise, the table goes beyond the html page limits on the right.
|
||||
|
||||
.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES
|
||||
|
||||
.. list-table:: Flash 加密过程中使用的 eFuses
|
||||
.. list-table:: flash 加密过程中使用的 eFuses
|
||||
:widths: 25 40 10
|
||||
:header-rows: 0
|
||||
|
||||
@ -80,7 +80,7 @@ Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这
|
||||
|
||||
.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256
|
||||
|
||||
.. list-table:: Flash 加密过程中使用的 eFuses
|
||||
.. list-table:: flash 加密过程中使用的 eFuses
|
||||
:widths: 25 40 10
|
||||
:header-rows: 0
|
||||
|
||||
@ -91,7 +91,7 @@ Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这
|
||||
- AES 密钥存储,N 在 0-5 之间。
|
||||
- XTS_AES_128 有一个 256 位密钥块,XTS_AES_256 有两个 256 位密钥块(共 512 位)。
|
||||
* - ``KEY_PURPOSE_N``
|
||||
- 控制 eFuse 块 ``BLOCK_KEYN`` 的目的,其中 N 在 0-5 之间。可能的值:``2`` 代表 ``XTS_AES_256_KEY_1``,``3`` 代表 ``XTS_AES_256_KEY_2``,``4`` 代表 ``XTS_AES_128_KEY``。最终 AES 密钥是基于其中一个或两个目的 eFuses 值推导。有关各种可能的组合,请参阅 *{IDF_TARGET_NAME} 技术参考手册* > *外部内存加密和解密(XTS_AES)* [PDF <{IDF_TARGET_TRM_CN_URL}#extmemencr>__]。
|
||||
- 控制 eFuse 块 ``BLOCK_KEYN`` 的目的,其中 N 在 0-5 之间。可能的值:``2`` 代表 ``XTS_AES_256_KEY_1``,``3`` 代表 ``XTS_AES_256_KEY_2``,``4`` 代表 ``XTS_AES_128_KEY``。最终 AES 密钥是基于其中一个或两个目的 eFuses 值推导。有关各种可能的组合,请参阅 *{IDF_TARGET_NAME} 技术参考手册* > *外部内存加密和解密(XTS_AES)* [`PDF <{IDF_TARGET_TRM_CN_URL}#extmemencr>`__]。
|
||||
- 4
|
||||
* - ``DIS_DOWNLOAD_MANUAL_ENCRYPT``
|
||||
- 设置后,在下载启动模式下禁用 flash 加密。
|
||||
@ -102,7 +102,7 @@ Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这
|
||||
|
||||
.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_128 and not SOC_FLASH_ENCRYPTION_XTS_AES_256 and not SOC_EFUSE_CONSISTS_OF_ONE_KEY_BLOCK
|
||||
|
||||
.. list-table:: Flash 加密过程中使用的 eFuses
|
||||
.. list-table:: flash 加密过程中使用的 eFuses
|
||||
:widths: 25 40 10
|
||||
:header-rows: 0
|
||||
|
||||
@ -124,7 +124,7 @@ Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这
|
||||
|
||||
.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_128 and SOC_EFUSE_CONSISTS_OF_ONE_KEY_BLOCK
|
||||
|
||||
.. list-table:: Flash 加密过程中使用的 eFuses
|
||||
.. list-table:: flash 加密过程中使用的 eFuses
|
||||
:widths: 25 40 10
|
||||
:header-rows: 0
|
||||
|
||||
@ -155,7 +155,7 @@ Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这
|
||||
.. important::
|
||||
{IDF_TARGET_NAME} 具有安全启动和 flash 加密两个密钥,但仅有一个 eFuse 密钥块。由于 eFuse 密钥块仅支持一次烧录,故应将密钥同时同批进行烧录。请勿单独启用“安全启动”或 “flash 加密”,否则在 eFuse 密钥块随后的写入中将返回错误。
|
||||
|
||||
Flash 的加密过程
|
||||
flash 的加密过程
|
||||
------------------
|
||||
|
||||
假设 eFuse 值处于默认状态,且固件的引导加载程序编译为支持 flash 加密,则 flash 加密的具体过程如下:
|
||||
@ -166,9 +166,9 @@ Flash 的加密过程
|
||||
|
||||
2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值 (``0b0000000``)。因为该值为 0(偶数位),固件的引导加载程序将配置并启用 flash 加密块,同时将 ``FLASH_CRYPT_CONFIG`` eFuse 的值编程为 0xF。关于 flash 加密块的更多信息,请参考 *{IDF_TARGET_NAME} 技术参考手册* > *eFuse 控制器(eFuse)* > *flash 加密块* [`PDF <{IDF_TARGET_TRM_CN_URL}#efuse>`__]。
|
||||
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 AES-256 位密钥,然后将其写入 ``flash_encryption`` eFuse 中。由于 ``flash_encryption`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 AES-256 位密钥,然后将其写入 ``flash_encryption`` eFuse 中。由于 ``flash_encryption`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。flash 加密操作完全在硬件中完成,无法通过软件访问密钥。
|
||||
|
||||
4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
4. flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
|
||||
5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b0000001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数个比特位。
|
||||
|
||||
@ -184,9 +184,9 @@ Flash 的加密过程
|
||||
|
||||
2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值 (``0b000``)。因为该值为 0(偶数位),固件引导加载程序将配置并启用 flash 加密块。关于 flash 加密块的更多信息,请参考 *{IDF_TARGET_NAME} 技术参考手册* > *eFuse 控制器(eFuse)* > *自动加密块* [`PDF <{IDF_TARGET_TRM_CN_URL}#efuse>`__]。
|
||||
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位或 512 位密钥,具体取决于 :ref:`生成的 AES-XTS 密钥的大小 <CONFIG_SECURE_FLASH_ENCRYPTION_KEYSIZE>`,然后分别将其写入一个或两个 `BLOCK_KEYN` eFuses。软件也为存储密钥的块更新了 ``KEY_PURPOSE_N``。由于一或两个 ``BLOCK_KEYN`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。``KEY_PURPOSE_N`` 字段也受写保护。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位或 512 位密钥,具体取决于 :ref:`生成的 AES-XTS 密钥的大小 <CONFIG_SECURE_FLASH_ENCRYPTION_KEYSIZE>`,然后分别将其写入一个或两个 `BLOCK_KEYN` eFuses。软件也为存储密钥的块更新了 ``KEY_PURPOSE_N``。由于一或两个 ``BLOCK_KEYN`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。``KEY_PURPOSE_N`` 字段也受写保护。flash 加密操作完全在硬件中完成,无法通过软件访问密钥。
|
||||
|
||||
4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
4. flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
|
||||
5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数位。
|
||||
|
||||
@ -210,9 +210,9 @@ Flash 的加密过程
|
||||
|
||||
2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值 (``0b000``)。因为该值为 0(偶数位),固件引导加载程序将配置并启用 flash 加密块。关于 flash 加密块的更多信息,请参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。
|
||||
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位密钥,然后将其写入 `BLOCK_KEYN` eFuse。软件也为存储密钥的块更新了 ``KEY_PURPOSE_N``。由于 ``BLOCK_KEYN`` eFuse 已设置编写和读取保护位,故无法通过软件访问密钥。``KEY_PURPOSE_N`` 字段也受写保护。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位密钥,然后将其写入 `BLOCK_KEYN` eFuse。软件也为存储密钥的块更新了 ``KEY_PURPOSE_N``。由于 ``BLOCK_KEYN`` eFuse 已设置编写和读取保护位,故无法通过软件访问密钥。``KEY_PURPOSE_N`` 字段也受写保护。flash 加密操作完全在硬件中完成,无法通过软件访问密钥。
|
||||
|
||||
4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
4. flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
|
||||
5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数位。
|
||||
|
||||
@ -228,9 +228,9 @@ Flash 的加密过程
|
||||
|
||||
2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值 (``0b000``)。因为该值为 0(偶数位),固件引导加载程序将配置并启用 flash 加密块。关于 flash 加密块的更多信息,请参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。
|
||||
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位或 128 位密钥(具体位数取决于 :ref:`Size of generated AES-XTS key <CONFIG_SECURE_FLASH_ENCRYPTION_KEYSIZE>`),然后将其写入 `BLOCK_KEY0` eFuse。同时,根据所选选项,软件对 ``XTS_KEY_LENGTH_256`` 进行更新。由于 ``BLOCK_KEY0`` eFuse 已设置编写和读取保护位,故无法通过软件访问密钥。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。若使用 128 位 flash 加密密钥,则整个 eFuse 密钥块都受写保护,但只有低 128 位受读保护,高 128 位是可读的,以满足安全启动的需要。如果 flash 加密的密钥是 256 位,那么 ``XTS_KEY_LENGTH_256`` 为 1,否则为 0。为防止意外将 eFuse 从 0 改为 1,RELEASE 模式中设置了一个写保护位。
|
||||
3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位或 128 位密钥(具体位数取决于 :ref:`Size of generated AES-XTS key <CONFIG_SECURE_FLASH_ENCRYPTION_KEYSIZE>`),然后将其写入 `BLOCK_KEY0` eFuse。同时,根据所选选项,软件对 ``XTS_KEY_LENGTH_256`` 进行更新。由于 ``BLOCK_KEY0`` eFuse 已设置编写和读取保护位,故无法通过软件访问密钥。flash 加密操作完全在硬件中完成,无法通过软件访问密钥。若使用 128 位 flash 加密密钥,则整个 eFuse 密钥块都受写保护,但只有低 128 位受读保护,高 128 位是可读的,以满足安全启动的需要。如果 flash 加密的密钥是 256 位,那么 ``XTS_KEY_LENGTH_256`` 为 1,否则为 0。为防止意外将 eFuse 从 0 改为 1,RELEASE 模式中设置了一个写保护位。
|
||||
|
||||
4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
4. flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。
|
||||
|
||||
5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数位。
|
||||
|
||||
@ -242,11 +242,11 @@ Flash 的加密过程
|
||||
|
||||
在开发阶段常需编写不同的明文 flash 镜像并测试 flash 的加密过程。这要求固件下载模式能够根据需求不断加载新的明文镜像。但是,在制造和生产过程中,出于安全考虑,固件下载模式不应有权限访问 flash 内容。
|
||||
|
||||
因此需要有两种不同的 flash 加密配置:一种用于开发,另一种用于生产。详情请参考 `Flash 加密设置`_ 小节。
|
||||
因此需要有两种不同的 flash 加密配置:一种用于开发,另一种用于生产。详情请参考 `flash 加密设置`_ 小节。
|
||||
|
||||
|
||||
|
||||
Flash 加密设置
|
||||
flash 加密设置
|
||||
----------------------
|
||||
|
||||
提供以下 flash 加密模式:
|
||||
@ -434,7 +434,7 @@ Flash 加密设置
|
||||
|
||||
espefuse.py --port PORT burn_key BLOCK_KEY0 flash_encryption_key256.bin XTS_AES_128_KEY
|
||||
|
||||
对于由 128 位导出的 AES-128 密钥(SHA256(128 位))- ``XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS``。Flash 加密密钥会被写入 eFuse BLOCK_KEY0 的低位,留出高 128 位以支持软件读取。如小节 ``同时烧录两个密钥`` 所示,在 espefuse 工具的特殊模式下,您可以使用任意 espefuse 命令来写入数据。
|
||||
对于由 128 位导出的 AES-128 密钥(SHA256(128 位))- ``XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS``。flash 加密密钥会被写入 eFuse BLOCK_KEY0 的低位,留出高 128 位以支持软件读取。如小节 ``同时烧录两个密钥`` 所示,在 espefuse 工具的特殊模式下,您可以使用任意 espefuse 命令来写入数据。
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@ -696,19 +696,19 @@ Flash 加密设置
|
||||
一旦启用 flash 加密,使用代码访问 flash 内容时要更加小心。
|
||||
|
||||
|
||||
Flash 加密范围
|
||||
flash 加密范围
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
当 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 设置为奇数位的值,所有通过 MMU 的 flash 缓存访问的 flash 内容都将被透明解密。包括:
|
||||
|
||||
- Flash 中可执行的应用程序代码 (IROM)。
|
||||
- flash 中可执行的应用程序代码 (IROM)。
|
||||
- 所有存储于 flash 中的只读数据 (DROM)。
|
||||
- 通过函数 :cpp:func:`spi_flash_mmap` 访问的任意数据。
|
||||
- ROM 引导加载程序读取的固件引导加载程序镜像。
|
||||
|
||||
.. important::
|
||||
|
||||
MMU flash 缓存将无条件解密所有数据。Flash 中未加密存储的数据将通过 flash 缓存“被透明解密”,并在软件中存储为随机垃圾数据。
|
||||
MMU flash 缓存将无条件解密所有数据。flash 中未加密存储的数据将通过 flash 缓存“被透明解密”,并在软件中存储为随机垃圾数据。
|
||||
|
||||
|
||||
读取加密的 flash
|
||||
@ -792,20 +792,20 @@ OTA 更新
|
||||
重置 {IDF_TARGET_NAME},flash 加密应处于关闭状态,引导加载程序将正常启动。
|
||||
|
||||
|
||||
Flash 加密的要点
|
||||
flash 加密的要点
|
||||
---------------------------------
|
||||
|
||||
.. list::
|
||||
|
||||
:esp32: - 使用 AES-256 加密 flash。Flash 加密密钥存储于芯片内部的 ``flash_encryption`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
:esp32: - 使用 AES-256 加密 flash。flash 加密密钥存储于芯片内部的 ``flash_encryption`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
|
||||
:esp32: - Flash 加密算法采用的是 AES-256,其中密钥随着 flash 的每个 32 字节块的偏移地址“调整”。这意味着,每个 32 字节块(2 个连续的 16 字节 AES 块)使用从 flash 加密密钥中产生的一个特殊密钥进行加密。
|
||||
:esp32: - flash 加密算法采用的是 AES-256,其中密钥随着 flash 的每个 32 字节块的偏移地址“调整”。这意味着,每个 32 字节块(2 个连续的 16 字节 AES 块)使用从 flash 加密密钥中产生的一个特殊密钥进行加密。
|
||||
|
||||
:esp32s2 or esp32s3: - 使用 XTS-AES-128 或 XTS-AES-256 加密 flash。Flash 加密密钥分别为 256 位和 512 位,存储于芯片内部一个或两个 ``BLOCK_KEYN`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
:esp32s2 or esp32s3: - 使用 XTS-AES-128 或 XTS-AES-256 加密 flash。flash 加密密钥分别为 256 位和 512 位,存储于芯片内部一个或两个 ``BLOCK_KEYN`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
|
||||
:esp32c3: - 使用 XTS-AES-128 加密 flash。 Flash 加密密钥为 256 位,存储于芯片内部的 ``BLOCK_KEYN`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
:esp32c3: - 使用 XTS-AES-128 加密 flash。 flash 加密密钥为 256 位,存储于芯片内部的 ``BLOCK_KEYN`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
|
||||
:esp32c2: - 使用 XTS-AES-128 加密 flash。 Flash 加密密钥为 128 位或 256 位,存储于芯片内部的 ``BLOCK_KEY0`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
:esp32c2: - 使用 XTS-AES-128 加密 flash。 flash 加密密钥为 128 位或 256 位,存储于芯片内部的 ``BLOCK_KEY0`` eFuse 中,并(默认)受保护,防止软件访问。
|
||||
|
||||
- 通过 {IDF_TARGET_NAME} 的 flash 缓存映射功能,flash 可支持透明访问——任何映射到地址空间的 flash 区域在读取时都将被透明地解密。
|
||||
|
||||
@ -824,22 +824,22 @@ Flash 加密的要点
|
||||
|
||||
.. _flash-encryption-limitations:
|
||||
|
||||
Flash 加密的局限性
|
||||
flash 加密的局限性
|
||||
--------------------
|
||||
|
||||
flash 加密可以保护固件,防止未经授权的读取与修改。了解 flash 加密系统的局限之处亦十分重要:
|
||||
|
||||
.. list::
|
||||
|
||||
- Flash 加密功能与密钥同样稳固。因而,推荐您首次启动设备时在设备上生成密钥(默认行为)。如果在设备外生成密钥,请确保遵循正确的后续步骤,不要在所有生产设备之间使用相同的密钥。
|
||||
- flash 加密功能与密钥同样稳固。因而,推荐您首次启动设备时在设备上生成密钥(默认行为)。如果在设备外生成密钥,请确保遵循正确的后续步骤,不要在所有生产设备之间使用相同的密钥。
|
||||
- 并非所有数据都是加密存储。因而在 flash 上存储数据时,请检查您使用的存储方式(库、API 等)是否支持 flash 加密。
|
||||
- Flash 加密无法防止攻击者获取 flash 的高层次布局信息。这是因为每对相邻的 16 字节 AES 块都使用相邻的 AES 密钥。当这些相邻的 16 字节块中包含相同内容时(如空白或填充区域),这些字节块将加密以产生匹配的加密块对。这让攻击者可在加密设备间进行高层次对比(例如,确认两设备是否可能运行相同的固件版本)。
|
||||
- flash 加密无法防止攻击者获取 flash 的高层次布局信息。这是因为每对相邻的 16 字节 AES 块都使用相邻的 AES 密钥。当这些相邻的 16 字节块中包含相同内容时(如空白或填充区域),这些字节块将加密以产生匹配的加密块对。这让攻击者可在加密设备间进行高层次对比(例如,确认两设备是否可能运行相同的固件版本)。
|
||||
:esp32: - 出于相同原因,攻击者始终可获知一对相邻的 16 字节块(32 字节对齐)何时包含相同的 16 字节序列。因此,在 flash 上存储敏感数据时应牢记这点,可进行相关设置避免该情况发生(可使用计数器字节或每 16 字节设置不同的值即可)。具体请参考 :ref:`NVS 加密 <nvs_encryption>`。
|
||||
- 单独使用 flash 加密可能无法防止攻击者修改本设备的固件。为防止设备上运行未经授权的固件,可搭配 flash 加密使用 :doc:`安全启动 <secure-boot-v2>`。
|
||||
|
||||
.. _flash-encryption-and-secure-boot:
|
||||
|
||||
Flash 加密与安全启动
|
||||
flash 加密与安全启动
|
||||
----------------------
|
||||
|
||||
推荐 flash 加密与安全启动搭配使用。但是,如果已启用安全启动,则重新烧录设备时会受到其他限制:
|
||||
@ -854,7 +854,7 @@ Flash 加密与安全启动
|
||||
|
||||
.. _flash-encryption-without-secure-boot:
|
||||
|
||||
Flash 加密的高级功能
|
||||
flash 加密的高级功能
|
||||
--------------------------------
|
||||
|
||||
以下部分介绍了 flash 加密的高级功能。
|
||||
@ -1019,19 +1019,19 @@ JTAG 调试
|
||||
|
||||
.. _flash-encryption-algorithm:
|
||||
|
||||
Flash 加密算法
|
||||
flash 加密算法
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
- AES-256 在 16 字节的数据块上运行。Flash 加密引擎在 32 字节的数据(2 个 串行 AES 块)上加密或解密数据。
|
||||
- AES-256 在 16 字节的数据块上运行。flash 加密引擎在 32 字节的数据(2 个 串行 AES 块)上加密或解密数据。
|
||||
|
||||
- Flash 加密的主密钥存储于 ``flash_encryption`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
- flash 加密的主密钥存储于 ``flash_encryption`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
|
||||
- AES-256 密钥大小为 256 位(32 字节),从 ``flash_encryption`` eFuse 中读取。与 ``flash_encryption`` 中的存储顺序相比,硬件 AES 引擎使用的是相反的字节顺序的密钥。
|
||||
|
||||
- 如果 ``CODING_SCHEME`` eFuse 设置为 0(默认“无”编码方案),则 eFuse 密钥块为 256 位,且密钥按原方式存储(反字节序)。
|
||||
- 如果 ``CODING_SCHEME`` eFuse 设置为 1(3/4 编码),则 eFuse 密钥块为 192 位(反字节序),信息熵总量减少。硬件 flash 加密仍在 256 字节密钥上运行,在读取后(字节序未反向),密钥扩展为 ``key = key[0:255] + key[64:127]``。
|
||||
|
||||
- Flash 加密中使用了逆向 AES 算法,因此 flash 加密的“加密”操作相当于 AES 解密,而其“解密”操作则相当于 AES 加密。这是为了优化性能,不会影响算法的有效性。
|
||||
- flash 加密中使用了逆向 AES 算法,因此 flash 加密的“加密”操作相当于 AES 解密,而其“解密”操作则相当于 AES 加密。这是为了优化性能,不会影响算法的有效性。
|
||||
|
||||
- 每个 32 字节块(2 个相邻的 16 字节 AES 块)都由一个特殊的密钥进行加密。该密钥由 ``flash_encryption`` 中 flash 加密的主密钥产生,并随 flash 中该字节块的偏移进行 XOR 运算(一次“密钥调整”)。
|
||||
|
||||
@ -1054,14 +1054,14 @@ JTAG 调试
|
||||
|
||||
.. _flash-encryption-algorithm:
|
||||
|
||||
Flash 加密算法
|
||||
flash 加密算法
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- {IDF_TARGET_NAME} 使用 XTS-AES 块密码模式进行 flash 加密,密钥大小为 256 位或 512 位。
|
||||
|
||||
- XTS-AES 是一种专门为光盘加密设计的块密码模式,它解决了其它潜在模式如 AES-CTR 在此使用情景下的不足。有关 XTS-AES 算法的详细描述,请参考 `IEEE Std 1619-2007 <https://ieeexplore.ieee.org/document/4493450>`_。
|
||||
|
||||
- Flash 加密的密钥存储于一个或两个 ``BLOCK_KEYN`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
- flash 加密的密钥存储于一个或两个 ``BLOCK_KEYN`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
|
||||
- 有关在 Python 中实现的完整 flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 ``_flash_encryption_operation()``。
|
||||
|
||||
@ -1070,14 +1070,14 @@ JTAG 调试
|
||||
|
||||
.. _flash-encryption-algorithm:
|
||||
|
||||
Flash 加密算法
|
||||
flash 加密算法
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- {IDF_TARGET_NAME} 使用 XTS-AES 块密码模式进行 flash 加密,密钥大小为 256 位。
|
||||
|
||||
- XTS-AES 是一种专门为光盘加密设计的块密码模式,它解决了其它潜在模式如 AES-CTR 在此使用情景下的不足。有关 XTS-AES 算法的详细描述,请参考 `IEEE Std 1619-2007 <https://ieeexplore.ieee.org/document/4493450>`_。
|
||||
|
||||
- Flash 加密的密钥存储于一个 ``BLOCK_KEYN`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
- flash 加密的密钥存储于一个 ``BLOCK_KEYN`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
|
||||
- 有关在 Python 中实现的完整 flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 ``_flash_encryption_operation()``。
|
||||
|
||||
@ -1085,13 +1085,13 @@ JTAG 调试
|
||||
|
||||
.. _flash-encryption-algorithm:
|
||||
|
||||
Flash 加密算法
|
||||
flash 加密算法
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- {IDF_TARGET_NAME} 使用 XTS-AES 块密码模式进行 flash 加密,密钥大小为 256 位。如果 128 位的密钥存储于 eFuse 密钥块中,那么最终的 256 位 AES 密钥将以 SHA256(EFUSE_KEY0_FE_128BIT) 的形式获得。
|
||||
|
||||
- XTS-AES 是一种专门为光盘加密设计的块密码模式,它弥补了其他潜在模式如 AES-CTR 在此使用场景下的不足。有关 XTS-AES 算法的详细描述,请参考 `IEEE Std 1619-2007 <https://ieeexplore.ieee.org/document/4493450>`_。
|
||||
|
||||
- Flash 加密的密钥存储于一个 ``BLOCK_KEY0`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
- flash 加密的密钥存储于一个 ``BLOCK_KEY0`` eFuse 中,默认受保护防止进一步写入或软件读取。
|
||||
|
||||
- 有关在 Python 中实现的完整 flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 ``_flash_encryption_operation()``。
|
||||
|
Loading…
Reference in New Issue
Block a user