结合官方文档对sm3算法研究了一下,从GMSSL源码挖出sm3,处理一下word数据存储方式后调试通过
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "sm3.h"
uint32_t Lendian_2_Bendian(uint32_t value)
{
return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8
|(value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;
}
void sm3_init(sm3_ctx_t *ctx)
{
ctx->digest[0] = 0x7380166F;
ctx->digest[1] = 0x4914B2B9;
ctx->digest[2] = 0x172442D7;
ctx->digest[3] = 0xDA8A0600;
ctx->digest[4] = 0xA96F30BC;
ctx->digest[5] = 0x163138AA;
ctx->digest[6] = 0xE38DEE4D;
ctx->digest[7] = 0xB0FB0E4E;
ctx->nblocks = 0;
ctx->num = 0;
}
void sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len)
{
if (ctx->num)
{
unsigned int left = SM3_BLOCK_SIZE - ctx->num;
if (data_len < left)
{
memcpy(ctx->block + ctx->num, data, data_len);
ctx->num += data_len;
return;
}
else
{
memcpy(ctx->block + ctx->num, data, left);
sm3_compress(ctx->digest, ctx->block);
ctx->nblocks++;
data += left;
data_len -= left;
}
}
while(data_len >= SM3_BLOCK_SIZE)
{
sm3_compress(ctx->digest, data);
ctx->nblocks++;
data += SM3_BLOCK_SIZE;
data_len -= SM3_BLOCK_SIZE;
}
ctx->num = data_len;
if(data_len)
{
memcpy(ctx->block, data, data_len);
}
}
void