0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32单片机 来源:STM32单片机 作者:STM32单片机 2021-09-24 14:23 次阅读

引言

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
    mcu
    +关注

    关注

    146

    文章

    16009

    浏览量

    343523
  • STM32
    +关注

    关注

    2239

    文章

    10669

    浏览量

    348709
  • IAR
    IAR
    +关注

    关注

    5

    文章

    319

    浏览量

    36281
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61307

原文标题:工程师笔记 | Crypto算法库使用技巧 —— 基于STM32 AES GCM应用提示

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32L072系列支持AES加密算法吗?

    STM32L072,L0系列,Cortex-M0/M0+/M1处理器基于ARMv6-M架构,查指令集是没有AES加密支持的请问要怎么支持AES加密算法
    发表于 04-10 08:05

    全志R128 SDK HAL 模块开发指南——Crypto Engine

    Crypto Engine 模块介绍 CE 模块主要支持对称算法、非对称算法、摘要算法进行数据的加密和解密功能。 CE 模块主要支持的算法
    发表于 03-21 10:44

    xmc7200如何将KEIL的算法库移植到MTB?

    你好我正在使用xmc7200芯片,我想将 KEIL 算法库移植到MTB使用,我应该如何操作?最好的问候
    发表于 01-25 06:08

    mini57系列运行带算法库的程序,编译没有错误但无法运行是为什么?

    我用mini57系列的芯片跑做一个心率检测的产品。加入心率算法库后,发现程序无法运行,但是编译没有报错。我在线仿真发现无法进入main函数,程序运行不了。算法库是用新塘的demo在keil的环境下生成的。 不知道是为什么。
    发表于 01-15 08:33

    基于PIC单片机的AES算法优化设计

    电子发烧友网站提供《基于PIC单片机的AES算法优化设计.pdf》资料免费下载
    发表于 10-30 09:46 0次下载
    基于PIC单片机的<b class='flag-5'>AES</b><b class='flag-5'>算法</b>优化设计

    STM32 Cryptolib使用技巧——AES GCM解密认证失败问题的研究

    电子发烧友网站提供《STM32 Cryptolib使用技巧——AES GCM解密认证失败问题的研究.pdf》资料免费下载
    发表于 09-20 11:08 1次下载
    <b class='flag-5'>STM32</b> Cryptolib使用技巧——<b class='flag-5'>AES</b> <b class='flag-5'>GCM</b>解密认证失败问题的研究

    【开源三方库】crypto-js加密算法库的使用方法

    crypto-js已支持的算法有:MD5、SHA-1、SHA-256、HMAC、HMAC-MD5、HMAC-SHA1、HMAC-SHA256、PBKDF2、AES、RC4、DES等。 特点 • 安全性
    发表于 09-08 15:10

    【开源三方库】crypto-js加密算法库的使用方法

    三方库。 crypto-js是一个加密算法类库,可以非常方便地在前端进行其所支持的加解密操作。目前crypto-js已支持的算法有:MD5、SHA-1、SHA-256、HMAC、
    的头像 发表于 09-07 21:10 527次阅读

    新唐有提供BLDC软件算法库吗?

    我看新塘的介绍里面 提供BLDC 软件算法库
    发表于 09-06 07:58

    用于在AES GCM中测试400字节加密时间的代码

    V3.00.0003 硬件:NuMaker-M2354 VER1.1 M2354系列MCU具有超低功率消耗特征,并有一个适合具有安全通信的IoT装置的加密加速器。 该示例代码用于在 AES GCM
    发表于 08-29 07:05

    mini57系列运行带算法库的程序,编译没有错误但无法运行是为什么?

    我用mini57系列的芯片跑做一个心率检测的产品。加入心率算法库后,发现程序无法运行,但是编译没有报错。我在线仿真发现无法进入main函数,程序运行不了。算法库是用新塘的demo在keil的环境下生成的。 不知道是为什么。
    发表于 08-22 08:16

    如何将AES的私人密钥储存在SPROM中

    : NuMaker-PFM-M487 V3.0 M480系列设计了用于知识产权保护的硬件CRYPTO和SPROM,加密(加密加速器)包括一个安全的假随机数字生成器核心,支持AES、DES/TDES、SHA和HMAC算法,安全保护
    发表于 08-22 06:58

    深度学习算法库框架学习

    深度学习算法库框架学习 深度学习是一种非常强大的机器学习方法,它可以用于许多不同的应用程序,例如计算机视觉、语言处理和自然语言处理。然而,实现深度学习技术需要使用一些算法库框架。在本文中,我们将探讨
    的头像 发表于 08-17 16:11 432次阅读

    mini57系列运行带算法库的程序,编译没有错误,但无法运行是为什么?

    我用mini57系列的芯片跑做一个心率检测的产品。加入心率算法库后,发现程序无法运行,但是编译没有报错。我在线仿真发现无法进入main函数,程序运行不了。算法库是用新塘的demo在keil的环境下生成的。 不知道是为什么。
    发表于 06-13 09:05

    如何实现AES128-CMAC的算法

    我在 S32K118 硬件上启用了 Csec 模块。上位机需要执行软件AES128-CMAC算法,然后将CMAC值发送给ECU进行校验。但是我不知道如何实现AES128-CMAC,你能给我一些建议吗?
    发表于 05-04 08:06