GMSSL sm3代码接口

本文详细介绍了GMSSL库中SM3加密算法的接口使用,通过实例展示了如何进行哈希计算,测试结果验证了接口的正确性和加密效率。
摘要由CSDN通过智能技术生成
结合官方文档对sm3算法研究了一下,从GMSSL源码挖出sm3,处理一下word数据存储方式后调试通过
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "sm3.h"


//大小端数据转换函数,例:0x00112233转换为0x33221100
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)
{
   
	//初始值IV
	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;
}

//前n-1个512bit块数据处理
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;
		}
	}

	//迭代压缩(处理前n-1个512bit块数据)
	while(data_len >= SM3_BLOCK_SIZE) 
	{
   
		sm3_compress(ctx->digest, data);
		ctx->nblocks++;
		data += SM3_BLOCK_SIZE;
		data_len -= SM3_BLOCK_SIZE;
	}

	//剩下一组不足512bit的块数据,进行单独处理
	ctx->num = data_len;
	
	if(data_len) 
	{
   
		memcpy(ctx->block, data, data_len);
	}
}

/************************************************************************
* 函数功能:处理剩余的一组不足512bit的块数据,并输出最终摘要值
* 输入:
*		@*ctx :输入数据
* 输出:
*		@*digest :摘要值
*返回值:NULL
************************************************************************/
void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值