在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OTFDEC硬件模塊基于STM32H735G-DK板的驗證研發

STM32單片機 ? 來源:STM32單片機 ? 作者:STM32單片機 ? 2021-07-05 14:03 ? 次閱讀

前言

STM32H73x系列開始,我們引入了一個新外設模塊,OTFDEC。它的全名叫做on the fly decryption。它的引入,可以幫助大家解決代碼保護的痛點。

OTFDEC簡介

大家都知道,代碼存儲在片內Flash,只要做好了JTAG調試端口的保護和片上關鍵代碼的隔離,在防止邏輯攻擊和直接探測層面,還是相當安全的。但是片上Flash畢竟容量有限,在一些應用中我們需要把代碼放到片外Flash存儲甚至直接從片外Flash執行。片外Flash相比片內Flash,在抗攻擊方面就脆弱得多。片外Flash一般沒有什么硬件層面的保護,只要知道了它的料號,它的讀寫時序都是可以查到的,那么讀出來里面的內容就不是什么難事。

所以大家一個自然的想法就是把代碼加密后再放到片外Flash上,這樣即使別人讀出里面的密文代碼,只要沒有密鑰,也無法獲知代碼的有效信息。

4630e482-dc58-11eb-9e57-12bb97331649.jpg

就比如膠片中這樣的典型拓撲結構:加密代碼放在外部的Octo-SPI Flash中。

對這種自然的做法,以往的MCU在執行片外加密代碼時,需要先調用OSPI驅動,把密文代碼讀進來,比如放到SRAM中。然后使用MCU的軟件或者硬件解密,把代碼明文恢復到SRAM的另一個區域。最后MCU再從這塊SRAM執行明文代碼。

現在我們引入了OTFDEC這個硬件模塊,它位于總線矩陣和Octo-SPI接口之間。把它配置好之后,內核執行片外Flash上的密文代碼(在這里Octo-SPI Flash的映射地址是0x9000 0000開始),無需中間再用SRAM倒一次手,而是在OTFDEC的作用下,直接把解密后的代碼送到總線矩陣上供內核執行了。也就是說,有了OTFDEC的配合,對于CPU來說,執行外部Flash上的加密代碼,就和執行片上Flash的明文代碼是一樣的。

466e6df2-dc58-11eb-9e57-12bb97331649.jpg

為了盡量減少OTFDEC解密造成的延遲,OTFDEC被設計工作在AES-128-CTR模式下。不使用AES的鏈表模式,就是為了盡量縮短對目標地址上密文解密的時間。因此存儲在外部Octo-SPI Flash上的加密代碼也需要使用同樣的AES-128-CTR運算得到。

有一點需要注意的是:為了達到這樣的使用效果,Octo-SPI需要配置到memory map模式。

目前,STM32系列家族中,集成了這個OTFDEC模塊的有STM32H73x系列,STM32L56x系列,和STM32U585系列。

467efdde-dc58-11eb-9e57-12bb97331649.jpg

今天我們不是介紹OTFDEC怎么使用,而是回答前段時間在給客戶介紹OTFDEC的時候,大家一個比較共同的問題:相對于直接執行外部Flash上的明文代碼,執行外部Flash的加密代碼,OTFDEC解密操作引入的延遲有多少?

實驗設計

468aadbe-dc58-11eb-9e57-12bb97331649.jpg

我們接下來設計一個實驗,驗證在OTFDEC參與下,內核執行外部Flash上的密文代碼效率到底如何,用數據說話。

我找了mbedTLS中一個自測程序Crypto_SelfTest,驗證一下把它加密后放在外部Flash,內核執行完整套自測程序需要的時間花銷,和執行外部明文代碼的差異。為了進一步說明問題,還加了一個場景,就是這個自測程序明文放在片內Flash,內核執行它的花銷會快多少。

這個Crypto自測程序經過最高優化等級編譯后,大小差不多在63K作用的樣子。

469e92f2-dc58-11eb-9e57-12bb97331649.jpg

第一個場景就是最普通的,直接把測試程序灌到片上Flash運行。

我們先來看一下這個自測程序,主要就是執行selftests這個函數數組里的自測程序。用戶可以在mebdtls_conf.h頭文件中去選擇哪些自測子項被包含進去?,F在我選擇了6個自測子項。

然后在自測程序開始運行之前,通過檢測是否有用戶按鍵按下,來決定是否開啟Cache。STM32H735集成ARM Cortex-M7內核,自帶32K指令Cache和32K數據Cache。

46aff402-dc58-11eb-9e57-12bb97331649.jpg

因為要測量運行這給自測程序的時間花銷,因此我們使能一個內核計數器,然后在每個測試子項的開始復位該計數器,在測試子項結束后把當前計數器的值,記錄到全局變量的時間戳數組中。最后在6個測試子項都完成后,根據時間戳數組里記錄的值,和當前內核運行頻率,轉換成時間花銷。

由于場景1,是最普通的用法,即程序運行在片上Flash,因此它的鏈接文件就是STM32Cube包中的缺省配置。我這里以IAR為例,展示了這個測試場景下,code的存放地址,包括復位和中斷向量表的存放地址。

46be78ba-dc58-11eb-9e57-12bb97331649.jpg

第二個場景,自測程序運行在外部Flash。而STM32是不能從外部Flash啟動的,我們按照常規的做法,從片上Flash首地址啟動,因此在片上Flash我們放一個Bootloader。它的功能很簡單,就是初始化OSPI接口,并把它配置到memory-map模式。然后調整堆棧指針SP,以及PC指針,跳到0x9000 0000開始的OSPI外部Flash首地址運行。而那里,則是我的Crypto自測程序。

在場景2的自測程序工程Crypto_Selftest_ext_plain中,和之前的工程相比,只需要稍微做兩處修改。鏈接文件,把復位和中斷向量表放到0x9000 0000的地方,并且調整內核寄存器的VTOR值。這樣子,一旦有任何中斷或者異常,都是去位于0x9000 0000處的向量表取執行地址。

46c7eb84-dc58-11eb-9e57-12bb97331649.jpg

第三個測試場景,boot loader工程相比第二個測試場景中,需要增加對OTFDEC的配置。而燒錄在0x9000 0000的內容,應該是從場景2下第二個工程生成的project.bin,加密后的密文。這里,左邊的Bootloader里是OTFDEC在解密,右邊是通過PC端工具預先把代碼做加密。

由于是AES是對稱加解密算法,因此OTFDEC的加密參數配置,要和PC端加密工具的參數一致。

46d5cc0e-dc58-11eb-9e57-12bb97331649.jpg

我們先來設置OTFDEC的解密參數,密鑰key和初始向量IV。

密鑰由用戶自己指定,在代碼里我們設置在Key數組中。按照數組的寫法,考慮到ARM Cortex-M內核是小段對齊,因此這16字節的密鑰,在memory中的存儲順序,應該如左下圖所示。注意,我這里刻意讓16字節的密鑰中,每個字節的內容都不一樣。為什么?我們接下來看。

OTFDEC的IV,HAL驅動封裝了一個結構體給用戶來填寫。由Nounce,OTFDEC將要作用的外部Flash地址范圍,以及將要存放在外部Flash那個地址范圍里代碼的版本號。Nounce,也是由用戶自己設定,我這里仍然刻意讓8個字節的內容都不相同。

46e34cb2-dc58-11eb-9e57-12bb97331649.jpg

接下來我們要配置PC端加密工具的參數了。這里我們使用openssl。

在OTFDEC的解密密鑰設置好了之后,我們在openssl中使用的密鑰要以字節為單位,在16個字節的范圍內,頭尾交換一下。但是注意,字節里面的bit順序不變,也就是每個字節的值不變,只是換了新的位置。這就是為什么我前面故意把OTFDEC的密鑰中,16個字節的內容每個字節值都不一樣,就是為了方便比對每個字節的移動位置。

為什么要這樣調換,這是因為OTFDEC電路設計造成的,我們沒有必要去追究原因,知道在這樣的設計下,我們該怎么做就可以了。

大家注意膠片里貼出來的openssl的命令,-K字符后跟著就是密鑰,這是以字節為單位的字節串。也就是說第一個字節是0x9A,接著的字節分別是0xBC, 0xDE,和膠片中下面的表格中字節順序排列一樣的。

4711371c-dc58-11eb-9e57-12bb97331649.jpg

然后來看IV。

OTFDEC的IV,我們在代碼中,給HAL驅動封裝出來的OTFDEC_RegionConfig結構體每個成員賦值好了之后。這個IV在使用openssl的時候,又需要做怎樣的調序呢?如圖所示:第一個32位的字,來自Nounce[1]。這個4字節組成的32位字里面,字節順序也是依次頭尾交換了一下。第二個32位字,來自Nounce[0],字節調位順序也是一樣。第三個字的高2位字節來自Version,字節調位順序和前面一樣。第四個32位字來自起始地址的移位和regionID的拼接。

大家注意膠片里貼出來的openssl的命令,-iv字符后跟著就是初始向量,這也是以字節為單位的字節串。也就是說第一個字節是0x13,接著的字節分別是0x57, 0x9B,和膠片中下面的表格中字節順序排列一樣的。

471f243a-dc58-11eb-9e57-12bb97331649.jpg

openssl命令的密鑰和IV輸入的內容確定了,還有一件很重要的需要調整的事情:OTFDEC將要解密的對象。

它并不是直接的把明文代碼Project.bin,使用openssl按照前面的參數加密就好了。仍然是由于不同AES運算工具對字節排序的不同,需要做手動調整。這里我們使用PC端的腳本工具,srec_cat先做輸入字節流的填充,然后使用xxd工具,對字節順序做調整。調整的規則和前面的密鑰是一樣的,即,對每16字節的內容:在16個字節的范圍內,頭尾交換一下,字節里面的bit順序不變,也就是每個字節的值不變,只是換了新的位置。經過調序后的字節流再送到openssl做加密,密文同樣還要經過一次相同規則的字節調序,才得到最終可以燒寫到片外Flash(0x9000 0000),由OTFDEC做實時解密的加密代碼。

472bfc3c-dc58-11eb-9e57-12bb97331649.jpg

打開cmd命令窗口,切換到在這個文檔配套的參考例程包里的Utilities/ExtTools目錄下,依次輸入前一頁膠片里的命令,得到預處理階段的最后輸出,即Project_pad_pre_enc_post.bin。

4738a284-dc58-11eb-9e57-12bb97331649.jpg

479bdf52-dc58-11eb-9e57-12bb97331649.jpg

我們可以使用STM32CubeProgramer來驗證OTDEC配置好了之后,從0x9000 0000的地方看到的就是明文代碼的樣子。

驗證步驟請參照膠片中的指示。

47a8210e-dc58-11eb-9e57-12bb97331649.jpg

接下來我們讓板子脫機運行,把場景3運行起來。從板載的LCD屏幕可以看到自測程序完成后,打印出來的時間花銷。

根據我復位的時候是否按下用戶按鍵,可以展現使能Cache和不使能Cache的效果。

從total time cost這一行可以看出,不是能Cache,執行時間要8秒;而使能了Cache,執行時間只要0.2秒。

47b65ed6-dc58-11eb-9e57-12bb97331649.jpg

我們再把場景1和場景2下,啟動工程和自測工程下載到板子上分別運行,再記錄各自的時間花銷。

圖中紅色數字是未開Cache的情況,綠色數字是開啟Cache的情況。

結論

可以得出結論:代碼運行在外部Flash的時候,運行明文和使用OTFDEC運行密文,效率相差無幾;要提高代碼運行在外部Flash的效率,主要加速措施是使能內核自動的Cache。

文章出處:【微信公眾號:STM32單片機

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17718

    瀏覽量

    358324
  • FlaSh
    +關注

    關注

    10

    文章

    1656

    瀏覽量

    150633
  • 代碼
    +關注

    關注

    30

    文章

    4880

    瀏覽量

    70018

原文標題:信息安全主題 | OTFDEC efficiency 基于 STM32H735G-DK 板的驗證

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM32G431移植FreeModbus

    STM32G431移植FreeModbus 的代碼已通過驗證,在WeActStudio的STM32G431CoreBoard上進行多次測試,均可正常讀取寄存器數值。STM32G431C
    發表于 04-19 16:50 ?0次下載

    使用STM32MP135x-DK進行lvgl9.1,編譯時出現報錯怎么解決?

    使用STM32MP135x-DK進行lvgl9.1,顯示屏設備節點使用的/dev/dri/card0 LV_USE_LINUX_FBDEV0 LV_USE_LINUX_DRM1 但是在編譯時出現
    發表于 03-13 06:02

    請問STM32G473是否支持硬件AES?

    STM32G473參考手冊及數據手冊中含有硬件AES相關內容及寄存器相關描述。但STM32G473xx.h中并無AES相關寄存器,pack版本已更新為最新。以地址方式直接賦值,Keil debug過程中查看AES外設賦值失敗。
    發表于 03-12 06:38

    請問STM32N6的OTP位HSLV_VDDIOx如何配置?

    由于沒有申請到stm32N657x0-DK開發,國內也沒有找到任何渠道可以購買DK或者nucleo的開發,近日我本人自制了一塊板子,用于驗證
    發表于 03-07 07:02

    【正點原子STM32H7R3開發套件試用體驗】4G聯網工業設備控制網關

    這次有幸參加 正點原子STM32H7R3開發套件 的評測,計劃使用 正點原子STM32H7R3開發套件,來完成一個 4G聯網工業設備控制網關。 評測計劃: 1. 通過正點原子開發資料
    發表于 12-18 14:14

    STM32H503開發(1)----開發測試

    STM32H503 & SENSOR是一款基于STM32H5系列微控制器的評估套件。該微控制器采用了40nm工藝制造,具有更快的FLASH訪問,更高的性能以及更低的功耗。此外,該套件具有豐富
    的頭像 發表于 11-28 09:23 ?910次閱讀
    <b class='flag-5'>STM32H</b>503開發(1)----開發<b class='flag-5'>板</b>測試

    ?Banana Pi BPi-M4 Zero 開源硬件開發評測試: 全志科技H618 方案設計 ,板載4G 內存,32G eMMC

    ?Banana Pi BPi-M4 Zero 開源硬件開發評測試: 全志科技H618 方案設計 ,板載4G 內存,32G eMMC
    的頭像 發表于 10-15 12:04 ?1284次閱讀

    stm32gstm32h的區別

    STM32GSTM32H是STMicroelectronics(意法半導體)推出的兩個不同的微控制器系列,它們都屬于STM32的廣泛產品線。STM32系列微控制器以其高性能、低功耗和
    的頭像 發表于 09-04 09:15 ?1427次閱讀

    請問STM32MP135F-DK如何移植ubuntu?

    STM32MP135F-DK如何移植ubuntu?
    發表于 07-23 07:10

    STM32WBA55G-DK1如何入門?

    STM32WBA55G-DK1如何入門
    發表于 07-03 07:43

    請問stm32g474ret6開發上面有穩壓器模塊嗎?

    stm32g474ret6開發上面有穩壓器模塊
    發表于 07-02 06:46

    SOC模塊LoRa-STM32WLE5有哪些值得關注

    思為無線最新推出的SOC模塊lora-STM32WLE5采用了ST公司的STM32WLE5芯片作為主芯片集成了LoRa、(G)FSK、(G)
    的頭像 發表于 06-27 17:39 ?1110次閱讀
    SOC<b class='flag-5'>模塊</b>LoRa-<b class='flag-5'>STM32</b>WLE5有哪些值得關注

    STM32MP157F-DK2配置的4G DDR3L,為什么輸入free指令的時候,顯示只有300M的運行內存?

    STM32MP157F-DK2配置的 4G DDR3L,但為什么輸入free指令的時候,顯示只有300M的運行內存。
    發表于 05-30 06:22

    高性能 AC-DC 氮化鎵電源管理芯片DK012G數據手冊

    DK012G 是一款高度集成了 650V/2.2Ω GaN HEMT 的準諧振反激控制AC-DC 功率開關芯片。DK012G檢測功率管漏極和源極之間的電壓(VDS)當 VDS達到其最低值時開啟功率管
    發表于 05-23 17:25 ?4次下載

    STM32H735RGV6芯片燒錄程序的時候提示未發現目標,為什么?

    STM32H735RGV6芯片燒錄程序的時候提示未發現目標,懷疑是電源配置問題,將NRST引腳拉低上電,然后連接STM32CubeProgrammer仍無法連接;將BOOT0拉高,將NRST引腳拉低上電,然后連接STM32Cub
    發表于 05-22 07:31
    主站蜘蛛池模板: 天天爽夜夜爽8888视频精品 | 国产日日操 | 免费观看视频在线 | 在线视频人人视频www | 色亚洲色图 | 亚洲人成电影在线播放 | 亚洲成年| 在线视频影院 | 五月激情综合丁香色婷婷 | 欧美性极品hd高清视频 | 免费又爽又黄的禁片1000部 | 中文天堂在线最新2022更新 | 爽好舒服快受不了了老师 | 一级一级一片免费高清 | 美国一级毛片免费看成人 | 天天舔天天爽 | 清纯唯美亚洲综合一区 | 黄色网址视频在线观看 | 34pao强力打造免费永久视频 | 色天天综合色天天碰 | bbbb毛片免费看 | 午夜精品一区二区三区在线视 | 免费国产不卡午夜福在线 | 亚洲成a人片在线观看中 | 免费人成网ww44kk44 | 亚洲a毛片 | 天天干天天拍天天射 | 亚洲国产丝袜精品一区杨幂 | 久久成人国产精品青青 | www.黄视频| 热久久久久久 | 国产三级精品最新在线 | 欧美成人 色 图 | 欧美精彩狠狠色丁香婷婷 | 欧美一区二区三区视频在线观看 | 狠狠色噜噜狠狠狠狠97不卡 | 国产一区二区三区欧美精品 | 奇米影视7777久久精品 | 久婷婷| 高清毛片aaaaaaaaa片 | 丁香九月婷婷 |