guanzhi / GmSSL

支持国密SM2/SM3/SM4/SM9/SSL的密码工具箱

Home Page:http://gmssl.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

强烈建议给加密函数开放更多的可选项

lizheng2018CC opened this issue · comments

在使用gmssl的过程中,由于开发需求,我们不能使用der编码,私钥不能用密码加密,sm2加密需要支持长数据加密,以及sm4分组加密算法需要支持任意长度数据加密。然而!这些特性在gmssl库中都没有,而一个非密码学领域的软件开发者研究怎么从原有的gmssl库中修改这些特性是很困难的。
也许这些需求既不安全也不合理,但这就是上面的需求,我们只能按这个做。
我看Issues中也有好几个人提出了类似的问题,我不是唯一有此需求的人。我不是一个密码学领域的开发者,相信很多使用gmssl的人也是。
作者出于安全性考虑必然出发点是好的,但是我还是强烈建议选择权交给使用者,在函数中调用中增加参数控制这些特性会极大地方便开发者使用。

sm2加密需要支持长数据加密+1

实际上GmSSL设计时考虑了这个需求,默认就不必须做DER编码。SM2_KEY, SM2_SIGNATURESM2_CIPHERTEXT这几个类型的内部数据已经做了序列化了,可以直接复制到内存里或者复制到文件里,即使在大小端不同的CPU之间传输也不会出现错误。

实际上GmSSL设计时考虑了这个需求,默认就不必须做DER编码。SM2_KEY, SM2_SIGNATURESM2_CIPHERTEXT这几个类型的内部数据已经做了序列化了,可以直接复制到内存里或者复制到文件里,即使在大小端不同的CPU之间传输也不会出现错误。

可是源码里面并没有直接将SM2_CIPHERTEXT 暴露给用户,用户还是需要阅读和修改源码才能得到非der编码的数组,不妨给函数参数加一个控制der编码的标志位,控制输出数组中的内容是否是der编码过的。并且还是希望1、sm2加密需要支持长数据加密;2、对私钥的加密也可关闭;3、sm4 EBC加密(虽然我已经实现了);

int sm2_encrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen)
{
	SM2_CIPHERTEXT C;

	if (!key || !in || !out || !outlen) {
		error_print();
		return -1;
	}
	if (!inlen) {
		error_print();
		return -1;
	}

	if (sm2_do_encrypt(key, in, inlen, &C) != 1) {
		error_print();
		return -1;
	}
	*outlen = 0;
	if (sm2_ciphertext_to_der(&C, &out, outlen) != 1) {
		error_print();
		return -1;
	}
	return 1;
}