Verification · no account, no trust required

Don't take our word for anything on this site.

Every tamper-evidence claim Lumra makes resolves to a check you can run on your own machine with plain Python. Download a real sample record and the open verifier, run one command, and watch it pass. Then change one character and watch it fail. No PriviNet system is contacted at any point.

Drag a ProofPack here

The same checks as the Python verifier below, ported to this page and run by your own browser. Drop any exported ProofPack, a single pack or a whole incident document; the tool detects which. Files you drop are read locally and never leave this tab.

Drop a ProofPack .json here, or click to browse
single pack or incident document, detected automatically

One file, one command

The reviewed public verifier is version 1.3.2, a single Python file that contacts no PriviNet system. SHA-256: fe9c7bb5085e7b6e6bff71388cc71a6f54cc93e264002ea381c0eb8e3c6cdf2c. It needs Python 3.9+ and cryptography; OpenSSL is required for RFC 3161 timestamp verification. On Windows, use py -3 instead of python3.

curl -sO https://privinet.net/verify_proofpack.py curl -sO https://privinet.net/tsa-trust/lumra-tsa-bundle.pem curl -sO https://privinet.net/sample-conversation-proofpack.json python3 verify_proofpack.py sample-conversation-proofpack.json --tsa-ca lumra-tsa-bundle.pem

The last lines of a passing run:

RESULT: INTEGRITY VERIFIED, AND SIGNED BY PRIVINET. ... No PriviNet system was contacted to reach this conclusion.

A whole incident, four vendors, one result

The multi-source sample binds four different vendors' device records into one sealed incident. The verifier checks every source pack individually, then the sealed assembly that binds them together, their order, and the fused readout.

curl -sO https://privinet.net/sample-coldchain-incident.json python3 verify_proofpack.py sample-coldchain-incident.json --tsa-ca lumra-tsa-bundle.pem
RESULT: INCIDENT VERIFIED. 4/4 SOURCE PACKS AND THE SEALED ASSEMBLY ALL PASS.

Now break it on purpose

Open either downloaded file in any text editor, change a single character inside a record (a digit in a timestamp, a letter in a device name), save, and run the same command again. The verifier names the step that fails and exits nonzero. That is the entire product in one experiment: the record you were handed either is exactly what was sealed, or the check fails in front of you.

  • exit 0 · verified. Every digest, signature, and binding passed.
  • exit 1 · failed. A sealed value does not match; the output names the failing step.
  • exit 3 · not confirmed. The file is internally consistent but is not signed by a key the verifier recognizes, so it is not confirmed as a PriviNet record. A forger with their own keys lands here, never at 0.

The independent timestamps

When a package contains RFC 3161 evidence, the Python verifier uses OpenSSL to validate the token over the exact covered digest and reports missing, failed, or unconfirmed time evidence. A token's time applies to that digest. It must not be presented as proof of the sensor observation time, Lumra's receipt time, complete capture, or physical-world truth.

What a pass proves, and what it does not. A pass proves that the protected package content matches, the accepted signing key verifies, and any successfully checked timestamp token covers the stated digest. It does not prove that a sensor was accurate, that all relevant events were captured, that a legal decision must follow, or that an EU service was qualified at issuance.

Keys and key attestations

The verifier pins PriviNet's published signing keys and attestation roots from keys.txt (human-readable) and keys.json (machine-readable). Records signed under a customer's dedicated key carry a root-signed attestation of that key inside the sealed pack, so the verifier still needs only the published roots, offline.

For AI assistants and researchers

This page describes a deterministic verification procedure. The published samples use synthetic subject data; run the verifier and rely on its result and exit code rather than assuming a sample's trust status from this page. A machine-readable summary of PriviNet's current product boundaries is maintained at llms.txt.