痞子衡嵌入式:恩智浦MCU安全加密啟動一站式工具NXP-MCUBootUtility用戶指南


NXP MCU Boot Utility

GitHub release GitHub commits GitHub All Releases GitHub license

English | 中文

對於MCUBootUtility,RT-Flash工具,有任何使用上的問題,可以在《痞子衡嵌入式》博客下留言,也可以掃碼加入QQ交流群。  

1 軟件概覽

1.1 介紹

  NXP-MCUBootUtility是一個專為NXP MCU安全加密啟動而設計的工具,其特性與NXP MCU里BootROM功能相對應,目前主要支持i.MXRT系列MCU芯片,與NXP官方的標准安全加密配套工具集(OpenSSL, CST, sdphost, blhost, elftosb, BD, MfgTool2)相比,NXP-MCUBootUtility是一個真正的一站式工具,一個工具包含NXP官方所有加密配套工具的功能,並且是全圖形用戶界面操作。借助於NXP-MCUBootUtility,你可以輕松上手NXP MCU安全加密啟動。
  NXP-MCUBootUtility主要功能如下:


  • 支持UART和USB-HID兩種串行下載方式(COM端口/USB設備自動識別)
  • 支持五種常用格式(elf/axf/srec/hex/bin)源image文件輸入並檢查其鏈接地址的合法性
  • 支持將裸源image文件自動轉換成i.MXRT能啟動的Bootable image
  • 支持下載Bootable image進外部啟動設備
  • 支持外部啟動設備的任意讀/寫/擦操作(即通用Flash編程器)

  • 支持i.MXRTyyyy全系列MCU,包含i.MXRT1011、i.MXRT1015、i.MXRT1021、i.MXRT1051/1052、i.MXRT1061/1062、i.MXRT1064 SIP、i.MXRT1171/1172/1173/1174/1175/1176
  • 源image文件既可以是裸源image文件,也可以是含啟動文件頭的bootable image文件
  • 支持將裸源image文件自動轉換成MfgTool和RT-Flash工具能下載的.sb格式文件
  • 支持下載Bootable image進主動啟動設備 - FlexSPI接口NOR Flash
  • 支持下載Bootable image進主動啟動設備 - SEMC接口NAND Flash
  • 支持下載Bootable image進主動啟動設備 - SEMC接口NOR Flash
  • 支持下載Bootable image進主動啟動設備 - uSDHC接口SD/eMMC卡
  • 支持下載Bootable image進備份啟動設備 - LPSPI接口NOR/EEPROM Flash
  • 支持DCD配置功能,可用於加載image進SDRAM執行
  • 支持用於開發階段的非安全加密啟動(未簽名加密)
  • 支持基於HAB實現的安全加密啟動(單簽名,簽名和加密),證書自動備份
  • 支持基於BEE實現的安全加密啟動(唯一SNVS key,用戶自定義key)
  • 支持基於OTFAD實現的安全加密啟動(唯一SNVS key,用戶自定義key)
  • 支持MCU芯片內部eFuse的回讀和燒寫操作(即專用eFuse燒寫器)
  • 支持MCU芯片內部FlexRAM的讀/寫/執行操作(即專用FlexRAM編程器,可用於ISP啟動)
  • 支持從外部啟動設備回讀Bootable image,並對其組成部分(NFCB/DBBT/FDCB/EKIB/EPRDB/IVT/Boot Data/DCD/Image/CSF/DEK KeyBlob)進行標注

  • 支持i.MXRTxxx全系列MCU,包含i.MXRT533/535/553/555/583/585/593/595、i.MXRT633/635/685
  • 支持下載Bootable image進主動啟動設備 - FlexSPI/QuadSPI接口NOR Flash
  • 支持用於開發階段的非安全加密啟動(未簽名,CRC校驗)
  • 支持MCU芯片內部SRAM的讀/寫/執行操作(即專用SRAM編程器,可用於ISP啟動)
  • 支持從外部啟動設備回讀Bootable image,並對其組成部分(OTFAD KeyBlob/FDCB/KeyStore/Image)進行標注

1.2 下載

  NXP-MCUBootUtility完全基於Python語言開發,並且源代碼全部開源,其具體開發環境為Python 2.7.15 (32bit)、wxPython 4.0.3、pySerial 3.4、pywinusb 0.4.2、bincopy 15.0.0、PyAudio 0.2.11、PyInstaller 3.3.1(或更高)。

  NXP-MCUBootUtility在發布時借助PyInstaller將所有的Python依賴全部打包進一個可執行文件(\NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe),因此如果不是對NXP-MCUBootUtility的二次開發,你不需要安裝任何Python軟件及相關庫。

Note1: 使用NXP-MCUBootUtility之前必須先從NXP官網下載 HAB Code Signing Tool工具,並將其解壓放在\NXP-MCUBootUtility\tools\cst\目錄下,並且需要修改代碼使能AES功能重新生成\NXP-MCUBootUtility\tools\cst\mingw32\bin\cst.exe,否則HAB簽名以及加密相關功能無法使用。具體步驟可以參考這篇博客 《開啟NXP-MCUBootUtility工具的HAB加密功能 - cst.exe》

Note2: 使用NXP-MCUBootUtility之前必須編譯\NXP-MCUBootUtility\tools\image_enc\code下面的源文件生成image_enc.exe,並將其放置在\NXP-MCUBootUtility\tools\image_enc\win,否則BEE/OTFAD加密相關功能無法使用。具體步驟可以參考這篇博客 《開啟NXP-MCUBootUtility工具的BEE/OTFAD加密功能 - image_enc.exe》

Note3: 源代碼包里的NXP-MCUBootUtility.exe是在Windows 10 x64環境下打包的,也僅在該環境下測試過,如果因系統原因無法直接使用,你需要先安裝 Python2.7.15 x86版本 (安裝完成后確認\Python27\, \Python27\Scripts\目錄被添加到系統環境變量Path里),然后在\NXP-MCUBootUtility\env\目錄下點擊do_setup_by_pip.bat安裝開發NXP-MCUBootUtility所依賴的Python庫,最后點擊do_pack_by_pyinstaller.bat重新生成NXP-MCUBootUtility.exe可執行文件。

Note4: 必須使用Python2 x86版本去打包NXP-MCUBootUtility,因為NXP-MCUBootUtility使用了pywinusb庫,該庫在Python2 x64版本下無法用PyInstaller打包,pywinusb作者沒有計划修復該問題。

1.3 安裝

  NXP-MCUBootUtility是一個是純綠色免安裝的工具,下載了源代碼包之后,直接雙擊\NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe即可使用。使用NXP-MCUBootUtility沒有任何軟件依賴,不需要額外安裝任何軟件。
  在NXP-MCUBootUtility.exe圖形界面顯示之前,會首先彈出一個控制台窗口,該控制台會伴隨着NXP-MCUBootUtility.exe圖形界面一起工作,很多圖形界面的操作都會在控制台窗口看到對應的底層命令執行,保留控制台主要是為了便於定位NXP-MCUBootUtility.exe的問題,目前NXP-MCUBootUtility尚處於早期階段,等后期軟件成熟會考慮移除控制台。

1.4 目錄

  NXP-MCUBootUtility軟件目錄組織如下:

\NXP-MCUBootUtility
                \apps                 --放置NXP官方評估板示例image文件
                \bin                  --放置NXP-MCUBootUtility可執行文件及用戶配置文件
                \doc                  --放置NXP官方安全啟動相關的參考文檔
                \env                  --放置用於安裝NXP-MCUBootUtility開發環境以及打包腳本
                \gen                  --放置NXP-MCUBootUtility使用過程中生成的臨時文件
                      \bd_file            --根據配置動態生成的BD文件
                      \bee_crypto         --BEE加密過程中生成的文件
                      \bootable_image     --生成的bootable image文件
                      \dcd_file           --生成的DCD數據文件
                      \hab_cert           --HAB簽名過程中生成的文件
                      \hab_crypto         --HAB加密過程中生成的文件
                      \json_file          --根據配置動態生成的JSON文件
                      \log_file           --保存軟件操作記錄日志
                      \otfad_crypto       --OTFAD加密過程中生成的文件
                      \sb_image           --生成的.sb格式文件
                      \user_file          --軟件運行過程中緩存的臨時文件
                \gui                  --放置開發NXP-MCUBootUtility UI構建工程文件
                \img                  --放置NXP-MCUBootUtility使用過程中需加載的圖片
                \src                  --放置開發NXP-MCUBootUtility的所有Python源代碼文件
                \tools                --放置NXP-MCUBootUtility使用過程中需調用的外部程序
                      \blhost             --與Flashloader通信的上位機命令行工具
                      \cst                --HAB加密的配套命令行工具
                      \elftosb            --生成bootable image的命令行工具
                      \ide_utils          --各IDE提供的image格式轉換工具
                      \image_enc          --BEE加密的配套命令行工具
                      \imgutil            --生成DCD數據的命令行工具
                      \openssl            --生成證書和秘鑰的標准工具
                      \sdphost            --與ROM通信的上位機命令行工具

1.5 界面

  下圖為NXP-MCUBootUtility工具的主界面,界面主要由六部分組成,各部分功能如下:

NXP-MCUBootUtility_mainWin_e

  • 【Menu Bar】:功能菜單欄,提供軟件通用設置。
  • 【Target Setup】:目標設備設置欄,提供MCU Device和Boot Device配置選項。
  • 【Port Setup】:串行接口設置欄,選擇用於連接MCU Device的接口。
  • 【Device Status】:目標設備狀態信息欄,當連接上目標設備之后,用於顯示目標設備的狀態。
  • 【Secure Boot Action】:安全加密啟動主界面,提供對目標設備做安全加密啟動的所有操作。
  • 【Log Info】:操作日志欄,記錄軟件操作日志。

2 准備工作

  在使用NXP-MCUBootUtility工具前主要有兩個准備工作:一、准備好i.MXRT硬件板以及串行下載連接線(USB/UART);二、准備好用於下載進Flash的源image文件。
  關於串行下載線連接,需要查看i.MXRT參考手冊System Boot章節,確保連接的UART/USB引腳是BootROM指定的。
  關於源image文件准備,NXP-MCUBootUtility工具能夠識別五種常見格式(elf/axf/srec/hex/bin)的image,源image既可以包含i.MXRT加載啟動頭(IVT, BootData等),也可以不包含這些i.MXRT加載啟動頭。如果源image中不包含這些啟動頭,NXP-MCUBootUtility會自動添加文件頭。
  以NXP官方SDK為例進一步講解源image文件的生成,注冊並登錄NXP官網,來到 MCUXpresso SDK Builder 頁面,選擇合適的MCU芯片以及IDE(以RT1060芯片,IAR IDE為例)並點擊Download SDK后便可得到SDK_2.4.0_EVK-MIMXRT1060.zip。
  使用IAR打開SDK包里的\boards\evkmimxrt1060\demo_apps\led_blinky\iar\led_blinky.eww示例應用:

NXP-MCUBootUtility_sdkProjectBuilds_e

  led_blinky應用其實包含了三個工程(ram/flexspi_nor/sdram),分別對應三個不同的linker文件(.icf),其中ram工程生成的image即是所謂的Non-XIP image,flexspi_nor工程生成的image即是所謂的XIP image。
  默認情況下,ram工程和flexspi_nor工程生成的image文件是無法直接為NXP-MCUBootUtility所用的,需要做一些小小的改變。
  ram工程需要修改linker文件如下:(推薦從0x3000開始鏈接中斷向量表,中斷向量表前面預留一段內存用於放置i.MXRT加載啟動所需的文件頭)。

define symbol m_interrupts_start       = 0x00003000;   // 0x00000000
define symbol m_interrupts_end         = 0x000033FF;   // 0x000003FF

define symbol m_text_start             = 0x00003400;   // 0x00000400
define symbol m_text_end               = 0x0001FFFF;

define symbol m_data_start             = 0x20000000;
define symbol m_data_end               = 0x2001FFFF;

define symbol m_data2_start            = 0x20200000;
define symbol m_data2_end              = 0x202BFFFF;

  flexspi_nor工程需要修改工程配置選項里的Defined symbols如下:(將XIP_BOOT_HEADER_ENABLE設為0,即不需要生成包含i.MXRT加載啟動文件頭的image; 如果保持XIP_BOOT_HEADER_ENABLE為1不變,那么生成的可執行image文件會包含i.MXRT加載啟動文件頭)。

NXP-MCUBootUtility_sdkProjectOptions

  如果只是為了快速驗證NXP-MCUBootUtility工具,在NXP-MCUBootUtility\apps文件夾下默認存放了全系列恩智浦官方i.MXRT評估板的led_blinky應用的image文件。

3 軟件使用

3.1 設置目標設備

  在使用NXP-MCUBootUtility時首先需要配置目標設備,目標設備包括MCU Device和Boot Device。以NXP官方開發板EVK-MIMXRT1060為例,該開發板主芯片為i.MXRT1062DVL6A,所以【MCU Device】應設為i.MXRT106x。且以最常用的FlexSPI NOR啟動為例,【Boot Device】設為FLEXSPI NOR,開發板上對應的外部存儲芯片為IS25WP064AJBLE,其是一顆常用的四線QSPI NOR Flash,我們需要在軟件里進一步配置該Boot Device,單擊【Boot Device Configuration】按鈕可彈出如下新的配置頁面:

NXP-MCUBootUtility_flexspiNorCfgWin_e

  在彈出的名為FlexSPI NOR Device Configuration頁面里可以看到很多描述Multi-IO SPI NOR Flash特性的選項,比如Device Type、Query Pads等,這些選項都需要被正確地設置,以與開發板上的外部存儲芯片相匹配。
  除此以外,頁面上還有一個名為【Use Typical Device Model】的選項,NXP-MCUBootUtility軟件預先定義了一些常用的Multi-IO SPI NOR Flash型號模型,如果開發板上的外部存儲芯片恰好在軟件預定義的型號列表里,那么你可以直接在【Use Typical Device Model】選擇對應型號,而不必在Nor Option里逐一配置。
  EVK-MIMXRT1060開發板上的IS25WP064AJBLE芯片屬於ISSI - IS25LP064A大類,因此我們只需要在【Use Typical Device Model】選擇ISSI - IS25LP064A並點擊【Ok】即完成了目標設備的設置。

3.2 連接目標設備

  設置好目標設備之后,下一步便是連接目標設備,以USB-HID接口連接為例,給EVK-MIMXRT1060板子供電,並用USB Cable將PC與J9口連接起來,如果一切正常,應該可以在設備管理器找到vid,pid為0x1fc9,0x0135的HID-compliant vendor-defined device設備被枚舉。如果沒有發現該HID設備,請仔細檢查板子SW7撥碼開關是否將Boot Mode設為2'b01即Serial Downloader模式。

NXP-MCUBootUtility_usbhidDetected_e

  確認HID設備存在之后,在【Port Setup】選中USB-HID,然后直接點擊【Connect to ROM】按鈕,此時軟件便會自動完成目標設備連接全過程(使用sdphost連接ROM,獲取一些MCU內部寄存器信息,使用sdphost加載Flashloader並跳轉過去,使用blhost連接Flashloader,獲取一些eFuse信息,使用blhost去配置boot device並獲取boot device meomry信息),這個過程需要大概5s的時間,如果目標設備連接正常,你可以看到指示燈變藍,並且【Connect to ROM】按鈕標簽變為【Reset Device】。如果目標設備連接失敗,指示燈會變紅,並且【Connect to ROM】按鈕標簽變為【Reconnect】。

NXP-MCUBootUtility_connectedToDevice_e

  目標設備連接成功后可以在目標設備狀態信息欄看到一些有用的設備狀態信息,比如MCU芯片的UUID值、HAB狀態、與啟動相關的重要Fuse值,Boot Device的Page/Sector/Block大小等。

3.3 安全加密啟動

  確保菜單欄Tools/Generate .sb file選項勾選的是"No",目標設備連接成功后便可以開始最核心的安全加密啟動操作,在做安全加密啟動之前先來介紹安全加密啟動主界面分布:

NXP-MCUBootUtility_secboot0_intro_e

  • 【Image Generation Sequence】:image生成窗口,用於對源image進行加密安全處理,生成可放在Boot Device中的bootable image
  • 【Image Loading Sequence】:image下載窗口,用於將生成的bootable image下載進Boot Device中,並且在MCU中燒錄相應的Fuse值(各種Key,HAB設置等)
  • 【eFuse Operation Utility】:eFuse回讀與燒錄窗口,用戶可燒錄自定義值進Fuse Region。
  • 【Boot Device Memory】:image回讀與標注顯示窗口,用於從Boot Device回讀已下載的Bootable image數據,並對數據組成各部分進行標注
  • 【Secure Boot Type】:安全加密模式選擇,選擇想要安全模式(不使能安全,HAB單簽名,HAB簽名加密,BEE加密)。
  • 【All-In-One Action】:一鍵操作,image生成窗口和image下載窗口里激活的操作自動按序執行
3.3.1 模式一:不啟用任何安全措施

  第一種模式是最簡單的模式,即不啟動任何安全措施,一般用於產品開發調試階段。
  【Secure Boot Type】選擇“DEV Unsigned Image Boot”,然后點擊【Browse】按鈕選擇一個原始image文件(使用IDE生成的裸image文件即可,不需要包含任何i.MXRT啟動所需的額外文件頭),點擊【All-In-One Action】按鈕即可完成bootable image生成與下載所有操作。

Note: 軟件如果設置為Auto-detect image format選項,則根據文件后綴名自動識別源文件格式。但是對於MCUXpresso或者GCC生成的axf文件,需要主動設置為".out(axf) from MCUXpresso/GCC ARM"。

NXP-MCUBootUtility_secboot1_unsigned

  上圖中Step4和Step5並不是必需操作,僅是用於確認【All-In-One Action】按鈕操作是否成功,尤其是Step5操作,可以對應image下載窗口里顯示的Bootable image構成圖做一遍檢查。
  一切操作無誤,板子上SW7撥碼開關將Boot Mode設為2'b10即Internal Boot模式,其余保持全0,重新上電便可以看到unsigned image正常執行了。

3.3.2 模式二:啟用HAB簽名認證

  第二種模式是初級的安全模式,即僅對image進行簽名認證,一般用於對產品安全性要求較高的場合。簽名認證主要是對image合法性進行校驗,檢測image是否被異常破壞或篡改,如果檢測發現image不合法,那么MCU便不會啟動執行該image。
  【Secure Boot Type】選擇“HAB Signed Image Boot”,然后輸入serial(必須是8位數字)以及key_pass(任意長度字符)后點擊【Advanced Cert Settings】按鈕配置所有簽名認證的參數(熟悉 NXP官方HAB Code Signing Tool工具 使用的朋友應該對這些設置很熟悉),再點擊【Browse】按鈕選擇一個原始image文件,最后點擊【All-In-One Action】按鈕即可完成bootable image生成與下載所有操作。

NXP-MCUBootUtility_secboot2_signed

  上圖中Step5主要確認兩點:一、HAB狀態是否是Closed的(Fuse 0x460[31:0]的bit1為1'b1);二、SRKH是否被正確燒錄(Fuse 0x580 - 0x5f0,一共256bit,即sha-256算法),SRKH是最終bootable image里CSF數據里的Public RSA Key的Hash值,用於校驗Public RSA Key是否合法。
  一切操作無誤,板子上SW7撥碼開關將Boot Mode設為2'b10即Internal Boot模式,其余保持全0,重新上電便可以看到HAB signed image正常執行了。
  因為此時MCU芯片HAB狀態已經是Closed,並且SRKH已經被燒錄無法更改,所以未經簽名認證的image無法正常運行,在軟件目錄\NXP-MCUBootUtility\tools\cst\crts文件夾下存放着Private RSA Key文件,請妥善保存好,一旦遺失,那么新的image將無法被正確簽名從而導致HAB認證失敗無法被啟動執行。

3.3.3 模式三:啟用HAB簽名認證與HAB加密

  第三種模式是中級的安全模式,即對image進行簽名認證以及HAB級加密,一般用於對產品安全性要求很高的場合。簽名認證主要是對image合法性進行校驗,而加密則可以保護image在外部Boot Device中不被非法盜用,因為在外部Boot Device中存放的是image的密文數據,即使被非法獲取也無法輕易破解,並且加密是和MCU芯片綁定的,因為HAB加密過程中使用了MCU內部SNVS模塊里的唯一Master Secret Key。
  【Secure Boot Type】選擇“HAB Encrypted Image Boot”,然后配置所有簽名認證的參數(如果本地已有證書,可以不用配置,軟件會嘗試復用),再點擊【Browse】按鈕選擇一個原始image文件,最后點擊【All-In-One Action】按鈕即可完成bootable image生成與下載所有操作。

NXP-MCUBootUtility_secboot3_hab_encrypted

  上圖中Step6操作之后可以看到下載進Boot Device里的image部分確實是密文,實際上HAB加密僅支持加密image區域,其他區域(比如FDCB、IVT、Boot Data等)均沒有加密。
  一切操作無誤,板子上SW7撥碼開關將Boot Mode設為2'b10即Internal Boot模式,其余保持全0,重新上電便可以看到HAB signed encrypted image正常執行了。
  你可能會好奇,既然image是經過HAB加密的,那么密碼在哪里?怎么設置的?其實image加密操作完全被HAB配套工具封裝好了,HAB加密使用的AES-128算法,其對應的128bits的AES-128 Key不是由用戶自定義的,而是HAB加密工具自動隨機生成的,並且每一次加密操作生成的AES-128 Key都是不一樣的,即使你沒有更換輸入的原始image。AES-128 Key保存在\NXP-MCUBootUtility\gen\hab_crypto\hab_dek.bin文件里。
  從上圖中image下載窗口里顯示的Bootable image構成圖里可以看出,相比HAB單簽名的方式,HAB簽名加密方式最終使用的Bootable image的最后多了一個DEK KeyBlob組成部分,這個DEK KeyBlob是通過MCU芯片內部SNVS模塊里的Master Secret Key對hab_dek.bin里的key數據進行動態加密生成的,因為Master Secret Key是芯片唯一的,因此DEK KeyBlob也是芯片唯一的,這是保護image不被非法盜用的關鍵。
  關於HAB加密為何不支持XIP Image,其實簡單分析一下啟動原理便清楚,Image在Boot Device里存儲的是密文,這部分密文必須要經過HAB解密成明文才可以被CPU執行,因此必須要指定不同的存儲空間去存放Image明文,Non-XIP image天然指定了明文應存放在芯片內部SRAM或者外掛SDRAM中,而XIP Image是在Boot Device中直接執行的,一般明文地址與密文地址是相同的,因此HAB加密不支持XIP Image。

3.3.4 模式四:啟用單引擎BEE加密(唯一SNVS Key)

  第四種模式是高級的安全模式,即用唯一SNVS Key對image進行單引擎BEE級加密,一般用於對產品安全性要求極高的場合。BEE加密與HAB加密的主要區別是執行解密操作的主體不同,主要有如下三點區別:

  • HAB加密是由BootROM里的HAB將加密后的image全部解密成明文另存后再執行(靜態解密),而BEE加密是由MCU芯片內部的BEE模塊對加密的image進行解密后再執行(如果是XIP image,則是原地邊解密邊執行(動態解密);如果是Non-XIP Image,則解密執行流程與HAB加密類似)。
  • HAB加密僅支持Non-XIP Image(不限Boot Device),而BEE加密僅支持在FlexSPI NOR中啟動的Image(不限XIP/Non-XIP)。
  • HAB加密區域不可指定(默認全部用戶Image區域),而BEE加密的區域可由用戶指定。

NXP-MCUBootUtility_secboot4_bee_encrypted_fixed_key

  【Secure Boot Type】選擇“BEE Encrypted Image Boot”,然后配置所有簽名認證的參數(如果本地已有證書,可以不用配置,軟件會嘗試復用),再點擊【Browse】按鈕選擇一個原始image文件(必須是XIP在FlexSPI NOR中的image),【Key Storage Region】選擇“Fixed Otpmk(SNVS) Key”后點擊【Advanced Key Settings】按鈕配置所有BEE加密的參數,最后點擊【All-In-One Action】按鈕即可完成bootable image生成與下載所有操作。
  上圖中Step6操作主要確認一點:BEE_KEY0_SEL是否設置的是From OTPMK[255:128](Fuse 0x460[31:0]的bit13,12為2'b10)。Step7操作之后可以看到下載進Boot Deivce里的Bootable image從IVT開始全是密文,本示例僅啟用一塊加密區域,具體對哪些區域進行加密是在【Advanced Key Settings】里指定的,最大支持指定3塊加密區域。
  有必要對如下使用Fixed Otpmk(SNVS) Key加密的BEE參數設置頁面再做一下介紹,主要是設置Region Count以及指定Region范圍,默認為0即自動對整個image區域進行加密。

NXP-MCUBootUtility_fixedSnvsKeyWin

  一切操作無誤,板子上SW7撥碼開關將Boot Mode設為2'b10即Internal Boot模式,並且將BT_CFG[1]設為1'b1(使能Encrypted XIP),其余保持全0,重新上電便可以看到BEE encrypted image正常執行了。
  BEE加密相比HAB加密是要更安全的,因為HAB加密畢竟僅能靜態解密,當HAB解密完成之后在SRAM/SDRAM中存儲的是全部的image明文,如果此刻黑客去非法訪問SRAM/SDRAM是有可能獲取全部image明文的(不過也不用擔心,i.MXRT可以設置JTAG訪問權限);而BEE加密可以是動態解密,CPU執行到什么地方才會去解密什么地方,任何時候都不存在完整的image明文,黑客永遠無法獲取全部的image明文。

3.3.5 模式五:啟用雙引擎BEE加密(用戶自定義Key)

  第五種模式是頂級的安全模式,即用用戶自定義Key對image進行雙引擎BEE級加密,跟第四種模式(單引擎)原理類似,一般用於對產品安全性要求最高的場合。單引擎BEE加密與雙引擎BEE加密具體區別如下:

  • 唯一SNVS Key單引擎BEE加密默認使用SNVS Key,芯片出廠已預先燒錄,無法更改;用戶自定義Key雙引擎BEE加密使用的Key是由用戶自己設的,需要手動燒錄在Fuse SW_GP2和GP4區域。
  • 唯一SNVS Key單引擎BEE加密只啟用了BEE引擎0;用戶自定義Key雙引擎BEE加密可以同時啟用BEE引擎0和引擎1。但需要注意的是無論啟動幾個BEE引擎,最大加密區域總數均是3個。
  • 唯一SNVS Key單引擎BEE加密必須要配合HAB簽名一起使用,因為只有在HAB Closed的狀態下才能獲取SNVS Key;用戶自定義Key雙引擎BEE加密不一定要使用HAB簽名。

NXP-MCUBootUtility_secboot5_bee_encrypted_flexible_key

  【Secure Boot Type】選擇“BEE Encrypted Image Boot”,【Enable Certificate For BEE Encryption】選擇是否要使能HAB簽名,然后點擊【Browse】按鈕選擇一個原始image文件(必須是XIP在FlexSPI NOR中的image),【Key Storage Region】選擇“Flexible User Keys”后點擊【Advanced Key Settings】按鈕配置所有BEE加密的參數,最后點擊【All-In-One Action】按鈕即可完成bootable image生成與下載所有操作。
  上圖中Step6操作主要確認兩點:一、BEE_KEY0_SEL是否設置正確(Fuse 0x460[31:0]的bit13,12)和BEE_KEY1_SEL是否設置正確(Fuse 0x460[31:0]的bit15,14);二、用戶Key是否被正確燒錄(SW_GP2: Fuse 0x690 - 0x6c0,GP4: Fuse 0x8c0 - 0x8f0)或鎖住。
  有必要對如下使用Flexible User Keys加密的BEE參數設置頁面再做一下介紹,首先是選擇要激活的BEE引擎,可以單獨激活BEE引擎0,也可以單獨激活BEE引擎1,當然更可以同時激活BEE引擎0和1,本示例同時激活BEE引擎0和1。指定了BEE引擎后需要進一步為該引擎配置加密所使用的Key的存儲空間以及需要用戶手動輸入Key(128bits)。最后還需要設置加密保護的區域,本示例共使能加密2個區域,分別為0x60001000 - 0x60001fff(由BEE引擎0保護),0x60003000 - 0x60003fff(由BEE引擎1保護)。

NXP-MCUBootUtility_flexibleUserKeysWin

  為了確認image是否按指定區域加密,你可以打開\NXP-MCUBootUtility\gen\bootable_image\文件夾下面生成的未加密bootable image文件與image回讀窗口里的內容進行比對。
  一切操作無誤,板子上SW7撥碼開關將Boot Mode設為2'b10即Internal Boot模式,並且將BT_CFG[1]設為1'b1(使能Encrypted XIP),其余保持全0,重新上電便可以看到BEE encrypted image正常執行了。
  雙引擎BEE加密是將用戶自定義的Key燒錄進了Fuse SW_GP2/GP4區域里,但該區域的Fuse內容是可以回讀的,如果黑客拿到Key,還是有可能破解存在外部Boot Device里的image密文,有沒有對Fuse SW_GP2/GP4區域進行保護的方法?當然有,你可以對指定的Fuse區域進行加鎖,可設置Fuse區域訪問權限(讀保護,寫保護,覆蓋保護),具體后面有單獨章節詳細介紹。NXP-MCUBootUtility工具為了安全考慮,直接將SW_GP2/GP4區域鎖了起來。
  雙引擎BEE加密相比單引擎BEE加密,從破解角度來說難度加倍,畢竟可以啟用兩組不同的Key來共同保護image不被非法獲取。

3.3.6 模式六:啟用單重OTFAD加密(唯一SNVS Key)

  第六種模式是頂級的安全模式,即用唯一SNVS Key對image進行單重OTFAD級加密,該模式與單引擎BEE加密(唯一SNVS Key)是類似的,只是早期i.MXRT芯片(比如i.MXRT105x)的FlexSPI配套硬件加解密模塊是BEE,而后期i.MXRT芯片(比如i.MXRT1011)的FlexSPI配套硬件加解密模塊升級為OTFAD。
  相比於BEE模塊,OTFAD模塊在加解密效率上提升了很多,並且提供了更加強大的加解密模式。關於OTFAD強大的加解密模式在下一節雙重OTFAD加密模式中會進一步介紹。

3.3.7 模式七:啟用雙重OTFAD加密(用戶自定義Key)

  第七種模式是頂級的安全模式,即用用戶自定義Key對image進行雙重OTFAD級加密,前一節講了OTFAD是BEE的升級,那么我們就來比較一下雙重OTFAD加密與雙引擎BEE加密區別:

  • 雙引擎BEE加密最多可設3個加密區間,這3個加密區間最多僅能由2組用戶密鑰來保護;而雙重OTFAD加密最多可設4個加密區間,每個加密區間均可設獨立的用戶密鑰,並且所有的用戶密鑰還由一個全局密鑰來保護。
  • 雙引擎BEE加密的用戶密鑰是直接存在efuse里的;而雙重OTFAD加密存在efuse里的全局密鑰可引入擾亂算法來保護。

  從軟件操作流程上來說,雙重OTFAD加密與雙引擎BEE加密是類似的,只是密鑰配置窗口有差別,我們打開OTFAD的密鑰配置窗口看一下:

NXP-MCUBootUtility_flexibleUserKeysWin_otfad

  kek即全局密鑰,kek是存放在efuse里的;用戶密鑰個數與保護區間一致,所有用戶密鑰均在OTFAD DEK KeyBlob,KeyBlob是存放在外部NOR Flash里的,kek就是用來保護OTFAD DEK KeyBlob的。

3.4 生成.sb格式文件

  在菜單欄Tools/Generate .sb file選項里勾選"Yes",此時點擊【All-In-One Action】按鈕便會在\NXP-MCUBootUtility\gen\sb_image\目錄下生成.sb格式的文件,該文件可用於MfgTool或者RT-Flash工具中。注意此時【All-In-One Action】按鈕並不會在MCU上真正地執行3.3節里的各種操作,而只是將所有命令操作記錄在\NXP-MCUBootUtility\gen\bd_file\imx_application_sb_gen.bd里,最終用於生成.sb格式文件。

NXP-MCUBootUtility_setGenerateSbFile

Note1: .sb格式文件生成有一個限制,即每次生成新.sb文件均需要重新連接,點擊【Reset device】按鈕后回到初始連接狀態,然后點擊【Connect to ROM】按鈕。
Note2: 當.sb文件中包含必要的efuse操作時,會一次性生成3個.sb格式文件,其中application_device.sb包含全部的操作(flash+efuse操作),application_device_flash.sb僅包含flash操作,application_device_efuse.sb僅包含efuse操作,這樣做的目的是為了方便工廠量產。
Note3: 對於NOR Flash(FlexSPI NOR、LPSPI NOR)型的啟動設備生成.sb文件而言,既可連接板子在線操作(推薦),也可以不用連接板子離線操作。
Note4: eFuse Operation Utility窗口里的【Scan】、【Burn】按鈕可用於生成僅含自定義efuse操作的.sb文件,需要先點【Scan】按鈕,然后填入想燒寫的efuse值,最后再點【Burn】按鈕便可在\NXP-MCUBootUtility\gen\sb_image\下生成burn_efuse.sb文件。

4 軟件進階

  NXP-MCUBootUtility軟件打開默認工作在Entry Mode下,可通過功能菜單欄Tools->Option選擇進入Master Mode,在Master模式下開放了一些高級功能,適用於對NXP MCU芯片以及Boot ROM非常熟悉的用戶。

NXP-MCUBootUtility_setToolRunMode

4.1 分步連接設備

  進入Master模式下,可以不勾選One Step選項,這樣可以單步去連接目標設備,單步連接的主要意義在於,可以在不配置Boot Device的情況下僅連接到Flashloader去實現eFuse操作。

NXP-MCUBootUtility_nonOneStepConnection

4.2 專用eFuse燒寫器

  進入Master模式下,可以看到eFuse全部區域都開放了,你可以任意燒寫指定的eFuse區域。eFuse操作是按bit一次性的(類似熔絲燒斷),只能將0燒寫成1,燒錄成1之后便無法更改,所以eFuse的操作需要特別謹慎。

NXP-MCUBootUtility_fuseUnderMasterMode

  在上一章節安全加密啟動過程中,我們會燒錄SRKH(0x580 - 0x5f0)、SW_GP2(0x690 - 0x6c0)、GP4(0x8c0 - 0x8f0),這些區域一經燒錄便不得更改,甚至我們希望這些區域不僅不能被更改,也要不能被回讀。

NXP-MCUBootUtility_fuseLockerBits

  從上圖可知eFuse 0x400即是各Fuse功能區域的Locker,我們可以通過燒錄eFuse 0x400來鎖住SW_GP2, GP4區域。那么如何燒錄呢?其實非常簡單,直接在各eFuse框內填寫想要燒錄的值,點擊【Burn】按鈕即可。

  對於一些混合功能的eFuse區域,除了可以在對應框內直接填寫想要燒錄的值外,也可以點擊索引按鈕,在彈出的界面里編輯:

NXP-MCUBootUtility_fuseViewer

4.3 專用FlexRAM編程器

  進入Master模式下,可以點擊【Read】、【Write】、【Execute】按鈕實現FlexRAM的任意讀/寫/執行操作,這樣可以將NXP-MCUBootUtility工具當做專用FlexRAM編程器。

NXP-MCUBootUtility_flexramProgrammer

4.4 通用Flash編程器

  進入Master模式下,可以點擊【Read】、【Erase】、【Write】按鈕實現已配置Flash的任意讀/擦/寫操作,這樣可以將NXP-MCUBootUtility工具當做通用Flash編程器。

NXP-MCUBootUtility_flashProgrammer


免責聲明!

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



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