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.
Run the verifier
Section titled “Run the verifier”npx @halvorai/ingest verify-pack ./pck_01JA8R2M7D0F3G6H9J2K5L8N1P.zipNothing 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:
npx @halvorai/ingest verify-pack ./pack.zip --jwks ./pack-keys.jsonYou can also use the browser version in the dashboard at /verify. It runs entirely in your browser.
What it checks
Section titled “What it checks”- The manifest signature.
manifest.jwsis checked against HalvorAI’s public pack key. The key set is published athttps://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. - Every file. Each file’s SHA-256 is compared with the manifest, so any added, removed or changed file is caught.
- 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 inchain.json. This shows the event is what the customer’s system sent. - 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.
- The report. A final summary of what passed.
Keep the zip unchanged
Section titled “Keep the zip unchanged”Do not unzip and rezip the pack before verifying. Recompressing can change bytes even when the files look identical.
Verifying by hand
Section titled “Verifying by hand”Every step uses standard formats, so you can check a pack with your own tools:
manifest.jwsis a compact JWS (RFC 7515) overmanifest.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.
What a passing result means
Section titled “What a passing result means”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.