Openssl编程:调用PEM_read_bio_PUBKEY返回总是NULL

问题遇到的现象和发生背景

因为课题需要,要实现一个SM2密钥存取功能。密钥以PEM格式存储,读取时调用PEM_read_bio_PUBKEY函数,然而程序运行时报“段错误”,经GDB调试发现问题就出在PEM_read_bio_PUBKEY上,PEM密钥明明传进去了,但函数返回为空。本人初学,还望帮忙看一些问题出在哪,或者指点下SM2密钥存取方案,非常感谢。

问题相关代码,请勿粘贴截图

EC_KEY* CreateEVP_PKEY(unsigned char* key, int is_public)
{
EC_KEY tmp_eckey = NULL;
tmp_eckey = EC_KEY_new();
EVP_PKEY
pkey = NULL;
BIO* keybio = BIO_new_mem_buf(key, -1);
unsigned char* buffer = (unsigned char*)malloc(sizeof(unsigned char)*179);
BIO_read(keybio,buffer,178);
printf("keybio10:%s\n",buffer);
if (keybio == NULL) {
printf("BIO_new_mem_buf failed.\n");
return NULL;
}
if (is_public) {
printf("密钥长度:%d\n",ECDSA_size(tmp_eckey));
pkey = PEM_read_bio_PUBKEY(keybio, NULL, 0, NULL);
tmp_eckey = EVP_PKEY_get1_EC_KEY(pkey);
printf("密钥长度:%d\n",ECDSA_size(tmp_eckey));
if(tmp_eckey == NULL)
{
printf("SM2密钥提取失败");
return NULL;
}
}
else {
pkey = PEM_read_bio_PrivateKey(keybio,NULL,0,NULL);
tmp_eckey = EVP_PKEY_get1_EC_KEY(pkey);
if(tmp_eckey == NULL)
{
printf("SM2密钥提取失败");
return NULL;
}
}
return tmp_eckey;
}

运行结果及报错内容

img