Programación en tiempo constante
Escribir código criptográfico cuyo tiempo de ejecución y patrón de acceso a memoria no dependan de valores secretos, para que un cronómetro no pueda sustituir a la clave.
Las reglas son pocas pero incómodas: nada de saltos condicionales sobre datos secretos, nada de índices de tabla derivados de la clave y nada de instrucciones de latencia variable con operandos secretos. El error clásico es comprobar un MAC con memcmp, que se detiene en la primera diferencia y así anuncia cuántos bytes eran correctos. La versión correcta hace XOR de todos los bytes, acumula el resultado y solo lo mira al final.
Paul Kocher demostró en 1996 que los ataques de temporización contra RSA funcionan en la práctica, y desde entonces el campo consiste sobre todo en descubrir nuevos sitios por donde se escapa el tiempo. Lo difícil es que el compilador no comparte el objetivo: un optimizador que ve que el resultado ya está decidido mete con gusto una salida anticipada en el código cuidadosamente libre de ramas. Por eso las rutinas críticas se escriben a menudo en ensamblador, o se verifican después con herramientas que buscan ramas dependientes de secretos.