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

questionAnswers(1)

yourAnswerToTheQuestion