HMAC
HMAC示例实现了HMAC的两种生成摘要模式:SHA-256和HMAC-SHA256。
- SHA-256对输入消息产生长度为256 bits的哈希值,称为消息摘要,输入信息需要用户按照相关HMAC驱动API规定进行填充。
- HMAC-SHA256对输入的密钥和消息运用哈希算法生成一段消息摘要,密钥长度为256 bits。
HMAC示例的源代码和工程文件位于SDK_Folder\projects\peripheral\hmac\hmac,其中工程文件在文件夹Keil_5下。
以下章节主要介绍HMAC消息认证的Interrupt、Query、DMA三种实现方式。
代码理解
- 配置HMAC模块。
g_hmac_handle.p_instance = HMAC; g_hmac_handle.init.mode = HMAC_MODE_HMAC; g_hmac_handle.init.p_key = (uint32_t *)hmac_key; g_hmac_handle.init.p_user_hash = NULL; g_hmac_handle.init.dpa_mode = DISABLE; g_hmac_handle.init.key_fetch_type = HAL_HMAC_KEYTYPE_MCU; g_hmac_handle.init.enable_irq = HAL_HMAC_DISABLE_IRQ; g_hmac_handle.init.enable_dma_mode = HAL_HMAC_DISABLE_DMA;- init.mode:HMAC操作模式选择,可选择HMAC_MODE_SHA(SHA-256模式)、HMAC_MODE_HMAC(HMAC-SHA256模式)。
- init.p_key:密钥,只在HMAC-SHA256计算模式下有效。
- init.p_user_hash:用户哈希初始值,可根据需要自定义哈希初始值。
- init.dpa_mode:配置是否使能DPA功能。
- init.key_fetch_type:Key的来源,可选择HAL_HMAC_KEYTYPE_MCU、HAL_HMAC_KEYTYPE_AHB、HAL_HMAC_KEYTYPE_KRAM。
- init.enable_irq:配置是否使能IRQ中断方式,可选择HAL_HMAC_ENABLE_IRQ、HAL_HMAC_DISABLE_IRQ。
- init.enable_dma_mode:配置是否使能DMA模式,可选择HAL_HMAC_ENABLE_DMA、HAL_HMAC_DISABLE_DMA。
- 用户可按需选择轮询、中断或DMA计算模式。各计算模式的配置方式如下:
- 可根据需要重载自定义哈希初始值p_user_hash和密钥p_key(仅在HMAC-SHA256计算模式生效)。
- 按需配置计算模式相关参数。
- init.enable_irq:HAL_HMAC_DISABLE_IRQ(轮询模式、DMA模式)、HAL_HMAC_ENABLE_IRQ(中断模式)
- init.enable_dma_mode:HAL_HMAC_DISABLE_DMA(轮询模式、中断模式)、HAL_HMAC_ENABLE_DMA(DMA模式)
- init.mode:HMAC_MODE_SHA或者HMAC_MODE_HMAC
- 使用hal_hmac_sha256_digest()计算消息摘要。若数据流太长无法一次性计算完成,则需将数据分段处理。对于非首段数据的处理,需将自定义的哈希初始值p_user_hash重载为上一次的计算结果。
对于中断及DMA计算模式,当计算完成时hal_hmac_done_callback()会被调用;计算出错时hal_hmac_error_callback()会被调用,用户可重写该接口。
测试验证
- 用GProgrammer下载hmac.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示HMAC计算结果。