c++ - DH_free 精确行为

标签 c++ memory-management openssl diffie-hellman

我正在使用 openssl,特别是 DH 和 BIGNUM 库,来实现我自己的 Diffie Hellman key 交换过程,我对它的工作方式有些担忧。

我能找到的文档,主要是 here , 并没有我希望的那么准确。我的问题是关于 DH_free 是如何工作的。它或多或少是免费的包装器,还是 openssl 有自己的内部函数来处理内存管理?在空指针上调用 DH_free 时会发生什么?

最佳答案

My question is about how DH_free works. Is it more or less a wrapper on free, or does openssl have its own internal functions that handle memory management? What happens when DH_free gets called on a null pointer?

当所有其他方法都失败时,请转到源头。

$ cd openssl-1.0.1h
$ grep -R DH_free * | grep void
crypto/dh/dh.h:void DH_free(DH *dh);
crypto/dh/dh_lib.c:void DH_free(DH *r)
doc/crypto/dh.pod: void DH_free(DH *dh);
doc/crypto/DH_new.pod: void DH_free(DH *dh);

实现位于dh_lib.c。下面是清理后的版本(一些 #defines 被删除,源代码被格式化):

void DH_free(DH *r)
{
    int i;
    if(r == NULL) return;

    i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_DH);
    if (i > 0) return;

    if (r->meth->finish)
        r->meth->finish(r);

#ifndef OPENSSL_NO_ENGINE
    if (r->engine)
        ENGINE_finish(r->engine);
#endif

    CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, r, &r->ex_data);

    if (r->p != NULL) BN_clear_free(r->p);
    if (r->g != NULL) BN_clear_free(r->g);
    if (r->q != NULL) BN_clear_free(r->q);
    if (r->j != NULL) BN_clear_free(r->j);
    if (r->seed) OPENSSL_free(r->seed);
    if (r->counter != NULL) BN_clear_free(r->counter);
    if (r->pub_key != NULL) BN_clear_free(r->pub_key);
    if (r->priv_key != NULL) BN_clear_free(r->priv_key);
    OPENSSL_free(r);
}

关于c++ - DH_free 精确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253343/

相关文章:

C++ bad_cast 异常将 *this 转换为派生模板类

c# - 连接对象的字符串表示的好方法?

memory-management - 为什么要在网络应用程序中进行垃圾收集?

c - 从 OpenSSL C API 访问客户端写入 key 和服务器写入 key

在 C 中使用 AES-256 和 openssl 计算 CBC-MAC

c++ - 检测大写锁定按键

c++ - 异步事件循环设计和问题

c++ - 一个接一个地运行动画的方法

Java:用ArrayList写pojo最高效的方法

c - 是否可以使用 SSL_write 和 SSL_read 发送结构?