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