2015-03-22 4 views
1

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

#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); 

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

heap error

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

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

+0

Этот код выглядит хорошо для меня. Где вы получили OpenSSL для Windows? Вы сами его построили? Если это был Win32 OpenSSL Томаса Хруски, вы установили требуемое время выполнения C? – jww

+0

@jww Я сам построил. Я использовал те же настройки времени выполнения и многопоточных ссылок, что и для моего образца кода. Странно, что я активно использую OpenSSL в своем проекте, он отлично работает для всего остального (RSA, шифрование AES в режиме GCM, генерация сертификата X509 и т. Д.). Это действительно просто связанные с ECDHE операции, которые, похоже, сильно падают. – ereOn

+0

В этом случае вы можете рассмотреть возможность создания OpenSSL для Windows без включенной ASM. Сделайте это, настроив с помощью 'no-asm'. Существует также опция enable-ec_nistp_64_gcc_128', которая влияет на ECDHE, но вы, вероятно, не используете ее. Если вы по-прежнему испытываете крах, вы можете рассмотреть вопрос об ошибке (это то, что мне кажется). – jww

ответ

0

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

От OpenSSL-dev mailing-list:

вт, 31 мар 2015, ****** ******* писал:

>

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

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

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

Смотрите также this other question для деталей.

Смежные вопросы