电子产业一站式赋能平台

PCB联盟网

搜索
查看: 251|回复: 0
收起左侧

为什么DCP硬件引擎做Hash校验偶尔会失败?

[复制链接]

355

主题

360

帖子

2831

积分

三级会员

Rank: 3Rank: 3

积分
2831
发表于 2021-4-29 22:58:00 | 显示全部楼层 |阅读模式
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache* [2 X4 E4 x; `8 ]- \
关于i.MXRT1xxx系列内部通用数据协处理器DCP模块,痞子衡之前写过一篇文章 《SNVS Master Key仅在i.MXRT10xx Hab关闭时才能用于DCP加解密》 介绍了DCP基本功能和AES加解密使用注意事项,实际上DCP模块除了对AES加解密算法支持外,还支持经典的Hash算法(SHA-1/SHA-256/CRC32)。/ `8 \. S. V, z8 M1 U/ F
痞子衡最近支持一个i.MXRT大客户,他们项目里使用了DCP做Hash运算,但会出现概率性Hash校验失败的情况(差不多运行50次,会失败1次),这是什么情况?
+ S. G( m+ X7 d5 |# P一、客户项目基本情况先介绍下客户基本情况,他们项目使用的主芯片是i.MXRT1062,并且配置了外部串行Flash存储程序代码(XiP),以及外部SDRAM放置程序数据区(其实主要是做frameBuffer的,但也同时放置了.data段和STACK),项目基于的SDK版本是v2.6.2。
2 h' S4 C: V. w. @; R, _" t项目中主要调用了 \SDK_2.6.2_EVK-MIMXRT1060\middleware\mbedtls\library\sha256.c 中的 mbedtls_sha256() 函数,这个函数其实是通过调用 \SDK_2.6.2_EVK-MIMXRT1060\middleware\mbedtls\port\ksdk\ksdk_mbedtls.c 里的一系列底层函数mbedtls_sha256_xx() 来进一步实现的。
6 R1 N, k& x7 bksdk_mbedtls.c 文件是同时适用Kinetis/LPC/i.MXRT等系列MCU的,不同MCU上硬件引擎不同(比如有LTC/CAAM/CAU3/DCP/HashCrypt)。对于i.MXRT1xxx,硬件引擎就是DCP,这些 mbedtls_sha256_xx() 函数主要调用了 SDK 标准驱动 fsl_dcp.c 里的如下函数:3 @7 M5 m% G9 k& N5 F: m8 w
status_t DCP_HASH_Init(DCP_Type *base, dcp_handle_t *handle, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo);; t, G+ [9 r  G
status_t DCP_HASH_Update(DCP_Type *base, dcp_hash_ctx_t *ctx, const uint8_t *input, size_t inputSize);! [/ q* ~: Q* o9 E6 ?/ W# g
status_t DCP_HASH_Finish(DCP_Type *base, dcp_hash_ctx_t *ctx, uint8_t *output, size_t *outputSize);
( S8 ^! V0 Z! r6 }$ Z2 a二、概率性失败情况分析既然是概率性失败的问题,那大概率和Cache处理有关了,我们需要检查下 fsl_dcp.c 驱动是否很好地处理了Cache。让我们打开 \SDK_2.6.2_EVK-MIMXRT1060\boards\evkmimxrt1060\driver_examples\dcp 例程先看一下,在 dcp.c 文件的 main() 函数里可以看到明显的提醒。如果项目里用到了SDRAM,必须将DCache关掉,说明 dcp 驱动并不支持在DCache使能下运行。但显然这个客户项目用到了SDRAM,后来跟客户确认,他们DCache一直是使能的,这显然是有问题的。
4 r! A2 a% G0 E5 Sint main(void)1 z: x; G- |2 H% s( m
{
) ]9 \; s9 p8 J" `- z" B    dcp_config_t dcpConfig;
! {" ^) K" e* M4 Z) d$ T4 x3 W* u    /* Init hardware*/
. w' K2 o1 \. y/ f9 w& S2 E( `# U    BOARD_ConfigMPU();4 H2 `( j$ {2 S* X
    BOARD_InitPins();
( j: F2 I- t! c$ L# n# R! \    BOARD_BootClockRUN();3 z( x* K, r* M( {2 B- j8 e
    BOARD_InitDebugConsole();% m% C! F$ L; w; O
    /* Data cache must be temporarily disabled to be able to use sdram */
: ~9 Y* h( @4 l# D    SCB_DisableDCache();
& Z9 w  m! `( ^    ...
( F7 ^4 x8 W3 d6 F- ?* u+ c让我们再次回到SDK版本,在 恩智浦SDK下载主页 可以看到所有i.MXRT1060 SDK历史版本,v2.6.2是2019年7月发布的(这个版本里的dcp驱动版本是v2.1.1),是的,这个客户算是i.MXRT早期客户了。而现在最新的SDK版本已经是v2.9.3(dcp驱动已经升级到v2.1.6),时间快过去两年了,客户并没有实时更新SDK版本。2 w$ Q* B' e* ]3 h
早期的 dcp 驱动没有处理DCache,所以其必须在 DCache 关掉的情况下才能正常工作。从v2.1.5开始增加了对 DCache 的处理,这样 dcp 驱动就可以在 DCache 使能的情况下正常工作了。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表