一文看懂碼靈半導體CFW32C7UL系列產(chǎn)品應用(二):國密算法●中篇
歡迎再次來(lái)到“碼靈半導體CFW32C7UL系列產(chǎn)品應用介紹”連載專(zhuān)題。通過(guò)上期對CFW32C7UL系列支持的國密算法種類(lèi)的介紹,相信您對CFW327UL系列的國密硬件模塊有了初步了解,那么這些國密模塊如何使用?應用是否便捷?加解密的速度如何?帶著(zhù)這些疑問(wèn),我們今天從真隨機數發(fā)生器TRNG和SM3算法模塊的調用開(kāi)始談起。
本文引用地址:http://dyxdggzs.com/article/202007/415807.htm一、真隨機數發(fā)生器TRNG模塊
說(shuō)到隨機,有兩個(gè)必須要搞清楚的概念即“真隨機數生成器”(TRNG)和偽隨機數生成器(PRNG)。大部分計算機程序和語(yǔ)言中的隨機函數,都是偽隨機數生成器,它們都是由確定的算法,通過(guò)一個(gè)“種子”(如“時(shí)間”)來(lái)產(chǎn)生“看起來(lái)隨機”的結果值。毫無(wú)疑問(wèn),只要知道算法和種子,或者是之前已經(jīng)產(chǎn)生了的隨機數,那么就有可能獲得接下來(lái)隨機數序列的信息,因此它們帶有可預測性。這種可預測性在密碼學(xué)上并不安全,所以我們稱(chēng)其為“偽隨機”。
與“偽隨機”相對應的是“真隨機”,真正的隨機數僅存在于量子力學(xué)中,而我們需要的是一種不可預測的、統計意義上的、高安全性的隨機數。在碼靈半導體CFW32C7UL系列產(chǎn)品中我們提供了四組這種真隨機數源,用以產(chǎn)生真隨機數,同時(shí)該功能模塊是采用硬件方式實(shí)現的,并且通過(guò)了NIST統計檢測程序的隨機性測試。
下面我們具體介紹下CFW32C7UL系列產(chǎn)品的真隨機數發(fā)生器TRNG模塊是如何通過(guò)碼靈半導體官方提供的SDK函數來(lái)進(jìn)行調用的。目前碼靈半導體官方提供了兩種SDK,即裸機SDK和Linux SDK。
開(kāi)發(fā)模式一:裸機SDK
裸機SDK與提供的freeRTOS和uCOS SDK中相同。
① 產(chǎn)生一個(gè)真隨機數
調用HAL_TRNG_GetValue()
uint32_t HAL_TRNG_GetValue() 函數返回值為一個(gè)真隨機數
② 使用范例
uint32_t random = HAL_TRNG_GetValue();
單個(gè)函數看不出硬件實(shí)現和軟件實(shí)現有什么不同,那下面展現一下函數源碼:
uint32_t HAL_HRNG_GetValue()
{
uint32_t ret;
HRNG->CMPRES = 0x02;
HRNG->CTRL |= (HRNG_CTRL_RNG_EN0 | HRNG_CTRL_RNG_EN1 | HRNG_CTRL_RNG_EN2 | HRNG_CTRL_RNG_EN3 | HRNG_CTRL_SCLK_SEL);
while((HRNG->STATUS& HRNG_STATUS_FIFO_NOT_EMPTY) ==0);
ret= HRNG->LFSR;
return ret;
}
上面所述的就是對寄存器HRNG->CMPRE、HRNG->CTRL進(jìn)行一個(gè)配置后,等待HRNG->STATUS,之后HRNG->LFSR寄存器中取出隨機數。
開(kāi)發(fā)模式二:Linux SDK
通過(guò)操作linux系統中/dev/wokoo_trng,就可以進(jìn)行產(chǎn)生真隨機數。
① TRNG算法底層接口
? open:打開(kāi)設備節點(diǎn)
? read:讀取隨機數的數據
② 接口描述
? open
函數原型:static int uac_open(struct inode *inode, struct file * file)
參數:file:文件名
返回值:成功0,其它失敗
? read
函數原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)
參數:file:文件名,buffer:讀出數據緩存,size:讀出數據長(cháng)度
返回值:成功0,其它失敗
③ 使用示例
trng_fd = open("/dev/wokoo_trng", O_RDWR); //打開(kāi)trng的節點(diǎn)
read(trng_fd, (unsigned char *)&trng_data, 1); //讀取真隨機數
CFW32C7UL系列的TRNG效率
目前碼靈半導體CFW32C7UL系列產(chǎn)品產(chǎn)生隨機數的速率是75kb/s,即每秒可以產(chǎn)生75kb的真隨機數。
二、SM3雜湊硬件算法模塊
SM3算法為國密雜湊算法,數據分組長(cháng)度為512bit,雜湊值長(cháng)度為256bit?;具\算流程為:對輸入數據流做填充,構成整數個(gè)512bit長(cháng)度的數據流;再對數據做分組;然后對每個(gè)分組做擴展和替換壓縮操作,得到中間的臨時(shí)雜湊值,反復進(jìn)行直到所有分組處理完畢,最后一個(gè)計算得到的雜湊值作為整個(gè)數據流的最終雜湊值輸出。
開(kāi)發(fā)模式一:裸機SDK
調用SM3_Hash產(chǎn)生SM3最終Hash值。
void SM3_Hash(uint32_t *pDataIn,uint32_t DataLen,uint32_t *pDigest)
① 函數參數說(shuō)明
pDataIn: 輸入的數據指針( big endian)
DataLen: 數據的bit 長(cháng)度
pDigest: 輸出的最終hash值
② 使用范例
SM3_Hash (message,32,tempbuf);
//message 是原始數據,數據長(cháng)度為32,tempbuf是產(chǎn)生的256位Hash值
開(kāi)發(fā)模式二:Linux SDK
通過(guò)操作linux系統中/dev/wokoo_sm3,就可以進(jìn)行SM3雜湊算法的運算。
① SM3算法底層接口
? open:打開(kāi)設備節點(diǎn)
? read:讀取加密后的數據
? write:寫(xiě)入加密的數據
② 接口描述
? Open
函數原型:static int uac_open(struct inode *inode, struct file * file)
參數:file:文件名
返回值:成功0,其它失敗
? Read
函數原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)
參數:file:文件名,buffer:讀出數據緩存,size:讀出數據長(cháng)度
返回值:成功0,其它失敗
? Write
函數原型: static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
參數:file:文件名,buf:寫(xiě)入數據緩存,count:寫(xiě)入數據長(cháng)度
返回值:成功0,其它失敗
③ 使用示例
sm3_fd = open("/dev/wokoo_sm3", O_RDWR); //打開(kāi)sm3節點(diǎn)
write(sm3_fd, &sm3_data.datain, sm3_data.datalen); //寫(xiě)入需雜湊的數據
read(sm3_fd, &sm3_data.dataout, NULL); //讀出雜湊完的結果
CFW32C7UL系列SM3算法的效率
通過(guò)輸入128KB數據,完成雜湊運算后輸出運算結果,統計時(shí)間如下圖:
目前碼靈半導體CFW32C7UL系列產(chǎn)品可以實(shí)現45Mbps的雜湊速率。
通過(guò)以上對CFW32C7UL系列產(chǎn)品的真隨機數發(fā)生器TRNG和SM3算法模塊的介紹,相信大家對國密模塊的如何使用有了初步了解,那么SM2和SM4算法在CFW32C7UL系列產(chǎn)品中如何具體使用呢?讓我們帶著(zhù)這些問(wèn)題,在下期中繼續探尋吧。
今天的專(zhuān)題就到這兒,更多關(guān)于碼靈半導體CFW32C7UL系列產(chǎn)品的介紹,我們下期見(jiàn)!
本期作者:劉悅臻、梁夢(mèng)雷、陳紹景、謝耀華、謝劍杰
評論