Документация SSL Анализ
Этот вопрос касается использования подпрограмм HMAC в OpenSSL.
Поскольку документация Openssl является слабым местом в некоторых областях, профилирование показало, что с помощью:
unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
int key_len, const unsigned char *d, int n,
unsigned char *md, unsigned int *md_len);
С здесь , показывает 40% времени моей библиотеки посвящено созданию и уничтожению HMAC_CTX за кадром.
Есть также две дополнительные функции для создания и уничтожения HMAC_CTX явным образом:
HMAC_CTX_init () инициализирует HMAC_CTX
перед первым использованием. Это надо называть.
HMAC_CTX_cleanup () стирает ключ и
другие данные из HMAC_CTX и
освобождает любые связанные ресурсы. Это
должен быть вызван, когда HMAC_CTX нет
больше требуется.
Эти два вызова функций имеют префикс:
Следующие функции могут использоваться, если
сообщение не полностью сохранено
в памяти
Мои данные полностью помещаются в память, поэтому я выбираю функцию HMAC - ту, чья подпись показана выше.
Контекст, как описано в справочной странице, используется с помощью следующих двух функций:
HMAC_Update () может вызываться повторно
с кусками сообщения быть
аутентифицировано (len байтов в данных).
HMAC_Final () помещает сообщение
код аутентификации в md, который должен
есть место для хэш-функции
выход.
Сфера применения
Мое приложение генерирует аутентичную (HMAC, которая также используется одноразовый номер) строку буфера зашифрованного протокола CBC-BF. Код будет взаимодействовать с различными веб-серверами и платформами Windows / Linux в качестве ОС, nginx, Apache и IIS в качестве веб-серверов и фильтров веб-серверов Python / .NET и C ++.
Приведенное выше описание должно прояснить, что библиотека должна быть поточно-безопасной, а потенциально может иметь возобновляемое состояние обработки - то есть, легкие потоки, совместно использующие поток ОС (которые могут оставить локальную память потока вне изображения ).
Вопрос
Как мне избавиться от 40% издержек при каждом вызове в (1) поточно-безопасном / (2) способе возобновления состояния? (2) является необязательным, поскольку все исходные данные присутствуют за один раз, и я могу убедиться, что дайджест создан на месте, не отказываясь от контроля над созданием потока в середине дайджеста. Таким образом,
(1), вероятно, может быть сделано с использованием локальной памяти потока - но как мне повторно использовать CTX? вызовет HMAC_final () сделать CTX многоразовым?
(2) необязательно: в этом случае мне придется создать пул CTX.
(3) как функция HMAC делает это? он создает CTX в области вызова функции и уничтожает его?
Будет полезен Psuedocode и комментарии.