Skip to content

Verify an evidence pack

An evidence pack is designed to be checked by someone who does not trust the sender. You need only the zip file and, if you want to be fully offline, a copy of HalvorAI’s public pack key.

Terminal window
npx @halvorai/ingest verify-pack ./pck_01JA8R2M7D0F3G6H9J2K5L8N1P.zip

Nothing is uploaded and no account is needed. The verifier prints a pass or fail result for each check and exits non-zero if anything fails.

To avoid fetching a key over the network, give it a key you pinned earlier:

Terminal window
npx @halvorai/ingest verify-pack ./pack.zip --jwks ./pack-keys.json

You can also use the browser version in the dashboard at /verify. It runs entirely in your browser.

  1. The manifest signature. manifest.jws is checked against HalvorAI’s public pack key. The key set is published at https://api.halvorai.com/v1/.well-known/pack-keys, and the manifest names the key it was signed with. Old keys stay in the set forever, so old packs keep verifying.
  2. Every file. Each file’s SHA-256 is compared with the manifest, so any added, removed or changed file is caught.
  3. Every event signature. For each event in events.jsonl, the verifier recomputes its canonical digest and checks the producer’s signature against the source public key included in chain.json. This shows the event is what the customer’s system sent.
  4. The hash chain. Where events are consecutive, the verifier recomputes the links, and it checks the signature on each daily anchor that covers the pack’s period. This shows nothing in the range was removed after the fact.
  5. The report. A final summary of what passed.

Do not unzip and rezip the pack before verifying. Recompressing can change bytes even when the files look identical.

Every step uses standard formats, so you can check a pack with your own tools:

  • manifest.jws is a compact JWS (RFC 7515) over manifest.json.
  • Event signatures are detached JWS over the RFC 8785 canonical JSON of the event, with EdDSA (Ed25519).
  • The chain hash is sha256(previous chain hash bytes || canonical digest bytes). See the hash chain.

It means the pack is exactly what HalvorAI signed, the events are exactly what the customer’s source signed, and no event in the covered range was removed. It does not mean every payment is legitimate. The pack supports the bank’s own investigation and does not replace it.