Modalità FIPS

sgcCrypto dispone di un'opzione di compilazione facoltativa, SGC_CRYPTO_FIPS, che lascia nella libreria solo gli algoritmi approvati FIPS. È pensata per i progetti che non devono utilizzare algoritmi al di fuori delle pubblicazioni FIPS e NIST SP. Questa pagina spiega cosa fa l'opzione, come attivarla, cosa mantiene, cosa rimuove e cosa non copre.

Cosa significa FIPS in questo contesto

FIPS 140-3 è una certificazione di un modulo crittografico, non di un algoritmo. Un laboratorio accreditato testa una specifica build di un prodotto nell'ambito del Cryptographic Module Validation Program (CMVP) di NIST, e NIST pubblica un certificato per quella build. Utilizzare un algoritmo approvato come AES non rende validato un programma.

sgcCrypto non è un modulo validato FIPS 140-3, e attivare l'opzione non costituisce una dichiarazione di validazione. Ciò che l'opzione fa è più limitato:

Gli algoritmi che restano seguono le pubblicazioni FIPS e NIST SP elencate nella tabella seguente.

Se il progetto ha un requisito formale FIPS 140-3, la sua crittografia deve passare attraverso un modulo validato, ad esempio Windows CNG con il sistema in esecuzione in modalità FIPS. L'opzione aiuta a tenere fuori dal codice gli algoritmi non approvati. Non sostituisce un modulo validato.

Attivazione dell'opzione

L'opzione è disattivata per impostazione predefinita. Senza di essa non cambia nulla, e ogni algoritmo elencato nella pagina Crittografia è disponibile. Per attivarla, eseguire una delle seguenti operazioni:


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

Quindi ricompilare. L'opzione influisce solo sul codice compilato con la direttiva, quindi i pacchetti precompilati generati senza di essa non ne sono interessati.

Con l'opzione attivata, le funzioni rimosse non esistono più. Il codice che ne chiama ancora una non viene compilato e produce l'errore "Undeclared identifier". È una scelta voluta: nulla di non approvato può finire per errore nel binario, e il compilatore indica ogni punto che richiede un algoritmo diverso.

Cosa resta

Restano disponibili anche i certificati, le password monouso e le funzioni di codifica, perché sono costruiti unicamente con gli algoritmi approvati oppure non sono affatto algoritmi crittografici.

Famiglia Algoritmi mantenuti Standard
AES AES-128/192/256 in modalità 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 (solo dove è ancora consentito, mai per nuove firme), 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
Autenticazione dei messaggi HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 FIPS 198-1
Derivazione delle chiavi PBKDF2, HKDF e la KDF ANSI X9.63 SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF)
RSA Generazione delle chiavi RSA, firme PKCS#1 v1.5 e PSS, cifratura RSA-OAEP FIPS 186-5, SP 800-56B
ECDSA ed ECDH Firme e key agreement su NIST P-256, P-384 e P-521 (P-224 non è implementata da sgcCrypto) FIPS 186-5, SP 800-56A
EdDSA Firme Ed25519 ed Ed448 FIPS 186-5
Crittografia post-quantistica ML-KEM, ML-DSA e SLH-DSA FIPS 203, FIPS 204, FIPS 205
Certificati e PKI Parsing dei certificati X.509, verifica della catena e controlli CRL, e generazione di certificati o CSR firmati con gli algoritmi sopra elencati RFC 5280, RFC 2986
Password monouso HOTP e TOTP, basati su HMAC RFC 4226, RFC 6238
Codifica e utilità Codifica Hex, Base32 e Base64, confronto a tempo costante, azzeramento sicuro RFC 4648

Cosa viene rimosso

Rimossi Motivo
ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 e XChaCha20-Poly1305 Non sono algoritmi NIST.
Scambio di chiavi X25519 e X448 Non sono approvati per il key agreement nella SP 800-56A.
L'ibrido X25519 + ML-KEM-768, ed ECIES Entrambi sono costruiti su X25519.
secp256k1 e le curve Brainpool, e le firme Schnorr BIP-340 Non sono curve raccomandate da NIST, e BIP-340 non è uno schema di firma FIPS 186-5. La modalità FIPS mantiene solo le curve NIST P.
Argon2 e scrypt Non sono funzioni NIST di derivazione delle chiavi da password.
BLAKE2b, BLAKE2s, SipHash e TLSH Non sono algoritmi NIST.
MD4, MD5, HMAC-MD5, RIPEMD-160 e DES (l'unit sgcCrypto_Legacy) Obsoleti, oppure mai approvati da NIST.
KDF1 e KDF2 Definite nella ISO 18033-2, non in una pubblicazione NIST. La KDF ANSI X9.63 resta disponibile.
Cifratura RSA PKCS#1 v1.5 Non consentita dalla SP 800-131A. Le firme PKCS#1 v1.5 restano disponibili.
WinZip AES (AE-1 e AE-2) Non è un formato NIST.

Per la maggior parte degli algoritmi rimossi, un sostituto approvato si trova nella prima tabella: AES-GCM al posto di ChaCha20-Poly1305, ECDH su P-256 o P-384 al posto di X25519, PBKDF2 al posto di Argon2 o scrypt, SHA-256 o SHA-3 al posto di BLAKE2, e RSA-OAEP al posto della cifratura PKCS#1 v1.5.

Regole verificate in fase di esecuzione

Alcune regole dipendono dai valori passati a una funzione, quindi il compilatore non può imporle. Con l'opzione attivata, sgcCrypto le verifica durante l'esecuzione della funzione, e ciascuna solleva un'eccezione il cui messaggio inizia con sgcCrypto FIPS:

Da dove provengono i byte casuali

Chiavi, nonce e salt richiedono byte casuali. sgcRandomBytes li legge sempre dal sistema operativo, in entrambe le modalità, e non vi sovrappone mai un proprio generatore. L'opzione cambia soltanto la sorgente di sistema utilizzata:

Piattaforma Con SGC_CRYPTO_FIPS Senza SGC_CRYPTO_FIPS
Windows BCryptGenRandom (CNG, RNG preferito dal sistema), senza fallback BCryptGenRandom, con fallback su RtlGenRandom e poi su CryptGenRandom quando BCryptGenRandom non è disponibile
Linux e Android La chiamata di sistema getrandom /dev/urandom
macOS e iOS SecRandomCopyBytes del framework Security /dev/urandom

In entrambe le modalità, se nessuna sorgente può essere letta, viene sollevata un'eccezione anziché restituire byte deboli. Il fatto che il generatore del sistema operativo sia considerato FIPS dipende dal sistema operativo e dalla sua configurazione, non da sgcCrypto.

Cosa non copre l'opzione

L'opzione si applica solo alle unit sgcCrypto. Altre parti di sgcWebSockets possono comunque utilizzare algoritmi non approvati:

Se l'intera applicazione deve limitarsi agli algoritmi approvati, verificare anche queste aree.

Vedere anche