Clause
← Toute la documentation

L'original anglais a changé depuis cette traduction ; certaines parties peuvent donc être obsolètes. Lire en anglais

Traduit de l'original anglais · 1e3a39c8-dirty · 2026-10-26

Crypto : OpenSSL, compilation et FIPS

Le crypto de Clause fournit le module crypto d’OTP au moyen de libcrypto d’OpenSSL. Cette note décrit la version d’OpenSSL utilisée et sa recherche, sa compilation depuis les sources par Clause et clau, son édition de liens avec les programmes et le mode FIPS. Les fonctions intégrées sont décrites dans fonctions intégrées, le module de bibliothèque dans bibliothèque, et les différences observables avec OTP dans différences. Les clés et signatures de public_key y font appel (public_key).

Versions d’OpenSSL

OpenSSL est sous licence Apache-2.0 ; aucun fichier OpenSSL n’est versionné.

Provenance de l’OpenSSL de Clause

CMake (cmake/OpenSSLDependencies.cmake) recherche libcrypto pour l’archive crypto dans cet ordre :

  1. -DCLAUSE_OPENSSL_ROOT=<path> : un préfixe d’installation (include/openssl/opensslv.h) ou une arborescence source (Configure, VERSION.dat), compilée comme au point 3.
  2. Un OpenSSL installé ≥ 3.1.2 (CLAUSE_OPENSSL_SYSTEM, ON par défaut sauf sous Windows) : find_package(OpenSSL), avec préférence pour libcrypto statique.
  3. La version fixée, téléchargée dans thirdparty/openssl-4.1.0 et vérifiée (openssl-4.1.0.tar.gz, SHA-256 50c17baf54cb008f6ce42d50deb4b28050a1aad711636cabd4b241c7e90cc2fd), configurée et compilée une fois dans thirdparty/openssl-4.1.0-<arch>-<crt>/install (recompilée si le compilateur ou les options changent) ; -DCLAUSE_DOWNLOAD_OPENSSL=OFF désactive le téléchargement.

-DCLAUSE_RUNTIME_CRYPTO=OFF exclut entièrement l’archive crypto. Lorsque les tests sont activés, la configuration télécharge aussi les sources de 3.1.2 (openssl-3.1.2.tar.gz, SHA-256 a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539) dans thirdparty/openssl-3.1.2 pour les tests de la suite complète ; -DCLAUSE_TEST_OPENSSL_MINIMUM=OFF omet ce téléchargement et ces tests.

Compilation d’OpenSSL depuis les sources

La compilation depuis les sources produit une libcrypto statique intégrant le fournisseur legacy (que les fonctions intégrées chargent comme 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

Difficultés rencontrées

Édition de liens des programmes

Les fonctions intégrées résident dans leur propre archive, clause_runtime_crypto, à côté de clause_runtime : les programmes qui n’appellent jamais crypto restent aussi petits qu’avant ; libcrypto et ses fournisseurs ajoutent environ 4.5 MB à ceux qui l’appellent.

FIPS

Mode commutable (comme OTP)

Le premier appel à crypto tente aussi de charger le fournisseur fips d’OpenSSL, qu’OpenSSL trouve via ses propres OPENSSL_MODULES (le répertoire des modules) et OPENSSL_CONF (une configuration qui inclut le fipsmodule.cnf écrit par openssl fipsinstall et active le fournisseur). Ensuite :

Les opérations à clé publique recherchent leurs algorithmes via les propriétés par défaut d’OpenSSL ; en mode FIPS, elles utilisent donc les implémentations du fournisseur. eddsa lève "Unsupported algorithm in FIPS mode" et SRP notsup, comme OTP.

La variable d’application fips_mode d’OTP n’est pas lue (Clause n’a pas de on_load et les programmes n’ont pas de sys.config) : les programmes appellent crypto:enable_fips_mode/1, ou sont compilés avec le mode fixé.

Programmes à mode fixé : clau --fips=PATH

--fips=PATH compile un programme qui s’exécute toujours en mode FIPS, avec un fournisseur FIPS fourni par l’utilisateur. PATH est soit un répertoire contenant le module du fournisseur et son fipsmodule.cnf, soit une installation OpenSSL :

FichierRecherché dans PATH, puis dans
fips.dll (Windows), fips.so (Linux), fips.dylib (macOS)lib/ossl-modules, lib64/ossl-modules, lib/<triplet>/ossl-modules
fipsmodule.cnfssl/, etc/ssl/

Quel fournisseur FIPS utiliser

Clause ne compile jamais de fournisseur FIPS destiné au déploiement. OpenSSL autorise d’autres versions à utiliser un fournisseur FIPS validé, mais interdit d’en utiliser un compilé soi-même depuis une version non validée : prendre le fournisseur d’une version validée (3.1.2 au moment de la rédaction, compilé selon sa politique de sécurité, ou fourni par un éditeur de système d’exploitation) et exécuter son openssl fipsinstall sur la machine cible lorsque la politique l’exige. Le fournisseur 3.1.2 se charge dans la libcrypto 4.1 fixée : la suite complète le compile (pour le test uniquement) et exécute avec lui des programmes à mode fixé et commutable.

Tests

TestSuiteVérifications
executables_crypto_digests, executables_crypto_ciphersfastTests de référence d’OTP 29.1.1 : vecteurs, états, erreurs, listes détectées, info_fips sans fournisseur
linking_cryptofastL’archive n’est liée que si elle est utilisée ; --with-crypto[=PATH], CLAUSE_OPENSSL_ROOT, refus
linking_fipsfastRefus de --fips, échec de compilation si les fournisseurs sont absents ou mal formés, copie, échecs au démarrage
linking_crypto_sourcefull--with-crypto=SOURCE compile une fois l’arborescence 4.1.0 dans le cache de compilation
linking_crypto_minimumfullLes tests de référence crypto liés à une libcrypto compilée depuis les sources de 3.1.2 affichent leurs résultats de référence
linking_fips_realfullFournisseur FIPS de 3.1.2 (compilé avec enable-fips pour le test) dans un programme à mode fixé (reste en mode FIPS, algorithmes interdits, arrêt si le module est altéré) et un programme à mode commutable (OPENSSL_MODULES/OPENSSL_CONF)