飛凌i.MX RT系列外置Flash加密爲您的產品安全保駕護航

一、背景

NXP宣佈推出i.MX RT系列處理器,內核基於 Arm-Cortex M7,運行主頻高達600MHz,3020的coremark跑分,令人咋舌。i.MX RT1020/1050/1060系列MCU沒有片內FLASH,從而可以讓用戶根據實際需要靈活搭配不同容量、不同廠家的外置FLASH 存儲器。飛凌嵌入式剛剛發佈的OK1061-S、OK1052-C採用的是4MB/16MB串行NorFlash,QSPI接口。使用外置FLASH的方案,也不用擔心裏面的程序有被竊取的風險,這些問題,NXP在設計芯片之初,都已經考慮在內。下面我們來了解一下,如何給外置Falsh進行加密。

二、我們來介紹一下Flash加密的幾種方法:

1、HAB(High-Assurance Boot)簽名認證

這種模式,並不是對Falsh中的image進行加密,而是對燒寫到Flash中的image進行合法性認證,檢測image是否被惡意破壞或篡改,如果檢測到image未經授權,即不合法,則MCU便不會執行該image。

我們使用非對稱加密來實現HAB功能。加密工具會生成私鑰和相應的公鑰對。然後私鑰用於加密我們想要發佈的鏡像,此加密爲鏡像生成唯一標識符,稱爲證書。公鑰也附加到鏡像上。在程序啓動時,公鑰用於解密證書。用於檢查比較證書和鏡像是否匹配。只有當證書和鏡像匹配時,鏡像才被視爲“受信任”。否則,鏡像被視爲“不安全”,不允許加載和運行。此過程稱爲身份驗證。***只能訪問公鑰,根據非對稱加密的屬性,私鑰不能從中推斷出來。如果沒有私鑰,***就無法爲其惡意鏡像附加有效證書。我們將公鑰的摘要值(哈希)燒錄到RT芯片的eFuses。一旦燒寫,就無法修改。這可以防止***使用另一對私鑰和公鑰作弊的可能性。

下面我們通過圖標來簡單描述一下此過程。

1)產生公鑰私鑰,並且將公鑰摘要值燒寫到efuse:

f_68660e51d1ef4758ae8c8fcd0aafd571&t=jpg&o=&s=&v=1583577198

 

2)使用私鑰對鏡像摘要加密生成鏡像證書:

f_aa75b72bb6de3b83d08e4af639ba66f9&t=jpg&o=&s=&v=1583577188

3)安全啓動時,對鏡像證書進行認證的過程:

f_febc19d5603f6a343100ff94c354bc59&t=jpg&o=&s=&v=1583577179

 

上圖中,一個正常做過簽名的鏡像文件在flash存在形式應該是由image(包括ivt,bootdata、dcd和應用image),HABdata(包括Public Key、Certificate和CSF)兩部分組成,如圖:

f_1f808a2deab2cbc5d92c1ae5775a56ec&t=jpg&o=&s=&v=1583577168

 

系統啓動時,MCU內部ROM的BootLoader啓動程序主要進行如下工作:

1) 將flash中image摘要進行HASH運算生產一個摘要值;

2) 使用已經在efuse中的燒寫好的Public Key的摘要值與flash中的Public Key進行匹配,如果匹配成功,則進行下一步。

3) 使用Public Key解密flash中證書Certificate,得到鏡像摘要值與第一步中生成的鏡像摘要值進行比對,如果比對成功則說明鏡像合法。

2、加密啓動(HAB簽名認證與HAB加密)

加密啓動是簽名認證與加密的組合啓動。

這種模式屬於中級安全模式,簽名認證是對iamge合法性驗證,而HAB加密就是對flash中的用戶image明文通過加密算法轉換爲密文。HAB加密使用的AES-128算法,其對應的128bits的AES-128 Key不是由用戶自定義的,而是HAB加密工具自動隨機生成的,並且每一次加密操作生成的AES-128 Key都是不一樣的,即使你沒有更換輸入的原始image。我們的image實際就是使用AES-128 Key這把鑰匙進行加密的,我們稱這把鑰匙爲:DEK(Data Encryption Key),這把鑰匙存在於加密工具所在的PC機。既然DEK每一次都不一樣而且存在於個人電腦中,那麼MCU在啓動的時候是怎麼找到這把鑰匙解密的呢?對,我們需要把這把鑰匙的信息附加在image裏面,燒寫到flash中,待到啓動的時候MCU的bootLoder程序會先把鑰匙從image中取出來。那麼問題來了,既然bootLoder能夠取出鑰匙,那麼作爲***的你我能不能也讀出flash中的image取出DEK呢,當然沒那麼簡單,因爲這塊存儲DEK的區域也是經過加密的,想要取出DEK還需要另一把鑰匙Master Secret Key,該鑰匙用於創建密鑰的加密區域blob(DEK blob),這把鑰匙只能由MCU內部的DCP或BEE訪問。這意味着每個芯片的blob是唯一的。在啓動引導時,blob以這樣的方式封裝,即只有i.MX RT上的DCP才能訪問DEK。下面的這個圖顯示了加密解密的過程:

f_3f364258146057a37155947aed956079&t=jpg&o=&s=&v=1583577139

 

所以一個做過加密啓動的鏡像存在與flash中應該是組織結構:

f_2959151a43c0da82bd810ecc0b7a9881&t=jpg&o=&s=&v=1583577116

 

3、加密XIP(單引擎/雙引擎BEE加密)

i.MX RT boot rom支持串行nor flash上的XIP(Execute-In-Place,在flash本地執行代碼),直接使用BEE控制器提供的動態解密功能(使用aes-ctr-128或aes-ecb-128加密算法)。在執行加密XIP之前,引導ROM需要正確設置BEE控制器,這些配置參數存儲在保護區域描述符塊prdb中,而整個prdb使用aes-cbc-128模式加密,這個用於加密prodb的aes密鑰存儲在密鑰信息塊(kib)中,而kid使用efuse中提供的aes密鑰加密爲ekib)。整個或部分軟件圖像使用自定義的私鑰(pvk)加密(然後將密鑰燒錄到片上efuse塊中),這個密鑰被限制爲僅能使用qspi解密引擎(bee)訪問。在ROM代碼初始化BEE塊之後的引導過程中,存儲在qspi flash中的加密和未加密的數據可以被動態訪問。每個芯片都可以使用一個唯一的密鑰來加密程序鏡像,因此每個鏡像只能用正確的密鑰在芯片上引導,從而防止鏡像盜用。

i.MX RT內部有兩個BEE加密引擎分別爲BEE引擎0和BEE引擎1,所以BEE加密又分爲單引擎加密和雙引擎加密。

單引擎加密:通過上面的描述中我們知道,BEE加密使用用戶自定義的密鑰進行加密,加密時將該密鑰燒錄到MCU內部的efuse中,其實,也可以使用MCU內部的SVNS Key作爲密鑰,該密鑰在芯片出廠時已預先燒錄,無法更改,具有高級別訪問權限,只能由內部DCP或BEE模塊訪問。

單引擎加密可以自定義設置加密區域和選擇BEE加密引擎(使用 SVNS Key作爲密鑰時只能選擇引擎0,使用自定義密鑰時,即可選擇引擎0也可選擇引擎1)。在加密過程中,加密工具會將這些配置信息存儲到prdb塊中。密鑰信息存儲在kib信息塊中。

雙引擎加密:雙引擎加密使用兩個用戶自定義的密鑰,分別賦予引擎0和引擎1使用,用戶可以分別自定義設置他們的加密區域,加密時加密工具會將這些信息分別存儲在prdb0和prdb1中。密鑰信息存儲在kib0和kib1中。

下面簡單看一下解密流程:

f_07d801e595f146cddcebf54c5e37901b&t=jpg&o=&s=&v=1583577107

 

 

BEE控制器通過讀取MCU內部efuse燒錄的用戶密鑰PVK,使用該PVK解密EKIB(Encrtpted KIB)密鑰信息塊,將其中的密鑰取出,用於解密EPRDB(Encrtpted PRDB),獲得BEE控制器的參數配置信息,BEE控制器通過此配置信息將密文image進行動態解密。

做過BEE加密的鏡像存在於flash中應該是這種組織結構:

f_4cb8113f1874c882323340fed6db521a&t=jpg&o=&s=&v=1583576997

三、總結

上面簡單介紹了一些關於Flash加密原理,現在我們總結一下一共有四中加密模式。

模式一:HAB簽名認證。

模式二:HAB簽名認證和HAB加密。

模式三:SNVS Key單引擎BEE加密。

模式四:用戶自定義Key單引擎BEE或雙引擎BEE加密。

這四種加密模式安全等級依次升高。其中HAB加密屬於靜態加密,是由片內ROM裏的Boot程序將加密後的密文image全部解密成明文image,copy到MCU內存ram中再執行,而BEE加密是由MCU芯片內部的BEE控制器對密文image進行邊解密邊執行,屬於動態加密(如果是Non-XIP Image,則解密執行流程與HAB加密類似)。






文章轉載至:飛凌嵌入式官網

https://www.forlinx.com/article-new-c22/346.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章