Attesto

Verifier System

Offline verifier en bundles

Een verifier bundle is een portable evidence pack. Het bevat de proof objects die nodig zijn om een stream range zonder toegang tot de Attesto backend te verifiëren, plus een manifest dat de meegeleverde bestanden bindt.

Offline verifier

De offline verifier controleert lokaal. Online anchor re-checks zijn optioneel en expliciet, zodat een reviewer de kern van de bundle nog steeds kan verifiëren wanneer netwerktoegang beperkt is.

attesto receipts verify \
  --file ./receipt.json \
  --public-key-hex "$ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX"

attesto bundles offline-verify --file ./attesto-bundle.json
attesto verify file --file ./receipt.attesto.json \
  --public-key-hex "$ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX"
attesto verify truth-package --file ./truth-package.zip

Window-, checkpoint-, anchor-, IVC- en volledige bundle-verificatie kan ook via de online verifier API vanuit dezelfde CLI draaien:

attesto windows verify --file ./window.json
attesto checkpoints verify --file ./checkpoint.json
attesto anchors verify --file ./anchor.json
attesto ivc epochs verify --file ./ivc-epoch.json
attesto bundles verify --file ./attesto-bundle.json

Portable receipts

Een portable receipt is een self-contained *.attesto.json export rond één signed receipt. Een ontvanger kan de receipt verifiëren met de Python SDK, TypeScript SDK, Go SDK, CLI of browser verifier zonder de Attesto backend aan te roepen. Een gepinde public key is het betrouwbare verificatiepad; een embedded key is alleen een transport hint en mag het trust policy van de verifier niet vervangen.

Portable receipts zijn nuttig voor email attachments, support tickets, data-room uploads en regulator workflows waar nog geen volledige bundle nodig is. Ze falen nog steeds gesloten bij gewijzigde payload commitments, gewijzigde event hashes, verkeerde signatures of mismatched stream linkage.

Browser WASM verifier

De verifier-only WebAssembly build exposeert receipt, inclusion, checkpoint-root en completeness verification aan een browser page. Er is geen client creation flow, geen API key handling en geen background network requirement. De JavaScript shell geeft JSON door aan de WASM verifier en krijgt een JSON report terug, zodat browser verification een dunne lokale wrapper blijft rond dezelfde Go verifier semantics die de CLI gebruikt.

Verify portal

De browser Verify portal op /verify.html is bedoeld voor snelle receipt verification door een externe ontvanger, auditor of supportteam. Drop een receipt JSON of portable receipt file in de pagina, plak de gepinde witness public key en verifieer lokaal. De pagina laadt de WASM verifier uit /assets/attesto-verify.wasm, maar uploadt de receipt, payload, public key of verifier result niet naar Attesto.

Voor gereguleerde workflows pin je de witness public key out-of-band en vergelijk je de WASM asset hash met het release manifest voordat je op een browserresultaat vertrouwt. Gebruik POST /v1/public/verify voor receipt verification in een serverworkflow, en POST /v2/verify voor Proofstream object en bundle verification. Browser verification, CLI verification, SDK verification en API verification moeten dezelfde canonical JSON- en signature-semantiek volgen.

Bundle structure

{
  "manifest": {
    "bundle_id": "bundle_...",
    "protocol": "ATTESTO-PROOFSTREAM-001",
    "created_at": "2026-06-07T12:00:00Z",
    "stream_id": "str_...",
    "from_seq_no": 1,
    "to_seq_no": 250,
    "artifact_hashes": {
      "receipts.json": "sha256-hex",
      "windows.json": "sha256-hex",
      "checkpoints.json": "sha256-hex",
      "witnesses.json": "sha256-hex",
      "anchors.json": "sha256-hex"
    }
  }
}

Truth packages

Tenant export ZIPs zijn ook lifecycle evidence. Wanneer Attesto een package bouwt, schrijft het attesto.truth-package.manifest.json in de ZIP, hasht de gefinaliseerde ZIP en registreert een truth_package.generated Proofstream event. Elke betekenisvolle dashboard- of auditor-toegang registreert een truth_package.accessed event met unieke access id, timestamp, package hash, manifest hash, actor type, access method en gehashte network metadata. Wanneer een user, auditor, SDK of CLI een succesvolle cryptographic verifier report terugstuurt naar Attesto, valideert de backend het report tegen de opgeslagen package- en manifest-hashes en registreert een truth_package.verified event.

Dit bewijst package integrity en lifecycle provenance. Het bewijst juridische compliance niet zelfstandig en bewijst niet dat een ontvanger de inhoud heeft gelezen of geaccepteerd. Download/access bewijst dat het package is geserveerd; truth_package.verified bewijst dat een verifier de ZIP- en artifact-hashes daadwerkelijk opnieuw heeft berekend.

De finale ZIP-hash wordt bewust na ZIP-finalisatie en buiten de ZIP zelf vastgelegd. De receipt over de finale ZIP-hash in dezelfde ZIP opnemen zou een circulaire self-reference maken: het aanpassen van de ZIP om de receipt toe te voegen verandert de hash die de receipt ondertekent.

attesto verify truth-package --file ./truth-package.zip

Het commando leest de ZIP, berekent de volledige package SHA-256 opnieuw, vereist attesto.truth-package.manifest.json, verifieert elke in het manifest genoemde artifact hash en verwerpt verboden archive paths zoals absolute paths, parent traversal, macOS metadata, workstation paths en lokale filesystem references. Een gewijzigde events.csv, proofs.json of manifest.json moet verificatie laten falen voordat het package als betrouwbaar bewijs kan worden behandeld.

curl -X POST https://dashboard.attesto.eu/v1/exports/exp_.../truth-package/verify \
  -H "Authorization: Bearer $ATTESTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "verifierKind": "attesto-cli",
    "verifierVersion": "0.4.0",
    "accessId": "tpa_...",
    "verificationReport": {
      "ok": true,
      "packageSha256": "hex...",
      "manifestSha256": "hex...",
      "verifiedArtifacts": 4,
      "problems": []
    }
  }'

Verifier matrix

MutatieVerwacht resultaat
Gewijzigde payloadReject: payload hash matcht de event commitment niet meer.
Gewijzigd sequence numberReject: stream ordering en head hash breken.
Verwijderd eventReject: window inclusion of stream range is incompleet.
Ingevoegd eventReject: sequence, previous hash of window commitment verandert.
Stale checkpointReject: checkpoint matcht de verwachte stream progression niet.
Verkeerde witness signatureReject: statement signature of key epoch is ongeldig.
Verkeerde anchorReject: anchor commitment bindt de included epoch niet.
Conflicterende checkpoint headsReject en rapporteer fork evidence.

Public verification API

Gebruik POST /v2/verify wanneer een online service dezelfde verifier semantics als de CLI nodig heeft.

curl -X POST https://verify.attesto.eu/v2/verify \
  -H "Content-Type: application/json" \
  --data-binary @attesto-bundle.json