FIPS-modus

sgcCrypto heeft een optionele compileerschakelaar, SGC_CRYPTO_FIPS, die alleen FIPS-goedgekeurde algoritmen in de bibliotheek overlaat. Deze is bedoeld voor projecten die geen algoritmen mogen gebruiken buiten de publicaties van FIPS en NIST SP. Deze pagina legt uit wat de schakelaar doet, hoe u hem inschakelt, wat hij behoudt, wat hij verwijdert en wat hij niet dekt.

Wat FIPS hier betekent

FIPS 140-3 is een certificering van een cryptografische module, niet van een algoritme. Een geaccrediteerd laboratorium test één specifieke build van een product in het kader van het Cryptographic Module Validation Program (CMVP) van NIST, en NIST publiceert een certificaat voor die build. Het gebruik van een goedgekeurd algoritme zoals AES maakt een programma niet gevalideerd.

sgcCrypto is geen FIPS 140-3-gevalideerde module, en het inschakelen van de schakelaar is geen validatieclaim. Wat de schakelaar doet, is beperkter:

De algoritmen die blijven, volgen de publicaties van FIPS en NIST SP die in de onderstaande tabel staan.

Als uw project een formele FIPS 140-3-eis heeft, moet de cryptografie ervan via een gevalideerde module lopen, bijvoorbeeld Windows CNG met het systeem in FIPS-modus. De schakelaar helpt algoritmen die niet zijn goedgekeurd uit uw code te houden. Hij vervangt geen gevalideerde module.

Inschakelen

De schakelaar staat standaard uit. Zonder de schakelaar verandert er niets, en is elk algoritme op de pagina Cryptografie beschikbaar. Doe een van de volgende dingen om hem in te schakelen:


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

Bouw daarna opnieuw. De schakelaar heeft alleen invloed op code die met de define is gecompileerd, dus vooraf gecompileerde pakketten die zonder de define zijn gebouwd, worden niet beïnvloed.

Met de schakelaar ingeschakeld bestaan de verwijderde functies niet meer. Code die er nog een van aanroept, compileert niet en geeft de fout "Undeclared identifier". Dit is bewust zo: niets wat niet is goedgekeurd kan per ongeluk in het binaire bestand terechtkomen, en de compiler wijst elke plek aan die een ander algoritme nodig heeft.

Wat blijft

Certificaten, eenmalige wachtwoorden en de encoderingshulpfuncties blijven ook behouden, omdat ze uitsluitend zijn opgebouwd uit de goedgekeurde algoritmen of helemaal geen cryptografische algoritmen zijn.

Familie Behouden Standaard
AES AES-128/192/256 in de modi ECB, CBC, CFB, OFB, CTR, CTS, GCM en CCM, AES Key Wrap (KW en KWP), AES-CMAC en AES-GMAC FIPS 197, SP 800-38A/B/C/D/F
Hashing SHA-1 (alleen waar het nog is toegestaan, nooit voor nieuwe handtekeningen), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE en KMAC FIPS 180-4, FIPS 202, SP 800-185
Berichtauthenticatie HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 en HMAC-SHA512 FIPS 198-1
Sleutelafleiding PBKDF2, HKDF en de ANSI X9.63 KDF SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF)
RSA RSA-sleutelgeneratie, handtekeningen met PKCS#1 v1.5 en PSS, versleuteling met RSA-OAEP FIPS 186-5, SP 800-56B
ECDSA en ECDH Handtekeningen en sleutelovereenkomst op NIST P-256, P-384 en P-521 (P-224 is niet geïmplementeerd in sgcCrypto) FIPS 186-5, SP 800-56A
EdDSA Handtekeningen met Ed25519 en Ed448 FIPS 186-5
Post-quantumcryptografie ML-KEM, ML-DSA en SLH-DSA FIPS 203, FIPS 204, FIPS 205
Certificaten & PKI X.509-certificaten parseren, ketenverificatie en CRL-controles, en het genereren van certificaten of CSR's die zijn ondertekend met de bovenstaande algoritmen RFC 5280, RFC 2986
Eenmalige wachtwoorden HOTP en TOTP, gebaseerd op HMAC RFC 4226, RFC 6238
Encodering & hulpprogramma's Encodering naar Hex, Base32 en Base64, vergelijking in constante tijd, veilig overschrijven met nullen RFC 4648

Wat wordt verwijderd

Verwijderd Waarom
ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 en XChaCha20-Poly1305 Geen NIST-algoritmen.
Sleuteluitwisseling met X25519 en X448 Niet goedgekeurd voor sleutelovereenkomst in SP 800-56A.
De hybride constructie X25519 + ML-KEM-768, en ECIES Beide zijn gebaseerd op X25519.
secp256k1 en de Brainpool-curven, en BIP-340 Schnorr-handtekeningen Geen door NIST aanbevolen curven, en BIP-340 is geen handtekeningschema volgens FIPS 186-5. De FIPS-modus behoudt alleen de NIST P-curven.
Argon2 en scrypt Geen NIST-functies voor sleutelafleiding uit wachtwoorden.
BLAKE2b, BLAKE2s, SipHash en TLSH Geen NIST-algoritmen.
MD4, MD5, HMAC-MD5, RIPEMD-160 en DES (de unit sgcCrypto_Legacy) Verouderd, of nooit door NIST goedgekeurd.
KDF1 en KDF2 Gedefinieerd in ISO 18033-2, niet in een NIST-publicatie. De ANSI X9.63 KDF blijft behouden.
RSA PKCS#1 v1.5-versleuteling Niet toegestaan volgens SP 800-131A. PKCS#1 v1.5-handtekeningen blijven behouden.
WinZip AES (AE-1 en AE-2) Geen NIST-formaat.

Voor de meeste verwijderde algoritmen staat een goedgekeurd alternatief in de eerste tabel: AES-GCM in plaats van ChaCha20-Poly1305, ECDH op P-256 of P-384 in plaats van X25519, PBKDF2 in plaats van Argon2 of scrypt, SHA-256 of SHA-3 in plaats van BLAKE2, en RSA-OAEP in plaats van PKCS#1 v1.5-versleuteling.

Regels die tijdens runtime worden gecontroleerd

Sommige regels hangen af van de waarden die aan een functie worden doorgegeven, zodat de compiler ze niet kan afdwingen. Met de schakelaar ingeschakeld controleert sgcCrypto ze wanneer de functie wordt uitgevoerd, en elke overtreding genereert een uitzondering waarvan het bericht begint met sgcCrypto FIPS:

Waar de willekeurige bytes vandaan komen

Sleutels, nonces en salts hebben willekeurige bytes nodig. sgcRandomBytes leest ze in beide modi altijd uit het besturingssysteem, en draait er nooit een eigen generator bovenop. De schakelaar bepaalt alleen welke systeembron wordt gebruikt:

Platform Met SGC_CRYPTO_FIPS Zonder SGC_CRYPTO_FIPS
Windows BCryptGenRandom (CNG, door het systeem geprefereerde RNG), zonder terugval BCryptGenRandom, met terugval op RtlGenRandom en daarna CryptGenRandom wanneer BCryptGenRandom niet beschikbaar is
Linux en Android De systeemaanroep getrandom /dev/urandom
macOS en iOS SecRandomCopyBytes uit het Security-framework /dev/urandom

In beide modi wordt een uitzondering gegenereerd als geen enkele bron kan worden gelezen, in plaats van zwakke bytes terug te geven. Of de generator van het besturingssysteem als FIPS geldt, hangt af van het besturingssysteem en de configuratie ervan, niet van sgcCrypto.

Wat de schakelaar niet dekt

De schakelaar geldt alleen voor de sgcCrypto-units. Andere delen van sgcWebSockets kunnen nog steeds algoritmen gebruiken die niet zijn goedgekeurd:

Als de hele toepassing binnen goedgekeurde algoritmen moet blijven, controleer dan ook deze onderdelen.

Zie ook