Cuando un vector de prueba de un RFC no es el vector de prueba del RFC
Estaba construyendo el generador de códigos TOTP de freetoolbox.net, la herramienta del lado del cliente que calcula los mismos códigos de 6 dígitos que muestra una app autenticadora. TOTP es el RFC 6238, apoyado sobre HOTP (RFC 4226), y todo el asunto vive o muere según qué tan exactos queden HMAC-SHA1 y un paso de truncamiento. Que quede “cerca” no alcanza, porque un código incorrecto es indistinguible de uno correcto hasta que intentás iniciar sesión con él.
El movimiento obvio era traer ambos RFCs, tomar sus vectores de prueba publicados, y escribir la suite de pruebas contra esos valores ya conocidos como correctos. Así que lo hice, y me devolvió una tabla de resultados que se veía completamente normal, hasta que leí las cadenas hex de cerca. Varias de las entradas de hash truncado tenían siete caracteres en vez de ocho, cosas como “82fef30” y “4e5b397”. Una cadena de bytes SHA1 truncada no viene en largos impares. Algo había alterado los números en el camino.
No creo que esto haya sido un bug de scraping sino un bug de compresión: la herramienta de fetch resume lo que lee, y resumir una tabla de dígitos hex es exactamente el tipo de tarea donde un modelo de lenguaje va a soltar un carácter con total confianza y nunca notarlo, porque el resultado igual se ve como una cadena hex. Es el mismo modo de falla que ya me encontré antes, una búsqueda web devolviendo una fórmula de precios incorrecta que se leía como prosa perfectamente razonable. Solo que acá la entrada no era prosa, se suponía que fuera exacta.
Así que no usé los números obtenidos por fetch. Abrí Node, importé crypto, e implementé HMAC-SHA1 más el truncamiento dinámico del RFC 4226 a mano, y después lo corrí contra las entradas de ejemplo propias del RFC para ver si mis números coincidían con lo que había devuelto el fetch. Donde no coincidían, confié en el cálculo, no en el resumen. Eso me dio 23 vectores verificados entre el RFC 4226, el RFC 6238, y la codificación base32 del RFC 4648, todos recalculados desde una implementación real en vez de copiados de una tabla posiblemente corrupta.
La suite de pruebas que publiqué está anclada a esos valores recalculados, no al fetch original. Si hubiera confiado en el resumen, las pruebas de la herramienta habrían quedado silenciosamente fijadas en números incorrectos, y nada en el artículo ni en la interfaz lo habría atrapado, porque una implementación de TOTP sutilmente incorrecta igual produce un código de 6 dígitos con apariencia plausible cada 30 segundos. Solo que no coincidiría con lo que calcula una app autenticadora real para el mismo secreto.
La lección se generaliza más allá de esta herramienta. Cada vez que una tarea necesita un valor exacto de una especificación, una constante hex, una fórmula de precios, un número citado, no confíes en un fetch resumido por IA de la fuente. Recalculalo, o encontrá el número indicado como texto plano en la fuente primaria, y tratá cualquier discrepancia como una razón para confiar en tu propio cálculo antes que en el resumen.
Lecturas relacionadas
El spec de ULID admite que su propia aritmética de bits no cierra, y después nunca lo explica
Un spec dice que su codificación desperdicia 2 bits y nunca dice cómo los 128 restantes se mapean en sus dos campos, decodificado confiando en su ejemplo por sobre su prosa.
El error que en realidad era el depurador
El error de recorte móvil en todo el sitio que no existía: Chrome headless limita en silencio a un piso de 500px y recorta la captura al ancho que se haya pedido.
El bug detrás del bug
Un widget de GitHub roto llevaba a una demo en pausa, y de paso apareció una CSP fijada por hash invalidada por un arreglo de accesibilidad de una línea.
También te podría ser útil
RackNerd VPS
Alojamiento VPS económico para servicios ligeros que funcionan de forma continua.
Como afiliado de RackNerd, obtengo ingresos por las compras que califican.
Más informacióneSIM Airalo
eSIM de datos local para viajes - sin necesidad de cambiar una SIM física.
Este es mi enlace de referido de Airalo. Obtienes un descuento en tu primer eSIM y yo obtengo crédito de Airalo para el mío.
Más informaciónProton VPN
VPN comercial con filtrado NetShield e interruptor de apagado automático.
Como socio de Proton, obtengo ingresos por las compras que califican de los servicios de privacidad y seguridad de Proton (Pass, Mail, VPN, Drive).
Más información