Ucotron Cortex
Guides by flow

Signed reports

Verify the signature with /v1/verify and offline with the public key.

An approved report always carries its signed manifest. The contract enforces it: approved without a signature is not verifiable evidence, and publishing it as if it were is worse than having no signature at all.

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)'

Offline verification

The signature is Ed25519 over the canonicalized payload (json-stable-stringify-v1). No network, database or runtime needed: the published public key is enough. That is what keeps the report verifiable when Ucotron is not on the other side.

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

What breaks

A manifest with a corrupt key or signature returns "does not verify", not a 500. A 500 on hostile input confirms to the attacker that they reached the engine, and denies the honest integrator the only answer that helps them.

A tampered manifest returns 422 with invalid_ed25519_signature, even if the rest of the document is intact.

Endpoints in this guide

On this page