#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;
}

openssl编程之sm2密钥生成_2d