[加密]ESP32 -Secure Boot 安全方案


轉自:https://blog.csdn.net/espressif/article/details/79362094

Secure Boot 功能概述

方案概述

  • Secure Boot 的目的是保證芯片只運行用戶指定的程序,芯片每次啟動時都會驗證從 flash 中加載的 partition table 和 app images 是否是用戶指定的
  • Secure Boot 中采用 ECDSA 簽名算法對 partition table 和 app images 進行簽名和驗證,ECDSA 簽名算法使用公鑰/私鑰對,秘鑰用於對指定的二進制文件簽名,公鑰用於驗證簽名
  • 由於 partition table 和 app images 是在軟件 bootloader 中被驗證的,所以為了防止攻擊者篡改軟件 bootloader 從而跳過簽名驗證,Secure Boot 過程中會在 ROM bootloader 時檢查軟件 bootloader image 是否被篡改,檢查用到的 secure boot key 由硬件隨機數生成器產生,保存的 efuse 中,對於軟件是讀寫保護的

所用資源

  • ECDSA 算法公鑰/私鑰對 
    • 燒寫 flash 前在 PC 端生成
    • 公鑰會被編譯到 bootloader image 中,軟件 bootloader 在執行時會讀取公鑰,使用公鑰驗證 flash 中partition table 和 app images 是否是經過相應的私鑰簽名的
    • 私鑰在編譯時被用於對 partition table 和 app images 簽名,私鑰必須被保密好,一旦泄露任何使用此私鑰簽名的 image 都能通過 boot 時的簽名驗證
  • secure bootloader key 
    • 這是一個 256-bit AES key,在第一次 Secure Boot 時由硬件隨機數生成,保存在 efuse 中,軟件無法讀取
    • 使用此 key 驗證軟件 bootloader image 是否被修改

執行過程

1.編譯 bootloader image 時發現 menuconfig 中使能了 secure boot,於是根據 menuconfig 中指定的公鑰/秘鑰文件路徑將公鑰編譯到 bootloader image 中,bootloader 被編譯成支持 secure boot 
2.編譯 partition table 和 app images 時使用秘鑰計算出簽名,將簽名編譯到相應的二進制文件中 
3.芯片第一次 boot 時,軟件 bootloader 根據以下步驟使能 secure boot:

  • 硬件產生一個 secure boot key,將這個 key 保存在 efuse 中,利用這個 key、一個隨機數 IV 和 bootloader image 計算出 secure digest
  • secure digest 與隨機數 IV 保存在 flash 的 0x0 地址,用於在后續 boot 時驗證 bootloader image 是否被篡改
  • 若 menuconfig 中選擇了禁止 JTAG 中斷和 ROM BASIC 中斷,bootloader 會將 efuse 中的一些標志位設置為禁止這些中斷(強烈建議禁止這些中斷)
  • bootloader 通過燒寫 efuse 中的 ABS_DONE_0 永久使能 secure boot

4.芯片在后面的 boot 中,ROM bootloader 發現 efuse 中的 ABS_DONE_0 被燒寫,於是從 flash 的地址 0x0 讀取第一次 boot 時保存的 secure digest 和隨機數 IV,硬件使用 efuse 中的 secure boot key 、隨機數 IV 與當前的 bootloader image 計算當前的 secure digest,若與 flash 中的 secure digest 不同,則 boot 不會繼續,否則就執行軟件 bootloader。 
5.軟件 bootloader 使用 bootloader image 中保存的公鑰對 flash 中的 partition table 和 app images 簽字進行驗證,驗證成功之后才會 boot 到 app 代碼中

使用步驟

  1. make menuconfig 選擇 “enable secure boot in bootloader”
  2. make menuconfig 設置保存公鑰/秘鑰對的文件
  3. 生成公鑰和秘鑰,先執行 “make” 命令,此時由於還沒有公鑰/秘鑰對,所以命令行中會提示生成公鑰/秘鑰對的命令,按提示執行命令即可。但在產品級使用中,建議使用 openssl 或者其他工業級加密程序生成公鑰/秘鑰對。例如使用 openssl:“openssl ecparam -name prime256v1 -genkey -noout -out my_secure_boot_signing_key.pem”(若使用現有的公鑰/秘鑰對文件,可以跳過此步)
  4. 運行命令 “make bootloader” 產生一個使能 secure boot 的 bootloader image
  5. 執行完4后命令行會提示下一步燒寫 bootloader image 的命令,按提示燒寫即可
  6. 運行命令 “make flash” 編譯並燒寫 partition table 和 app images
  7. 重啟芯片,軟件 bootloader 會使能 secure boot ,查看串口打印確保 secure boot 成功啟用。

注意事項

  • 正常使用情況下, bootloader image 只能燒寫一次,partition table 和 app images 可以重復燒寫
  • 秘鑰必須保密,一旦泄露 secure boot 將失去作用
  • 用於 OTA 的 image 必須進行秘鑰簽名,OTA 時會使用公鑰進行驗證

可重復燒寫 bootloader

  • 默認情況下 bootloader image 只能燒寫一次,在產品中強烈建議這樣做,因為 bootloader image 可以重新燒寫的情況下可以通過修改 bootloader 跳過后續 image 的驗證過程,這樣 secure boot 就失去作用
  • 可重復燒寫 bootloader 模式下,secure bootloader key 是在 PC 端產生的,此 key 必須保密,一旦 key 被泄露,其它使用此 key 生成digest 的 bootloader image 也能通過硬件檢查
  • 使用步驟: 
    1.make menuconfig 中選擇 “secure bootloader mode”->”Reflashable” 
    2.按“使用步驟”一節步驟2和3生成公鑰與秘鑰 
    3.運行指令 “make bootloader” ,一個 256-bit secure boot key 會根據用於簽名的私鑰計算出,命令行會打印兩個后續步驟,按循序執行:

    • 將 PC 端生成的 secure boot key 燒入 efuse 中的命令
    • 將編譯好的帶有預計算出的 secure digest 的 bootloader image 燒寫到 flash 中

    4.從“使用步驟”一節的步驟6繼續執行

Flash Encryption

方案概述

  • 使能 flash encryption 后,使用物理手段(如串口)從 SPI flash 中讀取的數據都是經過加密的,大部分數據無法恢復出真實數據
  • flash encryption 使用 256-bit AES key 加密 flash 數據,key 保存在芯片的 efuse 中,生成之后變成軟件讀寫保護
  • 用戶燒寫 flash 時燒寫的是數據明文,第一次 boot 時,軟件 bootloader 會對 flash 中的數據在原處加密
  • 一般使用情況下一共有4次機會通過串口燒寫 flash ,通過 OTA 更新 flash 數據沒有次數限制。開發階段可以在 menuconfig 中設置無燒寫次數限制,但不要在產品中這么做

使用步驟

  1. make menuconfig 中選擇 “Security features”->”Enable flash encryption on boot”
  2. 按通常操作編譯出 bootloader, partition table 和 app image 並燒寫到 flash 中
  3. 第一次 boot 時 flash 中被指定加密的數據被加密(大的 partition 加密過程可能需要花費超過1分鍾) ,之后就可以正常使用被加密的 flash 數據

加密過程(第一次 boot 時進行)

  1. bootloader 讀取到 efuse 中的 FLASH_CRYPT_CNT 為0,於是利用硬件隨機數生成器產生加密用的 key ,此 key 被保存在 efuse 中,對於軟件是讀寫保護的
  2. bootloader 對所有需要被加密的 partition 在 flash 中原處加密
  3. 默認情況下 efuse 中的 DISABLE_DL_ENCRYPT, DISABLE_DL_DECRYPT 和 DISABLE_DL_CACHE 會被燒寫為1,這樣 UART bootloader 時就不能讀取到解密后的 flash 數據
  4. efuse 中的 FLASH_CRYPT_CONFIG 被燒寫成 0xf,此標志用於決定加密 key 的多少位被用於計算每一個 flash 塊(32字節)對應的秘鑰,設置為 0xf 時使用所有256位
  5. efuse 中的 FLASH_CRYPT_CNT 被燒寫成 0x01,此標志用於 flash 燒寫次數限制以及加密控制,詳見“FLASH_CRYPT_CNT”一節
  6. bootloader 將自己重啟,從加密的 flash 執行軟件 bootloader

串口重燒 flash (3次重燒機會)

  • 串口重燒 flash 過程 
    1.make menuconfig 中選擇 “Security features”->”Enable flash encryption on boot” 
    2.編譯工程,將所有之前加密的 images (包括 bootloader)燒寫到 flash 中 
    3.在 esp-idf 的 components/esptool_py/esptool 路徑下使用命令 espefuse.py burn_efuse FLASH_CRYPT_CNT 燒寫 efuse 中的 FLASH_CRYPT_CNT 
    4.重啟設備,bootloader 根據 FLASH_CRYPT_CNT 的值重新加密 flash 數據

  • 若用戶確定不再需要通過串口重燒 flash,可以在 esp-idf 的 components/esptool_py/esptool 路徑下使用命令 espefuse.py –port PORT write_protect_efuse FLASH_CRYPT_CNT 將 FLASH_CRYPT_CNT 設置為讀寫保護(注意此步驟必須在 bootloader 已經完成對 flash 加密后進行)

FLASH_CRYPT_CNT

  • FLASH_CRYPT_CNT 是 flash 加密方案中非常重要的控制標志,它是 8-bit 的值,它的值一方面決定 flash 中的值是否馬上需要加密,另一方面控制 flash 燒寫次數限制
  • 當 FLASH_CRYPT_CNT 有(0,2,4,6,8)位被燒寫為1時,bootloader 會對 flash 中的內容進行加密
  • 當 FLASH_CRYPT_CNT 有(1,3,5,7)位被燒寫為1時,bootloader 知道 flash 的內容已經過加密,直接讀取 flash 中的數據解密后使用
  • FLASH_CRYPT_CNT 的變化過程:

    1.沒有使能 flash 加密時,永遠是0 
    2.使能了 flash 加密,在第一次 boot 時 bootloader 發現它的值是 0x00,於是知道 flash 中的數據還未加密,利用硬件隨機數生成器產生 key,然后加密 flash,最后將它的最低位置1(取值為0x01) 
    3.后續 boot 時,bootloader 發現它的值是 0x01,知道 flash 中的數據已加密,可以解密后直接使用 
    4.用戶需要串口重燒 flash ,於是使用命令行手動燒寫 FLASH_CRYPT_CNT,此時2個 bit 被置為 1(取值為0x03) 
    5.重啟設備,bootloader 發現 FLASH_CRYPT_CNT 的值是 0x03(2 bit 1),於是重新加密 flash 數據,加密完成后 bootloader 將 FLASH_CRYPT_CNT 燒寫為0x07(3 bit 1),flash 加密正常使用 
    6.用戶需要串口重燒 flash ,於是使用命令行手動燒寫 FLASH_CRYPT_CNT,此時4個 bit 被置為 1(取值為0x0f) 
    7.重啟設備,bootloader 發現 FLASH_CRYPT_CNT 的值是 0x0f(4 bit 1),於是重新加密 flash 數據,加密完成后 bootloader 將 FLASH_CRYPT_CNT 燒寫為0x1f(5 bit 1),flash 加密正常使用 
    8.用戶需要串口重燒 flash ,於是使用命令行手動燒寫 FLASH_CRYPT_CNT,此時6個 bit 被置為 1(取值為0x3f) 
    9.重啟設備,bootloader 發現 FLASH_CRYPT_CNT 的值是 0x4f(6 bit 1),於是重新加密 flash 數據,加密完成后 bootloader 將 FLASH_CRYPT_CNT 燒寫為0x7f(7 bit 1),flash 加密正常使用 
    10.注意!此時不能再使用命令行燒寫 FLASH_CRYPT_CNT,bootloader 讀到 FLASH_CRYPT_CNT 為 0xff(8 bit 1)時,會停止后續的 boot。

被加密的數據

  • Bootloader
  • Secure boot bootloader digest(若 Secure Boot 被使能, flash 中會多出這一項, 具體查看“Secure Boot”中“執行過程”的步驟3)
  • Partition table
  • Partition table 中指向的所有 Type 域標記為“app”的部分
  • Partition table 中指向的所有 Flags 域標記為“encrypted”的部分(用於非易失性存儲(NVS)部分的 flash 在任何情況下都不會被加密)

哪些方式讀到解密后的數據(真實數據)

  • 通過內存管理單元的 flash 緩存讀取的 flash 數據都是經過解密后的數據,包括: 
    • flash 中的可執行應用程序代碼
    • 存儲在 flash 中的只讀數據
    • 任何通過 API esp_spi_flash_mmap() 讀取的數據
    • 由 ROM bootloader 讀取的軟件 bootloader image 數據
  • 如果調用 API esp_partition_read()讀取被加密區域的數據,則讀取的 flash 數據是經過解密后的數據

哪些方式讀到不解密的數據(無法使用的臟數據)

  • 通過 API esp_spi_flash_read() 讀取的數據
  • ROM 中的函數 SPIRead() 讀取的數據

軟件寫入加密數據

  • 調用 API esp_partition_write() 時,只有寫到被加密的 partition 的數據才會被加密
  • 函數 esp_spi_flash_write() 根據參數 write_encrypted 是否被設為 true 決定是否對數據加密
  • ROM 函數 esp_rom_spiflash_write_encrypted() 將加密后的數據寫入 flash 中,而 SPIWrite() 將不加密的數據寫入到 flash 中

Secure Boot 與 Flash Encryption 流程圖

  • 第一次 boot 時 secure boot 與 flash encrypt 的生效過程如下圖所示,圖中藍色框是 secure boot 的步驟,綠色框是 flash encrypt 的步驟

    secure_encrypt_first_boot

  • 后續 boot 時流程圖如下,圖中綠色框中的步驟會執行解密,解密是由硬件自動完成的

    secure_encrypt_subsequent_boot

Windows平台的下載工具

  • 樂鑫提供windows平台的下載工具,能夠在工廠生產環境中批量燒寫固件
  • 點擊這里,閱讀生產下載固件的說明文檔。
  • 生產下載工具的配置文件在 configure 文件夾內,涉及安全特性的配置在 security.conf 中,目前涉及的配置內容如下表:
ITEM Function default
debug_enable 是否開啟debug模式,在debug模式下,工具會根據pem文件產生相同密鑰,否則隨機生成密鑰 True
debug_pem_path 設置證書地址,用於生成可重復燒寫的密鑰,盡在debug模式下有效  
SECURE BOOT    
secure_boot_en 開啟secure boot功能 False
burn_secure_boot_key 使能secure boot key燒寫 False
secure_boot_force_write 是否不檢查secure boot key block,強制燒寫key False
secure_boot_rw_protect 開啟secure boot key區域的讀寫保護 False
FLASH ENCRYPTION    
flash_encryption_en 開啟flash加密功能 False
burn_flash_encryption_key 使能flash encrypt key燒寫 False
flash_encrypt_force_write 是否不檢查flash encrypt key block,強制燒寫key False
flash_encrypt_rw_protect 開啟flash encrypt key區域的讀寫保護 False
AES KEY Not used yet  
DISABLE FUNC    
jtag_disable 是否關閉JTAG調試功能 False
dl_encrypt_disable 是否關閉下載模式下flash加密功能 False
dl_decrypt_disable 是否關閉下載模式下flash解密功能 False
dl_cache_disable 是否關閉下載模式下的flash cache功能 False
  • 下載工具的內部邏輯和流程如下:

    download_tool_flow_chart


啟用Secure Boot 與 Flash Encryption 的生產方案

准備工作

  • 安裝eptool

    • esptool默認路徑在$IDF_PATH/components/esptool_py/esptool/
    • 也可以通過python安裝:

      pip install esptool 或者 pip3 install esptool
      • 1
      • 2
      • 3

方案1: 通過bootloader完成security特性初始化

  • 優勢: 可以批量進行flash燒錄,初始化的固件相同,密鑰在第一次上電有在設備內隨機生成。
  • 缺陷: 設備在首次初始化過程所用時間較長,如果在首次初始化過程發生掉電等意外情況,設備可能無法正常啟動。
  • 由芯片端自動隨機生成secure boot 與 flash encrypton 密鑰,並寫入芯片 efuse 中, 密鑰寫入后,對應的efuse block會被設置為讀寫保護狀態,軟件與工具都無法讀取出密鑰。
  • 所有編譯出的 images 都按正常情況燒寫,芯片會在第一次 boot 時進行配置。
  • 通過 make menuconfig 配置 secure boot 和 flash encryption, 按照第一、二節介紹的步驟執行即可,具體操作步驟如下,如果了解第一、二節的內容,可以跳過:

1.隨機生成RSA密鑰文件:

$ espsecure.py generate_signing_key secure_boot_signing_key.pem
  • 1

or

$ openssl ecparam -name prime256v1 -genkey -noout -out secure_boot_signing_key.pem
  • 1

2.在menuconfig中,選擇Sign binaries during build, 並指定剛才生成的密鑰路徑, 如下圖。

menuconfig_02

3.分別編譯bootloader與應用代碼

$ make bootloader $ make
  • 1
  • 2

4.使用 esptool 將編譯生成的bin文件寫入flash對應地址, 以example中hellow-world工程為例:

        bootloader.bin --> 0x1000 partition.bin --> 0x8000 app.bin --> 0x10000 python $IDF_PATH/components/esptool_py/esptool/esptool.py --chip esp32 --port /dev/cu.SLAB_USBtoUART --baud 1152000 --before default_reset --after no_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 $IDS_PATH/esp-idf/examples/get-started/hello_world/build/bootloader/bootloader.bin 0xf000 $IDF_PATH/esp-idf/examples/get-started/hello_world/build/phy_init_data.bin 0x10000 $IDF_PATH/examples/get-started/hello_world/build/hello-world.bin 0x8000 $IDF_PATH/examples/get-started/hello_world/build/partitions_singleapp.bin
  • 1
  • 2
  • 3
  • 4

以上命令僅是示例代碼,請在使用時,替換其中的文件路徑以及所選參數,包括串口、波特率、SPI模式和頻率等。

5.我們也可以使用window平台的下載工具來完成工廠下載。需要在配置文件中,關閉工具的security功能,這樣工具端就不會操作security相關特性,完全由硬件和bootloader來完成初始化:

        [SECURE BOOT]
        secure_boot_en = False [FLASH ENCRYPTION] flash_encryption_en = False
  • 1
  • 2
  • 3
  • 4

download_frame_02

注意: 
修改並保存參數前,請先關閉下載工具,配置文件修改完成並保存后,再開啟運行下載工具。

6.或者我們可以通過下載工具的combine功能,將多個bin文件打包為一個文件,再由工廠flash燒錄器燒錄進flash進行批量生產。

  • 選擇bin文件並制定flash中的地址
  • 選中 ‘DoNotChgBin’ 選項,這樣工具不會對bin文件的配置(SPI模式速率等)進行任何修改。
  • 點擊 ‘CombineBin’ 按鍵,生產合並后的bin文件。
  • 在 ‘combine’ 文件夾下,生成 target.bin,將其燒寫到 Flash 的 0x0 地址即可。
  • 工具只會對填寫的最大地址范圍內的空白區域填充 0xff。並將文件按地址組合。

combine_01

7.下載完成后,需要運行一次程序,使bootloader完成security相關特性的初始化,包括AES密鑰的隨機生成並寫入EFUSE,以及對明文的flash進行首次加密。

請誤在首次啟動完成前,將芯片斷電,以免造成芯片無法啟動的情況。

  • 注意事項: 
    • 用於簽名的私鑰需要保密,如果泄漏,app.bin有被偽造的可能性。
    • 使用者不能遺失私鑰,必須使用私鑰用於對 OTA app 簽名(如果有OTA功能)。
    • 芯片通過軟件 bootloader 對 flash 加密是一個比較緩慢的過程,對於較大的 partition 可能需要花費一分鍾左右
    • 若第一次執行 bootloader, flash 加密進行到一半芯片掉電 
      • 沒有使能 secure boot 時,可重新將 images 明文燒寫到 flash 中,讓芯片下次 boot 時重新加密 flash
      • 使能了 secure boot 時,由於無法重新燒寫 flash,芯片將永久無法 boot

方案2: 通過下載工具初始化security特性

  • 優勢: 工具進行密鑰的隨機生成,直接將 image 密文燒寫進flash,然后配置efuse. 避免過程中掉電造成無法啟動的情況。
  • 缺陷: 每個設備必須通過下載工具進行燒寫,因為密鑰不同,無法預先燒寫相同的固件到flash中。
  • 使用下載工具應用 secure boot 和 flash encryption,這時用戶只需要的在 make menuconfig 中選擇“enable secure boot in bootloader”並設置公鑰/秘鑰路徑即可
  • 下載工具在運行時,會隨機產生 secure boot 與 flash encryption 密鑰, 並燒寫到對應的 EFUSE 位置中。
  • 操作步驟:

1.隨機生成RSA密鑰文件,用於簽名固件:

$ espsecure.py generate_signing_key secure_boot_signing_key.pem
  • 1

or

$ openssl ecparam -name prime256v1 -genkey -noout -out secure_boot_signing_key.pem
  • 1

2.在menuconfig中,選擇Sign binaries during build, 並指定剛才生成的密鑰路徑, 如下圖。

menuconfig_02

3.分別編譯bootloader與應用代碼

$ make bootloader $ make
  • 1
  • 2

4.設置下載工具的安全配置文件

    [DEBUG MODE]
    debug_enable = False #關閉debug模式,工具隨機生成密鑰。否則根據pem文件產生相同密鑰 debug_pem_path = #debug模式下,設置證書地址,用於生成可重復燒寫的密鑰 [SECURE BOOT] secure_boot_en = True #開啟secure boot功能 burn_secure_boot_key = True #使能secure boot key燒寫 secure_boot_force_write = False #是否不檢查secure boot key block,強制燒寫key secure_boot_rw_protect = True #開啟secure boot key區域的讀寫保護 [FLASH ENCRYPTION] flash_encryption_en = True #開啟flash加密功能 burn_flash_encryption_key = True #使能flash encrypt key燒寫 flash_encrypt_force_write = False #是否不檢查flash encrypt key block,強制燒寫key flash_encrypt_rw_protect = True #開啟flash encrypt key區域的讀寫保護 [AES KEY] aes_key_en = False #目前未實現,僅保留該選項 burn_aes_key = False #目前未實現,僅保留該選項 [DISABLE FUNC] jtag_disable = True #是否關閉JTAG調試功能 dl_encrypt_disable = True #是否關閉下載模式下flash加密功能 dl_decrypt_disable = True #是否關閉下載模式下flash解密功能 dl_cache_disable = True #是否關閉下載模式下的flash cache功能
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

注意: 
修改並保存參數前,請先關閉下載工具,配置文件修改完成並保存后,再開啟運行下載工具。

5. 使用下載工具進行下載,若不希望工具修改任何配置參數(比如flash 頻率和模式),請勾選‘DoNotChgBin’選項。下載工具會更具配置文件的設置,在下載過程中完成固件加密下載和密鑰隨機生成與燒寫。
  • 1
  • 2

download_frame_new

  • 注意事項
    • 用於簽名的私鑰需要保密,如果泄漏,app.bin有被偽造的可能性。
    • 使用者不能遺失私鑰,必須使用私鑰用於對 OTA app 簽名(如果有OTA功能)。
    • 用戶可以選擇不啟用 app image的簽名校驗,只需要關閉menuconfig中的secure boot功能即可。下載工具會更具配置文件,通過efuse啟用secure boot。 
      禁用app image的簽名校驗會存在安全隱患。

開發階段使用可重復燒寫 flash 的 Secure Boot 與 Flash encryption

1.make menuconfig 中使能 secure boot 和 flash encrypt,“Secure bootloader mode”選擇“Reflashable”,並設置你的公鑰/私鑰.pem文件路徑 
2.編譯 bootloader 並生成 secure boot key:

make bootloader
  • 1

3.使用 key 和 bootloader 計算 帶 digest 的 bootloader

python $IDF_PATH/components/esptool_py/esptool/espsecure.py digest_secure_bootloader --keyfile ./build/bootloader/secure_boot_key.bin -o ./build/bootloader/bootloader_with_digest.bin ./build/bootloader/bootloader.bin
  • 1

4.編譯 partition_table 與 app

make partition_table make app
  • 1
  • 2

5.加密三個 bin 文件

python $IDF_PATH/components/esptool_py/esptool/espsecure.py encrypt_flash_data --keyfile flash_encrypt_key.bin --address 0x0 -o build/bootloader/bootloader_digest_encrypt.bin build/bootloader/bootloader_with_digest.bi python $IDF_PATH/components/esptool_py/esptool/espsecure.py encrypt_flash_data --keyfile flash_encrypt_key.bin --address 0x8000 -o build/partitions_singleapp_encrypt.bin build/partitions_singleapp.bin python $IDF_PATH/components/esptool_py/esptool/espsecure.py encrypt_flash_data --keyfile flash_encrypt_key.bin --address 0x10000 -o build/iot_encrypt.bin build/iot.bin
  • 1
  • 2
  • 3

6.燒寫三個加密后的 bin 文件

python $IDF_PATH/components/esptool_py/esptool/esptool.py --baud 1152000 write_flash 0x0 build/bootloader/bootloader_digest_encrypt.bin python $IDF_PATH/components/esptool_py/esptool/esptool.py --baud 1152000 write_flash 0x8000 build/partitions_singleapp_encrypt.bin python $IDF_PATH/components/esptool_py/esptool/esptool.py --baud 1152000 write_flash 0x10000 build/iot_encrypt.bin
  • 1
  • 2
  • 3

7.將 flash_encryption_key 燒入 efuse (僅在第一次boot前燒寫):

python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_key flash_encryption flash_encrypt_key.bin
  • 1

8.將 secure boot key 燒入efuse(僅在第一次boot前燒寫):

python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_key secure_boot ./build/bootloader/secure_boot_key.bin
  • 1

9.燒寫 efuse 中的控制標志(僅在第一次boot前燒寫)

python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_efuse ABS_DONE_0 python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_efuse FLASH_CRYPT_CNT python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_efuse FLASH_CRYPT_CONFIG 0xf python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_efuse DISABLE_DL_ENCRYPT python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_efuse DISABLE_DL_DECRYPT python $IDF_PATH/components/esptool_py/esptool/espefuse.py burn_efuse DISABLE_DL_CACHE


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM