Bee2evp: плагин для OpenSSL

Почти все криптографические алгоритмы и протоколы, стандартизированные в нашей стране, реализованы в библиотеке Bee2. Это общедоступная библиотека, опубликованная на платформе GitHub два года назад. За прошедшие два года Bee2 стала интерпретироваться криптографической общественностью как эталонная программная реализация национальной криптографии.

Но криптографическая инфраструктура нашей страны не исчерпывается алгоритмами и протоколами. Имеется довольно большой массив, так называемых, форматных стандартов: СТБ 34.101.17 (запросы на выпуск сертификата), СТБ 34.101.19 (сертификаты открытого ключа, списки отозванных сертификатов), СТБ 34.101.23 (CMS), СТБ 34.101.26 (OCSP), СТБ 34.101.67 (атрибутные сертификаты).

Управление форматами – это довольно трудная задача. Трудная из-за многообразия форматов и их внутренней сложности. Сложность определяется как большим количеством форматных полей, так и большим числом вариантов их комбинирования. Целевые форматы описываются на языке АСН.1. Этот язык позволяет задать структуру полей, типы полей, атрибуты полей. Варианты комбинирования появляются из-за того, что поля могут описываться различными способами (идет речь о конструкции CHOICE) и что поля могут опускаться (конструкция OPTIONAL).

Известный криптографический тезис гласит: "сложность – главный враг безопасности". Из-за сложности форматов постоянно возникают уязвимости в различных криптографических продуктах. Точной статистики у нас нет, но вполне здраво можно сказать, что количество форматных уязвимостей значительно превышает уязвимости, связанные с ошибками в реализациях криптоалгоритмов.

Трудности поддержки форматов было решено преодолеть, используя уже готовые программные библиотеки. Нас интересовали те их них, которые удовлетворяют следующим критериям:

  • открытость (библиотека должна распространяться свободно);
  • полнота (библиотека должна поддерживать основные форматы);
  • стабильность (за библиотекой должен стоять коллектив разработчиков, должны быть налажены процессы выпуска новых версий, устранения недостатков и т.д.);
  • переносимость (библиотека может использоваться на разных аппаратных платформах в разных операционных средах);
  • универсальность (должны быть предусмотрены интерфейсы подключения внешних криптографических алгоримтов);
  • популярность (библиотека должна использоваться в большом количестве разнотипных криптографических продуктах).

Требования достаточно жесткие. На сегодняшний день им в полной мере удовлетворяет лишь одна библиотека – OpenSSL. Разработка ОреnSSL началась в 1998 году. Из-за сверхлиберальной лицензии библиотека получила огромную популярность. Она является неотъемлемой частью дистрибутивов Linux, используется в таких продуктах, как Apache HTTP Server, OpenVPN, OpenCA, OpenSC и многих многих других. Как пишут разработчики, "очень даже может быть, что в вашем телевизоре, автомобиле или холодильнике уже используется OpenSSL".

OpenSSL предоставляет достаточно подробный программный интерфейс EVP, через который библиотеку можно связать с внешними реализациями криптоалгоритмов. Внешние реализации оформляются в виде специального плагина, который в OpenSSL называется engine. Плагин может поддерживать широкий спектр алгоритмов: симметричное шифрование, хэширование, имитозащита, ЭЦП, построение ключей по паролям, шифрование на открытом ключе.

Реализации алгоритмов сопровождаются функциями управления их долговременными параметрами и ключами, в том числе функциями работы с форматами. Реализовав низкоуровневый плагин, правильно описав базовые криптоалгоритмы, мы сразу получаем доступ к сложным высокоуровневым командам, в частности, к командам управления криптографическими форматами. С помощью OpenSSL удается поддержать форматы всех объявленных выше стандартов, кроме СТБ 34.101.67. 

Библиотека Bee2evp – это плагин OpenSSL, который реализует EVP-интерфейсы поверх функций Bee2. Библиотека обеспечивает унифицированный вызов следующих криптографических алгоритмов и протоколов:

  • алгоритмы шифрования (СТБ 34.101.31);
  • алгоритмы имитозащиты (СТБ 34.101.31, СТБ 34.101.47);
  • алгоритмы одновременного шифрования и имитозащиты (СТБ 34.101.31);
  • алгоритмы хэширования (СТБ 34.101.31, СТБ 34.101.77);
  • алгоритм преобразования ключа (СТБ 34.101.31);
  • алгоритм проверки параметров эллиптической кривой (СТБ 34.101.45);
  • алгоритм генерации личного и открытого ключей (СТБ 34.101.45);
  • алгоритм проверки открытого ключа (СТБ 34.101.45);
  • алгоритмы электронной цифровой подписи (СТБ 34.101.45);
  • алгоритмы транспорта ключа (СТБ 34.101.45);
  • алгоритм построения ключа по паролю (СТБ 34.101.45).

Дополнительно Bee2evp косвенно поддерживает алгоритм построения ключа и протокол Диффи – Хеллмана, заданные в СТБ 34.101.66.

В плагине реализованы функции управления низкоуровневыми форматами данных, определенных в СТБ 34.101.45. С помощью этих функций в OpenSSL реализуется управление высокоуровневыми форматами следующих объектов:

  • запрос на выпуск сертификата (СТБ 34.101.17);
  • сертификат открытого ключа (СТБ 34.101.19);
  • список отозванных сертификатов (СТБ 34.101.19);
  • запрос и ответ OCSP (СТБ 34.101.26);
  • хэшированные данные CMS (СТБ 34.101.23);
  • шифрованные данные CMS (СТБ 34.101.23);
  • подписанные данные CMS (СТБ 34.101.23);
  • конвертованные данные CMS (СТБ 34.101.23).

Управление высокоуровневыми форматами реализуется с помощью команд OpenSSL.

При разработке плагина были предприняты шаги, снижающие зависимость от потенциальных уязвимостей OpenSSL и "придвигающие" криптографическую границу как можно ближе к Bee2. Во-первых, критические объекты алгоритмов и протоколов размещаются в блобах Bee2 – зашищенных фрагментах памяти. Во-вторых, для генерации ключей используется не штатный генератор OpenSSL, а генератор псевдослучайных чисел, реализованный в Bee2.

Разрабатывая плагин, мы старались поддержать даже самые мелкие подробности форматов криптографических данных. Так, например, плагин поддерживает явное описание эллиптической кривой СТБ 34.101.45, вплоть до указания опционального кофактора ее группы точек. Для регулирования способа описания кривой введены специальные форматные флаги, которые можно использовать в командном интерфейсе OpenSSL. Флаги регулируют не только форматы, но и например переключение на детерминированный режим выработки ЭЦП Bign (СТБ 34.101.45).

При разработке мы столкнулись с трудностями встраивания в OpenSSL алгоритмов bign-with-hspec. Это алгоритмы Bign с произвольной функцией хэширования. Идентификатор нужной хэш-функции задается в специальной структуре данных, уточняющей параметры Bign. Оказалось, что OpenSSL не имел достаточно полных инструментов управления этими параметрами. Мы обратились в команду OpenSSL с предложениями по усилению инструментов. Наши предложения были приняты, в исходные тексты OpenSSL были внесены изменения. В итоге, алгоритмы bign-with-hspec могут работать в связке с произвольной хэш-функцией подходящей размерности.

По команде

openssl engine -c -t bee2evp

можно получить перечень объектов, реализованных в плагине:

(bee2evp) Bee2evp Engine [belt + bign + bash]
[belt-ecb128, belt-ecb192, belt-ecb256, belt-cbc128, belt-cbc192, belt-cbc256, belt-cfb128, belt-cfb192, belt-cfb256, belt-ctr128, belt-ctr192, belt-ctr256, belt-dwp128, belt-dwp192, belt-dwp256, belt-kwp128, belt-kwp192, belt-kwp256, bash256, bash384, bash512, belt-hash, bign-with-hspec, bign-with-hbelt, bign-with-bash256, bign-with-bash384, bign-with-bash512, bign-keytransport, bign-curve256v1, bign-curve384v1, bign-curve512v1, bign-primefield, bign-pubkey, belt-mac128, belt-mac192, belt-mac256, belt-hmac]

Этими объектами являются: алгоритмы (например, belt-ecb128 – алгоритм шифрования в режиме простой замены), долговременные параметры (например, эллиптическая кривая bign-curve384v1), ключи (bign-pubkey), вспомогательные алгебраические структуры (bign-primefield).

Новости
07.03.2024
План семинара весна 2024
12.02.2024
Единый день голосования
24.10.2023
II Международная научная конференция
26.05.2023
XХVIII научно-практическая конференция
28.04.2023
TIBO 2023
02.01.2023
Программный комплекс ЭАДП
27.12.2022
С Новым годом!
21.11.2022
Программный инструментарий
13.09.2022
XIII Международная научная конференция