从EVP_PKEY到缓冲区的OpenSSL公钥
我正在编程一个客户端,它通过连接到谷歌服务器的TCP套接字发送消息,参与TLS1.2握手。我正在使用ECDH密钥交换方法 我使用代码生成了客户机密钥对,现在我想将ClientKeyExchange发送到包含公钥的服务器。 为了做到这一点,我首先需要将EVP_PKEY中包含的密钥传输到缓冲区中。我已经为服务器peerkey做了相反的转换,但我还不知道现在该怎么做 我的代码是:从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
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);