Открытый ключ OpenSSL из EVP_PKEY в буфер - PullRequest
0 голосов
/ 07 ноября 2019

Я программирую клиента, который участвует в рукопожатии TLS 1.2, отправляя сообщения через TCP-сокет, подключенный к серверу Google. Я использую метод обмена ключами 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(), но она тоже не работает. документы

1 Ответ

0 голосов
/ 08 ноября 2019

Вам нужно получить EC_KEY из EVP_PKEY вместо EC_KEY_new_by_curve_name и EVP_PKEY_set1_EC_KEY использовать EVP_PKEY_get0_EC_KEY _ * 100 * * * * * * * * * * * ** выделяет буфер для вас и не использует предварительно выделенный буфер, этот выделенный буфер должен быть освобожден с использованием 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;
    } 
}
...