电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

355

主题

360

帖子

2831

积分

三级会员

Rank: 3Rank: 3

积分
2831
发表于 2021-4-29 22:58:00 | 显示全部楼层 |阅读模式
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache" |3 n+ o! s' O# G  x$ X& a
关于i.MXRT1xxx系列内部通用数据协处理器DCP模块,痞子衡之前写过一篇文章 《SNVS Master Key仅在i.MXRT10xx Hab关闭时才能用于DCP加解密》 介绍了DCP基本功能和AES加解密使用注意事项,实际上DCP模块除了对AES加解密算法支持外,还支持经典的Hash算法(SHA-1/SHA-256/CRC32)。
, |2 S: e+ \3 H5 P痞子衡最近支持一个i.MXRT大客户,他们项目里使用了DCP做Hash运算,但会出现概率性Hash校验失败的情况(差不多运行50次,会失败1次),这是什么情况?
" }; X5 @9 ]) j  ~一、客户项目基本情况先介绍下客户基本情况,他们项目使用的主芯片是i.MXRT1062,并且配置了外部串行Flash存储程序代码(XiP),以及外部SDRAM放置程序数据区(其实主要是做frameBuffer的,但也同时放置了.data段和STACK),项目基于的SDK版本是v2.6.2。
0 r5 K2 x' l, ~: Q; w* k项目中主要调用了 \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() 来进一步实现的。4 J* F1 U! L# S" l& U# p: F; `
ksdk_mbedtls.c 文件是同时适用Kinetis/LPC/i.MXRT等系列MCU的,不同MCU上硬件引擎不同(比如有LTC/CAAM/CAU3/DCP/HashCrypt)。对于i.MXRT1xxx,硬件引擎就是DCP,这些 mbedtls_sha256_xx() 函数主要调用了 SDK 标准驱动 fsl_dcp.c 里的如下函数:' s! D8 S$ k: y% W
status_t DCP_HASH_Init(DCP_Type *base, dcp_handle_t *handle, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo);# k# b7 |1 ~( \% s$ j# ?
status_t DCP_HASH_Update(DCP_Type *base, dcp_hash_ctx_t *ctx, const uint8_t *input, size_t inputSize);
% F1 m/ u) W$ W$ hstatus_t DCP_HASH_Finish(DCP_Type *base, dcp_hash_ctx_t *ctx, uint8_t *output, size_t *outputSize);6 r- |4 v- u1 M; M
二、概率性失败情况分析既然是概率性失败的问题,那大概率和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一直是使能的,这显然是有问题的。7 @( [) f3 d0 e
int main(void)1 T; k) E% f3 F/ k' K
{
, k% _, J- R7 S+ o3 H" ?    dcp_config_t dcpConfig;3 y3 v# T8 m/ H" K/ w% f
    /* Init hardware*/" U0 F$ {0 ?9 x0 W
    BOARD_ConfigMPU();
4 r4 W* [3 q+ ?" ^' |/ ~    BOARD_InitPins();
* D3 x. ]9 C1 _( @) a4 l0 i2 O9 Y    BOARD_BootClockRUN();1 k' h0 F" @7 N5 h' M3 `1 Y6 X
    BOARD_InitDebugConsole();" S! c# F) c* o$ e) J0 b3 c) J
    /* Data cache must be temporarily disabled to be able to use sdram */
- a, C- f9 O0 c9 b5 X    SCB_DisableDCache();% G2 }$ m. L: y: j- C6 k4 [
    .... a0 E7 n* L: F% \/ f/ O
让我们再次回到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版本。
$ f$ Z8 n& }6 G/ C" p8 E8 R6 r7 K- S早期的 dcp 驱动没有处理DCache,所以其必须在 DCache 关掉的情况下才能正常工作。从v2.1.5开始增加了对 DCache 的处理,这样 dcp 驱动就可以在 DCache 使能的情况下正常工作了。
回复

使用道具 举报

发表回复

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

本版积分规则


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