Підключення користувацьких алгоритмів OpenSSL на прикладі провайдера "GOST engine"


Нотатку було створено в процесі пошуку рішення для виправлення помилки декодування гаманця GOSTcoin:


error loading wallet.dat: wallet corrupted


Якщо ви шукаєте рішення саме цієї проблеми, то вам сюди:

Особливості запуску GOSTcoin на Fedora


В матеріалі нижче - описані кроки, які я виконував в процесі пошуку; вони виявились ніяк не пов'язаними з рішенням для гаманця GOSTcoin, утім, можуть бути корисними для підключення будь яких інших "провайдерів" та "рушіїв" до нативного OpenSSL, тим само дозволяючи розширити системний набір криптографічних алгоритмів.


gost-engine


https://github.com/gost-engine/engine


Проєкт реалізує "engine" і "provider", є два варіанти його встановлення.


Репозиторій Fedora


https://src.fedoraproject.org/rpms/openssl-gost-engine


Чомусь інсталяція не містить в собі деяких алгоритмів при оновленні політики (про що згодом)


sudo dnf install openssl-gost-engine

Збірка з початкового коду


https://github.com/gost-engine/engine/blob/master/INSTALL.md


Щоб уникнути проблеми зі знаходженням <openssl/engine.h> на Fedora, потрібно додати пакунок:


sudo dnf install openssl-devel-engine

згодом, додав нотатку до README


git clone https://github.com/gost-engine/engine
cd engine
git submodule update --init
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release
sudo cmake --build . --target install --config Release

Підключення engine


[openssl_init]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = /usr/lib64/engines-3/gost.so
default_algorithms = ALL

# ще не впевнений, чи ці параметри дійсно потрібні і є правильними
# CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
# activate = 1

Підключення provider


[provider_sect]
default = default_sect
gost = gost_sect

[gost_sect]
module = /usr/lib64/ossl-modules/gostprov.so
activate = 1

Оновлення політики


Стандартною політикою на Fedora 43 є DEFAULT. Тому для використання сертифікатів GOST, її потрібно знизити до LEGACY:


sudo update-crypto-policies --set LEGACY

Дана команда змінить наступні рядки у файлі /etc/crypto-policies/back-ends/openssl.config:



Напряму файл `openssl.config` редагувати не варто, бо його рано чи пізно буде перезаписано системою: при оновленні кешу або використанні утиліти вище.


Тестування


$ openssl engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine

$ openssl engine gost -t -c
(gost) Reference implementation of GOST engine
 [gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-ecb, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, magma-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac]
     [ available ]

$ openssl ciphers|tr ':' '\n' | grep GOST
GOST2012-MAGMA-MAGMAOMAC
GOST2012-KUZNYECHIK-KUZNYECHIKOMAC
LEGACY-GOST2012-GOST8912-GOST8912
IANA-GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89

$ openssl list -public-key-algorithms | grep GOST
    IDs: { 1.2.643.2.2.19, GOST R 34.10-2001, gost2001 } @ gost
    IDs: { 1.2.643.2.2.98, GOST R 34.10-2001 DH, id-GostR3410-2001DH } @ gost
    IDs: { 1.2.643.7.1.1.1.1, GOST R 34.10-2012 with 256 bit modulus, gost2012_256 } @ gost
    IDs: { 1.2.643.7.1.1.1.2, GOST R 34.10-2012 with 512 bit modulus, gost2012_512 } @ gost

$ openssl ecparam -list_curves | grep -i GOST

Посилання


F43 change Proposal: Disabling support of building OpenSSL engines (system-wide)



/uk/