Clause
← Toda a documentação

O original em inglês mudou desde esta tradução, pelo que partes dela podem estar desatualizadas. Ler em inglês

Traduzido do original em inglês · 1e3a39c8-dirty · 2026-10-26

Crypto: OpenSSL, compilação e FIPS

O crypto do Clause corresponde ao módulo crypto do OTP sobre a libcrypto do OpenSSL. Esta nota descreve que OpenSSL é usado e como é encontrado, como o Clause e o clau o compilam a partir do código-fonte, como os programas o ligam e o modo FIPS. As funções incorporadas são descritas em funções incorporadas, o módulo de biblioteca em biblioteca e as diferenças observáveis face ao OTP em diferenças. As chaves e assinaturas de public_key chamam-no (public_key).

Versões do OpenSSL

O OpenSSL tem licença Apache-2.0; nenhum ficheiro do OpenSSL é incluído no repositório.

De onde vem o OpenSSL do Clause

O CMake (cmake/OpenSSLDependencies.cmake) resolve a libcrypto para o arquivo crypto pela seguinte ordem:

  1. -DCLAUSE_OPENSSL_ROOT=<path>: um prefixo de instalação (include/openssl/opensslv.h) ou uma árvore de código-fonte (Configure, VERSION.dat), que é compilada como em 3.
  2. Um OpenSSL ≥ 3.1.2 instalado (CLAUSE_OPENSSL_SYSTEM, ON por predefinição exceto em Windows): find_package(OpenSSL), com preferência pela libcrypto estática.
  3. A versão fixada, descarregada para thirdparty/openssl-4.1.0 e verificada (openssl-4.1.0.tar.gz, SHA-256 50c17baf54cb008f6ce42d50deb4b28050a1aad711636cabd4b241c7e90cc2fd), configurada e compilada uma vez em thirdparty/openssl-4.1.0-<arch>-<crt>/install (recompilada quando o compilador ou as opções mudam); -DCLAUSE_DOWNLOAD_OPENSSL=OFF desativa a transferência.

-DCLAUSE_RUNTIME_CRYPTO=OFF exclui por completo o arquivo crypto. Com os testes ativados, a configuração também descarrega o código-fonte de 3.1.2 (openssl-3.1.2.tar.gz, SHA-256 a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539) para thirdparty/openssl-3.1.2, para os testes da bateria completa; -DCLAUSE_TEST_OPENSSL_MINIMUM=OFF ignora-o e ignora esses testes.

Compilar o OpenSSL a partir do código-fonte

Uma compilação a partir do código-fonte produz uma libcrypto estática com o fornecedor legacy incorporado (que as funções incorporadas carregam como o 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

Dificuldades encontradas pelo caminho

Ligação de programas

As funções incorporadas residem no seu próprio arquivo, clause_runtime_crypto, ao lado de clause_runtime, pelo que os programas que nunca chamam crypto mantêm o tamanho anterior; a libcrypto com os seus fornecedores acrescenta cerca de 4.5 MB aos que o fazem.

FIPS

Modo comutável (como no OTP)

A primeira chamada a crypto também tenta carregar o fornecedor fips do OpenSSL, que o OpenSSL encontra através dos seus OPENSSL_MODULES (o diretório de módulos) e OPENSSL_CONF (uma configuração que inclui o fipsmodule.cnf escrito por openssl fipsinstall e ativa o fornecedor). Depois:

As operações de chave pública obtêm os seus algoritmos através das propriedades predefinidas do OpenSSL, pelo que no modo FIPS usam as implementações do fornecedor; eddsa gera "Unsupported algorithm in FIPS mode" e SRP gera notsup, como no OTP.

A variável de aplicação fips_mode do OTP não é lida (o Clause não tem on_load e os programas não têm sys.config): os programas chamam crypto:enable_fips_mode/1 ou são compilados com o modo fixado.

Programas com modo fixado: clau --fips=PATH

--fips=PATH compila um programa que executa sempre no modo FIPS, com um fornecedor FIPS indicado pelo utilizador. PATH é um diretório que contém o módulo do fornecedor e o seu fipsmodule.cnf, ou uma instalação do OpenSSL:

FicheiroProcurado em PATH, depois em
fips.dll (Windows), fips.so (Linux), fips.dylib (macOS)lib/ossl-modules, lib64/ossl-modules, lib/<triplet>/ossl-modules
fipsmodule.cnfssl/, etc/ssl/

Que fornecedor FIPS usar

O Clause nunca compila um fornecedor FIPS para distribuição. O OpenSSL permite que outras versões usem um fornecedor FIPS validado, mas proíbe o uso de um compilado pelo próprio utilizador a partir de uma versão não validada: use o fornecedor de uma versão validada (3.1.2 à data deste texto, compilado como prescreve a sua política de segurança, ou um distribuído por um fornecedor de sistema operativo) e execute o seu openssl fipsinstall na máquina de destino quando a política o exigir. O fornecedor de 3.1.2 carrega na libcrypto 4.1 fixada: a bateria completa compila-o (apenas para o teste) e executa com ele programas de modo fixado e comutável.

Testes

TesteBateriaO que verifica
executables_crypto_digests, executables_crypto_ciphersrápidaTestes de referência do OTP 29.1.1: vetores, estados, erros, listas detetadas, info_fips sem fornecedor
linking_cryptorápidaO arquivo só é ligado quando é usado; --with-crypto[=PATH], CLAUSE_OPENSSL_ROOT, recusas
linking_fipsrápidaRecusas de --fips, fornecedores ausentes ou malformados fazem falhar a compilação, cópia, falhas no arranque
linking_crypto_sourcecompleta--with-crypto=SOURCE compila a árvore de 4.1.0 uma vez na cache de compilação
linking_crypto_minimumcompletaOs testes de referência de crypto ligados a uma libcrypto compilada a partir do código-fonte de 3.1.2 imprimem os seus resultados de referência
linking_fips_realcompletaO fornecedor FIPS de 3.1.2 (compilado com enable-fips para o teste) num programa de modo fixado (mantém-se no modo FIPS, algoritmos proibidos, um módulo adulterado termina-o) e num de modo comutável (OPENSSL_MODULES/OPENSSL_CONF)