當前位置:
首頁 > 最新 > Qorivva MPC56xx系列MCU的Flash加密解密原理與工程實現方法詳解

Qorivva MPC56xx系列MCU的Flash加密解密原理與工程實現方法詳解

內容提要

引言

1. Qorivva MPC56xx系列MCU的加解密原理

2. Qorivva MPC56xx系列MCU的Shadow Flash與加密配置

2.1 非易失系統加密寄存器--NVSCC0和NVSCC1

2.2 Qorivva MPC56xx系列MCU加密秘鑰寄存器NVPWD1和NVPWD01

3. Qorivva MPC56xx系列MCU的加密配置規則

4. 具體應用工程中的加密配置實現

第一步、在任意C源文件中添加以下秘鑰和加密配置定義:

第二步、配置應用工程鏈接文件

第三步、編譯鏈接應用工程,生成Shadow Flash秘鑰配置S19文件

第四步、選擇目標MCU的Shadow Flash演算法文件,下載elf:

①使用CodeWarrior 10.6 IDE + U-Multilink調試器

②使用Cyclone離線Flash編程器

第五步、斷電重啟MCU,通過POR上電複位讓加密配置生效

5. Qorivva MPC56xx系列MCU的複位啟動過程和Flash解密流程

5.1 Qorivva MPC56xx系列MCU的引導啟動模式選擇

5. 2 Flash存儲器引導啟動

5.3 串列引導啟動模式(基於BAM的默認固化bootloader)

A.下載並執行新程序

B.下載64-bit秘鑰並檢查秘鑰

5.4 Qorivva MPC56xx系列MCU的Flash解密方法

第①種、通過JTAG調試介面提供64-bit秘鑰解密

第②種、配置進入串列引導啟動模式,通過串列通信介面提供64-bit秘鑰解密

總結

引言

《S12(X)系列MCU的片上存儲器資源與分頁訪問機制詳解(一)》;

《S12(X)系列MCU的片上存儲器資源與分頁訪問機制詳解(二)》;

《S12(X)系列MCU的加密(Secure)原理和解密(Unsecure)方法》;

詳細介紹了S12(X)的片上NVM(非易失性存儲器--包括EEPROM/D-Flash和P-Flash)以及RAM資源的分頁訪問機制以及加解密原理和方法;NXP的8-bit 汽車級MCU--S08系列以及基於ARM Cortex M系列內核的KEA/S32K1xx系列汽車級MCU的加解密原理和方法與S12(X)系列類似,大家可以參考學習。

廣泛使用的NXP的32-bit汽車級MCU--Qorivva MPC56xx/系列MCU的加解密原理和方法是怎樣的呢?很多讀者留言希望我能夠介紹一下。本文就以MPC5604B為例給大家詳細介紹Qorivva MPC56xx系列MCU的加解密原理和方法,希望對大家有所幫助和啟發。

1. Qorivva MPC56xx系列MCU的加解密原理

Qorivva MPC56xx系列MCU中對存儲在其片上NVM中的用戶應用程序和數據的保護是通過審查(Censorship)機制實現的,其本質上與S12(X)系列MCU的加密(Security)都是禁止調試介面(Qorivva MPC56xx系列MCU的JTAG/Nexus,S12(X)系列MCU的BDM)的讀寫訪問許可權,從而阻止非法讀取和修改存儲在NVM上的用戶程序和數據以及對通過調試介面對MCU內部寄存器資源的控制和調試。所以為了方便大家理解和記憶,本文中我們暫且也將Qorivva MPC56xx系列MCU的審查等效為加密。

具體而言,Qorivva MPC56xx系列MCU審查(Censorship)機制控制以下模塊對片上NVM資源的訪問許可權:

A. JTAG/Nexus調試介面;

B . BAM(Boot Assit Module-啟動輔助模塊)的串列引導啟動模式(Serial Boot Mode)(該模式為Qorivva MPC56xx系列MCU提供了一種下載並執行代碼以查詢或者修改NVM的出廠默認bootloader,下文將對其進行詳細介紹)

加密後,為了重新獲得NVM的訪問許可權,需要提供加密時設置的64-bit正確秘鑰(password).

Tips:使能Qorivva MPC56xx系列MCU的加密(審查(Censorship)機制)後,重新獲得MCUNVM訪問許可權的唯一方式就是通過秘鑰,如果秘鑰忘記或者未被正確配置,將無法恢復;

Tips:當然,與S12(X)系列MCU的NVM加密一樣,Qorivva MPC56xx系列MCU的加密(審查(Censorship)機制)針對的也僅是外部調試器或者BAM上位機軟體對MCU片內NVM的訪問許可權,其並不影響MCU中運行的用戶程序對片上NVM的正常訪問。

2. Qorivva MPC56xx系列MCU的Shadow Flash與加密配置

Qorivva MPC56xx系列MCU的加密配置由位於地址0x203DE0~0x203DE7的非易失系統審查控制寄存器NVSCC0~1以及位於地址0x203DD8~0x203DDF的非易失審查私鑰寄存器NVPW0~1共同完成,下圖為MPC5604B的Shadow Flash扇區結構:

Tips:NVSCC0~1和NVPW0~1都位於Qorivva MPC56xx系列MCU的Shadow Flash中,其獨立於用於存儲用戶程序和代碼的Code Flash和Data Flash,其編程所使用的演算法也不一樣,從而防止了用戶在編程應用程序時意外修改MCU的加密配置,保證了系統的可靠性和安全性;

2.1 非易失系統加密寄存器--NVSCC0和NVSCC1

這兩個寄存器用於定義加密配置,工廠出廠測試後,默認關閉加密的值如下:

NVSCC0= 0x55AA_55AA;

NVSCC1= 0x55AA_55AA;

每個寄存器的32-bit被分為高低兩個16-bit,高16-bit用於控制串列引導模式加密(SC-Field, Serial boot mode Censorship),而低16-bit用於控制Flash引導啟動加密(CW-field).

Tips:如果影子Flash(Shadow Flash)被擦除,而且NVSCC0和NVSCC1未被重新編程為正確值,那麼該MCU將被永久加密而無法訪問,處於此狀態的MCU將不可被調試或者重新編程,即成為「磚頭」,徹底報廢掉!

2.2 Qorivva MPC56xx系列MCU加密秘鑰寄存器NVPWD1和NVPWD01

NVPWD1和NVPWD01兩個私鑰寄存器組合形成一個64-bit的秘鑰,MCU出廠測試後其默認的值如下,是固定公開的,故也稱作公鑰:

NVPWD0= 0xFEED_FACE;

NVPWD1= 0xCAFE_BEEF;

這也就意味著,即使用戶通過修改加密控制寄存器加密了Flash,如果未修改NVPWD1和NVPWD01這兩個寄存器的值,也可以通過以上默認私鑰0xFEED_FACE_CAFE_BEEF解密該MCU。

Tips:配置以上加密私鑰寄存器時,每個半字(16-bit)必須包含至少一個1和1個0,下表列舉了一些合法和非法的秘鑰配置:

即使存儲在Flash中或者在引導過程中提供的秘鑰不符合以上規則,未加密的MCU也可以通過串列啟動模式(Serial Boot Mode)從LINFlex0或者FlexCAN0下載代碼到內部SRAM中。

3. Qorivva MPC56xx系列MCU的加密配置規則

對Qorivva MPC56xx系列MCU進行加密配置時, 首先需要定義一個符合秘鑰規則的正確64-bit秘鑰;這個64-bit秘鑰是加密能否實現的關鍵所在,其需要滿足上面2.2小節所介紹的秘鑰配置規則--每個半字(16-bit)必須包含至少一個1和1個0。

其次,用戶需要按照下表和流程圖,決定所需的加密等級並配置寄存器NVSCC0和NVSCC1;

其中紅色區域的配置會造成晶元死鎖,無法解密恢復,所以需要避免。

為了通過私密實現Flash加密,用戶需要修改NVSCC0和NVSCC1寄存器,讓NVSCC0=NVSCC1,但其低16-bit的CW field不等於0x55AA;這樣加密之後,可以通過輸入正確的私鑰解密,然後從串列引導模式或者Flash引導模式啟動MCU;

Tips:如果NVSCC0和NVSCC1不一致或者NVSCC0和NVSCC1被置為非0x55AA的值,則MCU將被永久加密而無法恢復;

4. 具體應用工程中的加密配置實現

第一步、在任意C源文件中添加以下秘鑰和加密配置定義:

②若使用以下配置則可以將晶元恢復為出廠配置,解密狀態且並將秘鑰配置為公鑰0xFEEDFACECAFEBEEF,加密控制寄存器NVSCC0=NVSCC1=0x55AA55AA:

第二步、配置應用工程鏈接文件

在應用工程鏈接文件中的存儲器分區MEMORY{}中添加如下Shadow Flash加密秘鑰和加密控制寄存器配置分區:

/*the shadow Flash used to store the 64-bit Nonvolatile Private Censorship PassWord 0–1 registers configuration*/

shadow_flash_NVPWD: org = 0x203DD8, len = 8

/*the shadow Flash used to store the 64-bit Nonvolatile System Censorship Control 0–1 registers configuration*/

shadow_flash_NVSCC: org = 0x203DE0, len = 8

在應用工程鏈接文件中的存儲器分區SECTIONS{}中添加如下Shadow Flash加密秘鑰和加密控制寄存器配置值放置段,使用關鍵詞KEEP()以保留其未使用段:

.__NVPWD_Config LOAD (ADDR(shadow_flash_NVPWD)): {KEEP(*(.__NVPWD_Config)) } > shadow_flash_NVPWD

.__NVSCC_Config LOAD (ADDR(shadow_flash_NVSCC)): {KEEP(*(.__NVSCC_Config)) } > shadow_flash_NVSCC

第三步、編譯鏈接應用工程,生成Shadow Flash秘鑰配置S19文件

第四步、選擇目標MCU的Shadow Flash演算法文件,下載elf:

有兩種方法可以實現對MPC56xx系列MCU的Shadow Flash的編程;

①使用CodeWarrior 10.6 IDE + U-Multilink調試器

首先,使用默認配置,把用戶自己的應用工程編譯結果下載到Flash中,若有Data-Flash數據或者外部QSPI Flash數據(比如MPC5606S),需要下載2次,並手動選擇Data-Flash演算法文件或者外部QSPI Flash演算法;

最後,按照下圖選擇目標MCU的Shadow Flash演算法文件,進行下載,以將以上用戶配置的加密配置和秘鑰下載到Shadow Flash中:

Tips:默認CodeWarrior 10.6 IDE安裝時,並不會安裝Qorivva MPC56xx系列MCU的Shadow Flash演算法,僅在CodeWarrior 2.10 IDE和Cyclone離線編程器上位機軟體的安裝目錄下提供:

如果你未安裝CodeWarrior 2.10 IDE和Cyclone離線編程器上位機軟體,可以在本文最後提供的百度雲盤分享鏈接下載。

在未選擇目標MCU的Shadow Flash演算法文件進行下載之前,可以在CodeWarrior 10.6的調試界面的Memory窗口中,輸入地址0x203DD8,查看到默認的Shadow Flash出廠加密配置如下圖:

而在選擇目標MCU的Shadow Flash演算法文件進行下載之後,在CodeWarrior 10.6的調試界面的Memory窗口中,輸入地址0x203DD8,查看編程結果如下圖,此時Shadow Flash已經編程成功為使能加密,且秘鑰為0x89ABCDEF-01234567:

②使用Cyclone離線Flash編程器

一方面,上面介紹的CodeWarrior 10.6 + Multilink通過debug下載程序的方式對Shadow Flash進行編程的方式時一種低成本的方案,可以方便大家學習和掌握MPC56xx系列MCU的加密配置,但是其實現流程十分繁瑣,不便於操作;另一方面,對NVM的加密往往是量產階段才需要配置的,在產品開發階段使能加密需要不斷的解密從而影響項目進度,而且沒有必要。所以我們推薦的Shadow Flash編程方法是使用Cyclone離線編程器--Cyclone MAX或者Cyclone Universal(FX)。

其步驟如下:

首先,分割應用工程S19文件為獨立的NVM編程S19文件

將上面第四步生成的應用工程S19文件(默認為

.mot,將其後綴改為.s19後即可使用)按照具體MCU的NVM資源地址映射,將其s19文件分割,成獨立的Code Flash編程S19文件、Data Flash編程S19文件(若存在Data Flash編程數據)、ShadowFlash編程S19文件(需要加密配置)和QSPI Flash編程S19文件(如果需要,比如MPC5606S/5645S或者Halo-MAC57D5xx);

本文使用的示例工程中只有MPC5604B的CodeFlash數據和存儲在Shadow Flash的NVM加密配置,故只需將其分割為兩個獨立的S19文件即可:

然後,配置SAP文件,載入對應的Flash演算法和S19編程文件

打開Cyclone Universal的離線編程文件SAP文件配置工具--Cyclone Image Creation Utility(該上位機軟體需要用戶自己下載安裝);

使用腳本嚮導(Lanunch Script Wizard)先載入Code Flash的演算法和Code Flash的S19編程文件,然後在手動添加其他Flash的編程文件(CM)和S19文件(SS)以及非空擦除(EN)、模塊編程(PM)和CRC校驗(VC)命令腳本,並配置解密使用64-bit公鑰,Cyclone 繼電器控制目標MCU供電並在編程完成中將JTAG介面的RESET管腳拉低以避免Flash編程過程中的EOS和ESD:

最後,將SAP文件保存在硬碟並載入到Cyclone離線編程器中

載入成功後,在Cyclone Universal編程器的人機界面上就能夠看到最新載入的SAP文件,按下右下角的Start按鍵,即可開始編程了:

Tips:按照Cyclone Universal編程器背面的繼電器供電管理方案配置為使用Cyclone內部電源通過JTAG編程介面供電(Internal Power-->Target Power Pin):

將電源配置跳線設置為:Jumper 1,2,3短接,而Jumper 4斷開:

這樣,就可以直接通過Cyclone Universal對MPC5604B進行編程了,無需給目標MCU外部供電;

第五步、斷電重啟MCU,通過POR上電複位讓加密配置生效

雖然完成了以上四個步驟,但此時JTAG還是可以鏈接,並正常調試的(包括複位,或者重新下載elf到Code-Flash/Data-Flash/Shadow-Flash),必須將目標MCU斷電重啟之後,也就是發生POR上電複位之後,Flash加密才會生效。

此時,用戶通過JTAG介面在連接ebug目標MCU時,使用默認的公鑰--0xFEEDFACECAFEBEEF已經無法連接了,

5. Qorivva MPC56xx系列MCU的複位啟動過程和Flash解密流程

Qorivva MPC56xx系列MCU每次POR複位之後都會自動運行BAM,檢查外部管腳FABM和ABS的狀態,從而判斷啟動模式。如下圖所示,如果FABM管腳為高電平,則進一步判斷ABS管腳:若為低電平,則從LINFlex0串列引導啟動;若為高電平,則從FlexCAN0串列引導啟動;如果FABM管腳為低電平,則檢查Flash中的啟動扇區(boot sector)中的RCHW中是否存在合法的啟動ID(boot ID):若存在,則從該扇區開始啟動(應用程序開始地址--複位向量位於合法啟動扇區的開始地址偏移4個位元組的位置);若不存在合法的boot ID,則晶元進入靜態模式(Static Mode,死機模式,不允許任何程序):

5.1 Qorivva MPC56xx系列MCU的引導啟動模式選擇

在Qorivva MPC56xx系列MCU中,有兩個外部引腳FAB(Force Alternate Boot mode,強製備選引導模式)和ABS(Alternate Boot Select,串列引導模式選擇),其狀態在每次MCU複位時被鎖定讀取用於決定MCU是從Flash引導啟動還是常數通過FlexCAN或者LINFlex下載程序引導;

FAB和ABS引腳狀態與MCU引導啟動模式選擇的關係如下表:

Tips:默認MCU複位之後,FAB引腳有內部弱下拉,而ABS引腳為內部弱上拉,即保證這兩個管腳外部懸空時,FAB=0,ABS=1,MCU從Flash引導啟動,而FAB和ABS引腳往往還與其他功能復用,因此在進行Qorivva MPC56xx系列MCU的硬體電路設計時,必須保證在任何複位過程中這兩個引腳處於你所想要的引導模式配置狀態;

比如在MPC5604B中,FAB引腳就與SIUL和EMIOS_0模塊復用,而ABS引腳則與SIUL、EMIOS_0以及LINFlex_3等模塊功能復用:

以上讀取FAB和ABS引腳狀態的過程通常由Qorivva MPC56xx系列MCU的SSCM(System Status and Configuration Module--系統狀態與配置模塊 )硬體模塊通過以下流程實現:

然後,MCU運行晶元出廠時固化的BAM代碼以判斷具體的引導啟動模式:

BAM代碼駐留在地址0xFFFF_C000開始預留的8KB ROM存儲器映射空間中;

如果進入串列引導模式,BAM運行時下載代碼的基地址為0x4000_0100開始的SRAM空間:

BAM代碼執行的流程邏輯如下:

5. 2 Flash存儲器引導啟動

為了成功地從Qorivva MPC56xx系列MCU的 Flash存儲器引導啟動,必須在MCU規定的Flash引導扇區(boot sector)之一中編程2個32-bit的入口,Qorivva MPC56xx系列MCU的引導扇區結構如下,這2個32-bit入口包括如下信息:

B .32-bit的複位向量(用戶代碼的開始地址,也即入口函數_Start()地址)

Flash引導啟動模式下,MCU的加密和解密控制流程如下:

5.3 串列引導啟動模式(基於BAM的默認固化bootloader)

若在複位時將MCU的FAB引腳拉倒高電平(FAB=1),則MCU進入串列引導啟動模式。具體選擇FlexCAN0(ABS=1)還是LINFlex0(ABS=0)作為通信介面則取決於ABS引腳的狀態。

BAM串列引導啟動模式下,MCU與上位機軟體通信協議具體如下:

A.下載並執行新程序

從頂層看,BAM串列引導啟動模式下,MCU與上位機軟體通信的程序下載流程如下:

1. 上位機發送消息並接受確認是否使能自動波特率(可選);

2. 發送64-bit秘鑰;

3. 發送開始地址、下載代碼大小(以位元組計算)和是否為VLE指令程序;

4.下載代碼/數據;

5.從起始地址執行代碼;

Tips:以上每一步的執行都必須保證:開始下一步之前,上一步已經完成。以上通信以半雙工方式進行:

1. 上位機發送數據到MCU並等待;

2. MCU應答數據已經收到;

3. MCU進行數據驗證如果回答正確:

--如果數據正確,上位機可以繼續發送數據;

--如果數據不正確,上位機停止發送,MCU需要複位重啟;

多位元組數據按照高位優先(MSB)方式發送。

B.下載64-bit秘鑰並檢查秘鑰

MCU通過BAM接收到的第一個64-bit數據將被當做秘鑰,發送到秘鑰檢查程序以驗證其正確與否:

秘鑰檢查的流程圖如下:

如果Flash為公開訪問狀態(默認),接收到的秘鑰將與公共秘鑰0xFEED_FACE_CAFE_BEEF進行比較;而如果Flash不能被公開訪問,但是也沒有加密,則接收到的秘鑰將於保存在NVPWD0和NVPWD1寄存器中的值進行比較;此時,秘鑰的比較都由BAM程序完成,如果失敗,則BAM將MCU置於靜態模式;

鑰匙Flash不能被公開訪問而且處於加密狀態,接收到的秘鑰將被寫入到PWCMPH和PWCMPL寄存器,等待固定的時間後,將有SSCM模塊硬體進行比較並更新結果到SSCM_STATUS的SEC位, 接著BAM程序再次檢查SSCM_STATUS的SEC標誌位:

SEC=: Flash已經被解密,BAM程序繼續執行;

SEC=1: Flash依然處於加密狀態因為秘鑰錯誤,BAM程序將MCU置於靜態模式;

此處固定的等待時間取決於外部晶振頻率,若外部為12MHz時鐘時,固定時間為350ms。

Tips:MPC560xx系列MCU的SSCM(System Status and Configuration Module--系統狀態與配置模塊 )的PWCMPH和PWCMPL寄存器定義如下,其用於驗證加密秘鑰:

為了成功解密晶元,秘鑰(password)必須按照如下序列寫入以上寄存器:先寫入秘鑰的高32-bit到PWCMPH寄存器,在將秘鑰的低32-bit寫入PWCMPL寄存器。這樣SSCM模塊就會自動比較秘鑰,如果正確,則晶元解密。

總結一下,進入串列引導啟動模式後(FAB=1),Qorivva MPC56xx系列MCU的加密和解密控制流程如下:

Tips:在BAM允許時,Qorivva MPC56xx系列MCU的SWT看門狗時默認關閉的,所以若在BAM期間發生意外,將有可能導致CPU掛掉(stalled),此時需要外部複位才可恢復。

5.4 Qorivva MPC56xx系列MCU的Flash解密方法

從前面的介紹控制, 加密後,為了解密Flash,必須通過JTAG調試介面或者串列通信介面給BAM模塊提供正確的秘鑰(password),從而恢復調試介面對MCU片上資源或者BAM對片上NVM資源的訪問許可權。

第①種、通過JTAG調試介面提供64-bit秘鑰解密

用戶可以通過CodeWarrior 10.6啟動調試過程中,通信失敗時彈出的秘鑰輸入窗口輸入正確64-bit秘鑰,對MCU解密,進而重新下載應用程序並進入調試模式:

另外一種通過JTAG調試介面提供64-bit秘鑰的方法是,在配置生成Cyclone離線Flash編程器編程鏡像SAP文件時,使能加密設置(Security Settings-->Device supports uncensoring):

①Cyclone MAX 離線編程鏡像SAP配置解密界面:

②Cyclone Universal/FX離線編程鏡像SAP配置解密界面:

Tips:以上解密都是臨時的,在下一次POR複位之後,依然需要輸入秘鑰才能解密。為了徹底解密MCU,需要將使用如下配置編譯生成NVPWD0/1和NVSCC1的默認配置,並載入Shadow Flash演算法,將Shadow Flash重新編程為默認出廠解密狀態才行:

第②種、配置進入串列引導啟動模式,通過串列通信介面提供64-bit秘鑰解密

第二種解密的途徑是,配置MCU的FAB引腳為高電平(FAB=1),使其進入串列引導啟動模式,然後通過NXP官網提供的RAppID Boot Loader Utility軟體,設置使能BAM,下載符合BAM串列通信協議的bootloader,並配置正確的解密秘鑰即可:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

受不了這樣的姑娘,就是想養想慣!
一部《妖貓傳》的大熱,不得不提起曾經的開元盛世

TAG:全球大搜羅 |