Vazamento de memória na função OpenSSL EVP_PKEY_keygen
Eu apenas tentei gerar uma chave RSA usando:
#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;
}
Até agora, acho que não estou fazendo nada de errado. Valgrind reclama "em uso na saída: 416 bytes em 6 blocos". Primeiro pensei, esqueci algo de graça, depois tentei
valgrind openssl genrsa 1024
E eu também "usei na saída: 416 bytes em 6 blocos". Cantarolar?! Até os vazamentos binários oficiais do OpenSSL?
Perguntas frequentes do Openssl diz:
Funções de limpeza global de aplicativos "brutais" (sem proteção de thread):
ERR_free_strings (), EVP_cleanup () e CRYPTO_cleanup_all_ex_data ().
Se eu executar * CRYPTO_cleanup_all_ex_data () *, ele não vaza. Mas, de acordo com a documentação do OpenSSL, é um método "brutal", o que quer que isso signifique. Não há documentação adicional sobre esta função.
Existe alguma maneira de limpá-lo corretamente?
Estou usando o OpenSSL 1.0.1f 6 de janeiro de 2014