您的位置 首页 知识

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

欢迎再次来到“码灵半导体CFW32C7UL系列产品应用介绍”连载专题。通过上期对CFW32C7UL系列支持的国密算法种类的介绍,相信您对CFW327UL系列的国密硬件模块有了初步了解,那么这些国密模块

欢迎再次来到“码灵半导体CFW32C7UL系列产品运用介绍”连载专题。经过上期对CFW32C7UL系列支撑的国密算法品种的介绍,信任您对CFW327UL系列的国密硬件模块有了开端了解,那么这些国密模块怎么运用?运用是否快捷?加解密的速度怎么?带着这些疑问,咱们今日从真随机数发生器TRNG和SM3算法模块的调用开端谈起。

图片.png

一、真随机数发生器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数据,完结杂凑运算后输出运算成果,核算时刻如下图:

图片.png

现在码灵半导体CFW32C7UL系列产品能够完结45Mbps的杂凑速率。

经过以上对CFW32C7UL系列产品的真随机数发生器TRNG和SM3算法模块的介绍,信任咱们对国密模块的怎么运用有了开端了解,那么SM2和SM4算法在CFW32C7UL系列产品中怎么详细运用呢?让咱们带着这些问题,鄙人期中持续探寻吧。

今日的专题就到这儿,更多关于码灵半导体CFW32C7UL系列产品的介绍,咱们下期见!

本期作者:刘悦臻、梁梦雷、陈绍景、谢耀华、谢剑杰

 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/114411.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部