HMAC - SM3/SHA1

11

#ifndef __HMAC_H__
#define __HMAC_H__

#include <stdint.h>

void hmac_sm3(const uint8_t *data, uint32_t data_len, const uint8_t *key, uint32_t key_len, uint8_t *out);
void hmac_sha1(const uint8_t *data, uint32_t data_len, const uint8_t *key, uint32_t key_len, uint8_t *out);

#endif /* __HMAC_H__ */
#include <stddef.h>
#include <string.h>
#include "sm3.h"
#include "sha1.h"
#include "hmac.h"

#define SM3_BLOCK_SIZE      64
#define SHA1_BLOCK_SIZE     64

/**************************************************
函数名称:hmac_sm3
函数功能:HMAC计算,杂凑函数SM3
入口参数:data,data_len,key,key_len
出口参数:out
返回值:void
data限长1024-SM3_BLOCK_SIZE
**************************************************/
void hmac_sm3(const uint8_t *data, uint32_t data_len, const uint8_t *key, uint32_t key_len, uint8_t *out)
{
    int i;
    uint8_t hK[SM3_BLOCK_SIZE];
    uint8_t hK1[SM3_BLOCK_SIZE];
    uint8_t hK2[SM3_BLOCK_SIZE];
    uint8_t lH[SM3_HASH_SIZE];
    uint8_t llH[SM3_HASH_SIZE];
    uint8_t hash_buf[1024];

    //1.密钥扩展
    memset(hK, 0x00, sizeof(hK));
    if (key_len > SM3_BLOCK_SIZE)
    {
        SM3Calc(key, key_len, hK);
    }
    else
    {
        memcpy(hK, key, key_len);
    }

    for (i = 0; i < SM3_BLOCK_SIZE; i++)
    {
        hK1[i] = hK[i] ^ 0x36;
        hK2[i] = hK[i] ^ 0x5C;
    }

    //2.杂凑计算
    memcpy(hash_buf, hK1, sizeof(hK1));
    memcpy(hash_buf+sizeof(hK1), data, data_len);
    SM3Calc((const uint8_t *)hash_buf, sizeof(hK1)+data_len, lH);

    //3.输出变换
    memcpy(hash_buf, hK2, sizeof(hK2));
    memcpy(hash_buf+sizeof(hK2), lH, sizeof(lH));
    SM3Calc((const uint8_t *)hash_buf, sizeof(hK2)+sizeof(lH), llH);

    //4.截断操作
    memcpy(out, llH, SM3_HASH_SIZE);

    return ;
}

/**************************************************
函数名称:hmac_sha1
函数功能:HMAC计算,杂凑函数sha1
入口参数:data,data_len,key,key_len
出口参数:out
返回值:void
**************************************************/
void hmac_sha1(const uint8_t *data, uint32_t data_len, const uint8_t *key, uint32_t key_len, uint8_t *out)
{
    int i;
    uint8_t hK[SHA1_BLOCK_SIZE];
    uint8_t hK1[SHA1_BLOCK_SIZE];
    uint8_t hK2[SHA1_BLOCK_SIZE];
    uint8_t lH[SHA1HashSize];
    uint8_t llH[SHA1HashSize];

    size_t hash_buf_size =  SHA1_BLOCK_SIZE + ((data_len < SHA1HashSize) ? SHA1HashSize : data_len);
    uint8_t hash_buf[hash_buf_size];

    //1.密钥扩展
    memset(hK, 0x00, sizeof(hK));
    if (key_len > SHA1_BLOCK_SIZE)
    {
        SHA1Encrypt((uint8_t *)key, key_len, hK);
    }
    else
    {
        memcpy(hK, key, key_len);
    }

    for (i = 0; i < SHA1_BLOCK_SIZE; i++)
    {
        hK1[i] = hK[i] ^ 0x36;
        hK2[i] = hK[i] ^ 0x5C;
    }

    //2.杂凑计算
    memcpy(hash_buf, hK1, sizeof(hK1));
    memcpy(hash_buf+sizeof(hK1), data, data_len);
    SHA1Encrypt(hash_buf, sizeof(hK1)+data_len, lH);

    //3.输出变换
    memcpy(hash_buf, hK2, sizeof(hK2));
    memcpy(hash_buf+sizeof(hK2), lH, sizeof(lH));
    SHA1Encrypt(hash_buf, sizeof(hK2)+sizeof(lH), llH);

    //4.截断操作
    memcpy(out, llH, SHA1HashSize);

    return ;
}

 

上一篇:AUTOSAR下的SPI相关结构体


下一篇:CubeMX创建usart启动文件[嵌入式学习]