OpenSSL中EC_GROUP_free和EC_KEY_free出错

这两天想根据国家密码管理局提供的SM2算法,写一个使用椭圆曲线加解密和一个数字签名验签的测试用例,SM2算法提供的加解密逻辑和数字签名验签逻辑与OpenSSL中提供的示例有一定的差别,OpenSSL提供的示例都是按照ECC原理模型来写的,而SM2算法在基本原理模型上有一定的扩展~~

在调试数字签名验签的测试用例时,发现在EC_GROUP_free函数和EC_KEY_free函数运行时程序直接崩溃,崩溃一般是由于内存访问错误引起的,在调用这两个函数前,使用ERR_get_error和ERR_error_string来获取错误原因时,确显示没有错误~~

为了找到出错地方,想到移动EC_GROUP_free函数和EC_KEY_free函数的位置,后来发现在某个函数运行后使用EC_GROUP_free和EC_KEY_free时发生崩溃,进去函数后,没找到任何错误。后来看到程序代码中有一处可以优化,即把

EC_POINT *Q = NULL;
Q = EC_POINT_new(group);
Q = EC_KEY_get0_public_key(key);
EC_POINT_mul(group,C2,NULL,Q,t,ctx);
EC_POINT_free(Q);
 
  

优化为

EC_POINT_mul(group,C2,NULL,EC_KEY_get0_public_key(key),t,ctx)

后发现,在接着使用EC_KEY_free时竟然没崩溃,可能使用EC_POINT_free(Q)与EC_KEY_free(key)发生了冲突,后来,考虑不使用EC_POINT_new函数来为Q分配空间,直接使用

EC_POINT *Q = NULL;
Q = EC_KEY_get0_public_key(key);
if (!Q) ABORT;
EC_POINT_mul(group,C2,NULL,Q,t,ctx);
发现,Q竟然不是NULL,而且使用过程中没有出现问题,即Q应该与key共享某一段内存空间。

同样,在使用EC_GROUP_free函数前,开始使用了如下相关代码

EC_POINT *P = NULL;
P = EC_POINT_new(group);
if (!Pa) ABORT;
P = EC_GROUP_get0_generator(group);
EC_POINT_free(P);
优化为

EC_POINT_mul(group,C1,NULL,EC_GROUP_get0_generator(group),s,ctx);
从而也消除了相应的错误,即P也与group共享某一段内存空间。

你可能感兴趣的:(信息安全)