Modular por diseño
El firmware de ZeroKeyUSB está escrito en C++ para el microcontrolador Microchip SAMD21E18A (ARM Cortex-M0+, 48 MHz, 256 KB flash, 32 KB SRAM).Sigue una arquitectura en capas que mantiene los drivers de hardware, las primitivas de seguridad y la interfaz de usuario claramente separadas. Cada módulo puede evolucionar de forma independiente manteniendo las rutinas críticas de seguridad auditables y fáciles de revisar.
Mapa de ficheros fuente
Secuencia de arranque
El flag de configuración en0x0000 determina si el dispositivo muestra el asistente de setup (flag ≠ 0x42) o la pantalla de desbloqueo con PIN (flag = 0x42). El asistente escribe 0x42 tras la creación exitosa del PIN.
Bucle principal
El firmware corre un bucle principal cooperativo — sin RTOS, sin interrupciones para lógica de aplicación, sin asignación dinámica de memoria: Cada iteración es determinista. Las operaciones sensibles al tiempo (cuenta atrás TOTP, delays de lockout) usanmillis() en lugar de delays bloqueantes.
Máquina de estados de pantalla
Cada vista interactiva es un estado identificado por una constanteprogramPosition. Los eventos táctiles se despachan en función de este valor:
Topología del bus I²C
Todos los periféricos comparten un único bus I²C: Velocidad del bus: 100 kHz (configurado al arranque, coincide con el bootloader).La dirección del TS06 es
0xD2 >> 1 = 0x69.
Dispositivo USB compuesto
ZeroKeyUSB se enumera como un dispositivo USB Full-Speed compuesto con dos interfaces:
Ambas interfaces están activas simultáneamente tras el arranque. El canal CDC requiere desbloqueo con PIN antes de aceptar cualquier comando que modifique datos.
Huella de memoria
No se usa asignación dinámica de memoria (
malloc/new) en ningún sitio. Todos los buffers son asignados en pila o estáticos.
Build y verificación
- Compilado con ARM GCC usando el core SAMD de Arduino.
- Proceso de build gestionado por
Makefile— soporta compilación selectiva y flasheo J-Link víaDashboard.bat. - El binario del firmware se firma con un MAC BLAKE2s y se le añade un footer de seguridad de 28 bytes.
- El bootloader verifica esta firma en cada arranque usando CRC32 + BLAKE2s antes de saltar al código de aplicación.
- El firmware sin firmar o manipulado dispara un delay de penalización de 15 segundos y cae en modo DFU USB-CDC.
ZeroKeyUSB corre sobre un stack de firmware mínimo: sin RTOS, sin asignación dinámica de memoria y sin puertas traseras de debug.
Todas las tareas son cooperativas y deterministas en tiempo — la simplicidad se trata como una característica de seguridad.
Todas las tareas son cooperativas y deterministas en tiempo — la simplicidad se trata como una característica de seguridad.