我使用openssl,特別是DH和BIGNUM庫來實現我自己的Diffie Hellman密鑰交換過程,並且我對它的工作方式有一些擔憂。DH_free精確行爲
我一直能找到的文檔主要是here,並沒有我想象的那麼準確。我的問題是關於DH_free是如何工作的。它或多或少是免費的封裝,還是openssl有自己的內部函數來處理內存管理?當DH_free被空指針調用時會發生什麼?
我使用openssl,特別是DH和BIGNUM庫來實現我自己的Diffie Hellman密鑰交換過程,並且我對它的工作方式有一些擔憂。DH_free精確行爲
我一直能找到的文檔主要是here,並沒有我想象的那麼準確。我的問題是關於DH_free是如何工作的。它或多或少是免費的封裝,還是openssl有自己的內部函數來處理內存管理?當DH_free被空指針調用時會發生什麼?
我的問題是關於DH_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);
}
謝謝!這真的很有用,我很感激幫助。 – magid
「的文檔......一直沒有準確像我可能會希望」 - 在嘗試OpenSSL的wiki頁面[迪菲 - 赫爾曼(http://wiki.openssl.org/index.php/Diffie_Hellman)。 – jww
謝謝。第一次發佈一個問題,我欣賞這些問題。 – magid