Ucotron Cortex
Guías por flujo

Reportes firmados

Verificar la firma con /v1/verify y offline con la clave pública.

Un reporte aprobado trae siempre su manifiesto firmado. El contrato lo impone: aprobado sin firma no es evidencia verificable, y publicarlo como si lo fuera es peor que no tener firma.

Diagrama: Reportes firmadosSecuencia de reporte firmado: generar el reporte, descargar el manifiesto con firma Ed25519 y verificarlo offline sin llamar a la API.SBOXClienteSBOXClienteo verificación offline con la clave pública publicadaGET /v1/reports/{id}200 · signature { manifestId, algorithm: Ed25519, publicKeyId }POST /v1/verify200 · verified_ed25519_offline
Diagrama: Reportes firmadosSecuencia de reporte firmado: generar el reporte, descargar el manifiesto con firma Ed25519 y verificarlo offline sin llamar a la API.SBOXClienteSBOXClienteo verificación offline con la clave pública publicadaGET /v1/reports/{id}200 · signature { manifestId, algorithm: Ed25519, publicKeyId }POST /v1/verify200 · verified_ed25519_offline
Fuente del diagrama (mermaid)
sequenceDiagram
    participant C as Cliente
    participant S as SBOX
    C->>S: GET /v1/reports/{id}
    S-->>C: 200 · signature { manifestId, algorithm: Ed25519, publicKeyId }
    C->>S: POST /v1/verify
    S-->>C: 200 · verified_ed25519_offline
    Note over C: o verificación offline con la clave pública publicada
bash
curl -sS "$SBOX/v1/reports" -H "authorization: Bearer $TOKEN" | jq '.data[] | select(.signature != null)'

Verificación offline

La firma es Ed25519 sobre el payload canonicalizado (json-stable-stringify-v1). No hace falta red, base de datos ni runtime: con la clave pública publicada alcanza. Eso es lo que hace que el reporte siga siendo verificable cuando Ucotron no está del otro lado.

Firma y verificación offline de un reporte La API genera el reporte y entrega un manifiesto con el payload canónico, la firma Ed25519 y la clave pública. La verificación ocurre del lado del integrador, sin llamar a la API: se canonicaliza el payload y se verifica la firma contra la clave pública; el resultado es válido o inválido. Cualquier byte alterado invalida la firma. Lado API reports:read · una vez REPORTE generado MANIFIESTO payload canónico · firma Ed25519 clave pública de acá en adelante, sin red descarga única Lado integrador — verificación offline sin llamar a la API, sin token canonicalJson(payload) bytes deterministas verify(firma, clave pública, bytes) VÁLIDO INVÁLIDO un byte alterado en el payload — un monto, una fecha — invalida la firma: eso es lo que hace al reporte evidencia y no un PDF más

Lo que se rompe

Un manifiesto con clave o firma corrupta devuelve "no verifica", no un 500. Un 500 ante entrada hostil le confirma al atacante que llegó a tocar el motor y le niega al integrador honesto la única respuesta que le sirve.

Un manifiesto alterado devuelve 422 con invalid_ed25519_signature, incluso si el resto del documento está intacto.

Endpoints de esta guía

On this page