Audit Labs / evidence-seal

Prove your evidence
hasn’t changed.

A command-line tool that seals a directory of audit evidence into a tamper-evident manifest. Later, it proves the package is byte-for-byte what was collected — and names anything that moved. Signing and trusted timestamps prove who and when.

# Seal an evidence package
$ evidence-seal seal ./aws_audit_prod_2026-08
  sealed 8 files
  root 1265ef6f…  id d096c7ed…
──────────────────────────────
# Months later — prove nothing changed
$ evidence-seal verify ./aws_audit_prod_2026-08
  ✓ intact — 8 files match the seal
# One byte edited after the fact?
$ evidence-seal verify ./aws_audit_prod_2026-08
  ✗ TAMPERED — MODIFIED iam_users.csv
Three guarantees

Integrity, custody, and proof of origin.

Each layer is optional and composes with the others — the core needs no dependencies at all.

01 · INTEGRITY

Nothing changed

Every file is hashed with SHA-256 and folded into a single Merkle root. Any change to any file, name, or byte flips the root — and verify names exactly what was modified, added, or removed.

02 · CHAIN OF CUSTODY

In order, unbroken

Seal each new package against the last and every manifest links to the previous by hash. A reordered, missing, or spliced-out link is detectable — an append-only history of a package over time.

03 · ATTRIBUTION & TIME

Who and when

Sign a seal with an ed25519 key to attest who collected it. Add an RFC 3161 timestamp from an independent authority to prove it existed by a certain time — not backdated.

The commands

Five verbs, one contract.

Every command exits 0 when all is well, 1 on tamper, and 2 on a usage error — so a pipeline can gate on the difference.

seal
Hash a directory into a canonical manifest.json — with provenance metadata, ignore globs, and an optional --prev link for chaining.
verify
Recompute and compare. Reports every MODIFIED, ADDED, and REMOVED file, and catches a doctored manifest itself.
chain
Verify a sequence of seals links oldest → newest, catching reordering or a removed link.
sign
Attach an ed25519 signature; verify --pubkey requires a named signer, proving identity, not just integrity.
timestamp
Request, submit, apply, and verify an RFC 3161 token — with --tsa-cert for full CMS signature verification.
Get started

Install & quickstart.

# Core is pure standard library.
# Extras add signing + timestamping:
pip install "evidence-seal[sign,timestamp]"

# Seal, then verify
evidence-seal seal ./evidence
evidence-seal verify ./evidence
Python 3.10+ GPL-3.0 stdlib core · 0 deps SHA-256 · Merkle

The exit-code contract, at a glance:

0Intact / valid — the package matches its seal.
1Tamper detected, chain broken, or an invalid signature.
2Usage error, or an optional dependency isn’t installed.

Distinguishing 1 from 2 lets CI separate “the evidence was tampered with” from “the job is misconfigured.”