Clause
← All dokumentation

Det engelska originalet har ändrats sedan översättningen gjordes, så delar av den kan vara inaktuella. Läs på engelska

Översatt från det engelska originalet · 1e3a39c8-dirty · 2026-10-26

Crypto: OpenSSL, bygge och FIPS

Clauses crypto motsvarar OTP:s crypto-modul ovanpå OpenSSL:s libcrypto. Denna text beskriver vilken OpenSSL som används och hur den hittas, hur Clause och clau bygger den från källkod, hur program länkar den och FIPS-läge. De inbyggda funktionerna beskrivs i inbyggda funktioner, biblioteksmodulen i bibliotek och de observerbara skillnaderna mot OTP i skillnader. Nycklar och signaturer i public_key anropar den (public_key).

OpenSSL-versioner

OpenSSL har Apache-2.0-licens; ingen OpenSSL-fil checkas in.

Var Clauses OpenSSL kommer från

CMake (cmake/OpenSSLDependencies.cmake) hittar libcrypto för crypto-arkivet i denna ordning:

  1. -DCLAUSE_OPENSSL_ROOT=<path>: ett installationsprefix (include/openssl/opensslv.h) eller ett källkodsträd (Configure, VERSION.dat), som byggs enligt punkt 3.
  2. En installerad OpenSSL ≥ 3.1.2 (CLAUSE_OPENSSL_SYSTEM, ON som standard utom på Windows): find_package(OpenSSL), med statiskt libcrypto i första hand.
  3. Den låsta utgåvan, hämtad till thirdparty/openssl-4.1.0 och verifierad (openssl-4.1.0.tar.gz, SHA-256 50c17baf54cb008f6ce42d50deb4b28050a1aad711636cabd4b241c7e90cc2fd), konfigurerad och byggd en gång till thirdparty/openssl-4.1.0-<arch>-<crt>/install (byggs om när kompilatorn eller alternativen ändras); -DCLAUSE_DOWNLOAD_OPENSSL=OFF stänger av hämtningen.

-DCLAUSE_RUNTIME_CRYPTO=OFF utelämnar crypto-arkivet helt. Med tester aktiverade hämtar konfigurationen också källkoden för 3.1.2 (openssl-3.1.2.tar.gz, SHA-256 a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539) till thirdparty/openssl-3.1.2 för den fullständiga svitens tester; -DCLAUSE_TEST_OPENSSL_MINIMUM=OFF hoppar över den och dessa tester.

Bygga OpenSSL från källkod

Ett källkodsbygge skapar ett statiskt libcrypto med legacy-providern inbyggd (som de inbyggda funktionerna laddar på samma sätt som 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

Fallgropar längs vägen

Länka program

De inbyggda funktionerna finns i ett eget arkiv, clause_runtime_crypto bredvid clause_runtime, så program som aldrig anropar crypto förblir lika små som tidigare; libcrypto med sina providrar lägger till cirka 4.5 MB för dem som gör det.

FIPS

Omkopplingsbart läge (som OTP)

Det första crypto-anropet försöker också ladda OpenSSL:s fips-provider, som OpenSSL hittar genom sina egna OPENSSL_MODULES (modulkatalogen) och OPENSSL_CONF (en konfiguration som inkluderar den fipsmodule.cnf som openssl fipsinstall skrev och aktiverar providern). Sedan gäller följande:

Operationer med publika nycklar hämtar sina algoritmer genom OpenSSL:s standardegenskaper, så i FIPS-läge körs de med providerns implementationer; eddsa ger "Unsupported algorithm in FIPS mode" och SRP notsup, som i OTP.

OTP:s applikationsvariabel fips_mode läses inte (Clause har ingen on_load och program har ingen sys.config): program anropar crypto:enable_fips_mode/1 eller byggs med låst läge.

Program med låst läge: clau --fips=PATH

--fips=PATH bygger ett program som alltid körs i FIPS-läge, med en FIPS-provider som användaren tillhandahåller. PATH är antingen en katalog med providermodulen och dess fipsmodule.cnf eller en OpenSSL-installation:

FilSöks i PATH, sedan i
fips.dll (Windows), fips.so (Linux), fips.dylib (macOS)lib/ossl-modules, lib64/ossl-modules, lib/<triplet>/ossl-modules
fipsmodule.cnfssl/, etc/ssl/

Vilken FIPS-provider

Clause bygger aldrig en FIPS-provider för distribution. OpenSSL tillåter att andra utgåvor använder en validerad FIPS-provider men förbjuder användning av en egenbyggd från en icke-validerad utgåva: använd providern från en validerad utgåva (3.1.2 i skrivande stund, byggd enligt dess säkerhetspolicy, eller en som levereras av en operativsystemsleverantör) och kör dess openssl fipsinstall på målmaskinen där policyn kräver det. Providern från 3.1.2 laddas i det låsta libcrypto 4.1: den fullständiga sviten bygger den (bara för testet) och kör program med låst och omkopplingsbart läge med den.

Tester

TestSvitVad det kontrollerar
executables_crypto_digests, executables_crypto_ciphersfastReferenstester från OTP 29.1.1: vektorer, tillstånd, fel, undersökta listor, info_fips utan provider
linking_cryptofastArkivet länkas bara när det används; --with-crypto[=PATH], CLAUSE_OPENSSL_ROOT, avvisanden
linking_fipsfastAvvisade --fips, saknade eller felaktiga providrar får bygget att misslyckas, kopiering, startfel
linking_crypto_sourcefull--with-crypto=SOURCE bygger 4.1.0-trädet en gång i byggcachen
linking_crypto_minimumfullCrypto-referenstesterna länkade med ett libcrypto byggt från källkoden för 3.1.2 skriver ut sina referensresultat
linking_fips_realfullFIPS-providern från 3.1.2 (byggd med enable-fips för testet) i ett program med låst läge (förblir i FIPS-läge, förbjudna algoritmer, manipulerad modul stoppar det) och ett med omkopplingsbart läge (OPENSSL_MODULES/OPENSSL_CONF)