| crypto | ||
| .gitignore | ||
| .gitmodules | ||
| .travis.yml | ||
| gost-test-main.c | ||
| gost-test.h | ||
| gost28147_basic.c | ||
| gost28147_int.h | ||
| gost28147_modes.c | ||
| gost28147_param.h | ||
| gosthash94_generic.c | ||
| kuznyechik_generic.c | ||
| kuztable.h | ||
| LICENSE | ||
| magma_generic.c | ||
| Makefile | ||
| README.md | ||
| streebog_generic.c | ||
| testmgr.c | ||
| testmgr.h | ||
linux-crypto (GOST crypto modules for Linux kernel)
Набор внешних (out-of-tree) модулей ядра Linux, добавляющих/расширяющих поддержку российских криптоалгоритмов семейства GOST через стандартный Linux Kernel Crypto API.
Репозиторий содержит модули (как .ko), которые регистрируют алгоритмы в /proc/crypto и становятся доступными:
- ядру (IPsec, dm-crypt, fscrypt и т.п. — если они умеют/сконфигурированы использовать эти алгоритмы),
- userspace через AF_ALG (
/sys/kernel/debug/crypto/AF_ALG) и инструменты, работающие с kernel crypto API (например, через libkcapi).
Важно: это именно модули ядра. Они должны быть собраны строго под вашу версию ядра.
Что внутри
Модули (файлы .ko)
Собираются следующие модули:
gost28147_generic.ko— блочный шифр GOST 28147-89 (в т.ч. варианты параметров/таблиц) + режимы и MAC (имитовставка).gosthash94_generic.ko— хэш GOST R 34.11-94, также используется для HMAC(gosthash94).magma_generic.ko— шифр GOST R 34.12-2015 “Magma” (RFC 7801).kuznyechik_generic.ko— шифр GOST R 34.12-2015 “Kuznyechik” (RFC 7801).streebog_generic.ko— хэш GOST R 34.11-2012 (Streebog 256/512). Сборка опциональна (см.CONFIG_CRYPTO_STREEBOG).gost-test.ko— тестовый модуль, прогоняющий набор self-test’ов через crypto API и печатающий результат в лог ядра.
Реализуемые алгоритмы (в терминах Crypto API)
Кратко (по смыслу):
- GOST 28147 cipher + режимы и MAC (imitovstavka)
- GOST R 34.11-94 digest + HMAC
- GOST R 34.12-2015: Magma и Kuznyechik + CMAC
- Streebog 256/512 (GOST R 34.11-2012) — при включенной сборке streebog-модуля
Совместимость и важные замечания
-
Сборка под конкретное ядро
- Модули должны быть собраны под точно ту версию ядра, в которую вы их устанавливаете.
- Если вы обновили ядро — нужно пересобрать пакет/модули.
-
Возможные пересечения с алгоритмами, уже встроенными в ядро
- Некоторые дистрибутивы/ядра уже включают часть GOST-алгоритмов.
- В таком случае возможны конфликты “такой алгоритм уже зарегистрирован”, либо приоритеты driver_name/priority.
- Если у вас уже есть streebog в ядре, часто разумно не собирать
streebog_generic.ko(см. ниже проCONFIG_CRYPTO_STREEBOG).
-
Secure Boot / запрет неподписанных модулей
- Если ядро настроено запрещать неподписанные модули, потребуется подписывать
.koвашим ключом (или отключать enforcement в рамках вашей политики безопасности).
- Если ядро настроено запрещать неподписанные модули, потребуется подписывать
Установка из RPM-пакета (рекомендуется)
Если в поставке есть уже собранный под ядро RPM для НАЙС.ОС, типовой сценарий:
sudo rpm -ivh linux-crypto-gost-*.rpm
# либо (если в вашей системе принято):
sudo dnf install ./linux-crypto-gost-*.rpm
# или tdnf/yum — в зависимости от окружения
После установки (и выполнения depmod) можно грузить модули через modprobe (см. ниже).
Сборка из исходников (ручная)
Зависимости (минимум)
Нужно:
-
компилятор и базовые инструменты сборки:
gcc,make,binutils -
заголовки/сборочное дерево ядра для вашей версии ядра:
- пакет вида
kernel-devel/linux-headers(название зависит от сборки НАЙС.ОС)
- пакет вида
-
утилиты модулей:
kmod(дляmodprobe,insmod,depmod)
Для этого установите пакет build-essential.
sudo dnf install build-essential
# или tdnf — в зависимости от окружения
Проверка, что дерево сборки ядра на месте:
uname -r
ls -l /lib/modules/$(uname -r)/build
Если каталог build отсутствует — установите пакет kernel-devel/linux-headers для текущего ядра.
Сборка
Клонируйте/распакуйте исходники и выполните:
make -j"$(nproc)"
По умолчанию KSRC берётся как:
KSRC ?= /lib/modules/$(uname -r)/build
Если вы собираете не под запущенное ядро, укажите KSRC явно:
make -j"$(nproc)" KSRC=/lib/modules/<kernel-version>/build
Отключение сборки streebog (опционально)
Если streebog уже есть в вашем ядре (по умолчанию в НАЙС.ОС от есть) или возникают проблемы совместимости, отключите сборку streebog_generic.ko:
make -j"$(nproc)" CONFIG_CRYPTO_STREEBOG=n
Установка (ручная)
Установка выполняется через стандартную цель modules_install ядра:
sudo make modules_install
sudo depmod -a
Если вы собираете под другое ядро, задайте KSRC так же, как при сборке:
sudo make KSRC=/lib/modules/<kernel-version>/build modules_install
sudo depmod -a <kernel-version>
Где окажутся .ko:
- обычно это что-то вроде
/lib/modules/<kernel-version>/extra/(для внешних модулей).
Загрузка модулей
Разовая загрузка (в текущей сессии)
sudo modprobe gost28147_generic
sudo modprobe gosthash94_generic
sudo modprobe magma_generic
sudo modprobe kuznyechik_generic
# streebog — только если вы его собирали/устанавливали
sudo modprobe streebog_generic
Проверка, что модули в памяти:
lsmod | egrep 'gost|magma|kuz|streebog'
Автозагрузка (чтобы модули грузились постоянно)
Есть два подхода, можно использовать любой.
Вариант A (простой и надёжный): modules-load.d
Создайте файл /etc/modules-load.d/linux-crypto-gost.conf:
# GOST crypto modules
gost28147_generic
gosthash94_generic
magma_generic
kuznyechik_generic
# streebog_generic
После перезагрузки systemd-modules-load поднимет модули автоматически.
Проверка:
systemctl status systemd-modules-load
lsmod | egrep 'gost|magma|kuz|streebog'
Вариант B (autoload “по требованию”)
Часть алгоритмов имеет MODULE_ALIAS_CRYPTO(...), поэтому ядро/cryptomgr могут подтягивать модуль при запросе алгоритма (после depmod).
Но если вы хотите гарантированно держать их загруженными всегда — используйте Вариант A.
Проверка работоспособности
1) Проверка регистрации алгоритмов
После загрузки модулей:
grep -iE 'gost|magma|kuznyechik|streebog' /proc/crypto | head -n 200
Вы должны увидеть записи, содержащие имена вроде:
gosthash94magma,kuznyechikstreebog256,streebog512(если включено)- режимы/обёртки (например,
ecb(...),cfb(...),cnt(...),cmac(...),hmac(...))
2) Прогон self-test через gost-test.ko
Загрузите тестовый модуль:
sudo modprobe gost-test
Он запускает набор тестов и пишет результат в лог ядра.
Смотрите лог:
dmesg | tail -n 200
# или
journalctl -k -n 200 --no-pager
Ожидаемое поведение:
- в логе появится строка о старте тестов (например “Starting GOST crypto tests”)
- при проблемах будут ошибки регистрации/тестов (и модуль может вернуться с ошибкой)
Удалить тестовый модуль можно так:
sudo rmmod gost-test
3) (Опционально) Userspace-тесты через libkcapi/kcapi-tools
Если в системе есть kcapi-tools (или аналоги), можно проверить шифрование/хэширование через kernel crypto API.
Команды зависят от того, какие утилиты доступны в вашей поставке НАЙС.ОС, поэтому этот шаг опционален.
Обновление initramfs (если нужно)
Обычно для этих модулей это не требуется. Но если вы хотите, чтобы они были доступны очень рано (например, до монтирования root при специфических сценариях), пересоберите initramfs:
# пример для dracut-подобных систем:
sudo dracut -f
Удаление
Если установлено RPM-пакетом
sudo rpm -e linux-crypto-gost
sudo depmod -a
Если ставили вручную
- Выгрузите модули:
sudo rmmod gost-test 2>/dev/null || true
sudo rmmod streebog_generic 2>/dev/null || true
sudo rmmod kuznyechik_generic magma_generic gosthash94_generic gost28147_generic 2>/dev/null || true
- Найдите установленные
.koи удалите их:
moddir="/lib/modules/$(uname -r)"
sudo find "$moddir" -name '*gost*ko' -o -name '*magma*ko' -o -name '*kuz*ko' -o -name '*streebog*ko'
# затем аккуратно удалите найденные файлы (только те, которые относятся к этому пакету)
- Обновите зависимости модулей:
sudo depmod -a
Типичные проблемы и решения
Ошибка “Invalid module format”
- Почти всегда означает, что модуль собран не под то ядро.
- Решение: пересобрать под текущий
uname -rи установить заново.
Нет /lib/modules/$(uname -r)/build
- Не установлены заголовки/дерево сборки ядра.
- Решение: поставить пакет
kernel-devel/linux-headersдля точной версии ядра.
Secure Boot / запрет неподписанных модулей
- Решение: подписать модули вашим ключом или отключить enforcement в рамках вашей политики.
Проблемы со streebog
-
Если streebog уже есть в ядре или сборка/загрузка конфликтует — соберите без него:
make CONFIG_CRYPTO_STREEBOG=n
Лицензия
GPL-2.0 (см. файл LICENSE).
Ссылки / происхождение
Upstream (зеркало):
RFC (описания алгоритмов/параметров):
- RFC 5830 (GOST 28147)
- RFC 5831 (GOST R 34.11-94)
- RFC 4357 (параметры/таблицы, HMAC и др.)
- RFC 7801 (Magma и Kuznyechik)
Быстрый чек-лист (TL;DR)
# 1) зависимости
ls -l /lib/modules/$(uname -r)/build
# 2) сборка
make -j"$(nproc)" CONFIG_CRYPTO_STREEBOG=n
# 3) установка
sudo make modules_install
sudo depmod -a
# 4) загрузка
sudo modprobe gost28147_generic gosthash94_generic magma_generic kuznyechik_generic
# 5) проверка
grep -iE 'gost|magma|kuz|streebog' /proc/crypto | head
sudo modprobe gost-test
dmesg | tail -n 200
This is a set of Linux kernel modules implementing GOST cryptographic algorithms:
- GOST 28147 cipher (RFC 5830)
- GOST 28147 "Imitovstavka" (MAC mode) (RFC 5830)
- GOST R 34.11-94 digest (RFC 5831)
- HMAC using GOST R 34.11-94 (RFC 4357)
- GOST R 34.12-2015 ciphers (Magma and Kuznyechik) (RFC 7801)
- CMAC using GOST R 34.12-2015 (as required by GOST R 34.13-2015)
- GOST R 34.11-2012 digest is provided from external source, developed by Vitaly Chikunov