欢迎再次来到“码灵半导体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系列产品的介绍,咱们下期见!
本期作者:刘悦臻、梁梦雷、陈绍景、谢耀华、谢剑杰