你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2022-8-10 08:54
1. 引言6 d$ K' W0 [. f" `  |2 U) z4 S
X-CUBE-CRYPTOLIB 是基于 STM32 的 Crypto 算法库,支持对称密钥、非对称密钥、哈希等多种算法。正确地使用 Cyrptolib 算法库,可以在应用程序中实现数据加密、设备身份认证、加密通信等多种应用层所需的安全功能。相反,若不能正确地使用算法库往往会带来加解密数据错误等系列问题。
) E0 l9 M1 t5 @( z关于 STM32 Crypto 算法库应用中的常见的问题之一就是应用程序没有使能 MCU 的CRC 模块,尽管输出的数据和期望值不同,但加解密函数的调用并未返回异常。本文在此描述另外一种没有正确使用算法库的情况。# Z8 N6 C0 g* N" S. j6 B! F
1 F6 H, K( A  C' t3 m

3 M- Z3 w8 C, T3 R1 W; D4 O/ d* _2. 问题描述
" s9 `" o0 R' D) C6 D6 ?7 l2 R" N客户应用项目中需要在固件更新过程中对固件进行加密并验证,根据推荐采用了 AES-GCM 算法完成该任务。下载的固件通过 AES-GCM 进行加密,并带 TAG 可以用于验证固件来源的合法性。在项目的代码中使用 X-Cube-Cryptolib 进行 AES-GCM 运算。上位机使用 cryptopp820 加密库对固件目标 bin 文件进行加密,然后在 MCU 上通过 X-Cube-Cryptolib 加密库进行 AES-GCM128 解密,解密数据没有问题,但是 TAG 数据总是无法校验通过。  |$ w; O' f9 t
. `5 [4 P& O; Q2 w/ M; E

3 w* C" T2 q& I! t+ a3 m3. 问题分析与定位
: e* j1 {$ ^+ X+ h6 V正常情况下,当调用 AES_GCM_Decrypt_Finish(P_pAESGCMctx, NULL,P_pOutputSize);执行后,AESctx.mFlags 结果会提示是否通过校验。如果校验成功,该值应该等于 0x22,而运行结果中看到的却是 0x12。6 r! t; t, d- X3 Q& c% S: q
5 ^( m6 v: I6 G) n
确认库函数使用方法
0 B/ L2 e6 P* k2 o* _$ s" w' L将调用 AES-GCM 功能的代码放在 X-Cube-Cryptolib 中一个简单的测试程序的环境进行测试,查看是否有该问题,结果发现测试程序中 AES-GCM 校验是可以成功的,但是集成到客户应用中时就无法成功。那我们接下来重点研究应用程序环境。2 m3 I' I  ^. j/ e
  t8 I4 ~, l+ }* \
应用程序环境6 D( U) e2 T3 z
应用程序使用了 FreeRTOS,基于 IAR 编译环境。
% ~" t, l" J: E; q, z8 U
/ Z& B; P. B5 u( ?查看库文件的使用
* O7 y8 H' m* q( R* a9 [' d, H确认使用了正确的库文件。3 H/ v4 Y; f: I
确认是否存在多线程访问
# H) S! {& O- ?AES-GCM 的函数会在几个线程中调用,而且确认不会出现同时调用的情况,不存在raise condition 的问题。
7 \% }( S6 C' ?5 w2 X& v: k, {& J. q  A" Z, m! {9 O
查看内存使用情况
, z  r4 l1 M$ z7 n最初怀疑是否因为任务栈溢出造成,于是查看内存使用情况。
7 C5 {7 I% @9 ]4 `4 e• IAR stack size: 0x4800
, t( {7 s+ [: g9 }3 @; V• IAR heap size: 0x4000, d% f' q' f, Z; {& h2 g) ~
• FreeRTOS heap size: 85KB
$ a# ?3 k2 W; O# a• 执行 AES 运算的线程 stack size: 2560B  a/ w0 o4 p1 J4 H' }/ z
通过 FreeRTOS 的 uxTaskGetStackHighWaterMark() 函数查看该线程还有 500 字节左右剩余空间。/ P% g6 F2 F5 F. o* m6 x
AESGCMctx_stt 结构的大小有 2360 字节,AES-GCM 加解密函数需要的 stack 大小大概在 450 字节左右,但是应用代码中将该变量定义为全局变量,以便可以在几个不同的线程中使用,这样可以确认线程栈大小没有问题,不存在 stack overflow 的问题。
' K' A- D8 n1 K0 K1 @% @
+ u6 H" {# @' z8 \$ r; i' W
查看生成代码的.map 文件
' Y. _! m) _1 W' o4 r8 _, Z通过比较,所有 cryptolib 中的 symbol 在 map 中的大小都正常,唯一有问题的是AESGCMctx_stt 结构变量的大小。
$ Z/ r$ |* A0 ]3 r( Q• 应用代码 .map: AESctx 0x2002f1f4 0x8f8 Data Gb AES_GCM_Decrypt.o [1]
: N1 K( t9 k" E# r% Z4 h: D• 正常测试代码 .map: AESctx 0x20002e64 0x938 Data Gb AES_GCM.o [1]: P8 D4 g, W  [9 q9 t
验证不过的问题应该和这个结构的数据有直接关系,接下来研究是什么造成了这个不同。
& k3 g0 H% s% U. a
& e! T0 c4 u; y( I5 ?

$ m0 R  ~' ?" }& s9 s5 T3 ^" y查看项目使用的 crypto 库头文件5 q# I( \" i' |; b0 g
经检查,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 是否定义会有所不同。, ?: e0 ^7 @0 O8 U8 P& d9 o
8 E6 U3 n- i8 ]' V! c" j

1 E  [2 A0 z& I  v. B 01PWO2%QVH~]39{Q1Z_XZYB.png # N0 {8 [" v8 Z0 c$ @; e
0S6(V2G{05$T{I%4%6[H0D3.png
; q4 U* n+ f1 e5 @0 n+ k9 D7 g
, X. Q$ F1 T0 v: C完整版请查看:附件

7 ~! L* z# B5 Y  J3 z9 {3 m
9 N$ |' P  U3 W' A. x/ t
8 r4 r# \! b% V* Y& B0 ?8 x1 R( o/ O) }: ?9 @5 D5 G; X" u2 h' T# B
+ t: M6 P' u4 @! H

LAT1026_基于STM32_AES_GCM应用提示.pdf

下载

304.76 KB, 下载次数: 2

赞 收藏 评论0 发布时间:2022-8-10 08:54

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版