Speicherverlust in der OpenSSL-Funktion EVP_PKEY_keygen

Ich habe gerade versucht, einen RSA-Schlüssel zu generieren:

#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;
}

Bisher glaube ich nicht, dass ich etwas falsch mache. Valgrind beschwert sich "in Benutzung am Ausgang: 416 Bytes in 6 Blöcken". Zuerst habe ich gedacht, ich habe etwas vergessen, um zu befreien, danach habe ich versucht

valgrind openssl genrsa 1024

Und ich habe auch "in Verwendung am Ausgang: 416 Bytes in 6 Blöcken". Summen?! Sogar die offiziellen Binärlecks von OpenSSL?

Openssl's FAQ erzählt:

"Brutale" (thread-unsichere) globale Bereinigungsfunktionen für Anwendungen:

ERR_free_strings (), EVP_cleanup () und CRYPTO_cleanup_all_ex_data ().

Wenn ich * CRYPTO_cleanup_all_ex_data () * ausführe, tritt kein Leck auf. Laut OpenSSL-Dokumentation handelt es sich jedoch um eine "brutale" Methode, was auch immer das bedeutet. Es gibt keine weitere Dokumentation zu dieser Funktion.

Gibt es eine Möglichkeit, es richtig aufzuräumen?

Ich benutze OpenSSL 1.0.1f 6. Januar 2014

Antworten auf die Frage(1)

Ihre Antwort auf die Frage