Saltar al contenido
El Registro de Jornada .com

Verificación

La cadena de integridad, especificada

Todo lo necesario para comprobar un registro sin usar nuestra aplicación: campos, orden, codificación y resumen, con vectores de prueba que cualquier implementación debe reproducir.

Resumen

Qué se calcula

Cada asiento lleva el resumen del anterior y el suyo. El suyo es el SHA-256, en hexadecimal minúscula, del resumen previo, una barra vertical y el JSON canónico de todos sus campos salvo cinco de control:

datos = asiento sin id, secuencia, hashPrevio, hash ni registradoEn
hash  = SHA-256( hashPrevio + "|" + canónico(datos) )

El primer asiento de una empresa tiene como resumen previo 64 ceros. Para cada asiento, por orden de secuencia, se comprueba que la secuencia sube de uno en uno, que su resumen previo es el del anterior, que su resumen coincide con el recalculado y que la hora de registro no retrocede. Se informan todas las roturas, no solo la primera.

El JSON canónico no lleva espacios, ordena las claves por unidades de código UTF-16, escapa solo comillas, barra invertida y caracteres de control, y escribe los números comoNumber::toString de ECMAScript (1.0 es 1, 1e+21,1e-7). Esos detalles son los que hacen fallar una implementación nueva, y por eso hay vectores específicos para ellos.

Encima de la cadena hay tres pruebas más: un sello diario encadenado, un sello diario firmado con Ed25519 y un recibo firmado por asiento (JWS, RFC 7515). Y un paquete pericial, un único fichero con todo ello. La especificación completa, con los códigos de problema de cada comprobación, está en ESPECIFICACION-INTEGRIDAD.md.

Implementaciones

Tres programas que coinciden

Además de la del motor de la aplicación, hay dos implementaciones independientes, escritas a partir de la especificación y no a partir del motor. Una prueba automática exige que las cuatro den el mismo veredicto y los mismos códigos en todos los vectores.

  • verificar.mjs: un fichero de Node.js 20 o superior, sin dependencias ni red, que también se ejecuta en el navegador (es el de /verificacion).
  • verificar.py: referencia en Python 3.9 o superior, solo biblioteca estándar, con Ed25519 incluido. Pensada para contrastar la especificación desde otro lenguaje, no como sustituto de una librería criptográfica auditada.
node verificar.mjs paquete.json
python verificar.py paquete.json

Vectores

Casos de prueba oficiales

Cada fichero se descarga tal cual. La salida esperada es 0 si todo cuadra y 1 si hay problemas; los códigos son un conjunto, sin repetir. El índice completo, con el JWKS de las claves de prueba, es esperado.json. Las claves de estos vectores son de prueba, fijas y públicas: no pertenecen a ningún servidor.

FicheroQué contieneResultado esperado
paquete-valido.jsonPaquete íntegro: 6 asientos en 3 días, sellos, sellos firmados y 2 recibosVálido
paquete-asiento-alterado.jsonUn asiento con la hora cambiada y las huellas del paquete rehechascadena_hash_no_corresponde
paquete-asiento-borrado.jsonUn asiento quitadocadena_secuencia_incorrecta, cadena_discontinua y sellos firmados
paquete-asiento-insertado.jsonUn asiento falso metido entre doscadena_secuencia_incorrecta, cadena_discontinua y sellos firmados
paquete-cadena-reescrita.jsonAsiento alterado con la cadena recalculada: cuadra por sí solarecibo_no_coincide, cierre_no_corresponde, sello_firmado_huella
paquete-sello-falso.jsonSello diario firmado por otra clavesello_firmado_invalido
paquete-un-byte.jsonUn solo byte cambiado en el ficherohuella_global, huella_parte
cadena-valida.jsonLista de asientos íntegraVálida
cadena-alterada.jsonLista con un asiento alteradocadena_hash_no_corresponde
cadena-con-hueco.jsonLista con un asiento borradocadena_secuencia_incorrecta, cadena_discontinua
cadena-insertada.jsonLista con un asiento falso insertadocadena_secuencia_incorrecta, cadena_discontinua
recibo-valido.txtRecibo firmado (con jwks.json y asiento-del-recibo.json)Válido
recibo-falso.txtRecibo firmado por otra claverecibo_invalido
canonizacion.jsonCasos de canonización y de resumen de asientoReproducir el resultado

Límites

Qué no acredita

  • Prueba integridad, no autoría ni que los hechos sean ciertos: un fichaje falso desde el origen queda igual de encadenado.
  • Los recibos y los sellos firmados llevan una clave de El Registro de Jornada: son sellos de integridad, no firma electrónica cualificada ni sello cualificado de tiempo.
  • Sin el JWKS publicado, las firmas solo se contrastan con las claves que lleva el propio paquete.
  • No sustituye a un perito.

Estamos terminando la aplicación.

Déjanos tu correo y entrarás antes que el resto, con los catorce días de prueba desde el primer día. Preferimos decirte que aún no está a venderte una prueba que hoy no podríamos darte.