【问题标题】:OpenSSL public key from EVP_PKEY to buffer从 EVP_PKEY 到缓冲区的 OpenSSL 公钥
【发布时间】:2019-11-07 10:13:04
【问题描述】:

我正在编写一个客户端,该客户端通过连接到 Google 服务器的 TCP 套接字发送消息来参与 TLS 1.2 握手。我正在使用 ECDH 密钥交换方法。

我使用this 代码生成了客户端密钥对,现在我想将 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() 函数,但它也不起作用。 docs

【问题讨论】:

    标签: openssl tls1.2 public-key-exchange


    【解决方案1】:

    您需要从 EVP_PKEY 获取 EC_KEY 而不是 EC_KEY_new_by_curve_name 并且 EVP_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;
        } 
    }
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,这对我有用:

      std::size_t len = 32;
      uint8_t* pubkey = new uint8_t[len];
      
      EVP_PKEY_get_raw_public_key(pkey, pubkey, &len);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 2014-09-11
        • 2017-04-29
        相关资源
        最近更新 更多