Как сгенерировать открытый ключ ECDHE с помощью OpenSSL?

Я пытаюсь сгенерировать ключ ECDHE с помощью OpenSSL 1.0.2a в Windows и иметь следующий пример кода:

#include <openssl/crypto.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ecdh.h>

int main()
{
    OpenSSL_add_all_algorithms(); ERR_load_crypto_strings();

    EVP_PKEY_CTX* parameters_context = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
    EVP_PKEY* cparameters = nullptr;
    EVP_PKEY* private_key = nullptr;

    if (EVP_PKEY_paramgen_init(parameters_context) != 1) { return 1; }
    if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(parameters_context, NID_sect571k1) != 1) { return 1; }
    if (EVP_PKEY_paramgen(parameters_context, &cparameters) != 1) { return 1; }

    EVP_PKEY_CTX* key_generation_context = EVP_PKEY_CTX_new(cparameters, NULL);

    if (!key_generation_context) { return 1; }
    if (EVP_PKEY_keygen_init(key_generation_context) != 1) { return 1; }        
    if (EVP_PKEY_keygen(key_generation_context, &private_key) != 1) { return 1; }

    BIO* bio = BIO_new(BIO_s_mem());
    PEM_write_bio_PUBKEY(bio, private_key); // <== This is where things go wrong.

    ERR_free_strings(); EVP_cleanup(); CRYPTO_cleanup_all_ex_data();
}

Я протестировал указанный код на других платформах (OSX и Debian Linux, используя gcc), и, похоже, он работает нормально (в разделе valgrind не сообщается об ошибках).

Когда я запускаю его в Windows, он всегда терпит неудачу в этой строке:

PEM_write_bio_PUBKEY(bio, private_key);

И я получаю этот "хороший" экран ошибки:

ошибка кучи

Я не могу понять, что не так: из множества руководств и страниц документации, которые я мог найти, это кажется правильным способом ведения дел.

Прежде чем я потрачу еще один день, пытаясь понять, что не так, я решил, что может быть разумнее спросить сообщество: это правильный способ создания и записи ключа ECDHE в формате PEM с OpenSSL?


person ereOn    schedule 22.03.2015    source источник
comment
Этот код выглядит нормально для меня. Где вы взяли OpenSSL для Windows? Вы сами построили? Если это был Win32 OpenSSL Томаса Хруски, установили ли вы требуемую среду выполнения C?   -  person jww    schedule 23.03.2015
comment
@jww Я построил его сам. Я использовал те же параметры среды выполнения и многопоточной ссылки, что и для моего примера кода. Странно то, что я активно использую OpenSSL в своем проекте, он отлично работает для всего остального (RSA, шифрование AES в режиме GCM, генерация сертификата X509 и т. д.). Это действительно только операции, связанные с ECDHE, которые, кажется, сильно терпят крах.   -  person ereOn    schedule 23.03.2015
comment
В этом случае вы можете подумать о сборке OpenSSL в Windows без включенного ASM. Сделайте это, настроив с помощью no-asm. Существует также параметр enable-ec_nistp_64_gcc_128, влияющий на ECDHE, но вы, вероятно, его не используете. Если вы продолжаете испытывать сбой, вы можете рассмотреть возможность регистрации ошибки (именно так это звучит для меня).   -  person jww    schedule 23.03.2015
comment
@jww Я уже указал no-asm, когда, к сожалению, построил его. Я создаю статическую библиотеку, если это имеет значение. Спасибо за обратную связь и подтверждение моего кода: думаю, у меня не будет другого выбора, кроме как реорганизовать этот образец в еще более автономный архив и сообщить об ошибке.   -  person ereOn    schedule 23.03.2015
comment
Для протокола: я создал ошибку в трекере запросов OpenSSL.   -  person ereOn    schedule 24.03.2015
comment
Отлично, спасибо. Я думаю, что они устали от того, что я регистрирую ошибки. Один из разработчиков сказал мне, что я зарегистрировал примерно 25% ошибок после перехода на новую систему отслеживания ошибок.   -  person jww    schedule 24.03.2015


Ответы (1)


Это действительно была ошибка в OpenSSL.

Из списка рассылки OpenSSL-dev:

Во вторник, 31 марта 2015 г., ****** ******* написал:

>

если (!combine) *pval = NULL;

Я бы предложил удалить две строки выше. Структура должна быть очищена без этого, и приведенная выше строка в любом случае неверна для полей без указателя.

Стив. -- Д-р Стивен Н. Хенсон. Основной разработчик проекта OpenSSL. Доступна коммерческая техническая поддержка. См.: http://www.openssl.org

См. также этот другой вопрос для получения подробной информации.

person ereOn    schedule 01.04.2015