2014-02-03 2 views
3

Я просто попытался сгенерировать ключ 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

+0

Был ОГРОМНАЯ ПРОБЛЕМА БЕЗОПАСНОСТИ с OpenSSL, когда разработчик решил Ыборка «утечки». Некоторые из них предназначены для того, чтобы получить какую-то энтропию к ключу. – opalenzuela

+1

Любые ссылки на эту проблему? – rralf

+1

Да. Я искал его прямо сейчас: https://www.openssl.org/support/faq.html#PROG13 – opalenzuela

ответ

1

Справку из OpenSSL отвечает на вопрос (спасибо @opalenzuela):

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

Имея более глубокий взгляд в источник OpenSSL показывает:

/* Release all "ex_data" state to prevent memory leaks. This can't be made 
* thread-safe without overhauling a lot of stuff, and shouldn't really be 
* called under potential race-conditions anyway (it's for program shutdown 
* after all). */ 
void CRYPTO_cleanup_all_ex_data(void) 
    { 
    IMPL_CHECK 
    EX_IMPL(cleanup)(); 
    } 
+0

Во всех случаях они не являются * безвредными. Поскольку OpenSSL загружается и выгружается в таких средах, как Java и .Net, просочившаяся память становится неограниченной. – jww

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