#include <openssl/evp.h>
#include <openssl/asn1.h>
// 从PKCS8编码中获得公钥
int lbxx_pkcs8_d2i_sm2_pubkey(unsigned char* pucDer, unsigned int puiLen, unsigned char* pucPubkey, unsigned int* uiKeylen)
{
int len = 0;
unsigned char* buf = NULL;
EVP_PKEY* pKey = NULL;
pKey = d2i_PUBKEY(NULL, (const unsigned char**)&pucDer, puiLen);
if (!pKey) {
return 1;
}
len = i2o_ECPublicKey((EC_KEY*)EVP_PKEY_get0(pKey), &buf);
if (*uiKeylen < len) {
return 1;
}
memcpy(pucPubkey, buf, len);
*uiKeylen = len;
return 0;
}
int openssl_sm2() {
int ret = 0;
// 必须为NULL
unsigned char* pucDer = NULL,*priDer=NULL;
unsigned int upucDerlen = 0,upriDerlen=0;
unsigned char buf[128] = { 0 };
unsigned int len = sizeof(buf);
ret = lbxx_pkcs8_i2d_sm2_generate_key(&pucDer, &upucDerlen,&priDer,&upriDerlen);
if (ret != 0) {
printf("call lbxx_pkcs8_i2d_sm2_generate_pubkey() error\n");
return 1;
}
//printf("sm2 prikey: ");
//for (int i = 0; i < upriDerlen; i++) {
// printf("%02x", priDer[i]);
//}
//printf("\n");
//printf("sm2 pubkey: ");
//for (int i = 0; i < upucDerlen; i++) {
// printf("%02x", pucDer[i]);
//}
//printf("\n");
//print_raw_sm2_keys(priDer,upriDerlen,pucDer,upucDerlen);
OPENSSL_free(pucDer);
OPENSSL_free(priDer);
return 0;
}
















