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.
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
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.
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.