Every number on this site, with its artifact.
This page is built from the lab artifacts themselves — suite scorecards, wire captures, theorem maps. Each entry carries its source path and run date. If we can’t reproduce a claim on request, we don’t make it.
OpenID Foundation conformance — local run, reproducible
Self-run against the official OpenID Foundation conformance suite. This is self-run evidence — not an OpenID Foundation certification; we are not listed on openid.net/certification.
| Run | Scope | Result | Status | Source artifact |
|---|---|---|---|---|
| 2026-06-01 independently reproduced 2026-06-04 |
Full suite — OID4VCI, OID4VP and OpenID Federation test plans | 319/332 passed, 0 failed 11 warnings, 2 skipped |
Pass | tier3_results/oidf_conformance/SCORECARD.json
[OIDF-1] |
| 2026-05-26 re-confirmed 2026-06-04 |
FAPI 2.0 Security Profile (Final) test modules embedded in the OID4VCI issuer plans | 78/80 passed, 0 failed 2 warnings |
Pass | tier3_results/local_oidf_20260526_122209_mdoc_keyatt/summary.json
[OIDF-2] |
| 2026-05-26 | Earlier full-suite baseline | 210/218 passed, 0 failed 7 warnings, 1 skipped |
Pass | tier3_results/local_oidf_20260526_122209_mdoc_keyatt/summary.json
[OIDF-3] |
| All runs | Signed result bundles — each export signed by the suite’s own key and archived | archived | Provenance | conformance_results/test-log-*.zip
[OIDF-4] |
Tested against real wallets, on the wire
Wire-level results from lab captures. Coverage varies per wallet — each row states exactly what was tested, and nothing more. Tested against ≠ endorsed by.
| Wallet / stack | What was tested | Result | Status | Source artifact |
|---|---|---|---|---|
| walt.id wallet stack | 22 credential types, in 43 issuer configurations (SD-JWT VC
and ISO mdoc formats), each issued and stored
end-to-end over live OID4VCI |
22 types · 43 configs | Pass | auto_research/scripts/wallet_baselines.json
[WAL-1] |
| vck library (A-SIT — the engine behind the ID-Austria Valera wallet) | Presented an SD-JWT PID to the PSDP verifier over
OID4VP 1.0 Final (direct_post + DCQL); PSDP
verified the issuer signature and the Key-Binding JWT and
accepted (2026-06-08, reproducible harness). Scope: the vck
library, not the Valera app binary; dc+sd-jwt only —
not JARM, not mso_mdoc |
KB-JWT verified, accepted | Pass | scripts/vck-vp-holder/README.md
[WAL-2] |
| Wallet clients identifying as Paradym/Credo, Sphereon and Lissi | The live PSDP issuer served complete OID4VCI
issuance flows (metadata → offer → token →
credential, all HTTP 200), logged 2026-06-04. The log records
user agents, not proof of the physical app |
full HTTP-200 chains | Pass | tier3_results/wallet_attempts/attempts.jsonl
[WAL-4] |
| Real Android wallet apps on physical devices — Paradym, Sphereon, EUDI reference, Procivis | Captured device logs (adb/logcat) against live PSDP endpoints. Device-traffic evidence only — no completed end-to-end real-phone flow is claimed | device logs captured | Partial | tier3_results/android_config_sweep_*
[WAL-3] |
Formal verification — the honest count
33 protocol theorems tracked: 15 discharged (machine-checked), 18 partial. We publish the split — partial means exactly that. A theorem map without gaps is a theorem map you should distrust.
| Track | Scope | Result | Status | Source artifact |
|---|---|---|---|---|
| Theorem map | 33 protocol theorems tracked across the protocol | 15 discharged · 18 partial | Partial | auto_research/knowledge/theorem_map.json
[FV-1] |
| Tamarin prover (Dolev-Yao adversary) | Protocol model machine-checked across 7 theory files | 36 lemmas verified — 32 trace + 4 observational‑equivalence (≈5,500 proof steps) | Pass | conformance_results/EVIDENCE_PACKAGE.json
[FV-2] |
| Unlinkability — discharged | Identifier-hiding (T10a), audit/verifier-split (T10d) and nullifier-unlinkability / private-presentation theorems | discharged | Pass | auto_research/knowledge/theorem_map.json
[FV-3] |
| Unlinkability — partial | Verifier-view unlinkability, issuer hiding and selective-disclosure privacy — modeled with machine-verified observational-equivalence lemmas but partial overall | partial | Partial | auto_research/knowledge/theorem_map.json
[FV-3] |
| ZK circuit checks (circom reference circuits) | Picus (Veridise, Z3): “properly constrained”; Circomspect (Trail of Bits): “no issues found”; April 2026 evidence package. The live verify path is the arkworks Groth16 backend, not these circom artifacts | 14/14 negative-witness tests | Pass | conformance_results/EVIDENCE_PACKAGE.json
[FV-4] |
What’s post-quantum here — and what isn’t
Hybrid post-quantum key establishment (X25519 + ML-KEM-768) and hybrid issuer signatures (ES256/EdDSA + ML-DSA-65, FIPS 204) are implemented in the reference stack.
| Layer | What ships | Post-quantum? | Source artifact |
|---|---|---|---|
| Key establishment (confidentiality) | Hybrid post-quantum X25519 + ML-KEM-768,
implemented in the reference stack |
Hybrid PQ | src/psdp_ref/pqc_credentials.py
[PQ-2] |
| Issuer signatures (authentication) | Hybrid ES256/EdDSA + ML-DSA-65 (FIPS 204),
implemented in the reference stack |
Hybrid PQ | src/psdp_ref/issuer_signatures.py
[PQ-2] |
| Zero-knowledge proofs | The shipping ZK backend is classical
Groth16/BN254 |
Not PQ | docs/PQ_ZK_STATUS.md
[PQ-1] |
| PQ-STARK backend (roadmap) | Transparent proving spike (hash-based, no trusted setup), de-risked: fused proof ≈73 KB, prove time ≈16 s on 2016 laptop hardware — not live, not formally sound, not production-ready | Not live | docs/PQ_ZK_STATUS.md
[PQ-3] |
Security posture — stated plainly
PSDP is a reference implementation; production hardening is in progress. That sentence is the ceiling — no stronger readiness wording appears anywhere on this site.
| Control | What the code does | Source artifact |
|---|---|---|
| Mock-proof rejection in production | In production mode (PSDP_PRODUCTION=1) the
verifier refuses mock proofs — submissions are rejected with
mock_crypto_rejected_in_production — and startup
checks enforce production configuration before serving |
src/psdp_ref/age_verification.pysrc/psdp_ref/startup_checks.py
[SEC-1] |
| Real ZK exercised in CI | Real Groth16/BN254 verification is exercised in CI: a
blocking job builds the Rust provers and runs the suite with
PSDP_REQUIRE_ZK=1, so a missing prover is a hard
failure, not a silent skip |
.github/workflows/ci.yml
[SEC-2] |
| Production-mode issuer trust | Fail-closed in production mode: real Ed25519 issuer-signature verification, expiry, registry/revocation status — any failure rejects — and one-time-use nullifiers persist across restarts via a file-backed replay guard. Scoped to the production layer; not a blanket “fail-closed everywhere” claim | src/psdp_ref/production.py
[SEC-4] |
| Readiness ceiling | PSDP is a reference implementation; production hardening is in progress. Informed by a 2026-06-09 production-readiness audit and its ongoing remediation | 2026-06-09 production-readiness audit [SEC-3] |
Re-run it yourself
The artifacts behind every table on this page, by path (relative to the PSDP lab tree). The signed OIDF bundles and the vck harness include their own rerun instructions.
# OIDF conformance scorecards (local runs of the official suite) [OIDF-1, OIDF-3]
$ cat tier3_results/oidf_conformance/SCORECARD.json
$ cat tier3_results/local_oidf_freshrun_20260604_161726_full/summary.json
$ cat tier3_results/local_oidf_20260526_122209_mdoc_keyatt/summary.json # FAPI 2.0 [OIDF-2]
# Signed result bundles (suite-signed exports) [OIDF-4]
$ ls conformance_results/test-log-*.zip
# Wallet interop baselines + live issuance logs [WAL-1, WAL-4]
$ cat auto_research/scripts/wallet_baselines.json
$ cat tier3_results/wallet_attempts/attempts.jsonl
# vck OID4VP harness — rerun instructions inside [WAL-2]
$ cat scripts/vck-vp-holder/README.md
# Formal verification — theorem map + Tamarin/circuit evidence [FV-1..FV-4]
$ cat auto_research/knowledge/theorem_map.json
$ cat conformance_results/EVIDENCE_PACKAGE.json
# The PQ/ZK status register — source of the do-not-claim list [PQ-1..PQ-3]
$ cat docs/PQ_ZK_STATUS.md
Want the full evidence pack for a procurement file? Talk to us →
The do-not-claim register
The register of claims we refuse to make is published next to the numbers — same repository, same review gate. The short version:
The full claims register — every allowed phrasing, its
source artifact, and the claims rejected during audit — is published
next to the numbers, at
/claims-register.