Verify a proof in your browser
Paste or open an AIP-23 proof envelope. Its form, the integrity of its statement and its post-quantum signature are checked here, in your browser, by a build of the published reference verifier. The page sends nothing, and it says so with a number you can check.
| Level | State | What was checked |
|---|
What this page checks, and what it does not
- form: the text is JSON and the envelope is
{statement, statementHash}with a 32-byte hash. A file that is not an envelope is refused by name, never with an error screen. - integrity:
sha256(JSON.stringify(statement))equalsstatementHash. - signature: when the envelope carries one, an ML-DSA-44, -65 or -87 signature over the canonical statement text, verified with a key of the scheme it declares. A classical key (Ed25519, RSA, P-256) that declares itself ML-DSA fails, as it does in the reference verifier. Another scheme is reported UNMEASURED, never passed.
- finality: not judged here. A notarization the envelope claims needs the chain: the most recent post-quantum anchor, the parent header under its certificate, and a Merkle proof of the notary's storage. Offline, the level reads UNMEASURED and says why. It is never PASSED on this page.
- witness: not judged here. A Bitcoin witness (OpenTimestamps) needs the Bitcoin header it points at. Offline, the level reads UNMEASURED and names the OpenTimestamps client.
The verdict follows the reference verifier's rule: VALID when every level present passed, PARTIAL when nothing failed but a level the proof claims was not measured, INVALID when a level failed. A claim that was not checked is never VALID.
Nothing leaves this page
Once this page has loaded, a verification makes no request: not to Aere Network, not to anyone. The line under the verdict counts the requests this browser recorded during the check (resource timing); it reads 0. To see it yourself: open your browser's developer tools, choose the Network tab, clear it, and verify a proof. Or switch the device to airplane mode first: the verdict is the same. The envelope you paste stays in this tab; nothing is stored.
The same judge, with the chain, in Node
curl -O https://aere.network/tools/verify-proof.mjs -O https://aere.network/tools/verify-anchor.mjs -O https://aere.network/tools/mpt.mjs -O https://aere.network/tools/falcon512.mjs -O https://aere.network/tools/registry-v3.mjs -O https://aere.network/tools/package.json && npm install node verify-proof.mjs proof.json # form, integrity, signature, finality (post-quantum anchor + Merkle proof), witness node verify-proof.mjs proof.json --offline # exactly what this page does
What runs here
A browser build of verify-proof.mjs, the reference verifier served at /tools/verify-proof.mjs: the same functions, not a rewrite. What the browser lacks is supplied beside them: SHA-256 and ML-DSA in JavaScript (the @noble libraries the verifier already depends on) in place of Node's OpenSSL, and nothing that reaches the network. The source this page was built from has the SHA-256 926c97ffc3c9bf45e21b5949fbd72bd73d8e573e305a56a93e7fdfa7d26d9701; compare it with the file above.
What this page is not
It is not a notarization service and it does not anchor anything: to record a hash on chain 2800, see Post-Quantum Notarization. It does not read the chain, so it cannot tell you when a statement was notarized or whether an anchor covers it; the reference verifier with Node does. It judges the envelope you give it, as it is: a verdict here says what that file holds, not who made it or what it means.