新聞中心

        EEPW首頁(yè) > 牛人業(yè)話 > 一文看懂碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品應(yīng)用(二):國(guó)密算法●中篇

        一文看懂碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品應(yīng)用(二):國(guó)密算法●中篇

        作者:碼靈半導(dǎo)體 時(shí)間:2020-07-19 來(lái)源:EEPW 收藏

        歡迎再次來(lái)到“L系列產(chǎn)品應(yīng)用介紹”連載專題。通過(guò)上期對(duì)L系列支持的國(guó)密算法種類的介紹,相信您對(duì)CFW327UL系列的國(guó)密硬件模塊有了初步了解,那么這些國(guó)密模塊如何使用?應(yīng)用是否便捷?加解密的速度如何?帶著這些疑問(wèn),我們今天從真隨機(jī)數(shù)發(fā)生器TRNG和SM3算法模塊的調(diào)用開始談起。

        本文引用地址:http://www.104case.com/article/202007/415807.htm

        圖片.png

        一、真隨機(jī)數(shù)發(fā)生器TRNG模塊

        說(shuō)到隨機(jī),有兩個(gè)必須要搞清楚的概念即“真隨機(jī)數(shù)生成器”(TRNG)和偽隨機(jī)數(shù)生成器(PRNG)。大部分計(jì)算機(jī)程序和語(yǔ)言中的隨機(jī)函數(shù),都是偽隨機(jī)數(shù)生成器,它們都是由確定的算法,通過(guò)一個(gè)“種子”(如“時(shí)間”)來(lái)產(chǎn)生“看起來(lái)隨機(jī)”的結(jié)果值。毫無(wú)疑問(wèn),只要知道算法和種子,或者是之前已經(jīng)產(chǎn)生了的隨機(jī)數(shù),那么就有可能獲得接下來(lái)隨機(jī)數(shù)序列的信息,因此它們帶有可預(yù)測(cè)性。這種可預(yù)測(cè)性在密碼學(xué)上并不安全,所以我們稱其為“偽隨機(jī)”。

        與“偽隨機(jī)”相對(duì)應(yīng)的是“真隨機(jī)”,真正的隨機(jī)數(shù)僅存在于量子力學(xué)中,而我們需要的是一種不可預(yù)測(cè)的、統(tǒng)計(jì)意義上的、高安全性的隨機(jī)數(shù)。L系列產(chǎn)品中我們提供了四組這種真隨機(jī)數(shù)源,用以產(chǎn)生真隨機(jī)數(shù),同時(shí)該功能模塊是采用硬件方式實(shí)現(xiàn)的,并且通過(guò)了NIST統(tǒng)計(jì)檢測(cè)程序的隨機(jī)性測(cè)試。

        下面我們具體介紹下CFW32C7UL系列產(chǎn)品的真隨機(jī)數(shù)發(fā)生器TRNG模塊是如何通過(guò)官方提供的SDK函數(shù)來(lái)進(jìn)行調(diào)用的。目前碼靈半導(dǎo)體官方提供了兩種SDK,即裸機(jī)SDK和Linux SDK。

        開發(fā)模式一:裸機(jī)SDK

        裸機(jī)SDK與提供的freeRTOS和uCOS SDK中相同。

        ① 產(chǎn)生一個(gè)真隨機(jī)數(shù)

        調(diào)用HAL_TRNG_GetValue()

        uint32_t HAL_TRNG_GetValue() 函數(shù)返回值為一個(gè)真隨機(jī)數(shù)

        ② 使用范例

        uint32_t random = HAL_TRNG_GetValue();

        單個(gè)函數(shù)看不出硬件實(shí)現(xiàn)和軟件實(shí)現(xiàn)有什么不同,那下面展現(xiàn)一下函數(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;

        }

        上面所述的就是對(duì)寄存器HRNG->CMPRE、HRNG->CTRL進(jìn)行一個(gè)配置后,等待HRNG->STATUS,之后HRNG->LFSR寄存器中取出隨機(jī)數(shù)。

        開發(fā)模式二:Linux SDK

        通過(guò)操作linux系統(tǒng)中/dev/wokoo_trng,就可以進(jìn)行產(chǎn)生真隨機(jī)數(shù)。

        ① TRNG算法底層接口

        ? open:打開設(shè)備節(jié)點(diǎn)

        ? read:讀取隨機(jī)數(shù)的數(shù)據(jù)

        ② 接口描述

        ? open

        函數(shù)原型:static int uac_open(struct inode *inode, struct file * file)

        參數(shù):file:文件名

        返回值:成功0,其它失敗

        ? read

        函數(shù)原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)

        參數(shù):file:文件名,buffer:讀出數(shù)據(jù)緩存,size:讀出數(shù)據(jù)長(zhǎng)度

        返回值:成功0,其它失敗

        ③ 使用示例

        trng_fd = open("/dev/wokoo_trng", O_RDWR);           //打開trng的節(jié)點(diǎn)

        read(trng_fd, (unsigned char *)&trng_data, 1);            //讀取真隨機(jī)數(shù)

        CFW32C7UL系列的TRNG效率

        目前碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品產(chǎn)生隨機(jī)數(shù)的速率是75kb/s,即每秒可以產(chǎn)生75kb的真隨機(jī)數(shù)。

        二、SM3雜湊硬件算法模塊

        SM3算法為國(guó)密雜湊算法,數(shù)據(jù)分組長(zhǎng)度為512bit,雜湊值長(zhǎng)度為256bit?;具\(yùn)算流程為:對(duì)輸入數(shù)據(jù)流做填充,構(gòu)成整數(shù)個(gè)512bit長(zhǎng)度的數(shù)據(jù)流;再對(duì)數(shù)據(jù)做分組;然后對(duì)每個(gè)分組做擴(kuò)展和替換壓縮操作,得到中間的臨時(shí)雜湊值,反復(fù)進(jìn)行直到所有分組處理完畢,最后一個(gè)計(jì)算得到的雜湊值作為整個(gè)數(shù)據(jù)流的最終雜湊值輸出。

        開發(fā)模式一:裸機(jī)SDK

        調(diào)用SM3_Hash產(chǎn)生SM3最終Hash值。

        void SM3_Hash(uint32_t *pDataIn,uint32_t DataLen,uint32_t *pDigest)

        ① 函數(shù)參數(shù)說(shuō)明

          pDataIn: 輸入的數(shù)據(jù)指針( big endian)

          DataLen: 數(shù)據(jù)的bit 長(zhǎng)度

          pDigest: 輸出的最終hash值

        ② 使用范例

        SM3_Hash (message,32,tempbuf);

        //message 是原始數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為32,tempbuf是產(chǎn)生的256位Hash值

        開發(fā)模式二:Linux SDK

              通過(guò)操作linux系統(tǒng)中/dev/wokoo_sm3,就可以進(jìn)行SM3雜湊算法的運(yùn)算。

        ① SM3算法底層接口

        ? open:打開設(shè)備節(jié)點(diǎn)

        ? read:讀取加密后的數(shù)據(jù)

        ? write:寫入加密的數(shù)據(jù)

        ② 接口描述

        ? Open

        函數(shù)原型:static int uac_open(struct inode *inode, struct file * file)

        參數(shù):file:文件名

        返回值:成功0,其它失敗

        ? Read

        函數(shù)原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)

        參數(shù):file:文件名,buffer:讀出數(shù)據(jù)緩存,size:讀出數(shù)據(jù)長(zhǎng)度

        返回值:成功0,其它失敗

        ? Write

        函數(shù)原型: static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

        參數(shù):file:文件名,buf:寫入數(shù)據(jù)緩存,count:寫入數(shù)據(jù)長(zhǎng)度

        返回值:成功0,其它失敗

        使用示例

          sm3_fd = open("/dev/wokoo_sm3", O_RDWR);          //打開sm3節(jié)點(diǎn)

          write(sm3_fd, &sm3_data.datain, sm3_data.datalen);        //寫入需雜湊的數(shù)據(jù)

          read(sm3_fd, &sm3_data.dataout, NULL);                             //讀出雜湊完的結(jié)果

        CFW32C7UL系列SM3算法的效率

        通過(guò)輸入128KB數(shù)據(jù),完成雜湊運(yùn)算后輸出運(yùn)算結(jié)果,統(tǒng)計(jì)時(shí)間如下圖:

        圖片.png

        目前碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品可以實(shí)現(xiàn)45Mbps的雜湊速率。

        通過(guò)以上對(duì)CFW32C7UL系列產(chǎn)品的真隨機(jī)數(shù)發(fā)生器TRNG和SM3算法模塊的介紹,相信大家對(duì)國(guó)密模塊的如何使用有了初步了解,那么SM2和SM4算法在CFW32C7UL系列產(chǎn)品中如何具體使用呢?讓我們帶著這些問(wèn)題,在下期中繼續(xù)探尋吧。

        今天的專題就到這兒,更多關(guān)于碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品的介紹,我們下期見(jiàn)!

        本期作者:劉悅臻、梁夢(mèng)雷、陳紹景、謝耀華、謝劍杰

         




        關(guān)鍵詞: 碼靈半導(dǎo)體 CFW32C7U

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 高雄市| 鄢陵县| 耿马| 澄城县| 德昌县| 获嘉县| 迁西县| 巩留县| 绵阳市| 西和县| 开原市| 都昌县| 东兴市| 巴塘县| 印江| 城市| 浑源县| 肃南| 江口县| 和平区| 古浪县| 商洛市| 德昌县| 寻乌县| 台湾省| 镇江市| 阿图什市| 比如县| 招远市| 伊宁市| 商水县| 历史| 遂川县| 苗栗市| 三明市| 团风县| 贵州省| 阿勒泰市| 新巴尔虎右旗| 穆棱市| 扶沟县|