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

    文章

    17132

    浏览量

    351013
  • STM32
    +关注

    关注

    2270

    文章

    10896

    浏览量

    355766
  • IAR
    IAR
    +关注

    关注

    5

    文章

    350

    浏览量

    36669
  • 函数
    +关注

    关注

    3

    文章

    4328

    浏览量

    62575

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

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

收藏 人收藏

    评论

    相关推荐

    aes算法在移动应用中的应用场景

    AES算法(Advanced Encryption Standard,高级加密标准)在移动应用中的应用场景十分广泛,主要体现在以下几个方面: 1. 数据传输安全 在移动应用中,用户经常需要通过网络
    的头像 发表于 11-14 15:14 290次阅读

    aes加密的常见错误及解决方案

    AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,它使用固定长度的密钥对数据进行加密。在使用AES加密时,可能会遇到一些常见错误。以下是对这些错误
    的头像 发表于 11-14 15:13 1189次阅读

    aes在云存储中的应用实例

    云存储服务允许用户通过互联网访问和存储数据,这使得数据的安全性和隐私性成为关键问题。AES作为一种高效的对称加密算法,提供了强大的数据保护能力。 2. AES基本原理 AES是一种对称
    的头像 发表于 11-14 15:11 373次阅读

    aes算法在数据传输中的应用

    随着信息技术的飞速发展,数据安全已成为一个日益重要的议题。AES(高级加密标准)算法作为一种广泛使用的对称加密技术,因其高效性和安全性,在数据传输领域扮演着至关重要的角色。 1. AES算法
    的头像 发表于 11-14 15:09 375次阅读

    蓝牙AES+RNG如何保障物联网信息安全

    对数据进行加密,即使别人截获了加密后的数据,也无法识别利用该数据。目前市面上大部分低功耗蓝牙BLE产品具备AES加密功能。AES(Advanced Encryption Standard)是对称加密算法的一个
    发表于 11-08 15:38

    村田电容grm和gcm的区别有哪些?

    村田电容grm和gcm的区别,众所周知,村田电容在同行业中算是最高端的产品的,跟TDK,太诱差不多级别。但村田电容里面也有分好多不同的系列,今天我们就来了解认识一下grm和gcm系列电容: GRM
    的头像 发表于 07-09 14:11 571次阅读
    村田电容grm和<b class='flag-5'>gcm</b>的区别有哪些?

    村田电容gcm和grm区别?

    村田电容的GCM系列和GRM系列在多个方面存在显著的差异。以下是关于这两个系列电容的详细比较: 1、应用领域 : GCM系列:GCM系列电容以其低ESR(等效串联电阻)和高品质因数(Q值)为主
    的头像 发表于 05-29 15:33 917次阅读
    村田电容<b class='flag-5'>gcm</b>和grm区别?

    ModusToolbox™中为CY8CPROTO-062-4343W) TDA5235_868_5_BOARD运行“Cryptography_AES_Demonstration”, 如何调试实际加密寄存器?

    “Cryptography_AES_Demonstration”。 如何调试实际加密寄存器(AES 芯片块)? 在调试模式下,可以打开外设视图,但它不会列出 CRYPTO 块。
    发表于 05-17 06:57

    AES加密协议是什么?AES加密协议的应用

    标准化过程:AES是在1997年由比利时密码学家Joan Daemen和Vincent Rijmen共同提出的Rijndael算法基础上发展起来的。经过严格的国际评审和对比测试,美国国家标准与技术研究
    的头像 发表于 04-15 15:34 857次阅读

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

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

    使用lsm303agr传感器做一个电子罗盘,能否使用X-CUBE-MEMS1算法库

    使用ST的lsm303agr传感器做一个电子罗盘的应用,希望使用的是nrf52832作为数据采集端,并希望能移植X-CUBE-MEMS1算法库,请问可行吗?如何操作?
    发表于 04-02 07:35

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

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

    请问有人用过瑞芯微自定义3A算法模块吗

    目前也研究了好一阵了,想请教一下如何开发自己的3A算法库或者别的图像处理算法库。想和各位讨论一下
    发表于 01-25 10:15

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

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

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

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