Paquete para el perito
Qué contiene el paquete de evidencia (.zip) de una notificación y cómo lo verifica un perito sin acceder a Notificado.
Actualizado:
El paquete de evidencia es un .zip que un perito, un juez o la contraparte verifican con herramientas estándar y sin acceso a Notificado. Descárguelo desde la notificación, en Notificaciones, junto con la constancia en PDF. Cada descarga queda registrada.
Desde la API o un asistente
Un asistente conectado por MCP no recibe los bytes del paquete: un .zip de decenas de megabytes no cabe en una respuesta de herramienta. La lectura evidenceDownloadInfo (alcance evidence:read, también en GET /v1/evidence-download-info) recibe orgId, notificationId, kind (zip si se omite, o constancia) y, si quiere una versión anterior, version. Responde el nombre del archivo (filename), su tipo (contentType), su tamaño en bytes (bytes), su huella SHA-256 (sha256), la versión del formato del paquete (zipVersion), la constancia a la que pertenece (constanciaId) y en fetch la llamada HTTP que lo descarga: method, path y el body exacto. Esa lectura no registra nada. La descarga es esa llamada, POST /v1/download-evidence con el mismo token, y queda registrada como cualquier otra descarga.
Sin constancia todavía, las dos responden 404 X_CONSTANCIA_NOT_FOUND; con el paquete aún armándose, 409 X_EVIDENCE_ZIP_NOT_READY (reintente en 30 segundos).
curl -X POST 'https://www.notificado.co/v1/download-evidence' \
-H "authorization: Bearer $NOTIFICADO_TOKEN" \
-H 'content-type: application/json' \
-d '{"orgId":"<orgId>","notificationId":"<notificationId>","kind":"zip","version":1}' \
| jq -r .contentBase64 | base64 -d > evidencia.zip
sha256sum evidencia.zipEl ejemplo pide la versión 1; envíe el body de fetch tal como llegó, que nombra la versión descrita. La huella que imprime sha256sum debe ser la misma sha256 que respondieron evidenceDownloadInfo y la descarga. Si difiere, el archivo se dañó en el camino: descárguelo de nuevo antes de entregarlo.
Qué contiene
| Archivo | Qué es |
|---|---|
manifest.json |
Lista de archivos con su SHA-256 y tamaño; los sellos y qué cubren. |
SHA256SUMS |
Las mismas huellas, para sha256sum -c. |
mensaje/*.eml |
El mensaje congelado de cada destinatario, tal como se entregó al proveedor de correo. |
adjuntos/ |
Los documentos, byte a byte. |
enlazados/ |
No viene en el paquete: la carpeta donde usted pone una copia de los archivos enlazados. |
eventos/eventos.json |
Eventos encadenados (hash anterior + hash), anclas diarias y pruebas Merkle. |
eventos/raw/ |
Lo que respondieron los proveedores, tal como llegó. |
sellos/*.tsr |
Los tokens de sello de tiempo RFC 3161. |
sellos/tsa-ca/*.pem |
La raíz de confianza de cada autoridad de sellado. |
constancia.pdf |
La constancia firmada. |
firma/cert-chain.pem |
La cadena de confianza de la firma de la constancia. |
verificar.js |
Verificador automático. |
LEEME.txt / README.txt |
Instrucciones en español y en inglés. |
Verificación automática
Con Bun, openssl, sha256sum y pdfsig (poppler-utils) instalados, dentro de la carpeta descomprimida:
bun verificar.jsSalida 0 = verificado; 1 = algo no verifica (se nombra); 2 = paquete ilegible; 3 = falta openssl; 4 = verificado, salvo un archivo enlazado que no se entregó y no se comprobó.
El informe tiene cuatro partes, siempre en el mismo orden:
- Comprobado: cada área (archivos, cadena de eventos, archivos que nombran los eventos, anclaje diario, sellos) con
OK,AVISOoFALLA; la huella SHA-256 demanifest.json, que identifica todo el paquete; y el tramo de la cadena (seqinicial y final). - Sellos de tiempo: por cada sello, la autoridad, el archivo que cubre y la hora que afirma la propia autoridad, leída del token.
- Hallazgos: cada falla, aviso o nota, con el archivo o el evento que la causa.
- No comprobado por este programa: la firma PAdES del PDF (
pdfsig), la confianza en cada autoridad de sellado y la firma de Amazon SNS de las respuestas crudas, que requiere red. Esas pruebas se hacen con las herramientas públicas indicadas.
La última línea es siempre el resultado. bun verificar.js --json entrega lo mismo en JSON.
Verificación manual
sha256sum -c SHA256SUMS
openssl ts -reply -in sellos/<sello>.tsr -text
openssl ts -verify -data mensaje/<destinatario>.eml -in sellos/<sello>.tsr -CAfile sellos/tsa-ca/<autoridad>.pem
pdfsig constancia.pdfCada sello debe responder Verification: OK. En la cadena, cada evento cumple hash = sha256(hash_anterior seguido del evento en JSON canónico RFC 8785): alterar, quitar o reordenar un evento rompe todos los siguientes.
Archivos enlazados
Un archivo demasiado grande para viajar adjunto al correo se pone a disposición del destinatario por enlace de descarga. Ese archivo no está dentro del zip: el paquete lo nombra por su huella SHA-256 y la constancia lo lista como «puesto a disposición por enlace de descarga». Un paquete con archivos enlazados dice "version": 2 en manifest.json y trae la lista linkedFiles (huella, tamaño, nombre y fecha hasta la que Notificado conserva el archivo). Un paquete sin ellos sigue siendo versión 1.
Cómo obtener el archivo. Pida una copia a la firma que envió la notificación, que conserva su original, o al destinatario. Cualquier copia sirve: lo que identifica el archivo es su huella SHA-256, no de dónde viene.
Cómo comprobarlo. Copie el archivo en una carpeta enlazados/ dentro del paquete descomprimido, o indique la carpeta donde lo tiene:
mkdir enlazados && cp /ruta/al/archivo enlazados/
bun verificar.js
bun verificar.js --linked /ruta/a/la/carpeta
sha256sum enlazados/*El verificador calcula la huella de cada copia y la compara con la que congeló el evento message.frozen. También comprueba que el nombre que manifest.json da al archivo sea el que congeló ese evento. El resultado tiene tres casos:
- La copia es el archivo. El informe la marca como verificada y la salida es
0. - Nadie entregó una copia. El resto del paquete verifica, el archivo aparece como
NO COMPROBADOy la salida es4. No es una falla y tampoco es un visto bueno: el programa no vio ese archivo. - La copia tiene el nombre del archivo y otra huella. Es una falla (
linked-file-hash) y la salida es1: no es el archivo notificado.
El sello de tiempo de un archivo enlazado cubre su huella y se comprueba con openssl ts -verify -digest <huella>; LEEME.txt trae la línea exacta. En la constancia, cada destinatario lista lo registrado sobre cada archivo enlazado: Descarga iniciada (evento link.download) y Transmisión del servidor (evento link.download.transmitted, con los bytes transmitidos y la huella de lo transmitido), o «sin descarga registrada».
link.download.transmitted dice lo que hizo el servidor de Notificado: escribió el archivo completo en la conexión desde la que se usó el enlace. No prueba que el destinatario lo haya recibido ni guardado: una conexión que se cierra sin leer los últimos bytes no se distingue de una que los leyó.
Cómo cotejar una copia entregada
Si el destinatario o la contraparte aportan el correo que llegó a su buzón, no lo compare por la huella SHA-256 del .eml: el archivo de mensaje/ es lo que Notificado entregó al proveedor de correo, y el proveedor recodifica el mensaje y pone sus propios encabezados en el tránsito (la fecha, los límites MIME, el orden de los encabezados, la firma DKIM). La huella del archivo completo será distinta aunque el contenido sea el mismo. Coteje así:
- El Message-ID. El encabezado
Message-IDde la copia entregada es el mismo del.emly el que nombra el eventomessage.frozen. - Cada adjunto. Extraiga los adjuntos de la copia entregada y calcule su SHA-256: debe ser el de
adjuntos/, el demanifest.jsony el que imprime la constancia. - El texto. El texto y el HTML son los mismos, salvo espacios al final de las líneas. El remitente, el destinatario, la dirección de respuesta y el asunto dicen lo mismo.
grep -i '^Message-ID:' copia-entregada.eml mensaje/<destinatario>.eml
sha256sum adjuntos/*Qué versión del método aplica
LEEME.txt indica la versión del método de evidencia bajo la que se emitió la constancia (por ejemplo, 2026-09-v3). Esa versión queda registrada en el evento encadenado constancia.issued (methodVersion). En paquetes anteriores a este registro, la versión aparece en la constancia, en el campo «Versión del software».
Qué no prueba
Que una persona leyó el mensaje: las aperturas son indicios. Tampoco quién hizo clic en un enlace de descarga, solo cuándo, desde qué IP y con qué navegador. La validez de la notificación la determina el juez.