Случайная сложность в функциях OpenSSL HMAC - PullRequest
2 голосов
/ 12 апреля 2010

Документация 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 и комментарии.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

Документация для функции HMAC_Init_ex() в OpenSSL 0.9.8g гласит:

HMAC_Init_ex() инициализирует или повторно a HMAC_CTX структура для использования функции evp_md и ключ key. Любой может быть NULL, в этом случае существующий будет использоваться повторно.

(Акцент мой). Таким образом, это означает, что вы можете инициализировать HMAC_CTX с помощью HMAC_CTX_Init() один раз, а затем сохранить его для создания нескольких HMAC, если вы не вызываете HMAC_CTX_cleanup() для него, и вы запускаете каждый HMAC с HMAC_Init_ex() .

Так что да, вы должны иметь возможность делать то, что вы хотите, с HMAC_CTX в локальной памяти потока.

0 голосов
/ 12 апреля 2010

Если вы не пытаетесь ограничить свои зависимости, вы можете выбрать реализацию HMAC, которая является автономной и требует, чтобы пользователь явно контролировал все аспекты, о которых OpenSSL, в своей документации, неопределен. Существует много таких простых альтернатив C / C ++, но вы должны выбрать и оценить такую ​​альтернативу.

...