Módulo Criptográfico
Archivo: src/crypto.rs (1004 líneas)
¿Por qué existe?
Implementa operaciones criptográficas esenciales sin dependencias externas. Incluye generación de números aleatorios seguros, cifrado simétrico (AES-256-GCM, ChaCha20-Poly1305), y derivación de claves (PBKDF2). Todo implementado a mano en Rust puro.
Componentes
1. CSPRNG — Aleatoriedad segura
Genera bytes criptográficamente aleatorios usando la API del sistema operativo:
- Windows:
BCryptGenRandom - Linux/BSD:
getrandom()syscall - macOS:
CCRandomGenerateBytes(Security framework)
2. Comparación en tiempo constante
constant_time_equal(a, b) -> bool — Compara dos slices de bytes sin cortocircuitos, previniendo ataques de canal lateral (timing attacks).
3. AES-256
Implementación manual completa:
- S-box estándar de AES
- Key expansion para 256 bits (14 rondas)
- Modos: ECB (base), CBC (con IV), GCM (AEAD con autenticación)
- Tamaño de bloque: 16 bytes (128 bits)
4. ChaCha20 + Poly1305
Implementación del AEAD RFC 8439:
- ChaCha20: Cifrado en flujo con 20 rondas, cuarto de ronda optimizado
- Poly1305: MAC (código de autenticación) de alta velocidad
- Modo AEAD combinado: cifrado + autenticación en una sola operación
5. PBKDF2-HMAC-SHA256
Derivación de claves a partir de contraseñas con salt automático y número configurable de iteraciones. Usa HMAC-SHA256 como PRF subyacente.
API Pública
| Función | Descripción |
|---|---|
random_bytes(n) | Genera n bytes aleatorios seguros |
constant_time_equal(a, b) | Comparación en tiempo constante |
aes256_gcm_encrypt(clave, iv, datos, aad) | Cifrado AES-256-GCM |
aes256_gcm_decrypt(clave, iv, cifrado, aad, tag) | Descifrado AES-256-GCM |
chacha20_poly1305_encrypt(clave, nonce, datos, aad) | Cifrado ChaCha20-Poly1305 |
chacha20_poly1305_decrypt(clave, nonce, cifrado, aad, tag) | Descifrado ChaCha20-Poly1305 |
pbkdf2_sha256(contraseña, salt, iteraciones, len) | Derivación de clave PBKDF2 |
Uso desde Forja
Estas operaciones se exponen a través del módulo crypto.fa de la stdlib, que provee una API en español: cifrar_aes_gcm, descifrar_aes_gcm, cifrar_chacha20, etc.