Qué hicimos
iraca es un arnés que verifica la criptografía post-cuántica que el ecosistema Rust realmente usa, diferenciándola contra una implementación independiente. Primer resultado público: el crate ml-kem de RustCrypto (ML-KEM / FIPS 203), muy usado y sin auditoría independiente publicada, resulta idéntico byte a byte a la referencia en C de pq-crystals en generación de claves, encapsulación y decapsulación, y rechaza correctamente las claves no-canónicas que exige FIPS 203.
Es un chequeo de conformidad, no una auditoría completa, y no cubre canales laterales (la clase KyberSlash).
Por qué importa
Los estándares NIST (FIPS 203/204/205) son definitivos y la migración es obligatoria. Buena parte del mundo Rust usa los crates de RustCrypto, que hoy no tienen auditoría independiente. Diferenciar una implementación muy usada contra otra distinta, en otro lenguaje, caza la clase de error que dos adaptaciones al mismo lenguaje podrían compartir.
El método: los mismos bytes crudos a los dos lados
iraca alimenta los mismos bytes al crate y a la referencia C de pq-crystals por sus entradas deterministas, sin DRBG y sin repetir vectores. Con determinismo de extremo a extremo, toda discrepancia es real, no ruido de aleatoriedad. La referencia C se compila desde el fuente y se enlaza tras un módulo FFI delgado; el resto es Rust seguro.
Una capa adversaria prueba además la validación de entrada: genera claves de encapsulación no-canónicas (un coeficiente mayor o igual a q) y comprueba que el crate las rechace, como exige FIPS 203 (el llamado modulus check). El oráculo de canonicidad es el estándar mismo, no otra implementación.
Resultados
- Diferencial funcional (ML-KEM-768): claves, textos cifrados y secretos compartidos idénticos byte a byte a pq-crystals en 128 semillas más un vector fijo.
- Conformidad adversaria (ML-KEM-768): RustCrypto rechaza las claves no-canónicas exigidas por FIPS 203; confirmado por lectura del fuente y por ejecución en 128 muestras.
- Resultado acompañante (ML-DSA-87): el mismo diferencial cruzado muestra acuerdo byte a byte con la referencia dilithium, con verificación cruzada y una prueba de manipulación.
Cada resultado lleva su pareja rojo/verde y su control positivo: un resultado sin discrepancia significa que el camino de comparación de verdad se ejecutó y sabe distinguir.
Qué no es
No es una auditoría completa; no es análisis de canal lateral ni temporal; es una versión y unas propiedades concretas. El aseguramiento es acumulativo, no un sello único.
Reproducible y para colaborar
El arnés es pequeño, determinista y pensado para re-correrse. Si mantienes una implementación post-cuántica y quieres una pasada diferencial y adversaria independiente, o un oráculo contra el cual diferenciar tu trabajo, para eso es. También colaboro con el esfuerzo post-cuántico de la Ethereum Foundation en verificación de esquemas de firma.
Xiliux