Modo FIPS

O sgcCrypto oferece uma opção facultativa em tempo de compilação, SGC_CRYPTO_FIPS, que deixa na biblioteca apenas algoritmos aprovados pelo FIPS. Ela é destinada a projetos que não podem usar algoritmos fora das publicações FIPS e NIST SP. Esta página explica o que a opção faz, como ativá-la, o que ela mantém, o que ela remove e o que ela não cobre.

 

O que FIPS significa aqui

 

A FIPS 140-3 é uma certificação de um módulo criptográfico, não de um algoritmo. Um laboratório acreditado testa um build específico de um produto no âmbito do Cryptographic Module Validation Program (CMVP) do NIST, e o NIST publica um certificado para esse build. Usar um algoritmo aprovado, como o AES, não torna um programa validado.

 

O sgcCrypto não é um módulo validado conforme a FIPS 140-3, e ativar a opção não é uma alegação de validação. O que a opção faz é mais restrito:

Os algoritmos que permanecem seguem as publicações FIPS e NIST SP listadas na tabela abaixo.

 

Se o seu projeto tem um requisito formal de FIPS 140-3, a criptografia dele precisa passar por um módulo validado, por exemplo o Windows CNG com o sistema executando em modo FIPS. A opção ajuda a manter algoritmos não aprovados fora do seu código. Ela não substitui um módulo validado.

 

Ativando a opção

 

A opção vem desativada por padrão. Sem ela nada muda, e todo algoritmo listado na página Criptografia fica disponível. Para ativá-la, faça uma das seguintes ações:

 


  {.$DEFINE SGC_CRYPTO_FIPS}   { off, the default }
  {$DEFINE SGC_CRYPTO_FIPS}    { on }

 

Em seguida, recompile. A opção afeta apenas o código compilado com a definição, de modo que pacotes pré-compilados que foram gerados sem ela não são afetados.

 

Com a opção ativada, as funções removidas deixam de existir. Código que ainda chama alguma delas falha ao compilar com um erro "Undeclared identifier". Isso é intencional: nada que não seja aprovado pode acabar no binário por acidente, e o compilador aponta cada lugar que precisa de um algoritmo diferente.

 

O que permanece

 

Certificados, senhas de uso único e os auxiliares de codificação também permanecem, porque são construídos apenas a partir dos algoritmos aprovados ou nem sequer são algoritmos criptográficos.

 

Família Mantido Padrão
AES AES-128/192/256 nos modos ECB, CBC, CFB, OFB, CTR, CTS, GCM e CCM, AES Key Wrap (KW e KWP), AES-CMAC e AES-GMAC FIPS 197, SP 800-38A/B/C/D/F
Hashing SHA-1 (apenas onde ainda é permitido, nunca para novas assinaturas), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE e KMAC FIPS 180-4, FIPS 202, SP 800-185
Autenticação de mensagens HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 FIPS 198-1
Derivação de chaves PBKDF2, HKDF e o ANSI X9.63 KDF SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF)
RSA Geração de chave RSA, assinaturas PKCS#1 v1.5 e PSS, criptografia RSA-OAEP FIPS 186-5, SP 800-56B
ECDSA e ECDH Assinaturas e acordo de chave nas curvas NIST P-256, P-384 e P-521 (a P-224 não é implementada pelo sgcCrypto) FIPS 186-5, SP 800-56A
EdDSA Assinaturas Ed25519 e Ed448 FIPS 186-5
Criptografia pós-quântica ML-KEM, ML-DSA e SLH-DSA FIPS 203, FIPS 204, FIPS 205
Certificados & PKI Parsing de certificados X.509, verificação de cadeia e de CRL, e geração de certificados ou de CSRs assinados com os algoritmos acima RFC 5280, RFC 2986
Senhas de uso único HOTP e TOTP, construídos sobre HMAC RFC 4226, RFC 6238
Codificação & utilitários Codificação Hex, Base32 e Base64, comparação em tempo constante, zero seguro RFC 4648

 

O que é removido

 

Removido Motivo
ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 e XChaCha20-Poly1305 Não são algoritmos do NIST.
Troca de chaves X25519 e X448 Não são aprovados para acordo de chave na SP 800-56A.
O híbrido X25519 + ML-KEM-768, e o ECIES Ambos são construídos sobre o X25519.
secp256k1 e as curvas Brainpool, e as assinaturas Schnorr BIP-340 Não são curvas recomendadas pelo NIST, e o BIP-340 não é um esquema de assinatura da FIPS 186-5. O modo FIPS mantém apenas as curvas NIST P.
Argon2 e scrypt Não são funções do NIST para derivação de chaves a partir de senhas.
BLAKE2b, BLAKE2s, SipHash e TLSH Não são algoritmos do NIST.
MD4, MD5, HMAC-MD5, RIPEMD-160 e DES (a unit sgcCrypto_Legacy) Obsoletos, ou nunca aprovados pelo NIST.
KDF1 e KDF2 Definidos na ISO 18033-2, não em uma publicação do NIST. O ANSI X9.63 KDF permanece.
Criptografia RSA PKCS#1 v1.5 Não permitida pela SP 800-131A. As assinaturas PKCS#1 v1.5 permanecem.
WinZip AES (AE-1 e AE-2) Não é um formato do NIST.

 

Para a maioria dos algoritmos removidos há um substituto aprovado na primeira tabela: AES-GCM em vez de ChaCha20-Poly1305, ECDH em P-256 ou P-384 em vez de X25519, PBKDF2 em vez de Argon2 ou scrypt, SHA-256 ou SHA-3 em vez de BLAKE2, e RSA-OAEP em vez da criptografia PKCS#1 v1.5.

 

Regras verificadas em tempo de execução

 

Algumas regras dependem dos valores passados a uma função, de modo que o compilador não consegue impô-las. Com a opção ativada, o sgcCrypto as verifica quando a função é executada, e cada uma gera uma exceção cuja mensagem começa com sgcCrypto FIPS:

 

De onde vêm os bytes aleatórios

 

Chaves, nonces e salts precisam de bytes aleatórios. A função sgcRandomBytes sempre os lê do sistema operacional, nos dois modos, e nunca executa um gerador próprio por cima. A opção muda apenas qual fonte do sistema é usada:

 

Plataforma Com SGC_CRYPTO_FIPS Sem SGC_CRYPTO_FIPS
Windows BCryptGenRandom (CNG, RNG preferido do sistema), sem fallback BCryptGenRandom, recorrendo ao RtlGenRandom e depois ao CryptGenRandom quando o BCryptGenRandom não está disponível
Linux e Android A chamada de sistema getrandom /dev/urandom
macOS e iOS SecRandomCopyBytes do framework Security /dev/urandom

 

Nos dois modos, se nenhuma fonte puder ser lida, uma exceção é gerada em vez de retornar bytes fracos. Se o gerador do sistema operacional conta como FIPS depende do sistema operacional e da sua configuração, não do sgcCrypto.

 

O que a opção não cobre

 

A opção se aplica apenas às units do sgcCrypto. Outras partes do sgcWebSockets ainda podem usar algoritmos não aprovados:

Se a aplicação inteira precisa se restringir a algoritmos aprovados, revise também essas áreas.

 

Veja também