<menu id="6c4oc"><tt id="6c4oc"></tt></menu>
  • 新聞中心

    EEPW首頁 > 牛人業話 > 一文看懂碼靈半導體CFW32C7UL系列產品應用(二):國密算法●中篇

    一文看懂碼靈半導體CFW32C7UL系列產品應用(二):國密算法●中篇

    作者:碼靈半導體時間:2020-07-19來源:EEPW收藏

    歡迎再次來到“L系列產品應用介紹”連載專題。通過上期對L系列支持的國密算法種類的介紹,相信您對CFW327UL系列的國密硬件模塊有了初步了解,那么這些國密模塊如何使用?應用是否便捷?加解密的速度如何?帶著這些疑問,我們今天從真隨機數發生器TRNG和SM3算法模塊的調用開始談起。

    本文引用地址:http://www.me-unplugged.com/article/202007/415807.htm

    圖片.png

    一、真隨機數發生器TRNG模塊

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

    與“偽隨機”相對應的是“真隨機”,真正的隨機數僅存在于量子力學中,而我們需要的是一種不可預測的、統計意義上的、高安全性的隨機數。L系列產品中我們提供了四組這種真隨機數源,用以產生真隨機數,同時該功能模塊是采用硬件方式實現的,并且通過了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系列產品的介紹,我們下期見!

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

     




    評論


    技術專區

    關閉
    熟妇女的欲乱
    <menu id="6c4oc"><tt id="6c4oc"></tt></menu>