#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;// 必须为NULLunsigned 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;
}