Crypto算法库使用技巧之基于STM32 AES GCM应用提示

发布者:yanfeng00最新更新时间:2023-08-17 来源: elecfans关键字:算法库  STM32  AES 手机看文章 扫描二维码
随时随地手机看文章

引言

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 的内容, 不可想当然地自行调整配置。其实,库是预先编译好了的,所有的功能都已经包含,只是链接的时候根据用户使用到的函数去链接最终的目标文件。


这个客户就是按照以为关闭某些配置可以节省代码空间的想法,贸然注释掉了他以为自己不需要的功能,造成数据结构大小发生变化等,影响加密库的正常使用。


关键字:算法库  STM32  AES 引用地址:Crypto算法库使用技巧之基于STM32 AES GCM应用提示

上一篇:STM32单片机中Hex、Bin文件的区别及应用详解
下一篇:由浅入深尽享STM32标准库开发的乐趣

推荐阅读最新更新时间:2024-11-04 17:18

STM32学习之ADC
对于STM32,在使用ADC的时候需要配置几个参数。 (1) 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 (2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置
[单片机]
基于STM32的keil4 MDK 软件仿真输出IO口的波形图
这是一个STM32的PA6和PA7口输出PWM波形的仿真步骤,其它情况类似 每一步我都做了截图,大家照着一步步来,有些参数根据自己的情况稍微改下就好,肯定可以出波形的!请大家放心参考
[单片机]
基于<font color='red'>STM32</font>的keil4 MDK 软件仿真输出IO口的波形图
STM32 的位带操作
位操作就是可以单独的对一个比特位进行读和写,这个在51单片机中非常常见。51单片机中通过关键字sbit来实现位定义,STM32中则是通过访问位带别名区的地址来实现对某一位的操作。 例如51单片机中可以实现以下操作 #define LED_ON 0 sbit LED = P2^0; LED = LED_ON; 而现在STM32的位段、位带别名区就为了实现这样的功能。STM32针对SRM和外设区开辟了两个内存空间(位带区),分别是SRAM和外社区的最低1MB的空间。这两个1MB的内存空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区就是把1MB位带区的每一个位膨胀成一个32位的字,当通过访问位带
[单片机]
<font color='red'>STM32</font> 的位带操作
基于STM32的甲醛浓度检测报警proteus仿真设计
仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0083 1.主要功能 功能说明: 1、以STM32单片机和控制核心设计甲醛浓度检测报警设计; 2、通过液晶屏LCD1602和串口上位机显示甲醛浓度,MV表示检测值,ALM表示报警值; 3、可以通过按键设置甲醛浓度ALM报警值大小。 4、监测甲醛浓度大于报警值时蜂鸣器报警电路导通,蜂鸣器报警。 5、默认监测到甲醛浓度高于0.100mg/m3蜂鸣器报警。 主要硬件设备:STM32F103单片机 资料下载链接: https://docs.qq.com/doc/DS0FkcGdVRlFGcVhN 以下为本设计资料展示: 2.仿真设计 本实验利用ST
[单片机]
基于<font color='red'>STM32</font>的甲醛浓度检测报警proteus仿真设计
如何让STM32优雅地“说”hello world?
01 前言 STM32上hello world,说白了就是使用串口向PC上的上位机软件或者串口调试助手发送字符串。 串口的使用方法百度一下就能知道了,简单来说就是下面这样。 uint8_t buff ;//定义一个缓存数组 HAL_UART_Receive_IT(&huart1, (uint8_t *)buff, BUFF_SIZE);//打开串口接收中断 串口中断打开之后,当接收到BUFF_SIZE个数据后就会进入 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 然后我们就可以在上面这个函数下操作收到的数据啦,简单方便快捷。当然实际操作一遍后大家就会发现,这个程序
[单片机]
防盗功能的智能车模型举例
简介:本文采用增强型32位低功耗单片机STM32F103VC、指纹识别技术和无线通信GSM技术设计了汽车防盗系统,它利用人体指纹的生物特征的惟一性,通过指纹识别控制汽车的电路、油路等,从而达到防盗的目的,解决了目前广泛采用的无线遥控方式存在空中截码和非法获取电子钥匙合法开车等问题。GSM技术增加了人防功能,它能通过无线网络进行远程报警。本系统的设计,有效的弥补了单一防盗电路的缺点,保障了汽车的安全。 目前市场上销售的汽车防盗报警器多为加装式汽车防盗器和采用电子密码钥匙的汽车防盗器。加装式汽车防盗器主要采用串接式的线路,对于精通汽车电路的盗贼来说,用跨接的方法可很轻松地避开防盗电路,防盗系统如同虚设。 随着汽车市场的飞速发展
[单片机]
防盗功能的智能车模型举例
STM32系列单片机在进入main函数前都在干些什么?
在刚开始学习单片机的时候,一直以为程序启动后就直接进入到了main函数,但是随着学习的深入才发现,程序在进入main函数前其实还要干好多事情。现在就来分析一下,STM32系列单片机程序在进入main函数前都在干些什么? 单片机上电后,程序首先跳转到地址0处,此时主堆栈指针MSP的初值也为0。然后单片机产生了复位信号,主堆栈指针加1,由于单片机内核为32位,所以地址增加一位,实际上是增加了32位,也就是增加了4个字节。此时MSP指针就指向了复位向量。而Cortex-M内核处理器的向量表可以重新定位,所以此时程序就会跳转到复位向量重新映射的地址处。 通过上面的两个图可以看到,通过复位向量的重映射后,MSP指针就会跳转到复位
[单片机]
<font color='red'>STM32</font>系列单片机在进入main函数前都在干些什么?
STM32 TIM重映射
复用功能 没有重映射 部分重映射 完全重映射 TIM3_CH1 PA6 PB4 PC6 CH2 PA7 PB5 PC7 CH3 PB0 PB0 PC8 CH4 PB1 PB1 PC9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved