痞子衡嵌入式:SNVS Master Key僅在i.MXRT10xx Hab關閉時才能用於DCP加解密


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是i.MXRT系列中數據協處理器DCP使用SNVS Master Key加解密的注意事項html

  i.MXRT不只僅是處理性能超強的MCU,也是安全等級極高的MCU。若是你們用過痞子衡開發的一站式安全啓動工具 NXP-MCUBootUtility,應該會從其 用戶手冊 3.3節中瞭解到i.MXRT支持的幾種安全啓動等級,其中HAB加密啓動方式和BEE/OTFAD加密啓動方式中都說起了一種神祕的密鑰 - SNVS Master Key,今天痞子衡就跟你們聊聊這個密鑰用於DCP模塊的注意事項(文中僅以i.MXRT1060爲例,其餘RT10xx型號或許有微小差異)。git

1、DCP模塊簡介

  先來給你們科普下DCP模塊,DCP是Data Co-Processor的簡稱,從名字上看是個通用數據協處理器。在i.MXRT1060 Security Reference Manual中有一張系統總體安全架構簡圖,這個簡圖中標出了DCP模塊的主要功能 :CRC-32算法、AES算法、Hash算法、類DMA數據搬移。github

  看到DCP支持的功能,你就能明白其模塊命名的由來了。本質上它就是一個數據處理加速器,若是說CRC-32/Hash算法只是算出一個結果(下圖中Mode3),而AES算法則是明文數據到密文數據的轉換(存在數據遷移,下圖中Mode2),DMA式數據搬移則更明顯了(下圖中Mode1),DCP內部集成了memcopy功能,能夠實現比普通DMA方式效率更高的內存到內存數據塊搬移,memcopy功能還支持blit模式,支持傳輸矩形數據塊到frame buffer用於LCD顯示。算法

  咱們今天主要是聊DCP的AES加解密功能,其支持AES-128算法,包含Electronic Code Book (ECB)和Cipher Block Chaining (CBC)模式,算法標準符合 NIST US FIPS PUB 197 (2001)規範,AES運算的最小單元是16字節。數組

2、DCP-AES密鑰來源

  對於加解密而言,一個很重要的特性就是密鑰管理。DCP的AES密鑰(長度均爲128bits)來源很豐富,按性質可分紅四類:安全

  • SRAM-based keys: 用戶自定義的存放於SRAM中的密鑰,最終會被寫入DCP的KEY_DATA寄存器中,最多四組。
  • Payload key: 用戶自定義的跟加解密數據放一塊兒的密鑰,操做時DCP直接解析。
  • eFuse SW_GP2 key: 用戶燒錄到eFuse SW_GP2區域的密鑰,可鎖定住讓軟件沒法訪問,但DCP可經過內置專用途徑獲取到。
  • SNVS Master key: 芯片出廠時預存的惟一密鑰,密鑰值沒法獲知,DCP可經過內置專用途徑獲取到。

  選用SRAM-based keys和Payload key僅須要在DCP模塊內部配置便可,而選用eFuse SW_GP2 key和SNVS Master key則要在以下IOMUXC_GPR寄存器中額外設置。微信

  IOMUXC_GPR_GPR10寄存器用於選擇Key是來自eFuse SW_GP2仍是SNVS Master Key:架構

  IOMUXC_GPR_GPR3寄存器用於選擇Key是來自SNVS Master Key(總256bits)的低128bit仍是高128bit(注意此寄存器對eFuse SW_GP2其實不生效,由於SW_GP2僅128bits):函數

3、什麼是SNVS Master Key?

  SNVS全稱Secure Non-Volatile Storage,它既是DCP的配套模塊,也是芯片系統的安全事務監測中心。它可以提供一個獨特的Master Key給DCP模塊,這個Master Key可有三種產生方式(在SNVS_LPMKCR中設置):工具

  • OTPMK:這種就是直接使用eFuse裏出廠預燒錄的OTPMK(256bits),這個OTPMK是每一個芯片惟一的,而且被鎖住了軟件不可訪問。
  • ZMK:這種是利用存在SNVS_LP ZMKRx寄存器組中的密鑰,該祕鑰可由用戶寫入,此密鑰在芯片主電源斷掉時會繼續保留(由於在LP域可由鈕釦電池供電),在芯片受到安全攻擊時密鑰會被自動擦除。
  • CMK:前二者組合後的Key,即OTPMK和ZMK的異或結果。

  通常來講,使用最多的SNVS Master Key就是默認的OTPMK。

4、兩種DCP驅動

  關於DCP模塊的驅動,在下載的芯片SDK包裏有兩種:

  • ROM版本:\SDK_2.x.x_EVK-MIMXRT1060\devices\MIMXRT1062\drivers\fsl_dcp.c
  • SDK版本:\SDK_2.x.x_EVK-MIMXRT1060\middleware\mcu-boot\src\drivers\dcp\fsl_dcp.c

  middleware裏的DCP驅動是ROM team負責的,他們是在芯片Tapeout以前寫的,屬於早期驅動;device包裏的DCP驅動纔是SDK team負責的,是芯片Tapeout以後寫的,是正式版本。

  兩版驅動都實現了AES加解密,不過代碼風格不一樣。好比ROM版本驅動的dcp_aes_ecb_crypt()函數同時支持加密和解密模式,而在SDK版本驅動裏則分紅兩個函數:DCP_AES_EncryptEcb() - 加密 、DCP_AES_DecryptEcb() - 解密。

5、DCP正確獲取SNVS Master Key

  前面鋪墊了那麼多,終於來到正題了。DCP模塊如何拿到正確的SNVS Master Key?讓咱們以\SDK_2.x.x_EVK-MIMXRT1060\boards\evkmimxrt1060\driver_examples\dcp 例程來作個測試。

  這個dcp例程演示了五種DCP工做模式,咱們就測試第一種TestAesEcb(),將宏DCP_TEST_USE_OTP_KEY改成1,即便用OTPMK低128bits做爲DCP的密鑰:

#define DCP_TEST_USE_OTP_KEY 1 /* Set to 1 to select OTP key for AES encryption/decryption. */

int main(void)
{
    dcp_config_t dcpConfig;

    // ...

    /* Initialize DCP */
    DCP_GetDefaultConfig(&dcpConfig);

#if DCP_TEST_USE_OTP_KEY
    /* Set OTP key type in IOMUX registers before initializing DCP. */
    /* Software reset of DCP must be issued after changing the OTP key type. */
    DCP_OTPKeySelect(kDCP_OTPMKKeyLow);
#endif

    /* Reset and initialize DCP */
    DCP_Init(DCP, &dcpConfig);

    /* Call DCP APIs */
    TestAesEcb();

    // ...
}

  在初始芯片狀態(Hab Open)下,使用J-Link下載工程進RAM直接單步調試看一看,在執行完DCP_AES_EncryptEcb()函數後查看cipher[]數組,能夠看到其值爲0xCF, 0x2E, 0xA3...,好吧咱們根本不知道SNVS Master Key究竟是多少,因此這個密文是否正確也無從知曉。

  既然沒法得知SNVS Master Key,那咱們作個小實驗,使用SRAM-based keys來作一次加密,密鑰姑且設個全0吧,再看一下結果,你發現了什麼,cipher[]的值是否是很熟悉?跟以前SNVS Master Key加密的結果一致,難道這顆芯片的SNVS Master Key是全0?想一想不可能,確定是流程哪裏出了問題!

  如今讓咱們再回憶 MCUBootUtility 用戶手冊裏關於測試HAB加密以及BEE/OTFAD加密使用SNVS Master Key的前提條件,是的,芯片狀態須要先設置爲Hab Close,好,讓咱們如今在eFuse裏將SEC_CONFIG[1:0]設爲2'b10(Hab Close),而後再次使用J-Link調試進去看一看,怎麼回事?cipher[]值依舊是0xCF, 0x2E, 0xA3...

  上面的測試對TestAesEcb()函數作了一個簡單的修改,將cipher[]值經過串口打印出來,那咱們就將程序經過NXP-MCUBootUtility下載到Flash裏由ROM來啓動運行吧(退出調試狀態),咱們再來看串口打印,哈哈,終於值變了,這意味着DCP終於拿到了正確的SNVS Master Key(非0)。

  總結一下,SNVS Master Key僅在芯片Hab狀態是Close而且非調試狀態下才能被DCP正常獲取,不然DCP獲取到的是全0的假Key。

  至此,i.MXRT系列中數據協處理器DCP使用SNVS Master Key加解密的注意事項痞子衡便介紹完畢了,掌聲在哪裏~~~

歡迎訂閱

文章會同時發佈到個人 博客園主頁CSDN主頁知乎主頁微信公衆號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就能夠在手機上第一時間看了哦。

相關文章
相關標籤/搜索