English | 中文html
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主要功能以下:python
- 支持i.MXRT全系列MCU,包含i.MXRT101五、i.MXRT102一、i.MXRT1051/105二、i.MXRT1061/106二、i.MXRT1064 SIP
- 支持UART和USB-HID兩種串行下載方式(COM端口/USB設備自動識別)
- 支持五種經常使用格式(elf/axf/srec/hex/bin)源image文件輸入並檢查其連接地址的合法性
- 源image文件既能夠是裸源image文件,也能夠是含啓動文件頭的bootable image文件
- 支持將裸源image文件自動轉換成i.MXRT能啓動的Bootable image
- 支持將裸源image文件自動轉換成MfgTool和RT-Flash工具能下載的.sb格式文件
- 支持下載Bootable image進主動啓動設備 - FlexSPI NOR、SEMC NAND接口Flash
- 支持下載Bootable image進備份啓動設備 - LPSPI接口NOR/EEPROM Flash
- 支持DCD配置功能,可用於加載image進SDRAM執行
- 支持用於開發階段的非安全加密啓動(未簽名加密)
- 支持基於HAB實現的安全加密啓動(單簽名,簽名和加密),證書自動備份
- 支持基於BEE實現的安全加密啓動(惟一SNVS key,用戶自定義key)
- 支持MCU芯片內部eFuse的回讀和燒寫操做(即專用eFuse燒寫器)
- 支持外部啓動設備的任意讀寫擦操做(即通用Flash編程器)
- 支持從外部啓動設備回讀Bootable image,並對其組成部分(NFCB/DBBT/FDCB/EKIB/EPRDB/IVT/Boot Data/DCD/Image/CSF/DEK KeyBlob)進行標註
NXP-MCUBootUtility徹底基於Python語言開發,而且源代碼所有開源,其具體開發環境爲Python 2.7.15 (32bit)、wxPython 4.0.三、pySerial 3.四、pywinusb 0.4.二、bincopy 15.0.0、PyAudio 0.2.十一、PyInstaller 3.3.1(或更高)。git
NXP-MCUBootUtility在發佈時藉助PyInstaller將全部的Python依賴所有打包進一個可執行文件(\NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe),所以若是不是對NXP-MCUBootUtility的二次開發,你不須要安裝任何Python軟件及相關庫。github
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》。web
Note2: 使用NXP-MCUBootUtility以前必須編譯\NXP-MCUBootUtility\tools\image_enc\code下面的源文件生成image_enc.exe,並將其放置在\NXP-MCUBootUtility\tools\image_enc\win,不然BEE加密相關功能沒法使用。具體步驟能夠參考這篇博客 《開啓NXP-MCUBootUtility工具的BEE加密功能 - 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做者沒有計劃修復該問題。緩存
NXP-MCUBootUtility是一個是純綠色免安裝的工具,下載了源代碼包以後,直接雙擊\NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe便可使用。使用NXP-MCUBootUtility沒有任何軟件依賴,不須要額外安裝任何軟件。
在NXP-MCUBootUtility.exe圖形界面顯示以前,會首先彈出一個控制檯窗口,該控制檯會伴隨着NXP-MCUBootUtility.exe圖形界面一塊兒工做,不少圖形界面的操做都會在控制檯窗口看到對應的底層命令執行,保留控制檯主要是爲了便於定位NXP-MCUBootUtility.exe的問題,目前NXP-MCUBootUtility尚處於早期階段,等後期軟件成熟會考慮移除控制檯。安全
NXP-MCUBootUtility軟件目錄組織以下:app
\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加密過程當中生成的文件 \log_file --保存軟件操做記錄日誌 \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通訊的上位機命令行工具
下圖爲NXP-MCUBootUtility工具的主界面,界面主要由六部分組成,各部分功能以下:
- 【Menu Bar】:功能菜單欄,提供軟件通用設置。
- 【Target Setup】:目標設備設置欄,提供MCU Device和Boot Device配置選項。
- 【Port Setup】:串行接口設置欄,選擇用於鏈接MCU Device的接口。
- 【Device Status】:目標設備狀態信息欄,當鏈接上目標設備以後,用於顯示目標設備的狀態。
- 【Secure Boot Action】:安全加密啓動主界面,提供對目標設備作安全加密啓動的全部操做。
- 【Log Info】:操做日誌欄,記錄軟件操做日誌。
在使用NXP-MCUBootUtility工具前主要有兩個準備工做:1、準備好i.MXRT硬件板以及串行下載鏈接線(USB/UART);2、準備好用於下載進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示例應用:
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工具,在NXP-MCUBootUtility\apps文件夾下默認存放了全系列恩智浦官方i.MXRT評估板的led_blinky應用的image文件。
在使用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】按鈕可彈出以下新的配置頁面:
在彈出的名爲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】即完成了目標設備的設置。
設置好目標設備以後,下一步即是鏈接目標設備,以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模式。
確認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】。
目標設備鏈接成功後能夠在目標設備狀態信息欄看到一些有用的設備狀態信息,好比MCU芯片的UUID值、HAB狀態、與啓動相關的重要Fuse值,Boot Device的Page/Sector/Block大小等。
確保菜單欄Tools/Generate .sb file選項勾選的是"No",目標設備鏈接成功後即可以開始最核心的安全加密啓動操做,在作安全加密啓動以前先來介紹安全加密啓動主界面分佈:
- 【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下載窗口裏激活的操做自動按序執行
第一種模式是最簡單的模式,即不啓動任何安全措施,通常用於產品開發調試階段。
【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"。
上圖中Step4和Step5並非必需操做,僅是用於確認【All-In-One Action】按鈕操做是否成功,尤爲是Step5操做,能夠對應image下載窗口裏顯示的Bootable image構成圖作一遍檢查。
一切操做無誤,板子上SW7撥碼開關將Boot Mode設爲2'b10即Internal Boot模式,其他保持全0,從新上電即可以看到unsigned image正常執行了。
第二種模式是初級的安全模式,即僅對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生成與下載全部操做。
上圖中Step5主要確認兩點:1、HAB狀態是不是Closed的(Fuse 0x460[31:0]的bit1爲1'b1);2、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認證失敗沒法被啓動執行。
第三種模式是中級的安全模式,即對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生成與下載全部操做。
上圖中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。
第四種模式是高級的安全模式,即用惟一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加密的區域可由用戶指定。
【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區域進行加密。
一切操做無誤,板子上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明文。
第五種模式是頂級的安全模式,即用用戶自定義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簽名。
【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操做主要確認兩點:1、BEE_KEY0_SEL是否設置正確(Fuse 0x460[31:0]的bit13,12)和BEE_KEY1_SEL是否設置正確(Fuse 0x460[31:0]的bit15,14);2、用戶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保護)。
爲了確認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不被非法獲取。
在菜單欄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格式文件。
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文件。
NXP-MCUBootUtility軟件打開默認工做在Entry Mode下,可經過功能菜單欄Tools->Option選擇進入Master Mode,在Master模式下開放了一些高級功能,適用於對NXP MCU芯片以及Boot ROM很是熟悉的用戶。
進入Master模式下,能夠不勾選One Step選項,這樣能夠單步去鏈接目標設備,單步鏈接的主要意義在於,能夠在不配置Boot Device的狀況下僅鏈接到Flashloader去實現eFuse操做。
進入Master模式下,能夠看到eFuse所有區域都開放了,你能夠任意燒寫指定的eFuse區域。eFuse操做是按bit一次性的(相似熔絲燒斷),只能將0燒寫成1,燒錄成1以後便沒法更改,因此eFuse的操做須要特別謹慎。
在上一章節安全加密啓動過程當中,咱們會燒錄SRKH(0x580 - 0x5f0)、SW_GP2(0x690 - 0x6c0)、GP4(0x8c0 - 0x8f0),這些區域一經燒錄便不得更改,甚至咱們但願這些區域不只不能被更改,也要不能被回讀。
從上圖可知eFuse 0x400便是各Fuse功能區域的Locker,咱們能夠經過燒錄eFuse 0x400來鎖住SW_GP2, GP4區域。那麼如何燒錄呢?其實很是簡單,直接在各eFuse框內填寫想要燒錄的值,點擊【Burn】按鈕便可。
進入Master模式下,能夠點擊【Read】、【Erase】、【Write】按鈕實現已配置Flash的任意讀擦寫操做,這樣能夠將NXP-MCUBootUtility工具當作通用Flash編程器。