Mode FIPS

sgcCrypto dispose d'un commutateur de compilation optionnel, SGC_CRYPTO_FIPS, qui ne laisse dans la bibliothèque que les algorithmes approuvés FIPS. Il est destiné aux projets qui ne doivent pas utiliser d'algorithmes en dehors des publications FIPS et NIST SP. Cette page explique ce que fait ce commutateur, comment l'activer, ce qu'il conserve, ce qu'il supprime et ce qu'il ne couvre pas.

Ce que FIPS signifie ici

FIPS 140-3 est la certification d'un module cryptographique, et non d'un algorithme. Un laboratoire accrédité teste une version compilée précise d'un produit dans le cadre du Cryptographic Module Validation Program (CMVP) du NIST, et le NIST publie un certificat pour cette version compilée. Utiliser un algorithme approuvé tel qu'AES ne fait pas d'un programme un programme validé.

sgcCrypto n'est pas un module validé FIPS 140-3, et activer le commutateur ne constitue pas une revendication de validation. Ce que fait le commutateur est plus limité :

Les algorithmes conservés suivent les publications FIPS et NIST SP listées dans le tableau ci-dessous.

Si votre projet est soumis à une exigence FIPS 140-3 formelle, sa cryptographie doit passer par un module validé, par exemple Windows CNG avec le système fonctionnant en mode FIPS. Le commutateur aide à tenir les algorithmes non approuvés à l'écart de votre code. Il ne remplace pas un module validé.

Activer le commutateur

Le commutateur est désactivé par défaut. Sans lui, rien ne change, et tous les algorithmes listés sur la page Cryptographie sont disponibles. Pour l'activer, procédez de l'une des manières suivantes :


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

Recompilez ensuite. Le commutateur n'affecte que le code compilé avec la directive, de sorte que les packages précompilés sans elle ne sont pas affectés.

Lorsque le commutateur est activé, les fonctions supprimées n'existent plus. Le code qui appelle encore l'une d'elles ne compile pas et produit une erreur « Undeclared identifier ». C'est voulu : rien de ce qui n'est pas approuvé ne peut se retrouver par accident dans le binaire, et le compilateur signale chaque endroit qui nécessite un autre algorithme.

Ce qui est conservé

Les certificats, les mots de passe à usage unique et les utilitaires d'encodage sont également conservés, car ils sont construits uniquement à partir des algorithmes approuvés ou ne sont pas du tout des algorithmes cryptographiques.

Famille Conservé Norme
AES AES-128/192/256 en modes ECB, CBC, CFB, OFB, CTR, CTS, GCM et CCM, AES Key Wrap (KW et KWP), AES-CMAC et AES-GMAC FIPS 197, SP 800-38A/B/C/D/F
Hachage SHA-1 (uniquement là où il est encore autorisé, jamais pour de nouvelles signatures), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE et KMAC FIPS 180-4, FIPS 202, SP 800-185
Authentification des messages HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 et HMAC-SHA512 FIPS 198-1
Dérivation de clé PBKDF2, HKDF et le KDF ANSI X9.63 SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (KDF ANSI X9.63)
RSA Génération de clés RSA, signatures PKCS#1 v1.5 et PSS, chiffrement RSA-OAEP FIPS 186-5, SP 800-56B
ECDSA et ECDH Signatures et accord de clé sur NIST P-256, P-384 et P-521 (la courbe P-224 n'est pas implémentée par sgcCrypto) FIPS 186-5, SP 800-56A
EdDSA Signatures Ed25519 et Ed448 FIPS 186-5
Cryptographie post-quantique ML-KEM, ML-DSA et SLH-DSA FIPS 203, FIPS 204, FIPS 205
Certificats & PKI Analyse des certificats X.509, vérification de chaîne et contrôle des CRL, et génération de certificats ou de CSR signés avec les algorithmes ci-dessus RFC 5280, RFC 2986
Mots de passe à usage unique HOTP et TOTP, reposant sur HMAC RFC 4226, RFC 6238
Encodage & utilitaires Encodage Hex, Base32 et Base64, comparaison en temps constant, effacement sécurisé RFC 4648

Ce qui est supprimé

Supprimé Raison
ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 et XChaCha20-Poly1305 Ce ne sont pas des algorithmes du NIST.
Échange de clés X25519 et X448 Non approuvés pour l'accord de clé par la SP 800-56A.
L'hybride X25519 + ML-KEM-768, et ECIES Tous deux reposent sur X25519.
secp256k1 et les courbes Brainpool, ainsi que les signatures Schnorr BIP-340 Ce ne sont pas des courbes recommandées par le NIST, et BIP-340 n'est pas un schéma de signature FIPS 186-5. Le mode FIPS ne conserve que les courbes NIST P.
Argon2 et scrypt Ce ne sont pas des fonctions de dérivation de clé à partir de mots de passe du NIST.
BLAKE2b, BLAKE2s, SipHash et TLSH Ce ne sont pas des algorithmes du NIST.
MD4, MD5, HMAC-MD5, RIPEMD-160 et DES (l'unité sgcCrypto_Legacy) Obsolètes, ou jamais approuvés par le NIST.
KDF1 et KDF2 Définis dans l'ISO 18033-2, et non dans une publication du NIST. Le KDF ANSI X9.63 est conservé.
Chiffrement RSA PKCS#1 v1.5 Interdit par la SP 800-131A. Les signatures PKCS#1 v1.5 sont conservées.
WinZip AES (AE-1 et AE-2) Ce n'est pas un format du NIST.

Pour la plupart des algorithmes supprimés, un remplaçant approuvé figure dans le premier tableau : AES-GCM au lieu de ChaCha20-Poly1305, ECDH sur P-256 ou P-384 au lieu de X25519, PBKDF2 au lieu d'Argon2 ou de scrypt, SHA-256 ou SHA-3 au lieu de BLAKE2, et RSA-OAEP au lieu du chiffrement PKCS#1 v1.5.

Règles vérifiées à l'exécution

Certaines règles dépendent des valeurs passées à une fonction, de sorte que le compilateur ne peut pas les imposer. Lorsque le commutateur est activé, sgcCrypto les vérifie à l'exécution de la fonction, et chacune lève une exception dont le message commence par sgcCrypto FIPS:

D'où proviennent les octets aléatoires

Les clés, les nonces et les sels nécessitent des octets aléatoires. sgcRandomBytes les lit toujours depuis le système d'exploitation, dans les deux modes, et n'exécute jamais son propre générateur par-dessus. Le commutateur ne change que la source système utilisée :

Plateforme Avec SGC_CRYPTO_FIPS Sans SGC_CRYPTO_FIPS
Windows BCryptGenRandom (CNG, générateur aléatoire préféré du système), sans repli BCryptGenRandom, avec repli sur RtlGenRandom puis sur CryptGenRandom lorsque BCryptGenRandom n'est pas disponible
Linux et Android L'appel système getrandom /dev/urandom
macOS et iOS SecRandomCopyBytes du framework Security /dev/urandom

Dans les deux modes, si aucune source ne peut être lue, une exception est levée au lieu de renvoyer des octets faibles. Que le générateur du système d'exploitation soit considéré comme FIPS ou non dépend du système d'exploitation et de sa configuration, et non de sgcCrypto.

Ce que le commutateur ne couvre pas

Le commutateur s'applique uniquement aux unités sgcCrypto. D'autres parties de sgcWebSockets peuvent encore utiliser des algorithmes non approuvés :

Si l'application entière doit s'en tenir aux algorithmes approuvés, examinez également ces domaines.

Voir aussi