sgcCrypto dispone de una opción de compilación de uso opcional, SGC_CRYPTO_FIPS, que deja en la biblioteca únicamente los algoritmos aprobados por FIPS. Está pensada para proyectos que no deben usar algoritmos ajenos a las publicaciones FIPS y NIST SP. Esta página explica qué hace la opción, cómo activarla, qué conserva, qué elimina y qué no cubre.
Qué significa FIPS aquí
FIPS 140-3 es una certificación de un módulo criptográfico, no de un algoritmo. Un laboratorio acreditado prueba una compilación concreta de un producto dentro del Cryptographic Module Validation Program (CMVP) del NIST, y el NIST publica un certificado para esa compilación. Usar un algoritmo aprobado, como AES, no convierte a un programa en validado.
sgcCrypto no es un módulo validado FIPS 140-3, y activar la opción no constituye una declaración de validación. Lo que hace la opción es más limitado:
Los algoritmos que se conservan siguen las publicaciones FIPS y NIST SP indicadas en la tabla siguiente.
Si su proyecto tiene un requisito formal de FIPS 140-3, su criptografía debe pasar por un módulo validado, por ejemplo Windows CNG con el sistema funcionando en modo FIPS. La opción ayuda a mantener fuera de su código los algoritmos no aprobados. No sustituye a un módulo validado.
Activar la opción
La opción está desactivada por defecto. Sin ella no cambia nada, y todos los algoritmos listados en la página Criptografía están disponibles. Para activarla, haga una de las siguientes cosas:
{.$DEFINE SGC_CRYPTO_FIPS} { off, the default }
{$DEFINE SGC_CRYPTO_FIPS} { on }
Después, vuelva a compilar. La opción solo afecta al código compilado con la definición, de modo que los paquetes precompilados que se generaron sin ella no se ven afectados.
Con la opción activada, las funciones eliminadas dejan de existir. El código que todavía llame a alguna de ellas no compila y produce un error "Undeclared identifier". Esto es intencionado: nada que no esté aprobado puede acabar en el binario por accidente, y el compilador señala cada lugar que necesita un algoritmo distinto.
Qué se conserva
También se conservan los certificados, las contraseñas de un solo uso y las funciones auxiliares de codificación, porque se construyen únicamente con los algoritmos aprobados o directamente no son algoritmos criptográficos.
| Familia | Se conserva | Estándar |
| AES | AES-128/192/256 en los modos ECB, CBC, CFB, OFB, CTR, CTS, GCM y CCM, AES Key Wrap (KW y KWP), AES-CMAC y AES-GMAC | FIPS 197, SP 800-38A/B/C/D/F |
| Hash | SHA-1 (solo donde todavía está permitido, nunca para firmas nuevas), SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224/256/384/512, SHAKE128, SHAKE256, cSHAKE y KMAC | FIPS 180-4, FIPS 202, SP 800-185 |
| Autenticación de mensajes | HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 y HMAC-SHA512 | FIPS 198-1 |
| Derivación de claves | PBKDF2, HKDF y la ANSI X9.63 KDF | SP 800-132 (PBKDF2), SP 800-56C (HKDF), SP 800-135 (ANSI X9.63 KDF) |
| RSA | Generación de claves RSA, firmas PKCS#1 v1.5 y PSS, cifrado RSA-OAEP | FIPS 186-5, SP 800-56B |
| ECDSA y ECDH | Firmas y acuerdo de claves sobre NIST P-256, P-384 y P-521 (sgcCrypto no implementa P-224) | FIPS 186-5, SP 800-56A |
| EdDSA | Firmas Ed25519 y Ed448 | FIPS 186-5 |
| Criptografía poscuántica | ML-KEM, ML-DSA y SLH-DSA | FIPS 203, FIPS 204, FIPS 205 |
| Certificados y PKI | Análisis de certificados X.509, verificación de cadena y comprobación de CRL, y generación de certificados o CSR firmados con los algoritmos anteriores | RFC 5280, RFC 2986 |
| Contraseñas de un solo uso | HOTP y TOTP, construidos sobre HMAC | RFC 4226, RFC 6238 |
| Codificación y utilidades | Codificación Hex, Base32 y Base64, comparación en tiempo constante, borrado seguro | RFC 4648 |
Qué se elimina
| Eliminado | Motivo |
| ChaCha20, XChaCha20, Salsa20, XSalsa20, Poly1305, ChaCha20-Poly1305 y XChaCha20-Poly1305 | No son algoritmos del NIST. |
| Intercambio de claves X25519 y X448 | No están aprobados para el acuerdo de claves en SP 800-56A. |
| El híbrido X25519 + ML-KEM-768, y ECIES | Ambos se construyen sobre X25519. |
| secp256k1 y las curvas Brainpool, y las firmas Schnorr BIP-340 | No son curvas recomendadas por el NIST, y BIP-340 no es un esquema de firma de FIPS 186-5. El modo FIPS conserva solo las curvas P del NIST. |
| Argon2 y scrypt | No son funciones del NIST para la derivación de claves a partir de contraseñas. |
| BLAKE2b, BLAKE2s, SipHash y TLSH | No son algoritmos del NIST. |
| MD4, MD5, HMAC-MD5, RIPEMD-160 y DES (la unidad sgcCrypto_Legacy) | Obsoletos, o nunca aprobados por el NIST. |
| KDF1 y KDF2 | Definidas en ISO 18033-2, no en una publicación del NIST. La ANSI X9.63 KDF se conserva. |
| Cifrado RSA PKCS#1 v1.5 | No permitido por SP 800-131A. Las firmas PKCS#1 v1.5 se conservan. |
| WinZip AES (AE-1 y AE-2) | No es un formato del NIST. |
Para la mayoría de los algoritmos eliminados hay un sustituto aprobado en la primera tabla: AES-GCM en lugar de ChaCha20-Poly1305, ECDH sobre P-256 o P-384 en lugar de X25519, PBKDF2 en lugar de Argon2 o scrypt, SHA-256 o SHA-3 en lugar de BLAKE2, y RSA-OAEP en lugar del cifrado PKCS#1 v1.5.
Reglas comprobadas en tiempo de ejecución
Algunas reglas dependen de los valores que se pasan a una función, por lo que el compilador no puede hacerlas cumplir. Con la opción activada, sgcCrypto las comprueba cuando se ejecuta la función, y cada una lanza una excepción cuyo mensaje empieza por sgcCrypto FIPS:
De dónde proceden los bytes aleatorios
Las claves, los nonces y los salts necesitan bytes aleatorios. sgcRandomBytes siempre los lee del sistema operativo, en ambos modos, y nunca ejecuta por encima un generador propio. La opción solo cambia qué fuente del sistema se utiliza:
| Plataforma | Con SGC_CRYPTO_FIPS | Sin SGC_CRYPTO_FIPS |
| Windows | BCryptGenRandom (CNG, RNG preferido del sistema), sin alternativa de respaldo | BCryptGenRandom, recurriendo a RtlGenRandom y después a CryptGenRandom cuando BCryptGenRandom no está disponible |
| Linux y Android | La llamada al sistema getrandom | /dev/urandom |
| macOS e iOS | SecRandomCopyBytes del framework Security | /dev/urandom |
En ambos modos, si no se puede leer ninguna fuente, se lanza una excepción en lugar de devolver bytes débiles. Que el generador del sistema operativo cuente como FIPS depende del sistema operativo y de su configuración, no de sgcCrypto.
Qué no cubre la opción
La opción se aplica únicamente a las unidades sgcCrypto. Otras partes de sgcWebSockets todavía pueden usar algoritmos no aprobados:
Si toda la aplicación debe limitarse a algoritmos aprobados, revise también estas áreas.
Véase también