一文看懂码灵半导体CFW32C7UL系列产品应用(二): 国密算法●中篇

欢迎再次来到“码灵半导体cfw32c7ul系列产品应用介绍”连载专题。通过上期对cfw32c7ul系列支持的国密算法种类的介绍,相信您对cfw327ul系列的国密硬件模块有了初步了解,那么这些国密模块如何使用?应用是否便捷?加解密的速度如何?带着这些疑问,我们今天从真随机数发生器trng和sm3算法模块的调用开始谈起。
一、真随机数发生器trng模块
说到随机,有两个必须要搞清楚的概念即“真随机数生成器”(trng)和伪随机数生成器(prng)。大部分计算机程序和语言中的随机函数,都是伪随机数生成器,它们都是由确定的算法,通过一个“种子”(如“时间”)来产生“看起来随机”的结果值。毫无疑问,只要知道算法和种子,或者是之前已经产生了的随机数,那么就有可能获得接下来随机数序列的信息,因此它们带有可预测性。这种可预测性在密码学上并不安全,所以我们称其为“伪随机”。
与“伪随机”相对应的是“真随机”,真正的随机数仅存在于量子力学中,而我们需要的是一种不可预测的、统计意义上的、高安全性的随机数。在码灵半导体cfw32c7ul系列产品中我们提供了四组这种真随机数源,用以产生真随机数,同时该功能模块是采用硬件方式实现的,并且通过了nist统计检测程序的随机性测试。
下面我们具体介绍下cfw32c7ul系列产品的真随机数发生器trng模块是如何通过码灵半导体官方提供的sdk函数来进行调用的。目前码灵半导体官方提供了两种sdk,即裸机sdk和linux sdk。
开发模式一:裸机sdk
裸机sdk与提供的freertos和ucos sdk中相同。
① 产生一个真随机数
调用hal_trng_getvalue()
uint32_t hal_trng_getvalue() 函数返回值为一个真随机数
② 使用范例
uint32_t random = hal_trng_getvalue();
单个函数看不出硬件实现和软件实现有什么不同,那下面展现一下函数源码:
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进行一个配置后,等待hrng->status,之后hrng->lfsr寄存器中取出随机数。
开发模式二:linux sdk
通过操作linux系统中/dev/wokoo_trng,就可以进行产生真随机数。
① trng算法底层接口
• open:打开设备节点
• 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:读出数据长度
返回值:成功0,其它失败
③ 使用示例
trng_fd = open(/dev/wokoo_trng, o_rdwr); //打开trng的节点
read(trng_fd, (unsigned char *)&trng_data, 1); //读取真随机数
cfw32c7ul系列的trng效率
目前码灵半导体cfw32c7ul系列产品产生随机数的速率是75kb/s,每秒可以产生75kb的真随机数。
二、sm3杂凑硬件算法模块
sm3算法为国密杂凑算法,数据分组长度为512bit,杂凑值长度为256bit。基本运算流程为:对输入数据流做填充,构成整数个512bit长度的数据流;再对数据做分组;然后对每个分组做扩展和替换压缩操作,得到中间的临时杂凑值,反复进行直到所有分组处理完毕,最后一个计算得到的杂凑值作为整个数据流的最终杂凑值输出。
开发模式一:裸机sdk
调用sm3_hash产生sm3 最终hash 值。
void sm3_hash(uint32_t *pdatain,uint32_t datalen,uint32_t *pdigest)
① 函数参数说明
pdatain: 输入的数据指针( big endian)
datalen :数据的bit 长度
pdigest: 输出的最终hash值
② 使用范例
sm3_hash (message,32,tempbuf);
//message 是原始数据,数据长度为32,tempbuf是产生的256位hash值
开发模式二:linux sdk
通过操作linux系统中/dev/wokoo_sm3 ,就可以进行sm3杂凑算法的运算。
① sm3算法底层接口
• open:打开设备节点
• read:读取加密后的数据
• write:写入加密的数据
② 接口描述
• 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:读出数据长度
返回值:成功0,其它失败
• write
函数原型: static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
参数:file:文件名,buf:写入数据缓存,count:写入数据长度
返回值:成功0,其它失败
③ 使用示例
sm3_fd = open(/dev/wokoo_sm3, o_rdwr); //打开sm3节点
write(sm3_fd, &sm3_data.datain, sm3_data.datalen); //写入需杂凑的数据
read(sm3_fd, &sm3_data.dataout, null); //读出杂凑完的结果
cfw32c7ul系列sm3算法的效率
通过输入128kb数据,完成杂凑运算后输出运算结果,统计时间如下图
目前码灵半导体cfw32c7ul系列产品可以实现45mbps的杂凑速率。
通过以上对cfw32c7ul系列产品的真随机数发生器trng和sm3算法模块的介绍,相信大家对国密模块的如何使用有了初步了解,那么sm2和sm4算法在cfw32c7ul系列产品中如何具体使用呢?让我们带着这些问题,在下期中继续探寻吧。
今天的专题就到这儿,更多关于码灵半导体cfw32c7ul系列产品的介绍,我们下期见!

捷杰知识小课堂|振动分析基础知识篇
美的电磁炉放电后不加热检修电路
智能魔镜的新应用,给新家赋予更多的实用乐趣
中国SaaS企业容联云通讯纽交所上市
电源供应器:基本概念与特性
一文看懂码灵半导体CFW32C7UL系列产品应用(二): 国密算法●中篇
华灿光电发布了《第四届董事会第十次会议决议公告》
罗姆三轴加速度传感器独有功能:高级数据路径
AI不是黑科技 场景落地是核心
客户邀约台湾高技实地拜访洽谈合作!
过压保护压缩机控制电路原理图
新手必看!FPGA的系统性学习
uboot和内核里phy的初始化_内核里的双网络配置及phy的初始化
博文 | Biu~笔记:高通蓝牙ADK(36)--第三类mic
华为5G折叠屏手机在巴黎旗舰店售卖 分析机构预计2020年华为智能手机出货量下降20%
PC打印机端口控制数据记录器
中国5G用户数已接近2亿,占全球比重达85%
比亚迪收10亿新能源补贴 新能源车占了比亚迪的半壁江山
供应链管理系统对于企业的好处是什么
单片机嵌入式编程要记住的5个要点