EU Wallet Sign-In — Verified Proof of Work
CodeB Sovereign Communications shipped an OID4VP 1.0 / EUDI Wallet verifier. On 2026‑06‑08 a spec‑compliant test wallet round‑tripped end‑to‑end against phone.codeb.io, returning verified PID claims and a signed SSO assertion. This page records the receipts — for buyers, auditors, regulators, and search engines that want more than a marketing slide.
Why a mock wallet?
The EUDI Wallet ecosystem is mid‑rollout. National pilot apps exist, but spec‑compliant OID4VP 1.0 + SD‑JWT VC + DCQL support is still landing in real wallets. To prove the verifier works independently of any specific wallet vendor, an internal deterministic test client follows the OID4VP 1.0 happy path exactly as the spec requires — demonstrating that any conforming wallet will interoperate.
Real‑wallet interop scales as the ecosystem matures. The substrate is locked in today.
What ran end-to-end
Eleven steps, every cryptographic gate passed, HTTP 200 returned with verified claims. The verifier's exact response to a successful presentation:
Four selective disclosures (given_name, family_name, birth_date, age_over_18) were verified against the SD‑JWT VC's _sd SHA‑256 hash array. The SSO assertion is a standard RS256 JWT with amr=["vc"] and acr="urn:codeb:acr:eudi-wallet" — every federated app in the tenant inherits verified identity through ordinary OIDC userinfo. One presentation, every reliant party benefits, no bespoke integration.
Full transcript — sanitised mock‑wallet run
Every protocol step recorded by the internal test client, with placeholder identity (Alice Tester, 1990‑01‑01) substituted for the real test subject. Cryptographic blobs are shown truncated (eyJ…) because they encode the placeholder data. The session ID, nonce, state, ephemeral keys and certificate are illustrative; they rotate per session.
Decode the sso_assertion JWT and you find amr=["vc"] and acr="urn:codeb:acr:eudi-wallet": every reliant party that trusts CodeB's OIDC layer now knows this session was authenticated by an EU Wallet credential, not a password. That signal is the whole point.
The crypto stack we shipped
- Authorization Request — signed JAR (ES256),
typ=oauth-authz-req+jwt, x5c chain pinned per HAIP 1.0 - Client Identifier Prefix —
x509_hash(OID4VP 1.0 §5.9.3, base64url SHA‑256 of the DER leaf) is the wallet‑preferred form that real EUDI wallets bind to;x509_san_dns(HAIP 1.0 Final) is supported for compatibility. The caller picks per request via?client_id_prefix=on the vp‑start endpoint; verifier‑metadata advertises both viaclient_id_schemes_supported. Tested back‑to‑back on every release witheu‑wallet‑mock‑both.py. Several identity‑focused verifiers in the wider ecosystem now support both prefixes; to our knowledge, CodeB is the only OID4VP 1.0 verifier with this combination integrated directly into a SIP / WebRTC business communications platform. - DCQL — native OID4VP 1.0 credential query syntax. No Presentation Exchange (PEX) legacy
- Response encryption — JWE compact serialisation,
alg=ECDH-ES+enc=A128GCM, NIST SP 800‑56A Concat KDF, RFC 7518 §4.6 / §5.1 conformant - SD-JWT VC —
vc+sd-jwtformat,_sdarray of SHA‑256 disclosure hashes, structural integrity verified leaf‑by‑leaf - KB-JWT — holder key binding via
cnf.jwk; nonce, aud andsd_hashall verified against the verifier challenge - Result envelope —
response=<JWE>form parameter per OID4VP §8.4; decrypted plaintext is a JSON envelope with the DCQL‑shapedvp_tokenobject - Session persistence — vp‑sessions atomically written under
App_Data/<tenant>/vp‑sessions/, so IIS app‑pool recycles or multi‑worker routing never lose a mid‑flight presentation
What is still ahead (iteration 2)
The current iter‑1 substrate verifies structural integrity and holder binding. Future work, transparently flagged:
- JWS issuer signature verification against per‑issuer JWKS / x5c trust chain
- LoTL (List of Trusted Lists) trust‑chain validation — PKI → member‑state Trusted List → EU LoTL
- Status list / revocation checking for issued credentials (IETF OAuth Status List)
- Multi‑credential DCQL queries — today the first credential in the response is consumed
- Phase B Issuer (OID4VCI) so CodeB tenants can issue their own member‑organisation credentials
Until iter‑2 ships, the verifier accepts well‑formed SD‑JWT VCs for use cases where the tenant trusts the issuer at presentation time — pilot deployments, identity‑proofing demos, member‑organisation logins. Production high‑assurance identity proofing should wait for iter‑2 + a notified national wallet.
Why this matters
eIDAS 2.0 mandates that every EU member state issue a national Digital Identity Wallet by 2026 and that public‑service relying parties accept it. The OID4VP 1.0 / SD‑JWT VC / DCQL specs are the wire format. A working verifier is the precondition for accepting wallet sign‑in — without it, "EU Wallet ready" is a sticker on a roadmap.
CodeB tenants get the verifier today. Self‑hosted, EU‑sovereign, NIS2 / DORA aligned, with the verified‑claim relay wired through the OIDC layer the rest of the platform already uses.
Free EU Wallet training. Free EU Wallet training (dial 1844) — a dedicated AI trainer that walks you through OID4VP, SD‑JWT VC, eIDAS 2.0 and the December 2027 mandate. Free, no signup, ends when you do.
Hear the AI receptionist. Talk to vnum 1234 in your browser — the live CodeB Sovereign Communications virtual assistant. Ask it about EU Wallet, features, the build chain, anything.
Try the wallet flow. logineu.html — the live EU Wallet sign‑in flow.
Read the feature card. features.html#eu-wallet
Public verifier API. Integrators — the full endpoint reference is at eu-wallet-api.html (DE: de/eu-wallet-api.html).
Deutsche Fassung. de/eu-wallet-proof.html
Engineered by Aloaha Limited — 🇲🇹 proudly made in Malta, shipped from the smallest EU member state to the whole single market. www.codeb.io