Sign in
Tessera never issued you one. Signing in is a challenge your wallet signs with a key that lives in your phone's secure hardware and only your fingerprint can use. Nothing to phish, nothing to reuse, nothing in a breach.
A tessera was a small token you carried to prove you were expected. Its halves only fitted each other.
You need the OTCP wallet on your phone with an identity already in it.
Tessera accepts both, and tells you which one you came through, because they buy different things. A verifier that treats every factor as equal is the reason account takeovers still work.
The wallet holds a P-256 key generated inside the phone's secure hardware. It was born requiring authentication for every single use, so each signature costs a fresh fingerprint — and enrolling a new fingerprint destroys the key outright.
The wallet's Auth tab works like any authenticator: Tessera and your wallet share a secret, and both derive the same rolling code from it. The wallet keeps codes masked until a biometric reveal — but that gate is local, not part of the proof.
That last one matters. The obvious way to recognise a returning user is the key's thumbprint — but every site would compute the same value for you, and two of them could merge their records with a string comparison. So the verifier never returns it. What Tessera gets is a hash of it under Tessera's own scope: stable here, unrelated everywhere else.
Don't take our word for it — and don't take ours either. Before your wallet answers anything it resolves who is asking: these requests are made through the demo instance's verifier, otcp-demo-verifier, and the wallet walks its entity statement in the Trust Fabric first. The identity you answer with came from an accredited issuer, whose standing resolves the same way. Both appear in the participant directory; Tessera is a fictional front end on that verifier's public tenant, so look for the verifier and the issuer there, not for us.
Standards, not inventions: OpenID4VP for the request, SD-JWT VC with key binding for the answer, Token Status List for revocation, and RFC 6238 for the backup code. See the other demos →