Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Numaker-IoT-M487
RT-Thread活动
开发板评测
【Numaker-IoT-M487】CRYPTO相关功能评测
发布于 2022-04-14 11:02:47 浏览:744
订阅该版
[tocm] NuMaker-IoT-M487 测评之 Crypto 时间:2022 年 4 月 14 日 项目地址:https://github.com/foldl/m487_crypto_test ## 硬件介绍 NuMaker-IoT-M487 开发板以 NuMicro M487 系列微控制器为主控核心,主频 192MHz,512KB FLASH,160KB RAM。具体内容就不再复制粘贴了,请直接查看[NuMaker-IoT-M487 上手指南](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/numaker-iot-m487/quick-start)。 首次拿到开发板,它的大红配色让人眼前一亮。 本评测着重在 Crypto 模块,将展示各 API 的用法,遇到的小“坑”,以及 M487 的一个~~(**很可能**)硬件缺陷~~BSP 配置错误的发现过程。 ## 使用说明 参照[RT-Thread Studio 快速上手](https://club.rt-thread.org/ask/article/3603.html)指南可以很快创建出一个闪灯程序:不需要写一行代码,Studio 生成的项目就是一个闪灯程序。 ### 温馨提示 拨码开关太小,最好准一个小螺丝刀。 ## 功能测试 根据 M487 本身的硬件能力,本次评测将涉及、对称加密、散列、循环冗余检验等方面。 ### 熟悉环境、API RT-Thread 采用组件式架构,Crypto 组件的接口定义在 `rt-thread\components\drivers\hwcrypto` 目录。M487 通过两层代码实现 `hwcrypto` 接口:一层是原本的[硬件驱动](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/libraries/m480/StdDriver),另一层是 [RTT porting](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/libraries/m480/rtt_port) 代码。 各 API 都是同步调用,所以注意不要在 `main` 里直接用,而是在一个 thread 里调用。 使用 Crypto 组件时,需要先创建/获取 `rt_hwcrypto_device` 对象,然后针对要使用的功能创建对应的上下文,使用完成后再销毁上下文。 ### 准备工作 ```c #define print rt_kprintf // 辅助函数 void print_hex(const uint8_t *buffer, int len) { int i; for (i = 0; i < len; i++) print("%02X", buffer[i]); print("\n"); } void main_test(void *dummy) { // 获取默认 crypto 设备对象 struct rt_hwcrypto_device * dev = rt_hwcrypto_dev_default(); //... } int main(int argc, char **argv) { rt_thread_t tid = rt_thread_create("t", main_test, NULL, 1024, 5, 50); rt_thread_startup(tid); return 0; } ``` ### RNG M487 内置硬件随机数发生器,这里我们生成一批数据,然后对数据的随机性做一个**最最简单**的检查:各字节是否在 [0..255] 之间均匀分布。 ```c void test_rng(struct rt_hwcrypto_device *device) { struct rt_hwcrypto_ctx *ctx = rt_hwcrypto_rng_create(device); int i; static uint32_t counts[256] = {0}; #define CNT_THRES 700 print("generating 256 * 1000 random bytes:\n"); for (i = 0; i < 256 * 1000 / 4; i++) { uint32_t v = rt_hwcrypto_rng_update_ctx(ctx); counts[v & 0xff]++; v >>= 8; counts[v & 0xff]++; v >>= 8; counts[v & 0xff]++; v >>= 8; counts[v & 0xff]++; } rt_hwcrypto_rng_destroy(ctx); print("a simple check: if random bytes follow an uniform distribution..."); int flag = 0; for (i = 0; i < 256; i++) { if (counts[i] < CNT_THRES) flag = 1; } print("%s\n", flag == 0 ? "PASS" : "FAIL"); } ``` 这个函数的运行结果是令人吃惊的:测试失败! 简单检查 RTT Porting 代码[可确认](https://github.com/RT-Thread/rt-thread/blob/efdd28bde620b7695ef852b8ab647cbddb12e646/bsp/nuvoton/libraries/m480/rtt_port/drv_trng.c#L37)问题不在这一层。但是这个地方需要进一步讨论:TRNG 失败后,回退到 `rand()` 是否合适? 从现象看,或许是漏配了 TRNG 的 0/1 均匀分布开关,再查 M487 [TRNG 寄存器定义](https://github.com/RT-Thread/rt-thread/blob/master/bsp/nuvoton/libraries/m480/Device/Nuvoton/M480/Include/trng_reg.h),无此开关。这个问题只能由新唐解决了,拭目以待。 **更新**:M487 实际上无 TRNG。 #### 温馨提示 目前不要使用 M487 生成真随机数,不可靠。 ### CRC CRC 功能测试如下: ```c void test_crc(struct rt_hwcrypto_device *device) { // CRC-32 // https://www.lddgo.net/encrypt/crc const struct hwcrypto_crc_cfg cfg = { .last_val = 0xffffffff, .poly = 0x04C11DB7, .width = 32, .xorout = 0xffffffff, .flags = CRC_FLAG_REFIN | CRC_FLAG_REFOUT, }; struct rt_hwcrypto_ctx *ctx = rt_hwcrypto_crc_create(device, HWCRYPTO_CRC_CRC32); if (ctx == 0) { print("HWCRYPTO_CRC_CRC32 not available!\n"); return; } rt_hwcrypto_crc_cfg(ctx, (struct hwcrypto_crc_cfg *)&cfg); const static uint8_t value[] = {1,2,3,4}; uint32_t crc = rt_hwcrypto_crc_update(ctx, value, sizeof(value)); print("%s\n", crc == 0xB63CFBCD ? "PASS" : "FAIL"); rt_hwcrypto_crc_destroy(ctx); } ``` #### 温馨提示 内置的几种 `hwcrypto_crc_mode` 不好用(不常见),建议直接构造配置,并使用 `rt_hwcrypto_crc_cfg`。 ### Hash 试试 SHA256: ```c void test_hash(struct rt_hwcrypto_device *device) { const static uint8_t result[] = {0x9f, 0x64, 0xa7, 0x47, 0xe1, 0xb9, 0x7f, 0x13, 0x1f, 0xab, 0xb6, 0xb4, 0x47, 0x29, 0x6c, 0x9b, 0x6f, 0x02, 0x01, 0xe7, 0x9f, 0xb3, 0xc5, 0x35, 0x6e, 0x6c, 0x77, 0xe8, 0x9b, 0x6a, 0x80, 0x6a}; int i; struct rt_hwcrypto_ctx *ctx = rt_hwcrypto_hash_create(device, HWCRYPTO_TYPE_SHA256); if (ctx == 0) { print("HWCRYPTO_TYPE_SHA256 not available!\n"); return; } const static uint8_t value[] = {1,2,3,4}; static uint8_t hash[256 / 8]; rt_err_t err = rt_hwcrypto_hash_update(ctx, value, sizeof(value)); if (err) { print("rt_hwcrypto_hash_update: %d\n", err); } rt_hwcrypto_hash_finish(ctx, hash, 32); rt_hwcrypto_hash_destroy(ctx); print("%s\n", memcmp(hash, result, sizeof(hash)) == 0 ? "PASS" : "FAIL"); } ``` 测试结果令人“遗憾”:程序卡在 `rt_hwcrypto_hash_update` 里的。 #### 温馨提示 NuMaker-IoT-M487 SDK v1.0.0 有问题,临时解决方案:将 BSP 代码到 `main` 分支的最新版本。升级时,务必注意只升级 Crypto 相关的二层代码即可,以免其它编译问题。 升级后,测试通过。 ### AES-128 用 AES-128 算法先加密再解密,看看结果是否一致: ```c void test_aes_128(struct rt_hwcrypto_device *device) { struct rt_hwcrypto_ctx *ctx = rt_hwcrypto_symmetric_create(device, HWCRYPTO_TYPE_AES_ECB); if (ctx == 0) { print("HWCRYPTO_TYPE_AES_ECB not available!\n"); return; } const static uint8_t key[128 / 8] = {1,2,3,4}; const static uint8_t iv[16] = {4}; static uint8_t msg[16] = {5,6,7,8}; static uint8_t enc[16] = {}; static uint8_t dec[16] = {}; rt_hwcrypto_symmetric_setkey(ctx, key, sizeof(key) * 8); rt_hwcrypto_symmetric_setiv(ctx, key, sizeof(iv)); rt_err_t err = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_ENCRYPT, sizeof(msg), msg, enc); if (err) { print("ENCRYPT err: %d\n", err); } err = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_DECRYPT, sizeof(msg), enc, dec); if (err) { print("DECRYPT err: %d\n", err); } rt_hwcrypto_symmetric_destroy(ctx); print("%s\n", memcmp(dec, msg, sizeof(msg)) == 0 ? "PASS" : "FAIL"); } ``` ### 心得与建议 1. Crypto 组件 API 设计延续 RT-Thread API 的简洁、明快,点赞; 1. 建议 RT-Thread Studio 为新项目生成 .gitignore。
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
FLWX_7778
这家伙很懒,什么也没写!
文章
3
回答
0
被采纳
0
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
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
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部