首页 > 其他分享 >痞子衡嵌入式:利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据长度对齐

痞子衡嵌入式:利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据长度对齐

时间:2024-11-20 21:46:27浏览次数:1  
标签:值时 handle 痞子 CRC MXRT10xx CRC32 对齐 DCP


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据长度对齐

  MCU 开发里常常需要 CRC 校验来检查数据完整性,CRC 校验既可以纯软件实现也可以借助 MCU 片内外设硬件实现。大部分 MCU 里通常都会包含一个单独的硬件 CRC 外设,但是在 i.MXRT 四位数系列里,翻看参考手册,我们却找不到名为 CRC 的外设,难道这么一款高性能 MCU 不支持硬件 CRC?当然不是!这个功能藏在一个更强大的数学计算引擎外设里。

  • Note:在 i.MXRT10xx 系列上这个引擎是 DCP,在 i.MXRT11xx 系列上这个引擎升级为 CAAM。

  关于 DCP 引擎使用,痞子衡写过一篇文章 《DCP计算Hash值时需特别处理L1 D-Cache》。最近官方社区里有人提问,当待校验 CRC 数据长度是 4 字节整数倍时,DCP 计算结果和一些在线网站上的计算结果保持一致(多项式和配置设置一致),但是当数据长度不是 4 字节对齐时,两者结果就不一致了,这是怎么回事?今天咱们来聊一聊:

一、DCP对于CRC支持

  翻看任何一个 i.MXRT10xx 系列的参考手册,仅在 System Security 章节有一小段关于 DCP 特性描述,里面讲了能支持 CRC32,但是关于多项式配置信息没有提及。

  既然手册没涉及太多,那直接撸代码吧,可以参考 SDK\boards\evkmimxrt10xx\driver_examples\dcp 例程,相关代码足够简单抄录如下。代码里仅 m_handle.swapConfig 设置会改变 CRC 计算结果(因为对源数据做了 swap 处理),除此以外并未提供其他 CRC 多项式参数配置,因此可以基本认定 DCP 支持的是一个固定参数模式的 CRC32 算法分支,用户无法更改参数。

#include "fsl_dcp.h"

dcp_config_t dcpConfig;
DCP_GetDefaultConfig(&dcpConfig);
DCP_Init(DCP, &dcpConfig);

dcp_handle_t m_handle;
m_handle.channel    = kDCP_Channel0;
m_handle.keySlot    = kDCP_KeySlot0;
// 仅这里换成 kDCP_InputByteSwap 会影响 CRC 计算结果(res - 4字节)
m_handle.swapConfig = kDCP_NoSwap;
status = DCP_HASH(DCP, &m_handle, kDCP_Crc32, srcBuf, srcLen, res, &resLen);

  这里痞子衡就不继续卖关子了,DCP 固定支持的就是经典的 CRC32-MPEG2,其参数如下:

二、DCP-CRC32关于数据对齐处理

  关于 CRC32-MPEG2 算法实现细节可在 IEEE 802 标准手册里找到,原则上其对于源数据长度是没有对齐要求的,但在具体硬件实现上,不同硬件可能会增加末尾数据对齐处理。

  痞子衡找了一块 RT1020-EVK 开发板跑了一下 SDK\boards\evkmimxrt1020\driver_examples\dcp 例程,只对例程做了简单修改如下,从测试结果来看,发现 DCP 对源数据做了末尾 4 字节对齐处理(用 0x00 填充)。

  DCP 这个数据对齐处理特性说明能在哪里找到呢?我们知道 DCP 是跟芯片安全特性相关的,i.MX RT 芯片除了有普通参考手册(RM)之外,还有一个安全参考手册(SRM),在 SRM 里面会进一步介绍芯片安全相关的外设。在恩智浦官网 i.MXRT 产品主页进入具体型号,切换到 Secure Files 选项(这里需要账号登录,并且申请访问权限,可联系 FAE 签 NDA),如果有访问权限,便可以下载 SRM:

  在 SRM 里我们看到了 DCP CRC32 对于数据对齐处理策略,与板级测试结果吻合:

  文章开头说 i.MXRT11xx 系列里的 CAAM 模块是 i.MXRT10xx 里 DCP 的升级,我们仅从 CRC 支持方面可见一斑,CAAM 对于 CRC 的支持更丰富,除了经典算法,还支持用户自定义参数(这就比较像传统 MCU 里的单独 CRC 外设):

  至此,利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据长度对齐痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

标签:值时,handle,痞子,CRC,MXRT10xx,CRC32,对齐,DCP
From: https://www.cnblogs.com/henjay724/p/18559411

相关文章

  • CRC32爆破
    记录一下第一次用CRC32爆破压缩包记录需要文件很小,类似几个字节那种工具链接:https://github.com/liqq1228/crc32下载题目,得到一个图片:veryeasy.png一样的图片文件,可以自己下载拿去练习通过foremost命令,foremostveryeasy.png分离图片得到2个压缩包第一个压缩包打开得......
  • CRC32爆破脚本 + [MoeCTF 2022]cccrrc 题解
    CRC32爆破原理介绍:CRC(循环冗余校验)是一种用于检测数据传输错误的技术。CRC算法生成一个校验值(校验和),这个值可以附加到数据后面,在数据接收方重新计算校验值并与附加的校验值进行比较,以此来确定数据是否在传输过程中发生了错误CRC32是一种常用的CRC算法,它的校验值长度固定为3......
  • 通过删除按钮从列表框中删除时,减去数字值时遇到一些问题
    我尝试了不同的组合来尝试在点餐时获取要减去的值,并成功地将项目从列表框中删除,但尚未从“总价值”中删除项目值。这是我多次尝试获取要减去的值时遇到的问题。有谁能够获得从列表框中删除后从总值中减去的值吗?importtimeimporttkinterastkfromPILimportImage,ImageT......
  • 旨在在函数达到某个值时中断函数的 Elif 条件不起作用
    我一直在开发一个程序,该程序检测按下“enter”的次数,问题是当变量达到某个值时,应该中断函数的elif/if条件会不断计算次数已按下“enter”而不是中断该功能。frompynputimportkeyboardkeystroke=0defon_release(key):print(key)globalkeystrokeifk......
  • 未从 Tkinter 刷新 GUI 中的值时出错
    我绝对是编码初学者,目前正在尝试使用ArduinoUno设计涡轮机性能显示器,该显示器将使用引脚A1的输入传达电压读数。然后将该读数发送到Python,然后发送到PythonGUI是根据Arduino的原始串行输入显示电流等读数。根据我所学到的知识,我从Arduino端进行了简单的编码,然后......
  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 传递参数化值时,类中的设置函数无法按预期工作
    我不知道为什么将此处提到的代码修改为以下内容不起作用?这些变量在测试内部不可访问,并且尽管范围设置为类,但在每次测试之前都会调用设置。任何指示都会非常有帮助。谢谢#conftest.pydefpytest_addoption(parser):parser.addoption("--data",action="store",d......
  • 赋值时的 Pydantic 类型转换
    我想使用Pydantic使用特定的哈希函数将明文字符串密码转换为分配时字节类型的哈希值。这是一个最小的示例,显示了我当前(不起作用)的方法。不过我对Pydantic还没有很深入的了解。importbcryptfrompydanticimportBaseModel,field_validatordefhash_password(passwor......
  • 支付宝小程序踩坑---父组件给子组件传值时,事件名必须以on开头?
    遇到了一个坑,当我让父组件给子组件传值的时候,传普通的变量也就算了,用花括号一包就行了,但是我的方法为啥传过去就成了字符串。我真的试了半天,怎么都不好使,我就睡下了,早上又看了一下,发现其他的方法名传过去都有一个共同的特性就是要以on开头,索性我也试一下吧,结果怎么着,真的传过去......
  • vue3使用van-picker组件时,滑动选中某个数值时在旁边相应显示单位
    vant的官方文档中没有支持这种需求的属性或方法,所以只能自己找别的方法。方法一van-picker控件选中某个元素时,该元素会有一个类名van-picker-column__item–selected我们可以在css里给这个类名通过::after,即使用伪类,来添加单位.van-picker-column__item--selected::aft......