Skip to main content

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 en 0x0000 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) usan millis() en lugar de delays bloqueantes.

Máquina de estados de pantalla

Cada vista interactiva es un estado identificado por una constante programPosition. 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ía Dashboard.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.