Перейти к содержанию

Разработка приложений с ГОСТ через OpenSSL EVP

Приложения под НАЙС.ОС могут использовать российские криптографические алгоритмы через библиотеку OpenSSL. Предпочтительный путь — высокоуровневые интерфейсы EVP (EVP_PKEY, EVP_MD, EVP_CIPHER) вместо обращения к структурам алгоритма или ручной реализации криптографических примитивов.

Подготовить окружение для сборки

rpm -q openssl-devel openssl-gost-engine
pkg-config --modversion openssl
pkg-config --cflags --libs openssl
openssl list -digest-algorithms | grep -i gost

Псевдокод операции подписи

создать контекст EVP
загрузить закрытый ГОСТ-ключ
выбрать нужную хэш-функцию ГОСТ
EVP_DigestSignInit(...)
EVP_DigestSignUpdate(...)
EVP_DigestSignFinal(...) -> бинарная подпись
освободить контексты и очистить секретные буферы

Проверка выполняется тем же классом функций через EVP_DigestVerifyInit/Update/Final и открытый ключ.

Проверка обнаружения хэша в C

Пример использует OpenSSL Provider API и выводит, доступна ли реализация имени md_gost12_256:

#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/provider.h>

int main(void) {
    OSSL_PROVIDER *def = OSSL_PROVIDER_load(NULL, "default");
    OSSL_PROVIDER *gost = OSSL_PROVIDER_load(NULL, "gostprov");
    EVP_MD *md = EVP_MD_fetch(NULL, "md_gost12_256", NULL);
    int available = md != NULL;
    printf("GOST digest: %s\n", available ? "available" : "unavailable");
    EVP_MD_free(md);
    if (gost) OSSL_PROVIDER_unload(gost);
    if (def) OSSL_PROVIDER_unload(def);
    return available ? 0 : 1;
}

Компиляция:

cc -Wall -Wextra -O2 check-gost.c -o check-gost \
  $(pkg-config --cflags --libs openssl)
./check-gost

Этот пример демонстрирует обнаружение алгоритма в Provider, не импортирует закрытые ключи. Для системного ENGINE-профиля алгоритмы доступны через другую цепочку регистрации EVP.

Конфигурация отдельного приложения

Чтобы не менять системные настройки, создайте профиль OPENSSL_CONF из раздела конфигурации и запустите приложение с этим окружением. При использовании systemd переменные задаются в файле unit/drop-in.

Практические рекомендации

  • Не реализуйте ГОСТ вручную, если задача решается через EVP.
  • Храните открытые ключи и сертификаты отдельно от закрытых ключей.
  • Применяйте подходящий контейнер и формат ASN.1.
  • Не передавайте закрытые ключи в логирование, трассировку и сообщения об ошибках.
  • Тестируйте не только успешное шифрование/подпись, но и изменение данных, неправильный ключ, неверный пароль и повреждённый контейнер.
  • При обновлении системных пакетов повторяйте регрессионные тесты.

Далее: контрольные примеры, Engine и Provider, исходники upstream.