簡體   English   中英

OpenSSL 公鑰從 EVP_PKEY 到緩沖區

[英]OpenSSL public key from EVP_PKEY to buffer

我正在編寫一個通過連接到 Google 服務器的 TCP 套接字發送消息來參與 TLS 1.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_PKEY_get_raw_public_key() function 但它也不起作用。 文檔

您需要從 EVP_PKEY 獲取 EC_KEY 而不是EC_KEY_new_by_curve_nameEVP_PKEY_set1_EC_KEY使用EVP_PKEY_get0_EC_KEY

EC_KEY_key2buf為您分配一個緩沖區並且沒有使用預分配的緩沖區,這個分配的緩沖區必須使用OPENSSL_free釋放。

void get_buffer(EVP_PKEY * pkey, unsigned char ** client_pub_key, int *pkeyLen) {
    EC_KEY *tempEcKey = NULL;

    tempEcKey = EVP_PKEY_get0_EC_KEY(pkey);
    if(tempEcKey == NULL) {
        handleErrors("Getting EC_KEY from EVP_PKEY");
        return;
    }

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

    *pkeyLen = EC_KEY_key2buf(tempEcKey, form, client_pub_key, NULL);
    if(*pkeyLen == 0){
       handleErrors("Creating buffer from key");
       return;
    } 
}

我遇到了同樣的問題,這對我有用:

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

EVP_PKEY_get_raw_public_key(pkey, pubkey, &len);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM