QTSP facet (fake Qualified Trust Service Provider, CSC v2 + OAuth2)

The rQES half of this simulator: it plays the QTSP that Quill's EudiRestSigningService talks to, so EUDI wallet signing runs end to end without a real QTSP. The wallet half of the simulator lives at /.

Mode: strict (PKCE + client authentication enforced), service leg via OpenID4VP on https://verifier-backend.eudiw.dev

EndpointWhat it does
GET /oauth2/authorizeService (PID authentication) and credential (digest consent) legs. Instant redirect, or an OpenID4VP QR page when USE_OID4VP=true.
GET /oauth2/statusBrowser poll of the hosted verifier during the OpenID4VP service leg.
POST /oauth2/tokenExchanges the code (PKCE S256 + client authentication in strict mode) for an access token.
POST /csc/v2/infoCapability metadata.
POST /csc/v2/credentials/list, /infoOne credential plus its certificate as base64 DER.
POST /csc/v2/signatures/signHashRSA PKCS#1 v1.5 over DigestInfo(SHA-256, hash) — real crypto, embeddable in a PDF.
POST /oid4vp/init, GET /oid4vp/statusInline flow: wallet deep link + QR for Quill to render itself.

Signing material

Subject: 2.5.4.5=#1316504e4f42452d38353031303131323334352d45554449,2.5.4.4=#0c0445756469,2.5.4.42=#0c045369676e,CN=EUDI Simulator QTSP Signing Certificate test,O=EUDI Simulator QTSP,C=BE · download the certificate
Key: /certs/qtsp/qtsp-signing-key.pem (never expose this one)
Certificate: /certs/qtsp/certs/qtsp-signing-cert.pem — point Quill's TRUSTED_EUDI_ROOT_CERTS_FOLDER at that certs/ folder.

Try the authorize endpoint

GET /oauth2/authorize (service leg)

It redirects back to this page with a code. In strict mode the matching PKCE verifier is eudi-simulator-demo-code-verifier; exchange the code with:

curl -s -X POST -d grant_type=authorization_code -d code=<code> -d code_verifier=eudi-simulator-demo-code-verifier http://localhost:8080/oauth2/token