疑問
前面碰到了一個問題,RT-Thread 支持 MD5,可是 M2354 卻不支持,那怎么知道 RT-Thread 的 CRYPTO 設(shè)備對 M2354 支持怎樣呢?
我看了下文檔,沒找到,通過查看源碼,做了如下表格:

總的來說看就是 RT-thread 支持隨機(jī)數(shù)、哈希、對稱加密,
PS:該表格根據(jù)文件 rt-threadbspnuvotonlibrariesm2354rtt_portdrv_crypto.c 里面的 static rt_err_t nu_hwcrypto_create(struct rt_hwcrypto_ctx *ctx)) 函數(shù)得來
接下來首先使用下 HASH 算法
hash 算法
hash 算法是什么? 我在網(wǎng)上找到這個解釋:
哈希算法(Hash)又稱摘要算法(Digest),它的作用是:對任意一組輸入數(shù)據(jù)進(jìn)行計算,得到一個固定長度的輸出摘要。
 哈希算法最重要的特點就是:
 相同的輸入一定得到相同的輸出;
 不同的輸入大概率得到不同的輸出。
根據(jù)這個我的理解是,對于任何(任何長度)數(shù)據(jù),不管什么時候計算,通過 hash 算法計算,都一定能得到相同的輸出。
常用的 hash 算法有:

目前,在 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è)備 對應(yīng)的 hash 算法 API 有:

根據(jù)文檔,使用方法為:
使用 rt_hwcrypto_hash_create 創(chuàng)建 hash 上下文
 使用 rt_hwcrypto_hash_update 對數(shù)據(jù)進(jìn)行 hash 運算
 使用 rt_hwcrypto_hash_finish 獲得運算結(jié)果
 最后使用 rt_hwcrypto_hash_destroy 刪除上下文,釋放資源
 通過前面運行文檔 CRYPTO 設(shè)備 給出的例程,我的實踐結(jié)果是如果按照該流程,在 NuMaker-M2354 上是無法正常運行的,需要在創(chuàng)建了上下文后調(diào)用函數(shù) rt_hwcrypto_hash_reset 才能夠正常運行。
如何測試
該文檔中 CRYPTO 設(shè)備 給出的 hash 例程比較簡單,我有沒實際使用場景,該如何測試 hash 呢?
我看了下 M2354 官方給出的 BSP (M2354_Series_BSP_CMSIS_V3.00.002)有個 sha1 的例程(目錄:M2354_Series_BSP_CMSIS_V3.00.002SampleCodeStdDriverCRYPTO_SHA),這個例程里面有 64 組數(shù)據(jù)及對應(yīng)的 hash 值,正好可以拿來測試,我把這個例程移植到 RT-Thread 中的 NuMaker-M2354 BSP 中,
移植好后,編譯運行:

程序一開始是跑下來了,計算出來的哈希值也是對的,可是運行到最后一組數(shù)據(jù)的時候,程序卡死了,通過調(diào)試發(fā)現(xiàn)也是卡死在 rt-threadbspnuvotonlibrariesm2354rtt_portdrv_crypto.c 里面的 SHABlockUpdate 函數(shù),也是停在了該函數(shù)的最后一句 while (!s_SHA_done) {};,一直等待在完成。
通過單步調(diào)試查看寄存器,發(fā)了了卡住的原因,如下圖:

在執(zhí)行開始計算的時候,CRYPTO_HMAC_DMACNT 寄存器為 0。
M2354 的參考手冊中,關(guān)于 Hash 的使用中有說道開始計算之前,需要先設(shè)置寄存器 CRYPTO_HMAC_DMACNT :

摘自:M2354 Series Technical Reference Manual
然后再單步調(diào)試、查看代碼,發(fā)現(xiàn)可疑點:

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

M2354 Sha1 的性能怎樣
怎么測試 Hash 算法的性能呢? 我不知道,我也只是剛接觸 CRYPTO,不過,我想起了之前見過的一張 PPT:

這是某個 MCU 的 HASH 算法的統(tǒng)計數(shù)據(jù),給出了 SHA2、SHA3 計算每 16KB 所需的時間,最下面 2 行是什么,還不知道,根據(jù)這個,做個簡化版的,畢竟 MCU 資源有限,我就做個計算 1K Byte 數(shù)據(jù)所需的時間。
做法是,根據(jù) M2354 官方給出的 BSP (M2354_Series_BSP_CMSIS_V3.00.002)里面的 sha1 例程,我做 10 組 大小 1024 字節(jié)的數(shù)據(jù),算出計算每組數(shù)據(jù)所需時間求和再除 10,統(tǒng)計出計算 1024 字節(jié) HASH 所需的時間。
那這數(shù)據(jù)怎么來呢?
我用 python 做了個簡單的小程序,生成 10 組大小為 1024 字節(jié)的隨機(jī)數(shù)的數(shù)組,并計算 hash 值,保存到一個文件中,代碼很簡單,才 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()
運行結(jié)果如下:

在 MCU 部分,我需要個可以統(tǒng)計計算 hash 所需時間的方法,一開始使用系統(tǒng)節(jié)拍(使用函數(shù) rt_tick_get() 獲取系統(tǒng)節(jié)拍)來統(tǒng)計,發(fā)現(xiàn)計算出來的時間是 0,精度不夠,后來試了下 HWTIMER,可以出時間,應(yīng)該是可以滿足需求的。
我分別做了 SHA1、SHA224、SHA256、SHA384、SHA512 的得出如下數(shù)據(jù):

總結(jié)
RT-Thread 的 HASH 算法用起來還是挺簡單的,文檔也是很詳細(xì)。我在使用過程中碰到 2 個問題:
使用 HASH 算法的時候,在創(chuàng)建 HASH 上下文后需要調(diào)用函數(shù) rt_hwcrypto_hash_reset 才能夠正常運行,可是這個跟文檔有出入,不知道是 M2364 的 BSP 的問題還是 文檔的問題
M2354 BSP 中的 rt-threadbspnuvotonlibrariesm2354rtt_portdrv_crypto.c里面的函數(shù) nu_sha_hash_run 這句:
 while ((psSHACtx->u32SHATempBufLen + u32DataLen) >= psSHACtx->u32BlockSize)
需要改為:
while ((psSHACtx->u32SHATempBufLen + u32DataLen) > psSHACtx->u32BlockSize)
這個是不是 bug ?
- 
                                寄存器
                                +關(guān)注
關(guān)注
31文章
5522瀏覽量
128510 - 
                                python
                                +關(guān)注
關(guān)注
56文章
4850瀏覽量
89309 - 
                                Hash算法
                                +關(guān)注
關(guān)注
0文章
43瀏覽量
7591 - 
                                RT-Thread
                                +關(guān)注
關(guān)注
32文章
1514瀏覽量
43991 - 
                                MCU芯片
                                +關(guān)注
關(guān)注
3文章
257瀏覽量
12460 
發(fā)布評論請先 登錄
新唐 M2354 系列,RTU 應(yīng)用的最佳選擇
NuMaker-M2354開發(fā)板之CRYPTO硬件密碼加速器測評
2022 RT-Thread全球技術(shù)大會:螢石EZIOT SDK對RT-Thread的支持
    
RT-Thread 4.1.0正式添加對Arm Compiler 6支持
    
          
        
        
怎么知道RT-Thread的CRYPTO設(shè)備對M2354支持怎樣呢?
                
 
    
    
    
           
            
            
                
            
評論