260|0

501

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

【NUCLEO H533RE】HASH384测试 [复制链接]

  • 前言

前一篇我们体验了AES算法,这一篇继续安全相关加速器的HASH-384. 还是按照硬件和软件对比的方式来体验。

  • HASH-384

HASH-384原理见https://eips.ethereum.org/assets/eip-2680/sha256-384-512.pdf

 

三.软件算法

参考https://github.com/th-blitz/Hash-Algorithms/blob/main/sha384.c

 

 

  • STM32硬件驱动

添加驱动文件

stm32h5xx_hal_hash.c

stm32h5xx_hal_conf.h中取消注释

/*#define HAL_HASH_MODULE_ENABLED */

 

 

初始化

HASH_HandleTypeDef  hhash;

    __HAL_RCC_HASH_CLK_ENABLE();

  hhash.Instance = HASH;

  hhash.Init.DataType = HASH_BYTE_SWAP;

  hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA384;

  if (HAL_HASH_Init(&hhash) != HAL_OK)

  {

    /* 错误 */

  }

 

取消初始化

    __HAL_RCC_HASH_FORCE_RESET();

__HAL_RCC_HASH_RELEASE_RESET();

__HAL_RCC_HASH_CLK_DISABLE();

 

 

计算

  if (HAL_HASH_Start(&hhash, (uint8_t *)Input, INPUT_TAB_SIZE, aDigest, 0xFF) != HAL_OK)

  {

    /* 错误 */

  }

 

 

  • 测试

 

shell_func.c中申明实现函数

static void sw_hash384_func(uint8_t* param);

static void hw_hash384_func(uint8_t* param);

 

新增两行命令用于计算

 

  { (uint8_t*)"sw_hash384",   sw_hash384_func,  (uint8_t*)"sw_hash384 input testtimes"},

  { (uint8_t*)"hw_hash384",   hw_hash384_func,  (uint8_t*)"sw_hash384 input testtimes"},

 

实现如下

 

HASH_HandleTypeDef hhash;

int hw_hash384(uint8_t* input, uint8_t* output, uint32_t len)

{

  __HAL_RCC_HASH_CLK_ENABLE();

  hhash.Instance = HASH;

  hhash.Init.DataType = HASH_BYTE_SWAP;

  hhash.Init.Algorithm = HASH_ALGOSELECTION_SHA384;

  if (HAL_HASH_Init(&hhash) != HAL_OK)

  {

return -1;

  }

 

  if (HAL_HASH_Start(&hhash, input, len, output, 0xFF) != HAL_OK)

  {

__HAL_RCC_HASH_FORCE_RESET();

  __HAL_RCC_HASH_RELEASE_RESET();

__HAL_RCC_HASH_CLK_DISABLE();

return -1;

  }

 

   __HAL_RCC_HASH_FORCE_RESET();

__HAL_RCC_HASH_RELEASE_RESET();

__HAL_RCC_HASH_CLK_DISABLE();

return 0;

}

 

int sw_hash384(uint8_t* input, uint8_t* output, uint32_t len)

{

sha384_core(input, len, (uint64_t*)output);

return 0;

}

 

 

static void sw_hash384_func(uint8_t* param)

{

uint32_t inlen;

uint32_t test_times;

if(sscanf((const char*)param,"%*s %s %d",(char*)(&(s_input[0])),&test_times) == 2)

  {

inlen = str2hex_buf(s_input,strlen((char*)s_input));

 

ULONG sw_start_time = tx_time_get();

for(uint32_t i=0; i<test_times;i++)

    {

sw_hash384(s_input,s_output,inlen);

}

ULONG sw_used_time = tx_time_get()-sw_start_time;

 

xprintf("sw %d\r\n",sw_used_time);

uint8_t* p = (uint8_t*)s_output;

for(int i=0; i<48; i++)

    {

xprintf("%02x",p);

}

xprintf("\r\n");

}

}

 

 

static void hw_hash384_func(uint8_t* param)

{

uint32_t inlen;

uint32_t test_times;

if(sscanf((const char*)param,"%*s %s %d",(char*)(&(s_input[0])),&test_times) == 2)

  {

inlen = str2hex_buf(s_input,strlen((char*)s_input));

 

ULONG hw_start_time = tx_time_get();

for(uint32_t i=0; i<test_times;i++)

    {

hw_hash384(s_input,s_output,inlen);

}

ULONG hw_used_time = tx_time_get()-hw_start_time;

 

xprintf("hw %d\r\n",hw_used_time);

uint8_t* p = (uint8_t*)s_output;

for(int i=0; i<48; i++)

    {

xprintf("%02x",p);

}

xprintf("\r\n");

}

}

 

 

测试如下

 

hw_hash384  01020304050607080900 10000

sw_hash384  01020304050607080900 10000

 

定义了大数组,栈要大点

uint64_t buffer[80];

 

 

硬件计算和在线计算工具计算出来的完全一样

 

 

在线计算工具计算

https://www.lddgo.net/encrypt/hash

 

 

    

  • 总结

以上测试了HASH加速计算,使用硬件加速计算运算很快,接口也很简单。

此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表