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.
Verification ran entirely in this browser tab; for dropped files, no server was contacted and the file was not uploaded anywhere. The two sample buttons fetch only the published sample JSON from this site, nothing else. The RFC-3161 timestamp tokens' certificate chains are checked separately with OpenSSL, following the pack's own verify_instructions; this tool checks that each anchor is present, that its status and imprint match what the manifest bound, and that the sealed secondary anchor covers the same imprint as the primary.
This page is fully self-contained: you can save it (Ctrl+S, "Webpage, HTML only") and run the same checks offline. The pinned PriviNet keys are embedded in the page; confirm them out of band at keys.txt.
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.pemThe 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.pemRESULT: 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.
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.