Я просто попытался сгенерировать ключ RSA с помощью:Утечка памяти в OpenSSL функции EVP_PKEY_keygen
#include <openssl/evp.h>
#include <openssl/rsa.h>
int main(void) {
OpenSSL_add_all_algorithms();
EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey = NULL;
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
if (!ctx) {
// error
}
if (EVP_PKEY_keygen_init(ctx) <= 0) {
// error
}
if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0) {
// error
}
if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { // this call seems to leak
// error
}
EVP_PKEY_free(pkey);
EVP_PKEY_CTX_free(ctx);
EVP_cleanup();
return 0;
}
До сих пор я не думаю, что я делаю что-то неправильно. Valgrind жалуется «при использовании при выходе: 416 байт в 6 блоках». Сначала я думал, что я забыл что-то свободное, потом я попробовал
Valgrind OpenSSL genrsa 1024
И я также получил "в использовании на выходе: 416 байт в 6 блоков". Хмм ?! Даже официальные двоичные утечки OpenSSL?
Openssl's FAQ говорит:
"Жестокая" (поточно-небезопасные) Применение глобальной функции очистки:
ERR_free_strings(), EVP_cleanup() и CRYPTO_cleanup_all_ex_data().
Если я выполняю * CRYPTO_cleanup_all_ex_data() *, он не течет. Но, согласно документации OpenSSL, это «жестокий» метод, что бы это ни значило. Дополнительную документацию по этой функции нет.
Есть ли способ очистить его правильно?
Я использую OpenSSL 1.0.1f 6 Jan 2014
Был ОГРОМНАЯ ПРОБЛЕМА БЕЗОПАСНОСТИ с OpenSSL, когда разработчик решил Ыборка «утечки». Некоторые из них предназначены для того, чтобы получить какую-то энтропию к ключу. – opalenzuela
Любые ссылки на эту проблему? – rralf
Да. Я искал его прямо сейчас: https://www.openssl.org/support/faq.html#PROG13 – opalenzuela