Modo FIPS

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