# Особливості збірки GOSTcoin на Fedora 43 > Я вгепав у це питання близько тижня і вже тричі переписував даний матеріал-пам'ятку. Утім, я досі не запустив старий гаманець GOSTCoin, але назбирав купу нотаток і нового досвіду. Прочитавши допис @acetone "GOSTCoin - первая криптовалюта в I2P" поставив собі цей гаманець на Debian 13: все працювало згідно інструкцій README. Але згодом, перебої зі світлом перегнали мене на іншу машину вже на базі Fedora 43, де запуск гаманця з підсунутим файлом `~/.gostcoin/wallet.dat` - вилітав з помилкою: > error loading wallet.dat: wallet corrupted Переглянувши журнал, знайшов там: ``` ~/.gostcoin/debug.log Error reading wallet database: CPrivKey corrupt ``` Створив відповідний репорт і отримав вичерпну вичерпну пораду збирати OpenSSL "під себе" => https://github.com/GOSTSec/gostcoin/issues/65 Я мало знайомий з нутрощами OpenSSL, але оскільки GOSTcoin - єдина відома мені валюта з альтернативним алгоритмом over SAM, вирішив заморочитись. З того що вияснив, OpenSSL v3 (як і Fedora) з коробки постачається тільки з "надійними" алгоритмами криптографії, все інше - застаріле, сумнівне та користувацьке - виведено на рівень модулів "engines" і "providers". Більше того, починаючи з Fedora 43, функціональність "engines" вважається застарілою: => https://discussion.fedoraproject.org/t/f43-change-proposal-disabling-support-of-building-openssl-engines-system-wide Fedora 43: Disabling support of building OpenSSL engines Тому на перспективу лишиться тільки "providers", API яких ще не всюди підтримується. GOSTcoin - тут не виключення: наприклад, інтерфейс `EC_GROUP*` - не бачитиме криптографічних кривих від "провайдерів" і схоже потребуватиме додаткового патчу або ж компіляції якоїсь старої версії OpenSSL... Стару версію я не хочу, бо й так завжди можу підняти старий Debian на віртуалці; мені цікаво саме актуалізуватись. ## gost-engine => https://github.com/gost-engine/engine Цей проєкт реалізує "engine" і "provider", тому він буде потрібен в не залежності від того, яким шляхом ви підете. Є два варіанти його встановлення: ### Репозиторій Fedora => https://src.fedoraproject.org/rpms/openssl-gost-engine Чомусь інсталяція не містить в собі деяких алгоритмів при оновленні політики (про що згодом) ``` bash sudo dnf install openssl-gost-engine ``` ### Збірка з початкового коду => https://github.com/gost-engine/engine/blob/master/INSTALL.md Щоб уникнути проблеми зі знаходженням на Fedora, потрібно додати пакунок: ``` bash sudo dnf install openssl-devel-engine ``` => https://github.com/gost-engine/engine/pull/511 вже додав цю нотатку до README ``` bash 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 ``` * або `sudo make install` ### Підключення engine ``` /etc/ssl/openssl.cnf [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 ``` * шлях `dynamic_path` можна визначити командою `openssl version -e` ### Підключення provider ``` /etc/ssl/openssl.cnf [provider_sect] default = default_sect gost = gost_sect [gost_sect] module = /usr/lib64/ossl-modules/gostprov.so activate = 1 ``` * шлях `module` можна визначити командою `openssl info -modulesdir` ### Оновлення політики Стандартною політикою на Fedora 43 є DEFAULT. Тому для використання сертифікатів GOST, її потрібно знизити до LEGACY: ``` bash sudo update-crypto-policies --set LEGACY ``` Дана команда змінить наступні рядки у файлі /etc/crypto-policies/back-ends/openssl.config: * `CipherString` - `SECLEVEL` буде переключено з `2` на `1` і додано `aGOST:aGOST01:kGOST:GOST94:GOST89MAC` * `Groups` - додано `gost2012_256:gost2012_512` * `rh-allow-sha1-signatures` буде встановлено як `yes` Напряму файл `openssl.config` редагувати не варто, бо його рано чи пізно буде перезаписано системою: при оновленні кешу або використанні утиліти вище. ### Тестування ``` bash $ 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 ``` Саме цікаве, що остання команда з `ecparam` - нічого не виводить і все тому, що (як зрозумів) тут ми використовуємо не вбудовані алгоритми а саме API "engine" та "provider". Далі я опишу збірку гаманця і планую доповнити матеріал згодом, коли натягну це діло ймовірно вже на форк з підтримкою провайдерів, а не допотопної версії OpenSSL. ## GOSTcoin Тут все згідно інструкції в README: ``` bash git clone https://github.com/GOSTSec/gostcoin.git cd gostcoin /usr/lib64/qt5/bin/qmake "USE_QRCODE=1" make ``` * `/usr/lib64/qt5/bin/qmake` - тому що в мене система чомусь не бачить `qmake` * `USE_QRCODE=1` - опціонально, якщо потрібна функціональність QR-кодів Якщо використовується власна збірка OpenSSL в `/opt/openssl`, шлях до неї вказується так: ``` bash git clone https://github.com/GOSTSec/gostcoin.git cd gostcoin /usr/lib64/qt5/bin/qmake \ "USE_QRCODE=1" \ "INCLUDEPATH += /opt/openssl/include" \ "LIBS += -L/opt/openssl/lib64 -lssl -lcrypto" \ "QMAKE_LFLAGS += -Wl,-rpath,/opt/openssl/lib64" make ``` В корені буде створено бінарник `gostcoin-qt` який запускаємо після i2pd. ## Посилання => https://github.com/gost-engine/engine/discussions/479#discussioncomment-13296401 Порада збирати OpenSSL v1.1 разом з GOST engine (LEGACY) => https://github.com/gost-engine/engine/issues/362 Openssl 3 + Gost Engine #362 => https://github.com/gost-engine/engine/blob/master/README.gost => https://github.com/majek/openssl/blob/master/engines/ccgost/README.gost => https://devel.fedoraproject.narkive.com/jls58kln/fedora-dnssec-and-gost-ecc-like-algorithms-with-openssl => https://github.com/gost-engine/engine/blob/master/INSTALL.md => https://www.reddit.com/r/OPNsenseFirewall/comments/126cmk4/question_how_can_i_install_gost_encryption/ => https://discussion.fedoraproject.org/t/strong-crypto-settings-how-best-to-define-apply/22600 => https://github.com/gost-engine/engine/discussions/478