Giter VIP home page Giter VIP logo

gm's People

Contributors

ikantech avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

gm's Issues

c#

希望能有c#版的实现

请问undefined reference to 怎么解决

/usr/bin/ld: /tmp/gm_test-0a45e1.o: in function test_bn': gm_test.c:(.text+0x46): undefined reference to gm_bn_from_hex'
/usr/bin/ld: gm_test.c:(.text+0x70): undefined reference to gm_bn_from_hex' /usr/bin/ld: gm_test.c:(.text+0xb1): undefined reference to GM_BN_P'
/usr/bin/ld: gm_test.c:(.text+0xc7): undefined reference to GM_BN_N' /usr/bin/ld: gm_test.c:(.text+0x103): undefined reference to gm_bn_to_mont'
/usr/bin/ld: gm_test.c:(.text+0x139): undefined reference to gm_bn_from_mont' /usr/bin/ld: gm_test.c:(.text+0x28a): undefined reference to gm_bn_add'
/usr/bin/ld: gm_test.c:(.text+0x301): undefined reference to gm_bn_sub' /usr/bin/ld: gm_test.c:(.text+0x345): undefined reference to gm_bn_to_mont'
/usr/bin/ld: gm_test.c:(.text+0x35f): undefined reference to gm_bn_to_mont' /usr/bin/ld: gm_test.c:(.text+0x394): undefined reference to gm_bn_mont_mul'
/usr/bin/ld: gm_test.c:(.text+0x3bc): undefined reference to `gm_bn_from_mont'

sm4_cbc_pkcs7加密,特定长度原文加密时出现段错误

【问题页面】https://github.com/ikantech/gm/blob/main/c/sm4.c

【问题描述】使用sm4_cbc_pkcs7方式加密数据,原文数据长度为(16*k+1)字节时,加密出现段错误。其中k为大于0的正整数。

【问题分析】sm4.c中的函数gm_sm4_update和函数gm_sm4_done如下方2段代码。

  1. 当前sm4.c的函数gm_sm4_update中对iLen进行了自减后,是否满16字节的判断条件为(ctx->cur_buf_len == 16 && iLen > 0)
  2. 当不断调用gm_sm4_update传入满16字节数据状态下,最后调用gm_sm4_update传入字节数为1时,执行iLen--后,if判断为假,ctx->cur_buf_len没有变为0,在执行ctx->buf[ctx->cur_buf_len++] = *input++;之后,ctx->cur_buf_len自增变为17;
  3. 当调用gm_sm4_done进行pkcs7 padding时,执行pad = 16 - ctx->cur_buf_len;后,pad值为-1,之后再调用 memset(ctx->buf + ctx->cur_buf_len, pad, pad);,出现段错误。
int gm_sm4_update(gm_sm4_context * ctx, const unsigned char * input, unsigned int iLen, unsigned char * output) {
	int rLen = 0;

	while(iLen--) {
		/* 是否满16个字节,这里要留一轮,要不调用gm_sm4_done时就不好处理填充了 */
		if (ctx->cur_buf_len == 16 && iLen > 0) {
			// 满了,则立即调用轮函数进行处理
			update_one_round(ctx, output + rLen);
			ctx->total_len += 16;
			ctx->cur_buf_len = 0;
			rLen += 16;
		}

		ctx->buf[ctx->cur_buf_len++] = *input++;
	}
	return rLen;
}
int gm_sm4_done(gm_sm4_context * ctx, unsigned char * output) {
	int rLen = 0;

	// 事先处理未满16字节加密时的填充
	int pad = 0;
	if((ctx->state & 0x01) && (ctx->state & 0x02) && (ctx->cur_buf_len != 16)) {
		// 如果是加密,PKCS7Padding,并且是未满16字节,则填充
		pad = 16 - ctx->cur_buf_len;
		memset(ctx->buf + ctx->cur_buf_len, pad, pad);
		ctx->cur_buf_len += pad;
	}
	......后续代码省略

【修改建议】
对gm_sm4_update的 iLen判断条件进行修改,修改为 iLen >= 0;对gm_sm4_done补充参数检查。提供以下参考代码:

int gm_sm4_update(gm_sm4_context * ctx, const unsigned char * input, unsigned int iLen, unsigned char * output) {
	int rLen = 0;

	while(iLen--) {
		/* 是否满16个字节,这里要留一轮,要不调用gm_sm4_done时就不好处理填充了 */
		if (ctx->cur_buf_len == 16 && iLen >= 0) {
			// 满了,则立即调用轮函数进行处理
			update_one_round(ctx, output + rLen);
			ctx->total_len += 16;
			ctx->cur_buf_len = 0;
			rLen += 16;
		}

		ctx->buf[ctx->cur_buf_len++] = *input++;
	}
	return rLen;
}
int gm_sm4_done(gm_sm4_context * ctx, unsigned char * output) {
	int rLen = 0;

	// 事先处理未满16字节加密时的填充
	int pad = 0;
	if((ctx->state & 0x01) && (ctx->state & 0x02) && (ctx->cur_buf_len != 16)) {
		// 如果是加密,PKCS7Padding,并且是未满16字节,则填充
		pad = 16 - ctx->cur_buf_len;
		if(pad < 0)
		{
			return -1;
		}
		memset(ctx->buf + ctx->cur_buf_len, pad, pad);
		ctx->cur_buf_len += pad;
	}
	......后续代码省略

sm3.c存在算法错误

文件大小模64等于55的文件计算sm3时是错误的。

需要将gm_sm3_done中的 < 56修改为<= 56

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.