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

    关注

    147

    文章

    18605

    浏览量

    387037
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371155
  • IAR
    IAR
    +关注

    关注

    5

    文章

    400

    浏览量

    38343
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66838

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯片AES硬件运算单元好用吗?

    我看好多芯片都支持AES硬件运算单元,感觉用起来的却没有几个,不知道芯源这方面是不是和其他芯片的AES硬件一样呢?我也想知道,这种硬件单元一般用在哪个场合比较多呢
    发表于 12-03 06:27

    AES加解密算法逻辑实现及其在蜂鸟E203SoC上的应用介绍

    这次分享我们会简要介绍AES加解密算法的逻辑实现,以及如何将AES算法做成硬件协处理器集成在蜂鸟E203 SoC上。 AES
    发表于 10-29 07:29

    针对AES算法的安全防护设计

    无法获取密钥与功耗曲线之间的相关性。为确保加密算法在执行过程中始终安全,全掩码技术是最常用的一种方法。 根据AES加解密算法的特点,结合我们提出的运算结构,设计的全掩码AES加解密电路
    发表于 10-28 07:38

    AES和SM4算法的可重构分析

    一、AES和SM4算法特点分析 基于前面几篇分享,我们对AES和SM4的算法流程有了较为清晰的认识,接下来对AES和SM4
    发表于 10-23 07:26

    AES加密流程

    AES(Advanced Encryption Standard)是一种对称密钥加密算法,它是当前最常用的加密标准之一。AES是一种可靠、高效和安全的加密技术,被广泛应用于网络安全、移动设备和云计算
    发表于 10-23 06:13

    为什么 M480 AES 示例输出与网络工具不同?

    为什么 M480 AES 示例输出与网络工具不同?
    发表于 08-28 08:12

    M487如何使用AES和SPROM保护ISP?

    M487使用 AES 和 SPROM 保护 ISP
    发表于 08-19 06:07

    Crypto核心库:颠覆传统的数据安全轻量级加密方案

    传统加密方案常陷入“安全与性能”的二元悖论。Crypto核心库打破这一僵局,通过轻量级架构与算法优化,实现加密解密的双向突破:在保障银行级安全的同时,将资源消耗压缩至极致,让数据安全“轻”装上
    的头像 发表于 08-04 14:44 525次阅读
    <b class='flag-5'>Crypto</b>核心库:颠覆传统的数据安全轻量级加密方案

    轻量级加密解密:Crypto核心库守护数据安全的终极答案

    在数据安全领域,“重量级”不等于“强效”。Crypto核心库摒弃臃肿设计,聚焦轻量化创新,通过精简算法与高效逻辑,实现加密解密的双重突破——既让数据安全无懈可击,又让系统运行轻如鸿毛。 加解密算法
    的头像 发表于 08-04 14:41 699次阅读
    轻量级加密解密:<b class='flag-5'>Crypto</b>核心库守护数据安全的终极答案

    STM32F103c8上做DLQR最优控制算法的C编程资料

    这是我近期做的一个项目--基于STM32F103c8的DLQR控制算法的C编程,涉及DLQR最优控制算法、嵌入式STM32F103编程、CMSIS-DSP库使用。    附有完整的程序
    发表于 07-23 15:30 0次下载

    STM32_Cryptographic st加密库V3.0.0移植以后啥也没改,AES256ECB模式加解密都不对,为什么?

    调用 status = STM32_AES_ECB_Encrypt( (uint8_t *) Plaintext, 64, Key, OutputMessage,&
    发表于 07-11 06:11

    harmony-utilsAESAES加解密

    harmony-utilsAESAES加解密 harmony-utils 简介与说明 [harmony-utils] 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于
    的头像 发表于 06-30 17:30 444次阅读

    shimetapi:开源RGB+EVS视觉融合相机事件相机工具链与算法库

    的接口控制和算法处理。 一、shimetapi_Hybrid_vision_algo (算法层 SDK) 定位: 这是 SDK 的核心算法处理层,位于架构的中间层(黄色部分)。 核心功能: 专注于处理来自
    的头像 发表于 06-26 13:52 464次阅读

    请问STM32G473是否支持硬件AES

    STM32G473参考手册及数据手册中含有硬件AES相关内容及寄存器相关描述。但STM32G473xx.h中并无AES相关寄存器,pack版本已更新为最新。以地址方式直接赋值,Keil
    发表于 03-12 06:38

    常见的加密算法有哪些?它们各自的优势是什么?

    常见的加密算法及其优势如下: AES(Advanced Encryption Standard): AES是一种对称加密算法,采用分组密码体制,支持128位、192位和256位密钥长度
    的头像 发表于 12-17 15:57 1727次阅读