引言
X-CUBE-CRYPTOLIB 是基于 STM32 的 Crypto 算法庫,支持對稱密鑰、非對稱密鑰、哈希等多種算法。正確地使用 Cyrptolib 算法庫,可以在應用程序中實現數據加密、設備身份認證、加密通信等多種應用層所需的安全功能。相反,若不能正確地使用算法庫往往會帶來加解密數據錯誤等系列問題。
關于 STM32 Crypto 算法庫應用中的常見的問題之一就是應用程序沒有使能 MCU 的CRC 模塊,盡管輸出的數據和期望值不同,但加解密函數的調用并未返回異常。本文在此描述另外一種沒有正確使用算法庫的情況。
問題描述
客戶應用項目中需要在固件更新過程中對固件進行加密并驗證,根據推薦采用了 AES- GCM 算法完成該任務。下載的固件通過 AES-GCM 進行加密,并帶 TAG 可以用于驗證固件來源的合法性。在項目的代碼中使用 X-Cube-Cryptolib 進行 AES-GCM 運算。上位機使用 cryptopp820 加密庫對固件目標 bin 文件進行加密,然后在 MCU 上通過X-Cube- Cryptolib 加密庫進行 AES-GCM128 解密,解密數據沒有問題,但是 TAG 數據總是無法校驗通過。
問題分析與定位
正常情況下,當調用 AES_GCM_Decrypt_Finish(P_pAESGCMctx, NULL, P_pOutputSize);執行后,AESctx.mFlags 結果會提示是否通過校驗。如果校驗成功,該值應該等于 0x22,而運行結果中看到的卻是 0x12。
確認庫函數使用方法
將調用 AES-GCM 功能的代碼放在 X-Cube-Cryptolib 中一個簡單的測試程序的環境進行測試,查看是否有該問題,結果發現測試程序中 AES-GCM 校驗是可以成功的,但是集成到客戶應用中時就無法成功。那我們接下來重點研究應用程序環境。
應用程序環境
應用程序使用了 FreeRTOS,基于 IAR 編譯環境。
查看庫文件的使用
確認使用了正確的庫文件。
確認是否存在多線程訪問
AES-GCM 的函數會在幾個線程中調用,而且確認不會出現同時調用的情況,不存在 raise condition 的問題。
查看內存使用情況
最初懷疑是否因為任務棧溢出造成,于是查看內存使用情況。IAR stack size: 0x4800
IAR heap size: 0x4000
FreeRTOS heap size: 85KB
執行AES 運算的線程 stack size: 2560B
通過 FreeRTOS 的 uxTaskGetStackHighWaterMark() 函數查看該線程還有 500 字節左右剩余空間。
AESGCMctx_stt 結構的大小有 2360 字節,AES-GCM 加解密函數需要的 stack 大小大概在 450 字節左右,但是應用代碼中將該變量定義為全局變量,以便可以在幾個不同的線程中使用,這樣可以確認線程棧大小沒有問題,不存在 stack overflow 的問題。
查看生成代碼的.map 文件
通過比較,所有 cryptolib 中的 symbol 在 map 中的大小都正常,唯一有問題的是 AESGCMctx_stt 結構變量的大小。應用代碼.map:AESctx 0x2002f1f4 0x8f8 Data Gb AES_GCM_Decrypt.o [1]
正常測試代碼 .map:AESctx 0x20002e64 0x938 Data Gb AES_GCM.o [1]
驗證不過的問題應該和這個結構的數據有直接關系,接下來研究是什么造成了這個不同。
查看項目使用的 crypto 庫頭文件
經檢查,INCLUDE_AES192 和 INCLUDE_AES256 兩個宏定義在 config.h 的定義中被注釋掉,這將導致 aes_gcm.h 中 AESGCMctx_stt 數據結構的成員變量 uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE];的大小發生變化,因為CRL_AES_MAX_EXPKEY_SIZE 的定義根據INCLUDE_AES128/192/256 是否定義會有所不同。
//#define INCLUDE_DES ((uint16_t)0x0001) /*!《 DES functions are included in the library. *///#define INCLUDE_TDES ((uint16_t)0x0002) /*!《 TripleDES (TDES) functions are included in the library. */#define INCLUDE_AES128 ((uint16_t)0x0004) /*!《 AES functions with key size of 128 bit are included in the library. *///#define INCLUDE_AES192 ((uint16_t)0x0008) /*!《 AES functions with key size of 192 bit are included in the library. *///#define INCLUDE_AES256 ((uint16_t)0x0010) /*!《 AES functions with key size of 256 bit are included in the library. *///#define INCLUDE_ARC4 ((uint16_t)0x0020) /*!《 ARC4 functions are included in the library. *///#define INCLUDE_CHACHA ((uint16_t)0x0040) /*!《 ChaCha functions are included in the library. *///#define INCLUDE_CHACHA20POLY1305 ((uint16_t)0x0080) /*!《 oly1305- AES functions are included in the library */
問題解決
將 config.h 里面被注釋掉的兩行定義打開,重新編譯,此時 TAG 驗證能夠正常通過。#define INCLUDE_AES128 ((uint16_t)0x0004) /*!《 AES functions with key size of 128 bit are included in the library. */#define INCLUDE_AES192 ((uint16_t)0x0008) /*!《 AES functions with key size of 192 bit are included in the library. */#define INCLUDE_AES256 ((uint16_t)0x0010) /*!《 AES functions with key size of 256 bit are included in the library. */
小結
簡言之,如果使用 X-Cube-Cryptolib 庫的話,作為用戶就不要改動 config.h 的內容, 不可想當然地自行調整配置。其實,庫是預先編譯好了的,所有的功能都已經包含,只是鏈接的時候根據用戶使用到的函數去鏈接最終的目標文件。
這個客戶就是按照以為關閉某些配置可以節省代碼空間的想法,貿然注釋掉了他以為自己不需要的功能,造成數據結構大小發生變化等,影響加密庫的正常使用。
編輯:jq
-
mcu
+關注
關注
146文章
17123瀏覽量
350994 -
STM32
+關注
關注
2270文章
10895瀏覽量
355744 -
IAR
+關注
關注
5文章
350瀏覽量
36665 -
函數
+關注
關注
3文章
4327瀏覽量
62573
原文標題:工程師筆記 | Crypto算法庫使用技巧 —— 基于STM32 AES GCM應用提示
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論