ParaID Beta
Prove a claim. Keep the data.
A verifier asks a question, like “is this person 18 or older?”. Your device answers yes or no, with cryptographic proof. The passport fields behind the answer never leave your device, and the relay never sees them either.
The demo below runs entirely in this page. Your wallet holds a real credential and answers requests. Screen-flash liveness is our app-less identity research.
1. An issuer seals the facts
A trusted issuer writes each field into a salted, sealed hash and signs the set once with ML-DSA-65 (FIPS 204). The issuer identity is bound to that key as a DID.2. Your device answers
The wallet opens the sealed answer plus the key binding, and signs the verifier’s fresh nonce with the holder key. You see precisely what will be shared before it leaves the device.3. The verifier checks offline
The verifier recomputes the chain, checks the issuer signature, confirms the credential is bound to the presenting device and that the answer is fresh. It learns the answer and who vouched for it. Nothing else.
1 · Demo issuer
Issues a demo passport credential on this device. In production this is a municipality, bank or employer.
2 · Your wallet (this device)
Issue a credential first.
3 · Verifier
Checks the proof chain, the ML-DSA-65 issuer signature, the holder-key binding and the freshness nonce. Works offline.
Session nonce: -
The counter above is measured live by your own browser (Performance API), not written by us. Want harder proof? Turn on airplane mode and run the demo again: everything keeps working.
How it works, in one picture
The trick is a Merkle tree. Each passport fact is sealed into its own hash (a leaf). Pairs of hashes are hashed together, again and again, up to a single fingerprint at the top: the root. The issuer signs only that root.
ROOT <-- issuer signs THIS with ML-DSA-65
/ \
H(1,2) H(3,4)
/ \ / \
H(name) H(birth) H(nat) H(doc) ... H(age_over_18=yes) H(holder key)
| | | | | |
"name" "1994.." "NL" "DEMO.." the answer your device
stays home stays home stays home stays home shared bound
How to read the results
1. The green result box, line by line
On success the verifier shows five rows, each a separate check that had to pass.
2. Is the issuer trustworthy? (the registry check)
One optional button checks the public issuer registry. Four possible outcomes:
3. Your privacy, shown live
4. When it fails
Beta means beta. The honest list:
- The demo issuer is generated in your tab; it is not a real authority. Production needs identity-proofing at a trusted issuer.
- No revocation yet: a real deployment adds a status list so issuers can withdraw credentials.
- Repeated proofs from the same credential are linkable to each other. The zero-knowledge route (STARK over the same sealed structure) removes that; it is on the roadmap, not in this beta.
- This is an advanced cryptographic attestation, not an eIDAS-qualified identity scheme.
- This page makes no network calls. Open devtools: the network tab stays empty while you run the demo.