Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
crypto
M2354
RT-Thread
【NuMaker-M2354试用】使用RT-Thread的CRYPTO设备(2)
发布于 2021-12-16 17:42:29 浏览:826
订阅该版
[tocm] 接上一篇:[【NuMaker-M2354试用】使用RT-Thread的CRYPTO设备(1)](https://club.rt-thread.org/ask/article/3196.html) ## 疑问 前面碰到了一个问题,RT-Thread 支持 MD5,可是 M2354 却不支持,那怎么知道 RT-Thread 的 CRYPTO 设备对 M2354 支持怎样呢? 我看了下文档,没找到,通过查看源码,做了如下表格: | 算法 | M2354 | RT-Thread 对 M2354 的支持 | | :--: | :---: | :-----------------------: | | PRNG | √ | √ | | AES | √ | √ | | RSA | √ | × | | SHA | √ | √ | | ECC | √ | × | 总的来说看就是 RT-thread 支持随机数、哈希、对称加密, PS:该表格根据文件 `rt-thread\bsp\nuvoton\libraries\m2354\rtt_port\drv_crypto.c` 里面的 `static rt_err_t nu_hwcrypto_create(struct rt_hwcrypto_ctx *ctx))` 函数得来 接下来首先使用下 HASH 算法 ## hash 算法 hash 算法是什么? 我在网上找到这个解释: ``` 哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。 哈希算法最重要的特点就是: 相同的输入一定得到相同的输出; 不同的输入大概率得到不同的输出。 ``` 摘自:[哈希算法](https://www.liaoxuefeng.com/wiki/1252599548343744/1304227729113121) 根据这个我的理解是,对于任何(任何长度)数据,不管什么时候计算,通过 hash 算法计算,都一定能得到相同的输出。 常用的 hash 算法有: ![hash_al.png](https://oss-club.rt-thread.org/uploads/20211216/b9ed68b6ea322862d2d6f95c0051933e.png) 摘自:[维基百科-散列函数](https://zh.wikipedia.org/wiki/%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B8) 目前,在 M2354 跑 RT-Thread 使用 [CRYPTO 设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/crypto/crypto?id=crypto-设备) 的话,可以用到的 hash 算法有: * sha1 :使用该算法获得的哈希值为 160 bit * sha2 * SHA224:使用该算法获得的哈希值为 224 bit * SHA256:使用该算法获得的哈希值为 256 bit * SHA384:使用该算法获得的哈希值为 384 bit * SHA512:使用该算法获得的哈希值为 512 bit ## CRYPTO 设备的 HASH 算法 API RT-Thread 使用 [CRYPTO 设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/crypto/crypto?id=crypto-设备) 对应的 hash 算法 API 有: | 函数 | 描述 | | --------------------------- | ------------------ | | rt_hwcrypto_hash_create() | 创建 hash 上下文 | | rt_hwcrypto_hash_destroy() | 释放上下文 | | rt_hwcrypto_hash_finish() | 计算最终 hash 值 | | rt_hwcrypto_hash_update() | 处理一包数据 | | rt_hwcrypto_hash_cpy() | 复制上下文 | | rt_hwcrypto_hash_reset() | 重置上下文 | | rt_hwcrypto_hash_set_type() | 设置 hash 算法类型 | 摘自: [CRYPTO 设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/crypto/crypto?id=crypto-设备) 根据文档,使用方法为: 1. 使用 `rt_hwcrypto_hash_create` 创建 hash 上下文 2. 使用 `rt_hwcrypto_hash_update` 对数据进行 hash 运算 3. 使用 `rt_hwcrypto_hash_finish` 获得运算结果 4. 最后使用 `rt_hwcrypto_hash_destroy` 删除上下文,释放资源 通过前面运行文档 [CRYPTO 设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/crypto/crypto?id=crypto-设备) 给出的例程,我的实践结果是如果按照该流程,在 **NuMaker-M2354** 上是无法正常运行的,需要在创建了上下文后调用函数 `rt_hwcrypto_hash_reset` 才能够正常运行。 ## 如何测试 该文档中 [CRYPTO 设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/crypto/crypto?id=crypto-设备) 给出的 hash 例程比较简单,我有没实际使用场景,该如何测试 hash 呢? 我看了下 M2354 官方给出的 BSP ([M2354_Series_BSP_CMSIS_V3.00.002](https://www.nuvoton.com.cn/resource-download.jsp?tp_GUID=SW1820201019143105))有个 sha1 的例程(目录:`M2354_Series_BSP_CMSIS_V3.00.002\SampleCode\StdDriver\CRYPTO_SHA`),这个例程里面有 64 组数据及对应的 hash 值,正好可以拿来测试,我把这个例程移植到 RT-Thread 中的 **NuMaker-M2354** BSP 中, 移植好后,编译运行: ![test_0.gif](https://oss-club.rt-thread.org/uploads/20211216/a1e2a289a71684b30aa8033bba9e48ca.gif) 程序一开始是跑下来了,计算出来的哈希值也是对的,可是运行到最后一组数据的时候,程序卡死了,通过调试发现也是卡死在 **rt-thread\bsp\nuvoton\libraries\m2354\rtt_port\drv_crypto.c** 里面的 `SHABlockUpdate` 函数,也是停在了该函数的最后一句 **while (!s_SHA_done) {};**,一直等待在完成。 通过单步调试查看寄存器,发了了卡住的原因,如下图: ![debug.png](https://oss-club.rt-thread.org/uploads/20211216/a8e7252231ff4146c61cf407a91047bf.png) 在执行开始计算的时候,**CRYPTO_HMAC_DMACNT** 寄存器为 0。 M2354 的参考手册中,关于 Hash 的使用中有说道开始计算之前,需要先设置寄存器 **CRYPTO_HMAC_DMACNT **: ![step.png](https://oss-club.rt-thread.org/uploads/20211216/3c2f185fe5cd3fd43e723b5cd71b9c99.png.webp) 摘自:M2354 Series Technical Reference Manual 然后再单步调试、查看代码,发现可疑点: ![bug.png](https://oss-club.rt-thread.org/uploads/20211216/f0096ed8a60da8f26f1fe8e6bea4b78a.png) 把上图中的 **>=** 改为 **>** 后,程序可以跑完了: ![test_1.gif](https://oss-club.rt-thread.org/uploads/20211216/09429141065e19ad13dc14058eb08232.gif) ## M2354 Sha1 的性能怎样 怎么测试 Hash 算法的性能呢? 我不知道,我也只是刚接触 CRYPTO,不过,我想起了之前见过的一张 PPT: ![com.png](https://oss-club.rt-thread.org/uploads/20211216/06a594d383f81b95008d4c7dba155e06.png.webp) 这是某个 MCU 的 HASH 算法的统计数据,给出了 SHA2、SHA3 计算每 16KB 所需的时间,最下面 2 行是什么,还不知道,根据这个,做个简化版的,毕竟 MCU 资源有限,我就做个计算 1K Byte 数据所需的时间。 做法是,根据 M2354 官方给出的 BSP ([M2354_Series_BSP_CMSIS_V3.00.002](https://www.nuvoton.com.cn/resource-download.jsp?tp_GUID=SW1820201019143105))里面的 sha1 例程,我做 10 组 大小 1024 字节的数据,算出计算每组数据所需时间求和再除 10,统计出计算 1024 字节 HASH 所需的时间。 那这数据怎么来呢? 我用 python 做了个简单的小程序,生成 10 组大小为 1024 字节的随机数的数组,并计算 hash 值,保存到一个文件中,代码很简单,才 20 多行,如下: ```python import numpy as np import hashlib def create_item(): first = np.random.randint(20,high = 0xff, size=1024) str = "" for item in first: str += hex(item).replace("0x","") source = [] for by in first: source.append(by) bye = bytes(source) n = hashlib.sha1() n.update(bye) return str,n.hexdigest() dat = "[L = 20]\n\n" for i in range(10): msg,has = create_item() dat += "Len = 8192\nMsg = " + msg + "\nMD = " + has + "\n\n" print(has) print(dat) file = open("sha_test_vector","w") file.write(dat) file.close() ``` 运行结果如下: ![create.gif](https://oss-club.rt-thread.org/uploads/20211216/61e0586c0cb32c820b772ba684cbb6e2.gif) 在 MCU 部分,我需要个可以统计计算 hash 所需时间的方法,一开始使用系统节拍(使用函数 `rt_tick_get()` 获取系统节拍)来统计,发现计算出来的时间是 0,精度不够,后来试了下 HWTIMER,可以出时间,应该是可以满足需求的。 我分别做了 SHA1、SHA224、SHA256、SHA384、SHA512 的得出如下数据: | Operation | Duration at 96 MHZ[us] | | ------------------ | ---------------------- | | SHA1 hash of 1KB | 122 | | SHA224 hash of 1KB | 121 | | SHA256 hash of 1KB | 127 | | SHA384 hash of 1KB | 106 | | SHA512 hash of 1KB | 100 | ## 总结 RT-Thread 的 HASH 算法用起来还是挺简单的,文档也是很详细。我在使用过程中碰到 2 个问题: 1. 使用 HASH 算法的时候,在创建 HASH 上下文后需要调用函数 `rt_hwcrypto_hash_reset` 才能够正常运行,可是这个跟文档有出入,不知道是 M2364 的 BSP 的问题还是 文档的问题 2. M2354 BSP 中的 `rt-thread\bsp\nuvoton\libraries\m2354\rtt_port\drv_crypto.c`里面的函数 `nu_sha_hash_run` 这句: ```c while ((psSHACtx->u32SHATempBufLen + u32DataLen) >= psSHACtx->u32BlockSize) ``` 需要改为: ```c while ((psSHACtx->u32SHATempBufLen + u32DataLen) > psSHACtx->u32BlockSize) ``` 这个是不是 bug ? 相关代码:[https://gitee.com/yhalin/rtt_-crypto](https://gitee.com/yhalin/rtt_-crypto) 该评测做的比较仓促,问题肯定是有,还请多多包涵,欢迎交流!
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
杨桃树
这家伙很懒,什么也没写!
文章
3
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
4
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部