我使用openssl,特别是DH和BIGNUM库来实现我自己的Diffie Hellman密钥交换过程,我对它是如何工作有一些担忧。
我能够找到的文档(主要是here)并没有像我希望的那样准确。我的问题是关于DH_free如何工作。它或多或少是free的包装器,还是openssl有自己的内部函数来处理内存管理?当在空指针上调用DH_free时会发生什么?
答案 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);
}