Я пытаюсь сгенерировать ключ 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?
no-asm
. Существует также параметрenable-ec_nistp_64_gcc_128
, влияющий на ECDHE, но вы, вероятно, его не используете. Если вы продолжаете испытывать сбой, вы можете рассмотреть возможность регистрации ошибки (именно так это звучит для меня). - person jww   schedule 23.03.2015no-asm
, когда, к сожалению, построил его. Я создаю статическую библиотеку, если это имеет значение. Спасибо за обратную связь и подтверждение моего кода: думаю, у меня не будет другого выбора, кроме как реорганизовать этот образец в еще более автономный архив и сообщить об ошибке. - person ereOn   schedule 23.03.2015