<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:SNVS Master Key僅在i.MXRT10xx Hab關(guān)閉時才能用于DCP加解密


        大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRT系列中數(shù)據(jù)協(xié)處理器DCP使用SNVS Master Key加解密的注意事項。

        i.MXRT不僅僅是處理性能超強的MCU,也是安全等級極高的MCU。如果大家用過痞子衡開發(fā)的一站式安全啟動工具 NXP-MCUBootUtility,應(yīng)該會從其 用戶手冊 3.3節(jié)中了解到i.MXRT支持的幾種安全啟動等級,其中HAB加密啟動方式和BEE/OTFAD加密啟動方式中都提及了一種神秘的密鑰 - SNVS Master Key,今天痞子衡就跟大家聊聊這個密鑰用于DCP模塊的注意事項(文中僅以i.MXRT1060為例,其他RT10xx型號或許有微小差別)。

      一、DCP模塊簡介

        先來給大家科普下DCP模塊,DCP是Data Co-Processor的簡稱,從名字上看是個通用數(shù)據(jù)協(xié)處理器。在i.MXRT1060 Security Reference Manual中有一張系統(tǒng)整體安全架構(gòu)簡圖,這個簡圖中標(biāo)出了DCP模塊的主要功能 :CRC-32算法、AES算法、Hash算法、類DMA數(shù)據(jù)搬移。

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

        我們今天主要是聊DCP的AES加解密功能,其支持AES-128算法,包含Electronic Code Book (ECB)和Cipher Block Chaining (CBC)模式,算法標(biāo)準(zhǔn)符合 NIST US FIPS PUB 197 (2001)規(guī)范,AES運算的最小單元是16字節(jié)。

      二、DCP-AES密鑰來源

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

      • SRAM-based keys: 用戶自定義的存放于SRAM中的密鑰,最終會被寫入DCP的KEY_DATA寄存器中,最多四組。
      • Payload key: 用戶自定義的跟加解密數(shù)據(jù)放一起的密鑰,操作時DCP直接解析。
      • eFuse SW_GP2 key: 用戶燒錄到eFuse SW_GP2區(qū)域的密鑰,可鎖定住讓軟件無法訪問,但DCP可通過內(nèi)置專用途徑獲取到。
      • SNVS Master key: 芯片出廠時預(yù)存的唯一密鑰,密鑰值無法獲知,DCP可通過內(nèi)置專用途徑獲取到。

        選用SRAM-based keys和Payload key僅需要在DCP模塊內(nèi)部配置即可,而選用eFuse SW_GP2 key和SNVS Master key則要在如下IOMUXC_GPR寄存器中額外設(shè)置。

        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):

      三、什么是SNVS Master Key?

        SNVS全稱Secure Non-Volatile Storage,它既是DCP的配套模塊,也是芯片系統(tǒng)的安全事務(wù)監(jiān)測中心。它能夠提供一個獨特的Master Key給DCP模塊,這個Master Key可有三種產(chǎn)生方式(在SNVS_LPMKCR中設(shè)置):

      • OTPMK:這種就是直接使用eFuse里出廠預(yù)燒錄的OTPMK(256bits),這個OTPMK是每個芯片唯一的,并且被鎖住了軟件不可訪問。
      • ZMK:這種是利用存在SNVS_LP ZMKRx寄存器組中的密鑰,該秘鑰可由用戶寫入,此密鑰在芯片主電源斷掉時會繼續(xù)保留(因為在LP域可由紐扣電池供電),在芯片受到安全攻擊時密鑰會被自動擦除。
      • CMK:前兩者組合后的Key,即OTPMK和ZMK的異或結(jié)果。

        一般來說,使用最多的SNVS Master Key就是默認的OTPMK。

      四、兩種DCP驅(qū)動

        關(guān)于DCP模塊的驅(qū)動,在下載的芯片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驅(qū)動是ROM team負責(zé)的,他們是在芯片Tapeout之前寫的,屬于早期驅(qū)動;device包里的DCP驅(qū)動才是SDK team負責(zé)的,是芯片Tapeout之后寫的,是正式版本。

        兩版驅(qū)動都實現(xiàn)了AES加解密,不過代碼風(fēng)格不同。比如ROM版本驅(qū)動的dcp_aes_ecb_crypt()函數(shù)同時支持加密和解密模式,而在SDK版本驅(qū)動里則分成兩個函數(shù):DCP_AES_EncryptEcb() - 加密 、DCP_AES_DecryptEcb() - 解密。

      五、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();
      
          // ...
      }
      

        在初始芯片狀態(tài)(Hab Open)下,使用J-Link下載工程進RAM直接單步調(diào)試看一看,在執(zhí)行完DCP_AES_EncryptEcb()函數(shù)后查看cipher[]數(shù)組,可以看到其值為0xCF, 0x2E, 0xA3...,好吧我們根本不知道SNVS Master Key到底是多少,所以這個密文是否正確也無從知曉。

        既然無法得知SNVS Master Key,那我們做個小實驗,使用SRAM-based keys來做一次加密,密鑰姑且設(shè)個全0吧,再看一下結(jié)果,你發(fā)現(xiàn)了什么,cipher[]的值是不是很熟悉?跟之前SNVS Master Key加密的結(jié)果一致,難道這顆芯片的SNVS Master Key是全0?想想不可能,肯定是流程哪里出了問題!

        現(xiàn)在讓我們再回憶 MCUBootUtility 用戶手冊里關(guān)于測試HAB加密以及BEE/OTFAD加密使用SNVS Master Key的前提條件,是的,芯片狀態(tài)需要先設(shè)置為Hab Close,好,讓我們現(xiàn)在在eFuse里將SEC_CONFIG[1:0]設(shè)為2'b10(Hab Close),然后再次使用J-Link調(diào)試進去看一看,怎么回事?cipher[]值依舊是0xCF, 0x2E, 0xA3...

        上面的測試對TestAesEcb()函數(shù)做了一個簡單的修改,將cipher[]值通過串口打印出來,那我們就將程序通過NXP-MCUBootUtility下載到Flash里由ROM來啟動運行吧(退出調(diào)試狀態(tài)),我們再來看串口打印,哈哈,終于值變了,這意味著DCP終于拿到了正確的SNVS Master Key(非0)。

        總結(jié)一下,SNVS Master Key僅在芯片Hab狀態(tài)是Close并且非調(diào)試狀態(tài)下才能被DCP正常獲取,否則DCP獲取到的是全0的假Key。

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

      歡迎訂閱

      文章會同時發(fā)布到我的 博客園主頁CSDN主頁知乎主頁、微信公眾號 平臺上。

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

      posted @ 2020-07-17 08:38  痞子衡  閱讀(1487)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲人妻系列中文字幕| 人人妻人人狠人人爽天天综合网 | 国产在线超清日本一本| 久久大香伊蕉在人线免费AV| 宣恩县| 一区二区三区四区亚洲自拍 | 亚洲男人第一无码av网站| 国产成人精品午夜2022| 日韩美少妇大胆一区二区| 大悟县| 国产精品中文字幕一区| 中文字幕日韩精品亚洲一区| 色欲久久人妻内射| 高清破外女出血AV毛片| 人妻精品动漫h无码| 成人免费xxxxx在线观看| 久久精品无码精品免费专区| 蜜臀精品一区二区三区四区| 性欧美VIDEOFREE高清大喷水| 高清一区二区三区不卡视频| 亚洲中文久久久精品无码| 亚洲人成电影网站 久久影视| 国产福利微视频一区二区| 丝袜国产一区av在线观看| 人成午夜大片免费视频77777| 男女一边摸一边做爽爽| 国产精品中文字幕第一页| 亚洲欧美日韩愉拍自拍美利坚| 好紧好湿好黄的视频| 亚洲av成人三区国产精品| 久久精品午夜视频| 国产精品国产亚洲区久久| 国产精品中文一区二区| 国产在线播放专区av| av老司机亚洲精品天堂| 亚洲精品天堂在线观看 | 成人看的污污超级黄网站免费 | 日韩av熟女人妻一区二| av在线播放国产一区| 成人无遮挡裸免费视频在线观看| 日韩一区二区三区女优丝袜|