Clause
← Toda la documentación

El original en inglés ha cambiado desde que se hizo esta traducción, por lo que partes de ella pueden estar desactualizadas. Leer en inglés

Traducido del original en inglés · 1e3a39c8-dirty · 2026-10-26

Crypto: OpenSSL, compilación y FIPS

El crypto de Clause implementa el módulo crypto de OTP sobre libcrypto de OpenSSL. Esta nota explica qué OpenSSL se usa y cómo se encuentra, cómo Clause y clau lo compilan desde el código fuente, cómo lo enlazan los programas y el modo FIPS. Las funciones integradas se describen en funciones integradas, el módulo de biblioteca en biblioteca y las diferencias observables respecto a OTP en diferencias. Las claves y firmas de public_key lo invocan (public_key).

Versiones de OpenSSL

OpenSSL tiene licencia Apache-2.0; no se incorpora ningún archivo de OpenSSL al repositorio.

De dónde procede el OpenSSL de Clause

CMake (cmake/OpenSSLDependencies.cmake) resuelve libcrypto para la biblioteca estática de crypto en este orden:

  1. -DCLAUSE_OPENSSL_ROOT=<path>: un prefijo de instalación (include/openssl/opensslv.h) o un árbol de fuentes (Configure, VERSION.dat), que se compila como en 3.
  2. Un OpenSSL instalado ≥ 3.1.2 (CLAUSE_OPENSSL_SYSTEM, ON por defecto salvo en Windows): find_package(OpenSSL), con preferencia por libcrypto estática.
  3. La versión fijada, descargada en thirdparty/openssl-4.1.0 y verificada (openssl-4.1.0.tar.gz, SHA-256 50c17baf54cb008f6ce42d50deb4b28050a1aad711636cabd4b241c7e90cc2fd), configurada y compilada una vez en thirdparty/openssl-4.1.0-<arch>-<crt>/install (se recompila al cambiar el compilador o las opciones); -DCLAUSE_DOWNLOAD_OPENSSL=OFF desactiva la descarga.

-DCLAUSE_RUNTIME_CRYPTO=OFF excluye por completo la biblioteca estática de crypto. Con las pruebas activadas, la configuración también descarga las fuentes de 3.1.2 (openssl-3.1.2.tar.gz, SHA-256 a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539) en thirdparty/openssl-3.1.2 para las pruebas de la batería completa; -DCLAUSE_TEST_OPENSSL_MINIMUM=OFF omite la descarga y esas pruebas.

Compilar OpenSSL desde el código fuente

La compilación desde las fuentes genera una libcrypto estática con el proveedor legacy integrado (que las funciones integradas cargan como hace 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

Problemas encontrados

Enlazar programas

Las funciones integradas residen en su propia biblioteca estática, clause_runtime_crypto, junto a clause_runtime, por lo que los programas que nunca llaman a crypto siguen siendo igual de pequeños; libcrypto con sus proveedores añade unos 4.5 MB a los que sí lo hacen.

FIPS

Modo conmutable (como OTP)

La primera llamada a crypto también intenta cargar el proveedor fips de OpenSSL, que OpenSSL encuentra mediante sus variables OPENSSL_MODULES (el directorio de módulos) y OPENSSL_CONF (una configuración que incluye el fipsmodule.cnf escrito por openssl fipsinstall y activa el proveedor). Entonces:

Las operaciones de clave pública obtienen sus algoritmos mediante las propiedades predeterminadas de OpenSSL, por lo que en modo FIPS usan las implementaciones del proveedor; eddsa genera "Unsupported algorithm in FIPS mode" y SRP genera notsup, como en OTP.

No se lee la variable de aplicación fips_mode de OTP (Clause no tiene on_load y los programas no tienen sys.config): los programas llaman a crypto:enable_fips_mode/1 o se compilan con el modo fijado.

Programas con modo fijado: clau --fips=PATH

--fips=PATH compila un programa que siempre se ejecuta en modo FIPS, con un proveedor FIPS proporcionado por el usuario. PATH es un directorio que contiene el módulo del proveedor y su fipsmodule.cnf, o una instalación de OpenSSL:

ArchivoSe busca en PATH y después en
fips.dll (Windows), fips.so (Linux), fips.dylib (macOS)lib/ossl-modules, lib64/ossl-modules, lib/<triplet>/ossl-modules
fipsmodule.cnfssl/, etc/ssl/

Qué proveedor FIPS usar

Clause nunca compila un proveedor FIPS para su distribución. OpenSSL permite que otras versiones usen un proveedor FIPS validado, pero prohíbe usar uno compilado por cuenta propia desde una versión no validada: se debe obtener el proveedor de una versión validada (3.1.2 en el momento de redactar este texto, compilado según su política de seguridad, o uno distribuido por un proveedor de sistema operativo) y ejecutar su openssl fipsinstall en la máquina de destino cuando lo exija la política. El proveedor de 3.1.2 se carga en la libcrypto 4.1 fijada: la batería completa lo compila (solo para la prueba) y ejecuta con él programas con modo fijado y conmutable.

Pruebas

PruebaBateríaQué comprueba
executables_crypto_digests, executables_crypto_ciphersrápidaPruebas de referencia de OTP 29.1.1: vectores, estados, errores, listas de disponibilidad, info_fips sin proveedor
linking_cryptorápidaLa biblioteca estática solo se enlaza cuando se usa; --with-crypto[=PATH], CLAUSE_OPENSSL_ROOT, rechazos
linking_fipsrápidaRechazos de --fips, los proveedores ausentes o mal formados hacen fallar la compilación, copia, fallos de inicio
linking_crypto_sourcecompleta--with-crypto=SOURCE compila el árbol de 4.1.0 una vez en la caché de compilación
linking_crypto_minimumcompletaLas pruebas de referencia de crypto enlazadas con una libcrypto compilada desde las fuentes de 3.1.2 imprimen sus resultados de referencia
linking_fips_realcompletaProveedor FIPS de 3.1.2 (compilado con enable-fips para la prueba) en un programa con modo fijado (permanece en modo FIPS, algoritmos prohibidos, un módulo alterado lo detiene) y uno conmutable (OPENSSL_MODULES/OPENSSL_CONF)