Mapa de memoria
La EEPROM está organizada en una zona de configuración (primeros ~220 bytes) y una zona de credenciales (resto):Estructura del slot de credencial
Cada uno de los 61 slots de credenciales ocupa 4 páginas consecutivas de 32 bytes en EEPROM (128 bytes en total): Cada página de 32 bytes contiene:- 16 bytes de texto plano (rellenados con
0xFF) cifrados como dos bloques AES-128 CBC - El cifrado usa el IV global del dispositivo más la clave maestra AES que vive dentro del slot 8 del ATECC — las rondas del cifrador corren en el chip, nunca en el MCU.
status o CRC separado por página. Los slots vacíos se escriben como blancos 0xFF cifrados durante silentEraseAll().
Cálculo de dirección de página
FIRST_CREDENTIAL_PAGEse calcula a partir deCONFIG_TOTP_META_ENDredondeado al siguiente límite de 32 bytes.slotIndexva de 0 a 61.pageIndexva de 0 (sitio) a 3 (TOTP).
Secuencia de escritura
La funciónwriteEepromPage() escribe 32 bytes en una dirección alineada a página:
- Comprueba la presencia de EEPROM vía
Wire.beginTransmission()+ test de ACK. - Envía la dirección de 2 bytes (MSB primero) seguida de 32 bytes de datos.
- Espera 10 ms para el ciclo de escritura interno de la EEPROM.
- Devuelve
truesiWire.endTransmission()no reportó error.
eepromWriteRaw() en zerokey-security.cpp divide los datos en los límites de 32 bytes para evitar el comportamiento de wrap-around de direcciones del M24C64.
Secuencia de lectura
readEepromPage() lee exactamente 32 bytes:
- Envía la dirección de 2 bytes vía escritura I²C.
- Emite
Wire.requestFrom(eepromAddress, 32). - Lee todos los bytes disponibles al buffer de salida.
- Rellena con ceros los bytes no recibidos (lectura parcial = error).
Metadatos TOTP
Cada slot de credencial tiene una entrada de metadatos TOTP de 2 bytes en la zona de configuración:
Los metadatos se leen/escriben independientemente de las páginas de credenciales para permitir detección rápida de TOTP sin descifrar el slot completo.
Características de desgaste
- La M24C64-WMN6TP soporta >1 millón de ciclos de escritura por página (garantía del datasheet).
- Las páginas de credenciales solo se reescriben cuando el usuario edita un campo o importa datos.
- Las páginas de la zona de configuración (IV, hash de PIN, umbral) se escriben durante el aprovisionamiento y cambios de PIN — eventos infrecuentes.
- El epoch TOTP en
0x0040se actualiza cada vez que el usuario sincroniza la hora o genera un código — es la ubicación más escrita. - Como las credenciales suelen ser estáticas, la vida útil esperada de la EEPROM supera las décadas de uso normal.
Resolución de problemas
Ninguna credencial descifrada toca memoria persistente sin acción explícita del usuario. El texto plano solo existe en SRAM durante la sesión activa.