我只是尝试使用以下方法生成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的官方二进制泄密?
“残酷”(线程不安全)应用程序全局清理功能:
ERR_free_strings(),EVP_cleanup()和CRYPTO_cleanup_all_ex_data()。
如果我执行* CRYPTO_cleanup_all_ex_data()*它不会泄漏。但根据OpenSSL文档,它是一种“残酷”的方法,无论这意味着什么。没有关于此功能的进一步文档。
有没有办法正确清理它?
我正在使用OpenSSL 1.0.1f 2014年1月6日
答案 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)();
}