Skip to content

Standards Compliance

TCS implements a complete stack of open standards for verifiable credential issuance, presentation, and trust establishment. OID4VCI profiles are conformance-passed, while OID4VP profiles are currently in conformance processing.


StandardSpecificationImplementationStatus
OID4VCIOpenID for Verifiable Credential Issuance — tracking the latest published Implementer’s DraftPre-authorized code flow (production), credential offer management, issuer metadata discovery. Authorization code flow on roadmap.Conformance passing
OID4VPOpenID for Verifiable Presentations — tracking the latest published Implementer’s DraftDCQL queries, JAR request objects, direct_post response mode, VP Token validationConformance processing
HAIP v1High Assurance Interoperability Profile 1.0ES256 signing, X.509 certificate binding, mandatory DPoP nonces, client attestation supportOID4VCI passing / OID4VP processing
SD-JWT VC draft-15IETF SD-JWT-based Verifiable Credentials — pinned to draft-ietf-oauth-sd-jwt-vc-15dc+sd-jwt credential format, selective disclosure, Type Metadata Documents (§5)Implemented
Token Status List draft-21IETF Token Status List — pinned to draft-ietf-oauth-status-list-21status.status_list reference on X.509-issued credentials, public statuslist+jwt endpoint, revoke / suspend / reinstateImplemented
DPoPRFC 9449 — Demonstrating Proof-of-PossessionToken binding with JWK thumbprint, server-issued nonces, JTI replay protectionImplemented
PKCERFC 7636 — Proof Key for Code ExchangeS256 challenge method for authorization code flowImplemented
JARRFC 9101 — JWT-Secured Authorization RequestsSigned request objects for OID4VP verification flowsImplemented
PARRFC 9126 — Pushed Authorization RequestsServer-side session creation before authorization redirectImplemented
OAuth 2.0 AS MetadataRFC 8414 — OAuth 2.0 Authorization Server Metadata/.well-known/oauth-authorization-server discovery endpointImplemented
ISO 27001Information Security ManagementOperational security controls governing TCS infrastructure and processesOrganization-stated certification claim
ISO 27701Privacy Information ManagementPrivacy controls for credential data handling and storageOrganization-stated certification claim

TCS implements two issuance flows defined by OID4VCI:

  • Pre-Authorized Code Flow (production): The issuer creates a credential offer containing a pre-authorized code. The holder wallet exchanges this code for an access token, then uses the token to request the credential. No user interaction with the authorization server is required.
  • Authorization Code Flow (roadmap, not in production): The wallet would initiate issuance through PAR, authenticate at the authorization endpoint, receive an authorization code, exchange it for an access token, and request the credential. Underlying primitives (PAR, PKCE) are implemented and exercised by conformance tests; the issuer-side flow: "authorization-code" switch is not yet wired through. See the Roadmap.

DPoP-bound access tokens are supported on the production flow per HAIP requirements.

TCS implements OID4VP v1 with the following capabilities:

  • DCQL (Digital Credentials Query Language) queries for specifying required credentials
  • JAR (JWT-Secured Authorization Requests) for signing request objects with application/oauth-authz-req+jwt content type
  • direct_post response mode for VP Token submission
  • Cross-device and same-device flows with session status polling and optional redirect URIs

HAIP defines a constrained profile of OID4VCI and OID4VP for high-assurance use cases. TCS satisfies HAIP requirements including:

  • ES256 (P-256) as the required signing algorithm for X.509-bound credentials
  • Mandatory DPoP nonces on every token and credential request
  • Client attestation JWT support (OAuth-Client-Attestation and OAuth-Client-Attestation-PoP headers)
  • dc+sd-jwt as the credential format

TCS uses the IETF SD-JWT VC specification for its credential format, pinned to draft-ietf-oauth-sd-jwt-vc-15. This is distinct from W3C Verifiable Credentials Data Model 2.0 — the two specifications are mutually exclusive per IETF SD-JWT VC §1.2.

Key characteristics:

  • Format identifier: dc+sd-jwt
  • Flat claims structure with selective disclosure via the _sd mechanism
  • Type metadata discovery through VCT URIs served by the Schema Registry
  • Key binding JWTs for holder proof-of-possession during presentation

Revocation is published as a Token Status List, pinned to draft-ietf-oauth-status-list-21. A credential issued on the X.509 / x5c path carries a status.status_list reference naming a list URI and an index within it:

{
"status": {
"status_list": {
"uri": "https://issuer.turingspace.co/acme/status-lists/0",
"idx": 4711
}
}
}

The URI serves a signed statuslist+jwt (Content-Type: application/statuslist+jwt) holding two bits per credential: valid, revoked, or suspended. The endpoint is public and unauthenticated — any relying party can resolve it without a TCS account. Revoking, suspending or reinstating a credential re-signs the list immediately, so the published token always reflects committed state.

Credentials issued on the did:iota path carry no status reference and are not revocable through this mechanism.

Freshness is a per-verifier property, not a guarantee we can make for you. Whether the TCS Verifier Service rejects a revoked credential is a per-deployment setting; where it is on, the list is fetched on every verification, so a revocation takes effect within roughly one round trip. A third-party verifier caches at its own discretion, bounded only by the ttl the token advertises — 300 seconds by default, adjustable by the operator without a code release. Draft-21 §8.2 asks relying parties to honour ttl, but that is a SHOULD at best, so a third-party verifier may serve a staler answer than the list contains. Design revocation timelines around the ttl you publish, not around realtime.

The token’s iss is not a spec guarantee. Draft-21 §5.1 does not define iss for a Status List Token, and a third-party relying party has no obligation to check it. The trust binding is the signer: TCS’s verifier requires the list token to be signed by the same leaf certificate that signed the credential, comparing the two x5c headers directly. Treat the signer as the authority, never the iss string.

uri + index is a persistent correlator. The pair is fixed for the life of the credential and visible to every verifier the credential is presented to, which makes it a stable identifier across unrelated verifiers (§12.5). What the mechanism does provide is Herd Privacy on the issuer side — the token covers the whole list, so fetching it tells the issuer that someone checked the list, never which credential was presented. That is not presentation unlinkability, and should not be described as such. Unlinkable presentation requires batch-issued single-use credentials, which is an issuance-side concern.

DPoP prevents token theft by binding access tokens to the client’s key pair. TCS enforces:

  • JWK thumbprint (jkt) binding stored with each access token
  • Server-issued DPoP nonces with 300-second expiry
  • JTI (JWT ID) replay protection backed by database tracking
  • IAT (issued-at) validation with 300-second maximum age and 60-second clock skew tolerance
  • Supported algorithms: EdDSA, ES256

All authorization code flows require PKCE with the S256 challenge method. The code verifier and challenge are validated during token exchange to prevent authorization code interception.

The Verifier Service signs OID4VP request objects as JWTs with content type application/oauth-authz-req+jwt. Wallets fetch the signed request object from the request URI and verify the signature before processing the authorization request.

The Authorization Server exposes a PAR endpoint that accepts authorization request parameters and returns a request_uri. This URI is then used at the authorization endpoint, keeping sensitive parameters server-side and reducing URL length.

The /.well-known/oauth-authorization-server endpoint publishes the Authorization Server’s capabilities, including supported grant types, endpoints, code challenge methods, and DPoP signing algorithms.


TCS runs the OpenID Foundation conformance suite against its endpoints. The status below reflects whether all required test plans for each profile pass; it does not imply OIDF certification (no certification has been granted as of this writing — conformance certification is a separate program).

ProfileSuiteResult
OID4VCI Credential IssuerOID4VCI Conformance SuitePassing
OID4VP VerifierOID4VP Conformance SuiteProcessing
HAIP + OID4VCI IssuerHAIP Conformance Suite + OID4VCIPassing
HAIP + OID4VP VerifierHAIP Conformance Suite + OID4VPProcessing

The conformance suite emulates a wallet client and validates that the TCS endpoints produce spec-compliant responses for all required protocol interactions, including error cases. To request a copy of the latest test plan output, contact the team.


TCS supports two signing paths, selected based on the issuer’s key material:

AlgorithmCurveKey TypeUse CaseCredential Header
EdDSAEd25519DID-basedIssuers using IOTA DID verification methodskid referencing the DID verification method
ES256P-256 (secp256r1)X.509-basedIssuers using X.509 certificates (required by HAIP)x5c containing the certificate chain

Note: did:key generation is available in Holder Service for wallet interoperability. This is a holder-side capability and does not constitute an additional issuer signing path — TCS issuer signing remains limited to the two paths above.


TCS supports two cryptographic binding methods for credential proof-of-possession:

MethodDescription
didThe holder proves possession of a DID verification method by signing a proof JWT with the corresponding private key
jwkThe holder proves possession of a standalone key pair by including the public key as a JWK in the proof JWT header

TCS uses a single credential format across all issuance flows:

PropertyValue
Format identifierdc+sd-jwt
Selective disclosure_sd claim mechanism (hash-based)
Key bindingKey Binding JWT appended to the SD-JWT string
Type metadataVCT URI resolving to a Type Metadata Document served by the Schema Registry
Claims structureFlat (no nested credentialSubject wrapper)

TCS issues dc+sd-jwt credentials and accepts presentations via OID4VP DCQL. Because both protocols are still pre-final, real-world interop depends on the wallet’s profile choices (proof type, binding method, request signing). The table below reflects what is currently substantiated by TCS internal test fixtures — it is not an OpenID Foundation interop certification, and it is intentionally conservative.

WalletIssuance (OID4VCI)Presentation (OID4VP)Notes
Turing Space Holder Service (custodial wallet)TestedTestedFirst-party reference path; exercised by TCS service tests

Third-party wallet results will be added to this table only once a dated test artefact exists — we deliberately do not list “untested” wallets, since that itself can read as an interop claim. If you need a specific wallet integration confirmed before engaging, contact the team — we can run a profile-matching session and share the resulting test output.


To make procurement decisions easier, we list what TCS does not currently implement, and the rationale or planned timing for each.

CapabilityStatusNotes
ISO/IEC 18013-5 mDoc / mDLNot implementedTCS issues only dc+sd-jwt. Deployments requiring EUDIW PID-mDoc parity must combine TCS with a separate mDoc stack.
W3C VC Data Model 1.1 / 2.0 (subject credentials)Out of scope by designThe IETF SD-JWT VC spec §1.2 treats W3C VCDM and SD-JWT VC as mutually exclusive. The only W3C-format artefact TCS produces is the DIF Well-Known DID Configuration credential for domain linkage.
OpenID Federation / EBSI TIR / ETSI Trusted List integrationNot implementedTCS operates a scoped issuer allowlist within the TCS deployment. Cross-ecosystem trust currently bridges via the X.509 / x5c path with an externally-anchored CA — see Architecture & Security.
OID4VCI Authorization Code FlowRoadmapPre-Authorized Code Flow is the production path; the auth-code flow is in active development.
did:web / did:jwk issuer DIDsNot implementedIssuers currently use either did:iota or X.509 certificates. See DIDs for the rationale.