0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么知道RT-Thread的CRYPTO設(shè)備對(duì)M2354支持怎樣呢?

冬至子 ? 來(lái)源:楊桃樹(shù) ? 作者:楊桃樹(shù) ? 2023-07-27 15:21 ? 次閱讀

疑問(wèn)

前面碰到了一個(gè)問(wèn)題,RT-Thread 支持 MD5,可是 M2354 卻不支持,那怎么知道 RT-Thread 的 CRYPTO 設(shè)備對(duì) M2354 支持怎樣呢?

我看了下文檔,沒(méi)找到,通過(guò)查看源碼,做了如下表格:

1.jpg

總的來(lái)說(shuō)看就是 RT-thread 支持隨機(jī)數(shù)、哈希、對(duì)稱加密,

PS:該表格根據(jù)文件 rt-threadbspnuvotonlibrariesm2354rtt_portdrv_crypto.c 里面的 static rt_err_t nu_hwcrypto_create(struct rt_hwcrypto_ctx *ctx)) 函數(shù)得來(lái)

接下來(lái)首先使用下 HASH 算法

hash 算法

hash 算法是什么? 我在網(wǎng)上找到這個(gè)解釋:

哈希算法(Hash)又稱摘要算法(Digest),它的作用是:對(duì)任意一組輸入數(shù)據(jù)進(jìn)行計(jì)算,得到一個(gè)固定長(zhǎng)度的輸出摘要。
哈希算法最重要的特點(diǎn)就是:
相同的輸入一定得到相同的輸出;
不同的輸入大概率得到不同的輸出。

根據(jù)這個(gè)我的理解是,對(duì)于任何(任何長(zhǎng)度)數(shù)據(jù),不管什么時(shí)候計(jì)算,通過(guò) hash 算法計(jì)算,都一定能得到相同的輸出。

常用的 hash 算法有:

1.jpg

目前,在 M2354 跑 RT-Thread 使用 CRYPTO 設(shè)備 的話,可以用到的 hash 算法有:

sha1 :使用該算法獲得的哈希值為 160 bit
sha2
SHA224:使用該算法獲得的哈希值為 224 bit
SHA256:使用該算法獲得的哈希值為 256 bit
SHA384:使用該算法獲得的哈希值為 384 bit
SHA512:使用該算法獲得的哈希值為 512 bit
CRYPTO 設(shè)備的 HASH 算法 API

RT-Thread 使用 CRYPTO 設(shè)備 對(duì)應(yīng)的 hash 算法 API 有:

1.jpg

根據(jù)文檔,使用方法為:

使用 rt_hwcrypto_hash_create 創(chuàng)建 hash 上下文
使用 rt_hwcrypto_hash_update 對(duì)數(shù)據(jù)進(jìn)行 hash 運(yùn)算
使用 rt_hwcrypto_hash_finish 獲得運(yùn)算結(jié)果
最后使用 rt_hwcrypto_hash_destroy 刪除上下文,釋放資源
通過(guò)前面運(yùn)行文檔 CRYPTO 設(shè)備 給出的例程,我的實(shí)踐結(jié)果是如果按照該流程,在 NuMaker-M2354 上是無(wú)法正常運(yùn)行的,需要在創(chuàng)建了上下文后調(diào)用函數(shù) rt_hwcrypto_hash_reset 才能夠正常運(yùn)行。

如何測(cè)試

該文檔中 CRYPTO 設(shè)備 給出的 hash 例程比較簡(jiǎn)單,我有沒(méi)實(shí)際使用場(chǎng)景,該如何測(cè)試 hash 呢?

我看了下 M2354 官方給出的 BSP (M2354_Series_BSP_CMSIS_V3.00.002)有個(gè) sha1 的例程(目錄:M2354_Series_BSP_CMSIS_V3.00.002SampleCodeStdDriverCRYPTO_SHA),這個(gè)例程里面有 64 組數(shù)據(jù)及對(duì)應(yīng)的 hash 值,正好可以拿來(lái)測(cè)試,我把這個(gè)例程移植到 RT-Thread 中的 NuMaker-M2354 BSP 中,

移植好后,編譯運(yùn)行:

1.jpg

程序一開(kāi)始是跑下來(lái)了,計(jì)算出來(lái)的哈希值也是對(duì)的,可是運(yùn)行到最后一組數(shù)據(jù)的時(shí)候,程序卡死了,通過(guò)調(diào)試發(fā)現(xiàn)也是卡死在 rt-threadbspnuvotonlibrariesm2354rtt_portdrv_crypto.c 里面的 SHABlockUpdate 函數(shù),也是停在了該函數(shù)的最后一句 while (!s_SHA_done) {};,一直等待在完成。

通過(guò)單步調(diào)試查看寄存器,發(fā)了了卡住的原因,如下圖:

1.jpg

在執(zhí)行開(kāi)始計(jì)算的時(shí)候,CRYPTO_HMAC_DMACNT 寄存器為 0。

M2354 的參考手冊(cè)中,關(guān)于 Hash 的使用中有說(shuō)道開(kāi)始計(jì)算之前,需要先設(shè)置寄存器 CRYPTO_HMAC_DMACNT :

1.jpg

摘自:M2354 Series Technical Reference Manual

然后再單步調(diào)試、查看代碼,發(fā)現(xiàn)可疑點(diǎn):

1.jpg

把上圖中的 >= 改為 > 后,程序可以跑完了:

1.jpg

M2354 Sha1 的性能怎樣

怎么測(cè)試 Hash 算法的性能呢? 我不知道,我也只是剛接觸 CRYPTO,不過(guò),我想起了之前見(jiàn)過(guò)的一張 PPT:

1.jpg

這是某個(gè) MCU 的 HASH 算法的統(tǒng)計(jì)數(shù)據(jù),給出了 SHA2、SHA3 計(jì)算每 16KB 所需的時(shí)間,最下面 2 行是什么,還不知道,根據(jù)這個(gè),做個(gè)簡(jiǎn)化版的,畢竟 MCU 資源有限,我就做個(gè)計(jì)算 1K Byte 數(shù)據(jù)所需的時(shí)間。

做法是,根據(jù) M2354 官方給出的 BSP (M2354_Series_BSP_CMSIS_V3.00.002)里面的 sha1 例程,我做 10 組 大小 1024 字節(jié)的數(shù)據(jù),算出計(jì)算每組數(shù)據(jù)所需時(shí)間求和再除 10,統(tǒng)計(jì)出計(jì)算 1024 字節(jié) HASH 所需的時(shí)間。

那這數(shù)據(jù)怎么來(lái)呢?

我用 python 做了個(gè)簡(jiǎn)單的小程序,生成 10 組大小為 1024 字節(jié)的隨機(jī)數(shù)的數(shù)組,并計(jì)算 hash 值,保存到一個(gè)文件中,代碼很簡(jiǎn)單,才 20 多行,如下:

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]nn"
for i in range(10):
msg,has = create_item()
dat += "Len = 8192nMsg = " + msg + "nMD = " + has + "nn"
print(has)
print(dat)
file = open("sha_test_vector","w")
file.write(dat)
file.close()

運(yùn)行結(jié)果如下:

1.jpg

在 MCU 部分,我需要個(gè)可以統(tǒng)計(jì)計(jì)算 hash 所需時(shí)間的方法,一開(kāi)始使用系統(tǒng)節(jié)拍(使用函數(shù) rt_tick_get() 獲取系統(tǒng)節(jié)拍)來(lái)統(tǒng)計(jì),發(fā)現(xiàn)計(jì)算出來(lái)的時(shí)間是 0,精度不夠,后來(lái)試了下 HWTIMER,可以出時(shí)間,應(yīng)該是可以滿足需求的。

我分別做了 SHA1、SHA224、SHA256、SHA384、SHA512 的得出如下數(shù)據(jù):

1.jpg

總結(jié)

RT-Thread 的 HASH 算法用起來(lái)還是挺簡(jiǎn)單的,文檔也是很詳細(xì)。我在使用過(guò)程中碰到 2 個(gè)問(wèn)題:

使用 HASH 算法的時(shí)候,在創(chuàng)建 HASH 上下文后需要調(diào)用函數(shù) rt_hwcrypto_hash_reset 才能夠正常運(yùn)行,可是這個(gè)跟文檔有出入,不知道是 M2364 的 BSP 的問(wèn)題還是 文檔的問(wèn)題

M2354 BSP 中的 rt-threadbspnuvotonlibrariesm2354rtt_portdrv_crypto.c里面的函數(shù) nu_sha_hash_run 這句:
while ((psSHACtx->u32SHATempBufLen + u32DataLen) >= psSHACtx->u32BlockSize)

需要改為:

while ((psSHACtx->u32SHATempBufLen + u32DataLen) > psSHACtx->u32BlockSize)

這個(gè)是不是 bug ?

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119821
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4768

    瀏覽量

    84376
  • Hash算法
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    7379
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39839
  • MCU芯片
    +關(guān)注

    關(guān)注

    3

    文章

    246

    瀏覽量

    11355
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用RT-ThreadCRYPTO設(shè)備資料推薦

    RT-ThreadCRYPTO 設(shè)備對(duì) M2354 支持怎樣
    發(fā)表于 04-02 11:22

    NuMaker-M2354開(kāi)發(fā)板之CRYPTO硬件密碼加速器測(cè)評(píng)

    RT-Thread 中的 hwcrypto 硬件加解密設(shè)備驅(qū)動(dòng)框架,該框架主要由硬件加解密驅(qū)動(dòng)抽象層以及各種加解密 API接口兩部分構(gòu)成。對(duì)于上層應(yīng)用,可對(duì)接安全套件或直接使用,使用方式十分靈活。對(duì)于驅(qū)動(dòng),需要對(duì)接的接口少,功能單一,驅(qū)動(dòng)開(kāi)發(fā)簡(jiǎn)單快捷。目前沒(méi)有實(shí)現(xiàn)對(duì)非對(duì)稱
    發(fā)表于 10-20 14:19

    請(qǐng)問(wèn)M2354芯片的Vsw是如何使用的?

    M2354芯片的Vsw是如何使用的?
    發(fā)表于 06-28 08:00

    2022 RT-Thread全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)RT-Thread支持

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread在攝像頭及IoT設(shè)備上的實(shí)踐經(jīng)驗(yàn)分享
    的頭像 發(fā)表于 05-27 11:08 ?1273次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)<b class='flag-5'>RT-Thread</b>的<b class='flag-5'>支持</b>

    RT-Thread 4.1.0正式添加對(duì)Arm Compiler 6支持

    RT-Thread 4.1.0 正式發(fā)布版中,添加了對(duì) Arm Compiler 6 的支持,用戶可以修改 rtconfig.py 指定生成 mdk5 工程時(shí)使用的編譯器
    的頭像 發(fā)表于 06-01 15:20 ?1971次閱讀
    <b class='flag-5'>RT-Thread</b> 4.1.0正式添加對(duì)Arm Compiler 6<b class='flag-5'>支持</b>

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

    RT-Thread文檔_RT-Thread 簡(jiǎn)介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡(jiǎn)介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_UART 設(shè)備

    RT-Thread文檔_UART 設(shè)備
    發(fā)表于 02-22 18:32 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_UART <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_PWM 設(shè)備

    RT-Thread文檔_PWM 設(shè)備
    發(fā)表于 02-22 18:35 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_PWM <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_SPI 設(shè)備

    RT-Thread文檔_SPI 設(shè)備
    發(fā)表于 02-22 18:36 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_SPI <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_CRYPTO 設(shè)備

    RT-Thread文檔_CRYPTO 設(shè)備
    發(fā)表于 02-22 18:38 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>CRYPTO</b> <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_AUDIO 設(shè)備

    RT-Thread文檔_AUDIO 設(shè)備
    發(fā)表于 02-22 18:38 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_AUDIO <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_Pulse Encoder 設(shè)備

    RT-Thread文檔_Pulse Encoder 設(shè)備
    發(fā)表于 02-22 18:39 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_Pulse Encoder <b class='flag-5'>設(shè)備</b>

    【NuMaker-M2354試用】microSD實(shí)驗(yàn)

    ? 測(cè)試M2354的硬件RTC,開(kāi)啟RTC功能,運(yùn)用RT-Thread提供的bsp及庫(kù)函數(shù),實(shí)現(xiàn)一個(gè)RTC功能。
    的頭像 發(fā)表于 08-02 17:18 ?858次閱讀
    【NuMaker-<b class='flag-5'>M2354</b>試用】microSD實(shí)驗(yàn)

    M2354錯(cuò)誤注入攻擊(Fault Injection Attack)防護(hù)

    M2354錯(cuò)誤注入攻擊(Fault Injection Attack)防護(hù)
    的頭像 發(fā)表于 08-10 11:12 ?656次閱讀
    <b class='flag-5'>M2354</b>錯(cuò)誤注入攻擊(Fault Injection Attack)防護(hù)