[方案相关] 【华大测评】HASH测试

[复制链接]
877|2
 楼主| 纪国圣 发表于 2021-12-18 09:44 | 显示全部楼层 |阅读模式
TI, se, ic, IO, ce
一、HASH简介
HASH 安全散列算法是HC32F460加密协处理模块的一个功能算法是 SHA-2 版本的 SHA-256Secure Hash Algorithm),符合美国国家标准和技术局发布的国家标准“FIPS PUB 180-3”,可以对长度不超过 2^64 位的消息产生 256 位的消息摘要输出。
安全散列算法的步骤如下:
首先填充消息使其长度恰好为一个比 512 的倍数仅小 64 位的数。填充方法是附一个1在消息后面,后接所要求的多个 0,然后在其后附上 64 位的消息长度(填充前),使消息长度恰好是 512 位的整数倍。
其次将 A、B、C、D、E、F、G、H 8 个 32 位变量,用十六进制初始化。然后开始算法的主循环,一次处理 512 位消息,循环次数是消息中 512 位分组的数目。循环一共进行 64 次操作,此操作称为压缩函数。每次操作都包含移位、循环移位、逻辑运算、模 232 加等,运算的过程见下图 33-2。最后的输出由 ABCDEFGH 级联而成。其中 Wt 为由 512 位消息得到的第 t 步所用的临时值,Kt 为第t 所用的常数值,t0t63)是 64 步循环中的一步。

4.PNG
二、操作流程上电后,本模块进行一次异步复位操作。时钟需在复位脱离前稳定有效,并且在后续运行中持续稳定。HSAH 模块的操作流程如下:
1) 软件将原始数据按照算法规则进行填充,并且将填充后的消息按512 比特进行分组。
2) 将被操作的数据写入数据寄存器(HASH_DR)中。
3) 如果本次运算为消息分组的第一组数据,对HASH_CR . FST_GRP 位写入1。
4) 对 HASH_CR.START 写入1,启动本模块进行运算。
注:以上的 3)和 4)可以同时进行
5) 判断本模块本次运算是否完成,通过以下方法:
不断读取 HASH_CR.START 直到读到该位为 0 即表示运算完成
6) 如果本次运算不是消息分组的最后一组数据,返回到 2)。
7) 如果本次运算为消息分组的最后一组数据,读取摘要寄存器(HASH_HR)获得本
次运算的结果。如需进行进一步运算则返回到步骤1。
三、测试
测试程序如下:

  1. /*******************************************************************************
  2. * Copyright (C) 2020, Huada Semiconductor Co., Ltd. All rights reserved.
  3. *
  4. * This software component is licensed by HDSC under BSD 3-Clause license
  5. * (the "License"); You may not use this file except in compliance with the
  6. * License. You may obtain a copy of the License at:
  7. *                    opensource.org/licenses/BSD-3-Clause
  8. */
  9. /******************************************************************************/
  10. /** \file main.c
  11. **
  12. ** \brief This sample demonstrates how to set GPIO as output function.
  13. **
  14. **   - 2021-04-16 CDT first version for Device Driver Library of GPIO.
  15. **
  16. ******************************************************************************/

  17. /*******************************************************************************
  18. * Include files
  19. ******************************************************************************/
  20. #include "hc32_ddl.h"
  21. #include "ev_hc32f460_lqfp100_v1.h"
  22. #include "TIM_Measure.h"

  23. /*******************************************************************************
  24. * Local type definitions ('typedef')
  25. ******************************************************************************/

  26. /*******************************************************************************
  27. * Local pre-processor symbols/macros ('#define')
  28. ******************************************************************************/
  29. #define HASH_MSG_DIGEST_SIZE        (32u)

  30. #define TIMEOUT_VAL                 (10u)

  31. /*******************************************************************************
  32. * Global variable definitions (declared in header file with 'extern')
  33. ******************************************************************************/

  34. /*******************************************************************************
  35. * Local function prototypes ('static')
  36. ******************************************************************************/

  37. /*******************************************************************************
  38. * Local variable definitions ('static')
  39. ******************************************************************************/
  40. float t = 0.0f;       
  41. static uint8_t m_au8HashMsgDigest[HASH_MSG_DIGEST_SIZE];
  42. const static char *m_su8SrcData = "abcdefghijklmnopqrstuvwxyz";
  43. /*******************************************************************************
  44. * Function implementation - global ('extern') and local ('static')
  45. ******************************************************************************/
  46. /**
  47. *******************************************************************************
  48. ** \brief  Main function of GPIO output
  49. **
  50. ** \param  None
  51. **
  52. ** \retval int32_t Return value, if needed
  53. **
  54. ******************************************************************************/
  55. int32_t main(void)
  56. {
  57.                 BSP_CLK_Init();
  58.        
  59.     /* 1. Enable HASH peripheral clock. */
  60.     PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_HASH, Enable);

  61.     /* 2. Initialize HASH. */
  62.     HASH_Init();

  63.     DDL_PrintfInit(BSP_PRINTF_DEVICE, BSP_PRINTF_BAUDRATE, BSP_PRINTF_PortInit);
  64.                
  65.                 TIM_Measure_Init();
  66.     while(1)
  67.     {
  68.                         TIM_Measure_Start();
  69.         /* Use HASH. */
  70.                         HASH_Start((uint8_t *)m_su8SrcData, strlen(m_su8SrcData), \
  71.                                                                         m_au8HashMsgDigest, TIMEOUT_VAL);
  72.                         TIM_Measure_Stop();
  73.                         t = Get_Time();
  74.                         DDL_Printf("\n");
  75.                         DDL_Printf("HASH use time: %fus\n",t*1000.0f);
  76.                        
  77.                         DDL_Printf("String "%s" message digest:\n", m_su8SrcData);
  78.                         for (uint8_t i = 0u; i < sizeof(m_au8HashMsgDigest); i++)
  79.                         {
  80.                                         DDL_Printf("%.2x ", m_au8HashMsgDigest[i]);
  81.                         }
  82.                        
  83.                         while(1);
  84.     };
  85. }

  86. /*******************************************************************************
  87. * EOF (not truncated)
  88. ******************************************************************************/
编译运行:
1.PNG
和网上的运行结果比较:
2.PNG
可以看出结果正确。
HC32F460_HASH.zip (701.04 KB, 下载次数: 2)
kiwis66 发表于 2021-12-20 11:22 | 显示全部楼层
这个功能还没试过,感谢分享
七毛钱 发表于 2021-12-20 11:37 来自手机 | 显示全部楼层
楼主最近发了很多测评贴啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

407

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部