3. 问题分析与定位
正常情况下,当调用 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 */
|