Я пытаюсь сгенерировать ключ 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);
И я получаю этот «хороший» экран ошибки:
Я на потери выясняя что не так: из многих учебников и страниц документации, которые я мог найти, это, кажется, правильный способ делать вещи.
Прежде чем я проведу еще один день, пытаясь выяснить, что случилось, я подумал, что разумнее спросить сообщество: - это правильный способ генерации и записи ключа ECDHE в виде PEM-формата с OpenSSL?
Этот код выглядит хорошо для меня. Где вы получили OpenSSL для Windows? Вы сами его построили? Если это был Win32 OpenSSL Томаса Хруски, вы установили требуемое время выполнения C? – jww
@jww Я сам построил. Я использовал те же настройки времени выполнения и многопоточных ссылок, что и для моего образца кода. Странно, что я активно использую OpenSSL в своем проекте, он отлично работает для всего остального (RSA, шифрование AES в режиме GCM, генерация сертификата X509 и т. Д.). Это действительно просто связанные с ECDHE операции, которые, похоже, сильно падают. – ereOn
В этом случае вы можете рассмотреть возможность создания OpenSSL для Windows без включенной ASM. Сделайте это, настроив с помощью 'no-asm'. Существует также опция enable-ec_nistp_64_gcc_128', которая влияет на ECDHE, но вы, вероятно, не используете ее. Если вы по-прежнему испытываете крах, вы можете рассмотреть вопрос об ошибке (это то, что мне кажется). – jww