i.MX RT系列外置Flash加密為您的產(chǎn)品安全保駕護(hù)航
一、背景
NXP宣布推出i.MX RT系列處理器,內(nèi)核基于 Arm-Cortex M7,運行主頻高達(dá)600MHz,3020的coremark跑分,令人咋舌。i.MX RT1020/1050/1060系列MCU沒有片內(nèi)FLASH,從而可以讓用戶根據(jù)實際需要靈活搭配不同容量、不同廠家的外置FLASH 存儲器。飛凌嵌入式剛剛發(fā)布的OK1061-S、OK1052-C采用的是4MB/16MB串行NorFlash,QSPI接口。使用外置FLASH的方案,也不用擔(dān)心里面的程序有被竊取的風(fēng)險,這些問題,NXP在設(shè)計芯片之初,都已經(jīng)考慮在內(nèi)。下面我們來了解一下,如何給外置Falsh進(jìn)行加密。
二、我們來介紹一下Flash加密的幾種方法:
1、HAB(High-Assurance Boot)簽名認(rèn)證
這種模式,并不是對Falsh中的image進(jìn)行加密,而是對燒寫到Flash中的image進(jìn)行合法性認(rèn)證,檢測image是否被惡意破壞或篡改,如果檢測到image未經(jīng)授權(quán),即不合法,則MCU便不會執(zhí)行該image。
我們使用非對稱加密來實現(xiàn)HAB功能。加密工具會生成私鑰和相應(yīng)的公鑰對。然后私鑰用于加密我們想要發(fā)布的鏡像,此加密為鏡像生成唯一標(biāo)識符,稱為證書。公鑰也附加到鏡像上。在程序啟動時,公鑰用于解密證書。用于檢查比較證書和鏡像是否匹配。只有當(dāng)證書和鏡像匹配時,鏡像才被視為“受信任”。否則,鏡像被視為“不安全”,不允許加載和運行。此過程稱為身份驗證。黑客只能訪問公鑰,根據(jù)非對稱加密的屬性,私鑰不能從中推斷出來。如果沒有私鑰,黑客就無法為其惡意鏡像附加有效證書。我們將公鑰的摘要值(哈希)燒錄到RT芯片的eFuses。一旦燒寫,就無法修改。這可以防止黑客使用另一對私鑰和公鑰作弊的可能性。
下面我們通過圖標(biāo)來簡單描述一下此過程。
1)產(chǎn)生公鑰私鑰,并且將公鑰摘要值燒寫到efuse:
2)使用私鑰對鏡像摘要加密生成鏡像證書:
3)安全啟動時,對鏡像證書進(jìn)行認(rèn)證的過程:
上圖中,一個正常做過簽名的鏡像文件在flash存在形式應(yīng)該是由image(包括ivt,bootdata、dcd和應(yīng)用image),HABdata(包括Public Key、Certificate和CSF)兩部分組成,如圖:
系統(tǒng)啟動時,MCU內(nèi)部ROM的BootLoader啟動程序主要進(jìn)行如下工作:
1) 將flash中image摘要進(jìn)行HASH運算生產(chǎn)一個摘要值;
2) 使用已經(jīng)在efuse中的燒寫好的Public Key的摘要值與flash中的Public Key進(jìn)行匹配,如果匹配成功,則進(jìn)行下一步。
3) 使用Public Key解密flash中證書Certificate,得到鏡像摘要值與第一步中生成的鏡像摘要值進(jìn)行比對,如果比對成功則說明鏡像合法。
2、加密啟動(HAB簽名認(rèn)證與HAB加密)
加密啟動是簽名認(rèn)證與加密的組合啟動。
這種模式屬于中級安全模式,簽名認(rèn)證是對iamge合法性驗證,而HAB加密就是對flash中的用戶image明文通過加密算法轉(zhuǎn)換為密文。HAB加密使用的AES-128算法,其對應(yīng)的128bits的AES-128 Key不是由用戶自定義的,而是HAB加密工具自動隨機(jī)生成的,并且每一次加密操作生成的AES-128 Key都是不一樣的,即使你沒有更換輸入的原始image。我們的image實際就是使用AES-128 Key這把鑰匙進(jìn)行加密的,我們稱這把鑰匙為:DEK(Data Encryption Key),這把鑰匙存在于加密工具所在的PC機(jī)。既然DEK每一次都不一樣而且存在于個人電腦中,那么MCU在啟動的時候是怎么找到這把鑰匙解密的呢?對,我們需要把這把鑰匙的信息附加在image里面,燒寫到flash中,待到啟動的時候MCU的bootLoder程序會先把鑰匙從image中取出來。那么問題來了,既然bootLoder能夠取出鑰匙,那么作為黑客的你我能不能也讀出flash中的image取出DEK呢,當(dāng)然沒那么簡單,因為這塊存儲DEK的區(qū)域也是經(jīng)過加密的,想要取出DEK還需要另一把鑰匙Master Secret Key,該鑰匙用于創(chuàng)建密鑰的加密區(qū)域blob(DEK blob),這把鑰匙只能由MCU內(nèi)部的DCP或BEE訪問。這意味著每個芯片的blob是唯一的。在啟動引導(dǎo)時,blob以這樣的方式封裝,即只有i.MX RT上的DCP才能訪問DEK。下面的這個圖顯示了加密解密的過程:
所以一個做過加密啟動的鏡像存在與flash中應(yīng)該是組織結(jié)構(gòu):
3、加密XIP(單引擎/雙引擎BEE加密)
i.MX RT boot rom支持串行nor flash上的XIP(Execute-In-Place,在flash本地執(zhí)行代碼),直接使用BEE控制器提供的動態(tài)解密功能(使用aes-ctr-128或aes-ecb-128加密算法)。在執(zhí)行加密XIP之前,引導(dǎo)ROM需要正確設(shè)置BEE控制器,這些配置參數(shù)存儲在保護(hù)區(qū)域描述符塊prdb中,而整個prdb使用aes-cbc-128模式加密,這個用于加密prodb的aes密鑰存儲在密鑰信息塊(kib)中,而kid使用efuse中提供的aes密鑰加密為ekib)。整個或部分軟件圖像使用自定義的私鑰(pvk)加密(然后將密鑰燒錄到片上efuse塊中),這個密鑰被限制為僅能使用qspi解密引擎(bee)訪問。在ROM代碼初始化BEE塊之后的引導(dǎo)過程中,存儲在qspi flash中的加密和未加密的數(shù)據(jù)可以被動態(tài)訪問。每個芯片都可以使用一個唯一的密鑰來加密程序鏡像,因此每個鏡像只能用正確的密鑰在芯片上引導(dǎo),從而防止鏡像盜用。
i.MX RT內(nèi)部有兩個BEE加密引擎分別為BEE引擎0和BEE引擎1,所以BEE加密又分為單引擎加密和雙引擎加密。
單引擎加密:通過上面的描述中我們知道,BEE加密使用用戶自定義的密鑰進(jìn)行加密,加密時將該密鑰燒錄到MCU內(nèi)部的efuse中,其實,也可以使用MCU內(nèi)部的SVNS Key作為密鑰,該密鑰在芯片出廠時已預(yù)先燒錄,無法更改,具有高級別訪問權(quán)限,只能由內(nèi)部DCP或BEE模塊訪問。
單引擎加密可以自定義設(shè)置加密區(qū)域和選擇BEE加密引擎(使用 SVNS Key作為密鑰時只能選擇引擎0,使用自定義密鑰時,即可選擇引擎0也可選擇引擎1)。在加密過程中,加密工具會將這些配置信息存儲到prdb塊中。密鑰信息存儲在kib信息塊中。
雙引擎加密:雙引擎加密使用兩個用戶自定義的密鑰,分別賦予引擎0和引擎1使用,用戶可以分別自定義設(shè)置他們的加密區(qū)域,加密時加密工具會將這些信息分別存儲在prdb0和prdb1中。密鑰信息存儲在kib0和kib1中。
下面簡單看一下解密流程:
BEE控制器通過讀取MCU內(nèi)部efuse燒錄的用戶密鑰PVK,使用該PVK解密EKIB(Encrtpted KIB)密鑰信息塊,將其中的密鑰取出,用于解密EPRDB(Encrtpted PRDB),獲得BEE控制器的參數(shù)配置信息,BEE控制器通過此配置信息將密文image進(jìn)行動態(tài)解密。
做過BEE加密的鏡像存在于flash中應(yīng)該是這種組織結(jié)構(gòu):
三、總結(jié)
上面簡單介紹了一些關(guān)于Flash加密原理,現(xiàn)在我們總結(jié)一下一共有四中加密模式。
模式一:HAB簽名認(rèn)證。
模式二:HAB簽名認(rèn)證和HAB加密。
模式三:SNVS Key單引擎BEE加密。
模式四:用戶自定義Key單引擎BEE或雙引擎BEE加密。
這四種加密模式安全等級依次升高。其中HAB加密屬于靜態(tài)加密,是由片內(nèi)ROM里的Boot程序?qū)⒓用芎蟮拿芪膇mage全部解密成明文image,copy到MCU內(nèi)存ram中再執(zhí)行,而BEE加密是由MCU芯片內(nèi)部的BEE控制器對密文image進(jìn)行邊解密邊執(zhí)行,屬于動態(tài)加密(如果是Non-XIP Image,則解密執(zhí)行流程與HAB加密類似)。
相關(guān)產(chǎn)品 >
-
OK1052-C開發(fā)板
飛凌提供的i.MXRT105x系列單片機(jī),iMXRT1052單片機(jī)基于NXP Cortex-M7 i.MX RT1052跨界處理器設(shè)計,底板+核心板分離結(jié)構(gòu),開發(fā)更簡單,imxrt1052核心板僅售68元,歡迎致電400-699-6866咨詢。推薦iMXRT單片機(jī),性價比高。 了解詳情 -
OKMX6ULL-C開發(fā)板
40*29mm,雙網(wǎng)雙CAN,8路串口| i.MX6ULL開發(fā)板是基于NXP i.MX6ULL設(shè)計開發(fā)的的一款Linux開發(fā)板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對板連接器,適應(yīng)場景豐富。 了解詳情