Как правильно использовать BIO_meth_new + BIO_get_new_index? - PullRequest
1 голос
/ 23 января 2020

Из документов OpenSSL 1.1.0 :

int BIO_get_new_index(void);
BIO_METHOD *BIO_meth_new(int type, const char *name);

BIO_meth_new() создает новую структуру BIO_METHOD. Ему должно быть дано уникальное целое число type и строка, представляющая его name. Используйте BIO_get_new_index(), чтобы получить значение для type.

Но я не могу найти пример кода, который на самом деле использует BIO_get_new_index()! Даже собственные примеры OpenSSL всегда делают ad-ho c такие вещи, как

// test/sslcorrupttest.c
#define BIO_TYPE_CUSTOM_FILTER  (0x80 | BIO_TYPE_FILTER)
[...]
method_tls_corrupt = BIO_meth_new(BIO_TYPE_CUSTOM_FILTER, "TLS corrupt filter");

(BIO_get_new_index() был добавлен в OpenSSL 2016-08-19 без сообщения о коммите и без тестов. )

В своем собственном коде я использовал BIO_TYPE_FILTER или BIO_TYPE_SOURCE_SINK напрямую, например:

BIO_METHOD *meth1 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth2 = BIO_meth_new(BIO_TYPE_FILTER, "EavesdropBIO");

Я подтвердил, что BIO_meth_new действительно возвращать новый BIO_METHOD* в каждом случае, чтобы не было наивного использования предоставленного type в качестве индекса в глобальной таблице. Пример:

BIO_METHOD *meth3 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth4 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "OtherBIO");
assert(meth3 != meth4);

Однако меня беспокоит, что то, что я делаю, может быть небезопасно (я имею в виду, даже более небезопасно, чем использование OpenSSL для начала;)). Итак, у меня есть два подвопроса:

  • Что может go не так, если я использую BIO_meth_new(BIO_TYPE_SOURCE_SINK, ...)? Другими словами, почему OpenSSL решил добавить BIO_get_new_index() в 1.1.0?

  • Если я должен использовать BIO_get_new_index(), , как я должен использовать это? Он предназначен для | редактирования с существующими макросами BIO_TYPE_, как показано ниже [ниже]? Если я выполняю эти строки несколько раз, разве я не «пропускаю» новые индексы? или BIO_meth_free "освобождает" новые индексы, а также освобождает структуру BIO_METHOD?

    BIO_METHOD *meth1 = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_SOURCE_SINK, "StringBIO");
    BIO_METHOD *meth2 = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_FILTER, "EavesdropBIO");
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...