从EVP_PKEY到缓冲区的OpenSSL公钥

从EVP_PKEY到缓冲区的OpenSSL公钥,openssl,tls1.2,public-key-exchange,Openssl,Tls1.2,Public Key Exchange,我正在编程一个客户端,它通过连接到谷歌服务器的TCP套接字发送消息,参与TLS1.2握手。我正在使用ECDH密钥交换方法 我使用代码生成了客户机密钥对,现在我想将ClientKeyExchange发送到包含公钥的服务器。 为了做到这一点,我首先需要将EVP_PKEY中包含的密钥传输到缓冲区中。我已经为服务器peerkey做了相反的转换,但我还不知道现在该怎么做 我的代码是: void get_buffer(EVP_PKEY * pkey, unsigned char * client_pub_k

我正在编程一个客户端,它通过连接到谷歌服务器的TCP套接字发送消息,参与TLS1.2握手。我正在使用ECDH密钥交换方法

我使用代码生成了客户机密钥对,现在我想将ClientKeyExchange发送到包含公钥的服务器。 为了做到这一点,我首先需要将EVP_PKEY中包含的密钥传输到缓冲区中。我已经为服务器peerkey做了相反的转换,但我还不知道现在该怎么做

我的代码是:

void get_buffer(EVP_PKEY * pkey, unsigned char * client_pub_key, int pkeyLen) {

   EC_KEY *tempEcKey = NULL;

   tempEcKey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);

   if(0 == (EVP_PKEY_set1_EC_KEY(pkey, tempEcKey))){
      handleErrors();
   }

   const EC_GROUP * group = EC_KEY_get0_group(tempEcKey);
   point_conversion_form_t form = EC_GROUP_get_point_conversion_form(group);

   //write in the buffer
   pkeyLen = EC_KEY_key2buf(tempEcKey, form, *client_pub_key, NULL);
   if(pkeyLen == 0){
      handleErrors();
   } 
}
调用EVP_PKEY_set1_EC_KEY(PKEY,tempEcKey)时,该代码会导致分段错误

我做错了什么


我还研究了
EVP\u PKEY\u get\u raw\u public\u key()
函数,但它也不起作用

您需要从EVP_PKEY获取EC_密钥,而不是通过曲线名称获取EC_密钥新密钥,EVP_PKEY_set1_EC_密钥使用EVP_PKEY_get0_EC_密钥

EC_KEY_key2buf为您分配一个缓冲区,并且不使用预先分配的缓冲区,必须使用OPENSSL_free释放此分配的缓冲区


您需要从EVP_PKEY获取EC_密钥,而不是通过曲线名称获取EC_密钥和EVP_PKEY_set1_EC_密钥使用EVP_PKEY_get0_EC_密钥

EC_KEY_key2buf为您分配一个缓冲区,并且不使用预先分配的缓冲区,必须使用OPENSSL_free释放此分配的缓冲区


我遇到了同样的问题,这对我来说很有效:

std::size_t len = 32;
uint8_t* pubkey = new uint8_t[len];

EVP_PKEY_get_raw_public_key(pkey, pubkey, &len);

我遇到了同样的问题,这对我来说很有效:

std::size_t len = 32;
uint8_t* pubkey = new uint8_t[len];

EVP_PKEY_get_raw_public_key(pkey, pubkey, &len);