OpenSSL函数EVP_PKEY_keygen中的内存泄漏

时间:2014-02-03 16:22:11

标签: c memory-leaks openssl

我只是尝试使用以下方法生成RSA密钥:

#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抱怨“在退出时使用:6个街区中的416个字节”。 首先我想,我忘记了要解放的东西,之后我尝试了

  

valgrind openssl genrsa 1024

我也在“退出时使用:6个块中的416个字节”。 哼?!甚至OpenSSL的官方二进制泄密?

Openssl's FAQ告诉:

  

“残酷”(线程不安全)应用程序全局清理功能:

     

ERR_free_strings(),EVP_cleanup()和CRYPTO_cleanup_all_ex_data()。

如果我执行* CRYPTO_cleanup_all_ex_data()*它不会泄漏。但根据OpenSSL文档,它是一种“残酷”的方法,无论这意味着什么。没有关于此功能的进一步文档。

有没有办法正确清理它?

我正在使用OpenSSL 1.0.1f 2014年1月6日

1 个答案:

答案 0 :(得分: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)();
    }