搜索
bottom↓
回复: 0

《DNK210使用指南 -SDK版 V1.0》第二十七章 高级加密加速器实验

[复制链接]

出0入234汤圆

发表于 昨天 09:29 | 显示全部楼层 |阅读模式
2.jpg
1)实验平台:正点原子DNK210开发板
2)购买链接:https://detail.tmall.com/item.htm?id=782801398750
3)全套实验源码+手册+视频下载地址:http://openedv.com/thread-348335-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学DNK210快速入门视频教程:https://www.bilibili.com/video/BV1kD421G7fu
6)正点原子FPGA交流群:132780729
1.png
3.png

第二十七章 高级加密加速器实验


       本章将介绍Kendryte K210的AES模块的使用,通过AES256加密实验帮助读者了解AES相关知识。通过本章的学习,读者将会对Kendryte K210内置的硬件AES模块有初步认知和应用能力。
       本章分为如下几个小节:
       27.1 AES介绍
       27.2 硬件设计
       27.3 程序设计
       27.4 运行验证

       27.1 AES介绍
       Kendryte K210内置AES(高级加密加速器),相对于软件可以极⼤的提高AES运算速度。 AES加速器支持多种加密/解密模式(ECB,CBC,GCM),多种⻓度的KEY(ECB,CBC,GCM)的运算。
       AES 加速器是用来加密和解密的模块,具体性能如下:
       1. 支持ECB,CBC,GCM三种加密方式
       2. 支持128位,192位,256位三种长度的KEY
       3. KEY可以通过软件配置,受到硬件电路保护
       4. 支持DMA传输
       Kendryte K210提供了非常多操作AES的API函数,我们这里就不一一详细讲解,大家可以自行参考官方库文件aes.c和aes.h,本章以AES256实验为例,以表格的形式讲述部分用到的函数,这些函数介绍如下:

1.png
表27.1.1 AES部分API函数介绍

       27.2 硬件设计

       27.2.1 例程功能

       1. 计算并打印输出AES的ECB模式、CBC模式和 GCM 模式对数据加密处理的时间(包括软件和硬件的对比时间,CPU 和 DMA 使用的是硬件的 AES )。

       27.2.2 硬件资源

       1.USB接口
              UARTHS_TX – IO5
              UARTHS_RX – IO4

       27.2.3 原理图
       本章实验内容,主要讲解AES模块的使用,无需关注原理图。

       27.3 程序设计

       27.3.1 main.c代码
       本章例程均来自官方SDK的DEMO,本章仅简单介绍下maic.c文件部分函数的功能,代码如下所示:
  1. int main(void)
  2. {
  3.     aes_cipher_mode_t cipher;
  4.     printf("begin test %d\n", get_time_flag);

  5.     for (cipher = AES_ECB; cipher < AES_CIPHER_MAX; cipher++)
  6.     {
  7.         printf("[%s] test all byte ... \n", cipher_name[cipher]);
  8.         if (AES_CHECK_FAIL == aes_check_all_byte(cipher))
  9.         {
  10.             printf("aes %s check_all_byte fail\n", cipher_name[cipher]);
  11.             return -1;
  12.         }

  13.         printf("[%s] test all key ... \n", cipher_name[cipher]);
  14.         if (AES_CHECK_FAIL == aes_check_all_key(cipher))
  15.         {
  16.             printf("aes %s check_all_key fail\n", cipher_name[cipher]);
  17.             return -1;
  18.         }

  19.         printf("[%s] test all iv ... \n", cipher_name[cipher]);
  20.         if (AES_CHECK_FAIL == aes_check_all_iv(cipher))
  21.         {
  22.             printf("aes %s check_all_iv fail\n", cipher_name[cipher]);
  23.             return -1;
  24.         }
  25.         
  26.         printf("[%s] [%ld bytes] cpu time = %ld us, dma time = %ld us, soft time = %ld us\n", cipher_name[cipher],
  27.                 AES_TEST_DATA_LEN,
  28.                 cycle[cipher][AES_HARD][AES_CPU]/(sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)/1000000),
  29.                 cycle[cipher][AES_HARD][AES_DMA]/(sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)/1000000),
  30.                 cycle[cipher][AES_SOFT][AES_CPU]/(sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)/1000000));
  31.     }
  32.     printf("aes-256 test pass\n");
  33.     while (1)
  34.         ;
  35.     return 0;
  36. }
复制代码
       可以看到,mian函数主要的功能是通过一个for循环,把 AES 的三种模式(ECB/CBC/GCM)对应的时间打印出来。
  1. check_result_t aes_check_all_byte(aes_cipher_mode_t cipher)
  2. {
  3.     uint32_t check_tag = 0;
  4.     uint32_t index = 0;
  5.     size_t data_len = 0;
  6.     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);
  7.     if (cipher == AES_GCM)
  8.         iv_len = iv_gcm_len;
  9.     for (index = 0; index < (AES_TEST_DATA_LEN < 256 ? AES_TEST_DATA_LEN : 256); index++)
  10.     {
  11.         aes_hard_in_data[index] = index;
  12.         data_len++;

  13.         AES_DBG("[%s] test num: %ld \n", cipher_name[cipher], data_len);
  14.         if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)
  15.             == AES_CHECK_FAIL)
  16.             check_tag = 1;
  17.     }

  18.     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);
  19.     get_time_flag = 1;
  20.     data_len = AES_TEST_DATA_LEN;
  21.     AES_DBG("[%s] test num: %ld \n", cipher_name[cipher], data_len);
  22.     for (index = 0; index < data_len; index++)
  23.         aes_hard_in_data[index] = index % 256;
  24.     if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)
  25.         == AES_CHECK_FAIL)
  26.         check_tag = 1;
  27.     get_time_flag = 0;
  28.     if(check_tag)
  29.         return AES_CHECK_FAIL;
  30.     else
  31.         return AES_CHECK_PASS;
  32. }
复制代码
       AES检测所有byte。
  1. check_result_t aes_check_all_key(aes_cipher_mode_t cipher)
  2. {
  3.     size_t data_len = 0;
  4.     uint32_t index = 0;
  5.     uint32_t i = 0;
  6.     uint32_t check_tag = 0;

  7.     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);
  8.     if (cipher == AES_GCM)
  9.         iv_len = iv_gcm_len;
  10.     data_len = AES_TEST_DATA_LEN;
  11.     for (index = 0; index < data_len; index++)
  12.         aes_hard_in_data[index] = index;
  13.     for (i = 0; i < (256 / key_len); i++)
  14.     {
  15.         for (index = i * key_len; index < (i * key_len) + key_len; index++)
  16.             aes_key[index - (i * key_len)] = index;
  17.         if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)
  18.             == AES_CHECK_FAIL)
  19.             check_tag = 1;
  20.     }
  21.     if(check_tag)
  22.         return AES_CHECK_FAIL;
  23.     else
  24.         return AES_CHECK_PASS;
  25. }
复制代码
       AES检测所有key。
  1. check_result_t aes_check_all_iv(aes_cipher_mode_t cipher)
  2. {
  3.     size_t data_len = 0;
  4.     uint32_t index = 0;
  5.     uint32_t i = 0;
  6.     uint8_t check_tag = 0;

  7.     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);
  8.     if (cipher == AES_GCM)
  9.         iv_len = iv_gcm_len;
  10.     data_len = AES_TEST_DATA_LEN;
  11.     for (index = 0; index < data_len; index++)
  12.         aes_hard_in_data[index] = index;
  13.     for (i = 0; i < (256 / iv_len); i++)
  14.     {
  15.         for (index = i * iv_len; index < (i * iv_len) + iv_len; index++)
  16.             aes_iv[index - (i * iv_len)] = index;
  17.         if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)
  18.             == AES_CHECK_FAIL)
  19.             check_tag = 1;
  20.     }
  21.     if(check_tag)
  22.         return AES_CHECK_FAIL;
  23.     else
  24.         return AES_CHECK_PASS;
  25. }
复制代码
       AES检测所有IV。

       27.4 运行验证
       将DNK210开发板连接到电脑主机,通过VSCode将固件烧录到开发板中,我们打开“串口终端”,可以看到串口中断不断的打印数据,如下图所示:

第二十七章 高级加密加速器实验6601.png
图27.4.1 “串行终端”窗口打印输出

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-18 23:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表