Manav.id
Proof

Don't trust us. Check the work.

A security product that asks for trust has already lost the argument. Below: what you can check in your browser today, what our test suite prints, and what we have not done yet.

Last updated 24 September 2026

Check a real receipt in your browser

The in-browser verifier carries a real signed receipt. Verification runs entirely on your machine against the published key, with no call to us, so it gives the same answer whether or not we are still here.

The same check from a terminal will look like this. The @manav/verify package is not on npm or PyPI yet; the published key set is live at /.well-known/manav-keys.

offline verification · package coming soon
$ curl -s https://manav.id/.well-known/manav-keys > jwks.json
$ curl -s https://manav.id/v2/revocations > revocations.json
$ npx @manav/verify --receipt receipt.json --jwks jwks.json --revocations revocations.json
ok

Conformance vectors

Our vectors are adversarial by design: most of them are supposed to fail, and a verifier that accepts them is broken. These run from the repository, which evaluating customers receive. Output below was captured on 24 September 2026.

conformance suite
$ node packages/verify-ts/test/run.js
20/20 receipt vectors pass

$ node tests/jcs-vectors.mjs
jcs vectors (js): 43 pass, 0 fail

$ php tests/jcs-vectors.php
43 pass, 0 fail

The receipt vectors are named for what they attack: stripped-mldsa, corrupt-ed25519, truncated-mldsa, unknown-kid, revoked-nonce, no-revocation-list, tampered-render, render-differs-from-statement, stale, tier-policy-too-low, cross-type-replay-as-v1.

The canonicalisation vectors include manav-bom-rejected, manav-bidi-rejected and manav-control-rejected — the inputs that break naive JSON canonicalisers.

The post-quantum half is real

ML-DSA-87 parameter sizes are fixed by FIPS 204. A library returning different sizes is not ML-DSA-87, so we check them on every call.

FIPS 204 self-test
$ echo '{"op":"selftest"}' | node core/pq/mldsa-cli.mjs
{"ok":true,"pkLen":2592,"skLen":4896,"sigLen":4627,"good":true,"bad":false}

good:true is a valid signature accepted. bad:false is a tampered signature rejected. There is no mock implementation anywhere in the tree, and our own test suite greps for one on every run.

We test for our own footguns

One test group exists purely to catch us cheating. It greps the entire source tree for the mistakes that would quietly turn this product into theatre.

Read the spec

The constructions are published, not described. If you disagree with a design decision you can point at the line.

What we have not done

No independent security audit has been performed. No penetration test has been commissioned. There are no external implementations of the verifier yet — our own bar is two implementations not written by us passing the full vector set, and we have not met it. Our verifiers are cross-language, not independent: they share an author. We would rather you learned that here than found it out later.

Found something wrong?

That is the point of publishing it. Tell us.