Your First Verification¶
The strongest demo BIJOTEL can give is letting you verify a real chain yourself. Same code path real auditors use. No screenshots, no mocks, no "trust me".
The verify-yourself demo¶
We host a public 200-entry chain at
bijotel.whiteandpoint.com, built
with bijotel 2.0.5, exported via bijotel export. The HMAC secret is
intentionally public so visitors can verify.
Step 1 — Install BIJOTEL¶
Step 2 — Download the demo chain¶
You now have a 302 KB JSON archive: 200 OpenTelemetry GenAI spans (mix of Anthropic Haiku/Sonnet + OpenAI gpt-4o-mini/gpt-4o), distributed across the past 14 days, with ~8% F11 attack-pattern prompts mixed in.
Step 3 — Verify integrity¶
bijotel verify-export demo_chain.json \
--secret-hex bd1ed00aded0bd1ed00aded0bd1ed00aded0bd1ed00aded0bd1ed00aded00000
Expected output:
Exit code: 0.
Now try a tampered version¶
We pre-built a variant with exactly one byte flipped at entry seq=100. The HMAC chain links are still intact at the chain-hash level — but the v2.0.3 canonical_body integrity check catches it.
curl -O https://bijotel.whiteandpoint.com/demo_chain_tampered.json
bijotel verify-export demo_chain_tampered.json \
--secret-hex bd1ed00aded0bd1ed00aded0bd1ed00aded0bd1ed00aded0bd1ed00aded00000
Expected output (on stderr):
Export INVALID: canonical_body tampered at seq=100:
body hashes to c1711163a58a53ac... but canonical_hash claims 273564cf0fc9e063...
Exit code: 1.
What just happened¶
BIJOTEL verified every entry by:
- Re-computing SHA-256 of each canonical body (RFC 8785 JCS-canonicalized JSON).
- Re-computing HMAC-SHA256:
hmac(prev_hash || canonical_hash, secret). - Checking each entry's
prev_hashmatches the previous entry'shmac_hash(or GENESIS for seq=1). - v2.0.3+: also re-hashes
canonical_body_b64and compares against storedcanonical_hash— catches body mutations even when the chain links themselves haven't been touched.
One changed byte at seq=100 → the SHA-256 of that body diverges from
the stored canonical_hash → exact entry surfaced, with both hashes
in the error message.
CLI failure signaling
bijotel verify and bijotel verify-export write failure reasons
to stderr and exit with code 3 (chain) or 1
(export). If you script the CLI, branch on exit code, not stdout
substring match.
Try it on your own chain¶
# Export your chain
bijotel export --db chain.db -o my_chain.json
# Verify with the secret it was sealed under
BIJOTEL_HMAC_SECRET=$YOUR_SECRET bijotel verify-export my_chain.json
The format is bijotel-chain-v1 — versioned for forward compatibility.
Auditors ship the JSON; you ship them the secret (out of band).
Next¶
- Policy Engine — pre-call gating
- Multi-Provider — Anthropic + OpenAI + xAI in one chain
- CLI Reference — every command