Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
HASH
hwcrypto
Numaker-IoT-M487
Nuvoton M487测评之CRYPTO(一) Hash
发布于 2022-04-12 22:33:32 浏览:1076
订阅该版
[tocm] 本次测评主要测试新唐M487芯片CRYPTO模块中Hash功能及其性能,性能方面会使用硬件加速和纯软件实现直接的效率差异。 # M487 CRYPTO硬件介绍 ## M487中的CRYPTO M487框架图 ![M487diagram.PNG](https://oss-club.rt-thread.org/uploads/20220412/33ecca2dfa00b75cc264cbee8efefef1.png.webp) Crypto是一个硬件计算加速器,不会通过IO与外界发生联系,直接通过AHB总线和内核连接。 ## CRYPTO框架 Crypto(加密加速器)包括一个安全的伪随机数生成器(PRNG) ,支持AES、DES/TDES、SHA、HMAC和ECC算法。 ![c7a6800213b34cb4586f9cb12df82f1a.png.webp](https://oss-club.rt-thread.org/uploads/20220412/c7a6800213b34cb4586f9cb12df82f1a.png.webp) ## 特性 ### PRNG - 支持64 bits, 128 bits, 192 bits, and 256 bits 随机数生成 ### AES - 支持 FIPS NIST 197 - 支持 SP800-38A and addendum - 支持 128, 192, and 256 bits key - 支持加密和解密 - 支持 ECB, CBC, CFB, OFB, CTR, CBC-CS1, CBC-CS2, and CBC-CS3 mode - 支持 key expander ### DES - 支持 FIPS 46-3 - 支持加密和解密 - 支持 ECB, CBC, CFB, OFB, and CTR 模式 ### TDES - 支持 FIPS NIST 800-67 - 根据 X9.52 标准实现 - 支持 2/3密钥模式 - 支持加密和解密 - 支持 ECB, CBC, CFB, OFB, and CTR 模式 ### SHA - 支持 FIPS NIST 180, 180-2 - 支持 SHA-160, SHA-224, SHA-256, SHA-384 SHA-512 ### HMAC - 支持 FIPS NIST 180, 180-2 - 支持 HMAC-SHA-160, HMAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384 and HMAC-SHA-512 ### ECC - 支持 prime field GF(p) 和 binary filed GF(2m) - 支持 NIST P-192, P-224, P-256, P-384 and P-521 - 支持 NIST B-163, B-233, B-283, B-409 and B-571 - 支持 NIST K-163, K-233, K-283, K-409 and K-571 - 支持 point multiplication, addition and doubling operations in GF(p) GF(2m) - 支持 modulus division, multiplication, addition subtraction operations in GF(p) # RT-Thread CRYPTO使用说明 ## 简介 hwcrypto 是一个硬件加解密设备驱动框架。主要由硬件加解密驱动抽象层以及各种加解密 API 接口两部分构成。对于上层应用,可对接安全套件或直接使用,使用方式十分灵活。对于驱动,需要对接的接口少,功能单一,驱动开发简单快捷。下图是 Crypto 框架层次图: ![rtThread-hwcrypto框架.png](https://oss-club.rt-thread.org/uploads/20220412/1658a1dfe0014fbfc547727a045feeb8.png.webp) 硬件加解密框架目前已经支持 AES/DES/3DES/RC4/SHA1/SHA2/MD5/CRC/RNG/BIGNUM 等加解密相关的接口,每种算法都提供了统一的API供应用和上层组件调用,非常方便。 按照功能划分,可以分为以下几类: - hash: 散列算法 - symmetric: 对称加解密算法 - gcm: GMAC 消息认证码 - crc: CRC 冗余校验 - rng: 随机数发生器 - bignum: 大数运算 ## Hash算法 Hash算法实质上就是将任意长度的数据压缩摘要为固定长度的摘要,最常见的就是用于验证文件的完整性,如MD5, SHA256. 当前RT-Thread的设备驱动中,支持的Hash类型包括: - MD5 - SHA1 - SHA2 - SHA224 - SHA256 - SHA384 - SHA512 具体方法可以参考RT-Thread官方文档[CRYPTO 设备](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/crypto/crypto). # M487 CRYPTO之Hash功能测试 ## SHA1 按照官方指导文档,编写一个计算SHA1的示例,计算字符串“1234567890”的SHA1哈希值。 ```C int sha1_test() { rt_uint8_t buf_in[] = "1234567890"; rt_uint8_t buf_out[SHA1_RESULT_SIZE] = {0}; struct rt_hwcrypto_ctx *ctx; rt_err_t ret; /* 创建一个 SHA1 类型的上下文 */ ctx = rt_hwcrypto_hash_create(rt_hwcrypto_dev_default(), HWCRYPTO_TYPE_SHA1); /* 将输入数据进行 hash 运算 */ ret = rt_hwcrypto_hash_update(ctx, buf_in, strlen(buf_in)); /* 获得运算结果 */ ret = rt_hwcrypto_hash_finish(ctx, buf_out, SHA1_RESULT_SIZE); /* 删除上下文,释放资源 */ rt_hwcrypto_hash_destroy(ctx); LOG_HEX("out:", sizeof(rt_uint8_t), buf_out, SHA1_RESULT_SIZE); return 0; } ``` 下载到开发板中,运行sha1_test, 可以得到运行结果: ![sha1运行结果.PNG](https://oss-club.rt-thread.org/uploads/20220412/20f6def73d4d34fd9c54db4178774fe5.png) 使用[网页工具](https://crypot.51strive.com/sha1.html)计算“1234567890”的SHA1,得到结果: ![SHA1网页结果.PNG](https://oss-club.rt-thread.org/uploads/20220412/4338aa3a58e0a6fea3929d16420b8afb.png) 可见结果一致,计算有效。 ## SHA256 按照官方指导文档,编写一个计算SHA256的示例,计算字符串“1234567890”的SHA256哈希值。 ```C int sha256_test() { rt_uint8_t buf_in[] = "1234567890"; rt_uint8_t buf_out[SHA256_RESULT_SIZE] = {0}; struct rt_hwcrypto_ctx *ctx; rt_err_t ret; /* 创建一个 SHA256 类型的上下文 */ ctx = rt_hwcrypto_hash_create(rt_hwcrypto_dev_default(), HWCRYPTO_TYPE_SHA256); /* 将输入数据进行 hash 运算 */ ret = rt_hwcrypto_hash_update(ctx, buf_in, strlen(buf_in)); /* 获得运算结果 */ ret = rt_hwcrypto_hash_finish(ctx, buf_out, SHA256_RESULT_SIZE); /* 删除上下文,释放资源 */ rt_hwcrypto_hash_destroy(ctx); LOG_HEX("out:", sizeof(rt_uint8_t), buf_out, SHA256_RESULT_SIZE); return 0; } ``` 下载到开发板中,运行sha256_test, 可以得到运行结果: ![sha256运行结果.PNG](https://oss-club.rt-thread.org/uploads/20220412/5833617cfcc85430ad1cb0ec659e24a1.png) 使用[网页工具](https://crypot.51strive.com/sha1.html)计算“1234567890”的SHA256,得到结果: ![SHA256网页结果.PNG](https://oss-club.rt-thread.org/uploads/20220412/4cab0089ad216879a695e8a5e5cf5587.png) 可见结果一致,计算有效。 # M487 CRYPTO之Hash性能测试 以SHA256为例,比较一下使用了CRYPTO硬件加速和纯软件实现直接的效率差距。 为例尽可能避免IO读取性能影响测试效果,采用RAM中的随机数据作为输入,片内RAM的起始地址为0x20000000, 共有160KB RAM. 使用timer0作为计时设备,计时进度基本可以精确到us。 使用硬件CRYPTO的代码示例: ```C /* 设置定时器超时值为10s并启动定时器 */ timeout_s.sec = 10; /* 秒 */ timeout_s.usec = 0; /* 微秒 */ if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) { rt_kprintf("set timeout value failed\n"); return RT_ERROR; } /* 创建一个 SHA256 类型的上下文 */ ctx = rt_hwcrypto_hash_create(rt_hwcrypto_dev_default(), HWCRYPTO_TYPE_SHA256); /* 将输入数据进行 hash 运算 */ ret = rt_hwcrypto_hash_update(ctx, 0x20000000, 160*1024); /* 获得运算结果 */ ret = rt_hwcrypto_hash_finish(ctx, buf_out, SHA256_RESULT_SIZE); /* 删除上下文,释放资源 */ rt_hwcrypto_hash_destroy(ctx); /* 读取定时器经过时间 */ rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); LOG_I("HWCRYPTO Total time: Sec = %d, Usec = %d\n", timeout_s.sec,timeout_s.usec); ``` 软件SHA256实现借助了yd_crypto这个库,这个库在RT Thread的online package就有,非常的短小精悍。 使用软件计算SHA256的示例: ```C /* 设置定时器超时值为10s并启动定时器 */ timeout_s.sec = 10; /* 秒 */ timeout_s.usec = 0; /* 微秒 */ if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) { rt_kprintf("set timeout value failed\n"); return RT_ERROR; } yd_sha256(0x20000000, 160*1024, buf_out); /* 读取定时器经过时间 */ rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); LOG_I("Software Total time: Sec = %d, Usec = %d\n", timeout_s.sec,timeout_s.usec); ``` 在同一个函数中先后运行两种实现方式,多次试验均得到了一致的结果,使用软件加速方案耗时为硬件方案的27倍左右,可见M487在hash的硬件CRYPTO还是非常强悍的。 ![8aab481c9d3fefc268275bb1ea3da4ae.png](https://oss-club.rt-thread.org/uploads/20220412/8aab481c9d3fefc268275bb1ea3da4ae.png) # 模块功能及性能测试演示 [Nuvoton M487测评 CRYPTO(一) HASH](https://www.bilibili.com/video/BV1F94y1o7Lg?spm_id_from=333.337.search-card.all.click) # 代码 [Gitee - yu-wang-yy/numaker-iot-m487-crypto-test](https://gitee.com/yu-wang-yy/numaker-iot-m487-crypto-test) # 总结 - 单就SHA256这一个功能来看,M487硬件加速的性能接近软件实现的27倍,非常可观。 - 其他算法虽然没有试验,但是基本大同小异。 - RT-Thread的CRYPTO框架非常的高效易用,在移植好BSP之后几乎开箱即用,非常方便 - 目前从最新的源码看,HASH算法中M487 BSP适配了SHA1和SHA2,但是并没有加入MD5的支持,M487芯片手册上也没有找到MD5的加速支持,如果知道的大佬可以指出来。 下一步还将继续加密,CRC等功能的验证
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
AngerCoke
这个人不懒,主要是真的不想写什么
文章
10
回答
2
被采纳
0
关注TA
发私信
相关文章
1
关于hwcrypto的CRC32校验数据不是4字节对齐问题
2
CRYPTO中的CRC设备,CRC16计算结果有问题
3
使用硬件CRC后 没有找到drv_crc.c 这样的驱动文件
4
使用hwcrypto CRC校验的问提
5
官方OTA,HASH校验失败
6
OTA升级CRC过了,但是HASH没过?
7
调试nuvoton M487芯片,使用Nu_link 调试器出错。。
8
NUMAKER-IOT-M487开发板没有找到RTC电池接口
9
新唐m487板子使用LAN8720
推荐文章
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
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部