DH_free精确的行为

时间:2014-06-16 22:46:57

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

我使用openssl,特别是DH和BIGNUM库来实现我自己的Diffie Hellman密钥交换过程,我对它是如何工作有一些担忧。

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

1 个答案:

答案 0 :(得分:1)

  

我的问题是关于DH_free的工作原理。它或多或少是free的包装器,还是openssl有自己的内部函数来处理内存管理?当在空指针上调用DH_free时会发生什么?

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

$ 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);
}