Точное поведение DH_free

#c #memory-management #openssl #diffie-hellman

#c #управление памятью #openssl #диффи-Хеллман

Вопрос:

Я использую openssl, в частности библиотеки DH и BIGNUM, для реализации моего собственного процесса обмена ключами Диффи Хеллмана, и у меня есть некоторые опасения по поводу того, как это работает.

Документация, которую я смог найти, в основном здесь, оказалась не такой точной, как я мог надеяться. Мой вопрос о том, как работает DH_free. Является ли это более или менее оболочкой free, или openssl имеет свои собственные внутренние функции, которые обрабатывают управление памятью? Что происходит, когда DH_free вызывается для нулевого указателя?

Комментарии:

1. «Документация … не было таким точным, как я мог надеяться » — Попробуйте вики-страницу OpenSSL на Диффи-Хеллман .

2. Спасибо. Впервые публикую вопрос, и я ценю предупреждение.

Ответ №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(amp;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, amp;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);
}
  

Комментарии:

1. Спасибо! Это действительно полезно, я ценю помощь.