Clause
← Gesamte Dokumentation

Das englische Original wurde seit dieser Übersetzung geändert, daher können Teile davon veraltet sein. Auf Englisch lesen

Übersetzt aus dem englischen Original · 1e3a39c8-dirty · 2026-10-26

Crypto: OpenSSL, Kompilierung und FIPS

Clauses crypto bildet das crypto-Modul von OTP auf OpenSSLs libcrypto ab. Dieses Dokument beschreibt, welches OpenSSL verwendet und wie es gefunden wird, wie Clause und clau es aus dem Quellcode kompilieren, wie Programme es linken und wie der FIPS-Modus funktioniert. Die Builtins sind unter Builtins, das Bibliotheksmodul unter Bibliothek und die beobachtbaren Unterschiede zu OTP unter Unterschiede beschrieben. Die Schlüssel- und Signaturfunktionen von public_key rufen es auf (public_key).

OpenSSL-Versionen

OpenSSL steht unter der Apache-2.0-Lizenz; keine OpenSSL-Datei ist im Repository eingecheckt.

Herkunft von Clauses OpenSSL

CMake (cmake/OpenSSLDependencies.cmake) sucht libcrypto für das Crypto-Archiv in dieser Reihenfolge:

  1. -DCLAUSE_OPENSSL_ROOT=<path>: ein Installationspräfix (include/openssl/opensslv.h) oder ein Quellbaum (Configure, VERSION.dat), der wie unter 3 kompiliert wird.
  2. Ein installiertes OpenSSL ≥ 3.1.2 (CLAUSE_OPENSSL_SYSTEM, standardmäßig ON außer unter Windows): find_package(OpenSSL), bevorzugt statische libcrypto.
  3. Die festgelegte Version, heruntergeladen nach thirdparty/openssl-4.1.0 und geprüft (openssl-4.1.0.tar.gz, SHA-256 50c17baf54cb008f6ce42d50deb4b28050a1aad711636cabd4b241c7e90cc2fd), einmalig konfiguriert und nach thirdparty/openssl-4.1.0-<arch>-<crt>/install kompiliert (erneut kompiliert, wenn sich Compiler oder Optionen ändern); -DCLAUSE_DOWNLOAD_OPENSSL=OFF deaktiviert den Download.

-DCLAUSE_RUNTIME_CRYPTO=OFF lässt das Crypto-Archiv vollständig weg. Bei aktivierten Tests lädt die Konfiguration außerdem den Quellcode von 3.1.2 (openssl-3.1.2.tar.gz, SHA-256 a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539) für die Tests der vollständigen Suite nach thirdparty/openssl-3.1.2 herunter; -DCLAUSE_TEST_OPENSSL_MINIMUM=OFF überspringt dies und diese Tests.

OpenSSL aus dem Quellcode kompilieren

Die Kompilierung aus dem Quellcode erzeugt eine statische libcrypto mit eingebautem Legacy-Provider (den die Builtins wie OTP laden):

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

Aufgetretene Fallstricke

Programme linken

Die Builtins liegen in einem eigenen Archiv, clause_runtime_crypto neben clause_runtime, sodass Programme, die crypto nie aufrufen, so klein wie bisher bleiben; libcrypto mit ihren Providern vergrößert Programme, die es aufrufen, um etwa 4,5 MB.

FIPS

Umschaltbarer Modus (wie bei OTP)

Der erste crypto-Aufruf versucht außerdem, OpenSSLs fips-Provider zu laden, den OpenSSL über seine eigenen Variablen OPENSSL_MODULES (das Modulverzeichnis) und OPENSSL_CONF findet (eine Konfiguration, die die von openssl fipsinstall geschriebene fipsmodule.cnf einbindet und den Provider aktiviert). Dann gilt:

Operationen mit öffentlichen Schlüsseln rufen ihre Algorithmen über OpenSSLs Standardeigenschaften ab und verwenden im FIPS-Modus daher die Implementierungen des Providers; eddsa löst "Unsupported algorithm in FIPS mode" aus und SRP notsup, wie bei OTP.

OTPs Anwendungsvariable fips_mode wird nicht gelesen (Clause hat kein on_load und Programme haben keine sys.config): Programme rufen crypto:enable_fips_mode/1 auf oder werden mit festgelegtem Modus kompiliert.

Programme mit festgelegtem Modus: clau --fips=PATH

--fips=PATH erzeugt ein Programm, das immer im FIPS-Modus läuft, mit einem vom Benutzer bereitgestellten FIPS-Provider. PATH ist entweder ein Verzeichnis mit dem Provider-Modul und seiner fipsmodule.cnf oder eine OpenSSL-Installation:

DateiZuerst in PATH gesucht, dann in
fips.dll (Windows), fips.so (Linux), fips.dylib (macOS)lib/ossl-modules, lib64/ossl-modules, lib/<triplet>/ossl-modules
fipsmodule.cnfssl/, etc/ssl/

Welcher FIPS-Provider

Clause kompiliert niemals einen FIPS-Provider für die Bereitstellung. OpenSSL erlaubt anderen Versionen, einen validierten FIPS-Provider zu verwenden, verbietet aber einen selbst kompilierten aus einer nicht validierten Version: Es ist der Provider einer validierten Version zu verwenden (zum Zeitpunkt dieses Dokuments 3.1.2, gemäß ihrer Sicherheitsrichtlinie kompiliert, oder ein von einem Betriebssystemanbieter gelieferter); dessen openssl fipsinstall ist auf dem Zielrechner auszuführen, soweit die Richtlinie dies verlangt. Der Provider von 3.1.2 lässt sich in die festgelegte libcrypto 4.1 laden: Die vollständige Suite kompiliert ihn (nur für den Test) und führt damit Programme mit festgelegtem und umschaltbarem Modus aus.

Tests

TestSuiteWas geprüft wird
executables_crypto_digests, executables_crypto_ciphersfastReferenztests aus OTP 29.1.1: Vektoren, Zustände, Fehler, ermittelte Listen, info_fips ohne Provider
linking_cryptofastDas Archiv wird nur bei Verwendung gelinkt; --with-crypto[=PATH], CLAUSE_OPENSSL_ROOT, Ablehnungen
linking_fipsfastAblehnungen von --fips, fehlende oder fehlerhafte Provider lassen den Build scheitern, Kopieren, Startfehler
linking_crypto_sourcefull--with-crypto=SOURCE kompiliert den Quellbaum von 4.1.0 einmalig in den Build-Cache
linking_crypto_minimumfullMit einer aus dem Quellcode von 3.1.2 kompilierten libcrypto gelinkte Crypto-Referenztests geben ihre Referenzausgaben aus
linking_fips_realfullDer FIPS-Provider von 3.1.2 (für den Test mit enable-fips kompiliert) in einem Programm mit festgelegtem Modus (bleibt im FIPS-Modus, verbotene Algorithmen, manipuliertes Modul stoppt es) und einem umschaltbaren (OPENSSL_MODULES/OPENSSL_CONF)