Clause
← Уся документація

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26

Crypto: OpenSSL, збирання та FIPS

crypto у Clause реалізує модуль crypto з OTP на основі libcrypto з OpenSSL. Ця довідка описує, яку версію OpenSSL використано та як її знаходять, як Clause і clau збирають її з вихідного коду, як програми компонуються з нею, а також режим FIPS. Самі вбудовані функції описано в описі вбудованих функцій, бібліотечний модуль — у бібліотеці, а спостережувані відмінності від OTP — у відмінностях. Операції з ключами та підписами public_key викликають його (public_key).

Версії OpenSSL

OpenSSL має ліцензію Apache-2.0; жоден файл OpenSSL не додається до репозиторію.

Звідки Clause отримує OpenSSL

CMake (cmake/OpenSSLDependencies.cmake) визначає libcrypto для архіву crypto в такому порядку:

  1. -DCLAUSE_OPENSSL_ROOT=<path>: префікс встановлення (include/openssl/opensslv.h) або дерево вихідного коду (Configure, VERSION.dat), яке збирається як у пункті 3.
  2. Встановлена OpenSSL ≥ 3.1.2 (CLAUSE_OPENSSL_SYSTEM, типово ON, крім Windows): find_package(OpenSSL), перевага статичній libcrypto.
  3. Закріплений випуск, завантажений у thirdparty/openssl-4.1.0 і перевірений (openssl-4.1.0.tar.gz, SHA-256 50c17baf54cb008f6ce42d50deb4b28050a1aad711636cabd4b241c7e90cc2fd), налаштований та одноразово зібраний у thirdparty/openssl-4.1.0-<arch>-<crt>/install (перезбирається при зміні компілятора чи параметрів); -DCLAUSE_DOWNLOAD_OPENSSL=OFF вимикає завантаження.

-DCLAUSE_RUNTIME_CRYPTO=OFF повністю вилучає архів crypto. Якщо тести ввімкнено, налаштування також завантажує вихідний код 3.1.2 (openssl-3.1.2.tar.gz, SHA-256 a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539) у thirdparty/openssl-3.1.2 для тестів повного набору; -DCLAUSE_TEST_OPENSSL_MINIMUM=OFF пропускає його та ці тести.

Збирання OpenSSL із вихідного коду

Збирання з вихідного коду створює статичну libcrypto з вбудованим провайдером legacy (який вбудовані функції завантажують так само, як OTP):

Configure <target> no-shared no-module no-tests no-docs no-makedepend enable-ec_explicit_curves
          [enable-static-vcruntime] [--debug] --prefix=<install> --openssldir=<install>/ssl --libdir=lib
make build_libs && make install_dev

Виявлені підводні камені

Компонування програм

Вбудовані функції містяться у власному архіві clause_runtime_crypto поруч із clause_runtime, тому програми, які ніколи не викликають crypto, залишаються такими ж малими; libcrypto зі своїми провайдерами додає близько 4.5 MB тим, що його викликають.

FIPS

Перемикний режим (як в OTP)

Перший виклик crypto також намагається завантажити провайдер fips із OpenSSL, який OpenSSL знаходить через власні OPENSSL_MODULES (каталог модулів) і OPENSSL_CONF (конфігурацію, що включає fipsmodule.cnf, записаний openssl fipsinstall, та активує провайдер). Далі:

Операції з відкритими ключами отримують алгоритми через типові властивості OpenSSL, тому в режимі FIPS використовують реалізації провайдера; eddsa спричиняє "Unsupported algorithm in FIPS mode", а SRP — notsup, як в OTP.

Змінна застосунку OTP fips_mode не читається (Clause не має on_load, а програми — sys.config): програми викликають crypto:enable_fips_mode/1 або збираються із закріпленим режимом.

Програми із закріпленим режимом: clau --fips=PATH

--fips=PATH збирає програму, яка завжди працює в режимі FIPS із наданим користувачем провайдером FIPS. PATH — це каталог із модулем провайдера та його fipsmodule.cnf або встановлення OpenSSL:

ФайлШукається в PATH, потім у
fips.dll (Windows), fips.so (Linux), fips.dylib (macOS)lib/ossl-modules, lib64/ossl-modules, lib/<triplet>/ossl-modules
fipsmodule.cnfssl/, etc/ssl/

Який провайдер FIPS використовувати

Clause ніколи не збирає провайдер FIPS для розгортання. OpenSSL дозволяє іншим випускам використовувати валідований провайдер FIPS, але забороняє використовувати самостійно зібраний провайдер із невалідованого випуску: слід взяти провайдер валідованого випуску (на час написання — 3.1.2, зібраний за вимогами його політики безпеки, або наданий постачальником операційної системи) та виконати його openssl fipsinstall на цільовій машині, якщо цього вимагає політика. Провайдер 3.1.2 завантажується в закріплену libcrypto 4.1: повний набір тестів збирає його (лише для тесту) та запускає з ним програми із закріпленим і перемикним режимами.

Тести

ТестНабірЩо перевіряє
executables_crypto_digests, executables_crypto_ciphersfastЕталони з OTP 29.1.1: вектори, стани, помилки, списки доступних алгоритмів, info_fips без провайдера
linking_cryptofastАрхів компонується лише за використання; --with-crypto[=PATH], CLAUSE_OPENSSL_ROOT, відмови
linking_fipsfastВідмови --fips, відсутні або некоректні провайдери зривають збирання, копіювання, помилки запуску
linking_crypto_sourcefull--with-crypto=SOURCE одноразово збирає дерево 4.1.0 у кеш збирання
linking_crypto_minimumfullЕталонні тести crypto, скомпоновані з libcrypto з вихідного коду 3.1.2, виводять свої еталони
linking_fips_realfullПровайдер FIPS із 3.1.2 (зібраний з enable-fips для тесту) у програмі із закріпленим режимом (залишається в режимі FIPS, заборонені алгоритми, змінений модуль зупиняє її) та з перемикним режимом (OPENSSL_MODULES/OPENSSL_CONF)