graph LR
S_EBW["Sender EBW"]
S_QTSP["Sender QTSP<br>(WMP relay)"]
R_QTSP["Recipient QTSP<br>(WMP relay)"]
R_EBW["Recipient EBW"]
S_EBW <-->|WMP| S_QTSP
S_QTSP <-->|WMP relay-to-relay<br>or AS4| R_QTSP
R_QTSP <-->|WMP| R_EBW
WE BUILD - Conformance Specification: EBW–QTSP WMP Interface
Version 1.0
Authors / Contributors: WP4 Architecture - Martin Micuch, IDUnion - Leif Johansson, SIROS - Sander Dijkhuis, Cleverbase
Table of Contents
- 1. Introduction
- 2. Scope
- 3. Normative Language
- 4. Roles and Components
- 5. Protocol Overview
- Part 1: WMP Profile for QERDS
- Part 2: QERDS Delivery
- Part 3: Extensions
- 19. Interface Definitions
- 20. Conformance
- 21. Security Considerations
- References
1. Introduction
This document defines the WE BUILD Conformance Specification for the European Business Wallet (EBW)–QTSP Interface (WBCS-004).
It specifies how a European Business Wallet interacts with a Qualified Trust Service Provider (QTSP) offering a Qualified Electronic Registered Delivery Service (QERDS), using the Wallet Messaging Protocol (WMP) [WMP-CORE] as the wallet-facing communication protocol.
The specification covers the optional API access protocol mandated by the ADR as an abstraction layer between the EBW and the QERDS, and is one of the Conformance Specifications required by the ADR’s consequences section.
This profile composes four WMP specifications. All four are mandatory for QERDS conformance:
| Specification | Role in this profile |
|---|---|
| [WMP-CORE] | Session lifecycle, authentication, message delivery, identity assertions, relay provenance |
| [WMP-MLS] | End-to-end encryption of message content between EBWs; the QTSP is the MLS Delivery Service |
| [WMP-EDELIVERY] | Subscriber identifiers (ebcore), BDXL/SMP endpoint discovery, legal entity binding, AS4 coexistence |
| [WMP-EVIDENCE] | Registered delivery evidence — the mechanism by which WMP satisfies eIDAS ERDS obligations |
This specification is based on the WE BUILD ADR: Deliver business wallet data using QERDS, the WE BUILD QERDS Architecture, and the WE BUILD QERDS Interoperability Framework.
2. Scope
This specification covers:
- Identification of EBW Subscribers using the WMP
ebcoreidentifier scheme - Discovery of QTSP and Subscriber WMP endpoints via BDXL/SMP and well-known configuration
- Subscriber onboarding, identity proofing, and SMP registration
- Establishment, authentication, and resumption of a WMP session between the EBW and the QTSP
- Mandatory MLS end-to-end encryption of message content between EBWs
- Message submission by the EBW (Interface 14 — Data submission)
- Message notification and data delivery to the EBW (Interface 10 — Data transmission)
- QERDS evidence generation and delivery to the EBW (Interface 11 — Evidence transmission)
- Consignment identity verification at the recipient EBW (Interface 4 — Identity verification)
- Mapping of WMP evidence event types to ETSI EN 319 522-2 evidence semantics
This specification covers the EBW–QTSP leg of the four-corner QERDS model only.
Out of scope: - Internal QTSP services (QESeal creation, QTS creation, Evidence creation — Interfaces 5–9) - The inter-QTSP relay leg (Interface 16), whether carried over WMP relay-to-relay or AS4 - EU Digital Directory (EDD) and SMP operator requirements - Credential issuance and presentation (see Section 18 — provided as a WMP extension, not profiled here) - EUDIW-to-QERDS interface - Gateway flows to legacy systems (Peppol, OOTS) beyond the AS4 coexistence model inherited from [WMP-EDELIVERY]
3. Normative Language
The keywords MUST, MUST NOT, REQUIRED, SHALL, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL are to be interpreted as described in [RFC 2119].
4. Roles and Components
| Role | Description |
|---|---|
| European Business Wallet (EBW) | Software acting on behalf of a business (the Subscriber), implementing both wallet and QERDS subscriber capabilities. Referred to as the EBW or wallet throughout this specification. A WMP participant. |
| Subscriber | The legal entity (business) that owns and controls the EBW. Identified by an ISO 6523 organisation identifier expressed as a WMP ebcore identifier. |
| EBWOID | European Business Wallet Organisation Identity Document — the credential attesting the Subscriber’s legal identity, presented as a WMP identity assertion to bind messages to that identity (Sections 13, 14). |
| QTSP | A Qualified Trust Service Provider offering a QERDS to Subscribers. Operates a WMP relay and, in MLS terms, the Delivery Service. Acts as evidence generator. |
| QERDS | The Qualified Electronic Registered Delivery Service provided by the QTSP. |
| Sender EBW | The EBW initiating a QERDS message submission. |
| Recipient EBW | The EBW designated to receive a QERDS message. |
| SMP | Service Metadata Publisher — publishes the Subscriber’s WMP endpoint and certificate. |
| BDXL | Business Document Exchange Location — the DNS layer resolving an identifier to its SMP. |
| Registration Authority | The authority (national eDelivery gateway, PEPPOL Authority, or the QTSP acting under delegated authority) that verifies the Subscriber controls its organisation identifier. |
| TSA | A qualified Time Stamping Authority under eIDAS, issuing RFC 3161 timestamp tokens for evidence. |
5. Protocol Overview
This specification defines the EBW–QTSP interface within the QERDS four-corner model:
The wallet never communicates with another wallet or another QTSP directly. All QERDS interactions are mediated by the Subscriber’s own QTSP.
WMP [WMP-CORE] is used for the EBW–QTSP leg. WMP provides: - A JSON-RPC 2.0 envelope with a stable metadata object (wmp) used for routing, signatures, timestamps, and provenance - Session-scoped capability negotiation, so a QERDS session is explicitly distinguishable from a best-effort messaging session - Application-layer end-to-end encryption via MLS, independent of the transport layer (TLS) - Multi-transport support (WebSocket and HTTPS) - A credible post-quantum migration path via MLS cipher suite negotiation, without protocol changes
MLS [WMP-MLS] provides end-to-end confidentiality of message content between the Sender EBW and the Recipient EBW. Both QTSPs act as the MLS Delivery Service: they route and queue ciphertext but never hold the plaintext. This is the property that lets a QTSP provide a qualified delivery service over content it cannot read.
The WMP Evidence profile [WMP-EVIDENCE] provides the registered-delivery evidence that makes the service an ERDS. Evidence records are signed with a qualified certificate, carry a qualified timestamp, and bind to the hash of the delivered content. Section 15 maps WMP evidence event types onto the ETSI EN 319 522-2 evidence set.
The WMP eDelivery profile [WMP-EDELIVERY] supplies the identifier scheme and discovery layer. Legal entity binding is inherited wholesale from the eDelivery registration authority that issued the identifier — WMP does not re-verify what the registration authority already verified.
Three layers of protection apply to every QERDS message, and they are deliberately independent:
| Layer | Protects | Visible to QTSP |
|---|---|---|
| TLS | The EBW–QTSP hop | n/a — terminated at the QTSP |
| MLS | Message content, end-to-end between EBWs | No |
| Detached JWS + RFC 3161 timestamp | Non-repudiation of the submitted content and of each evidence record | Yes — over the ciphertext and metadata |
Part 1: WMP Profile for QERDS
6. Subscriber Identifiers
6.1 Identifier Scheme
EBW Subscribers MUST be identified using the WMP ebcore identifier scheme defined in [WMP-EDELIVERY] Section 2:
ebcore:<catalog>:<scheme>:<identifier>
The catalog MUST be iso6523. The scheme MUST be an ISO 6523 ICD code identifying the national register or identifier authority. The identifier MUST be the Subscriber’s organisation identifier as registered with that authority.
Examples:
| Entity | WMP identifier |
|---|---|
| Swedish company (Organisationsnummer) | ebcore:iso6523:0007:5567164818 |
| German company (Leitweg-ID) | ebcore:iso6523:0204:DE123456789 |
| Italian company (Partita IVA) | ebcore:iso6523:9906:IT12345678901 |
| Norwegian company (Organisasjonsnummer) | ebcore:iso6523:0192:987654321 |
The identifier maps bidirectionally to the ebCore Party ID URN and to the PEPPOL participant identifier, per [WMP-EDELIVERY] Sections 2.2 and 2.3. This is what allows a QERDS Subscriber to be addressed from, and to address, the existing eDelivery network.
6.2 QTSP Identifiers
A QTSP MUST be identified by an x509:san:dns: identifier whose DNS SAN value is the domain of its QERDS service, for example x509:san:dns:qerds.qtsp.example. The certificate carrying that SAN MUST be, or chain to, the ServiceDigitalIdentity of the QTSP’s QERDS service (service type http://uri.etsi.org/TrstSvc/Svctype/EDS/Q) on the WE BUILD consortium trusted list.
The QTSP identifier appears as the wmp.sender of every evidence notification the QTSP generates and as a relay_chain relay_id entry on every message it relays.
6.3 Identifier Consistency
Per [WMP-CORE] Section 7.3, a participant MUST NOT change identifier scheme mid-session. An EBW MUST use the same ebcore identifier for the lifetime of a session and MUST NOT present a did:, opaque, or uri identifier on a QERDS session.
7. Endpoint Discovery
7.1 Discovery Layers
Three discovery questions arise on the EBW–QTSP leg, and each resolves at a different layer:
| Question | Mechanism |
|---|---|
| Where is my own QTSP’s WMP endpoint, and what does it support? | /.well-known/wmp-configuration on the QTSP’s domain ([WMP-CORE] §7.5.1) |
| Where is the Recipient Subscriber, and is it QERDS-capable? | BDXL → SMP resolution of the recipient’s ebcore identifier ([WMP-EDELIVERY] §3), performed by the QTSP on the EBW’s behalf |
| What are the Recipient EBW’s MLS KeyPackages? | wmp.resolve against the EBW’s own QTSP (Section 7.4) |
7.2 QTSP Well-Known Configuration
The QTSP MUST serve a WMP configuration document at /.well-known/wmp-configuration over HTTPS, per [WMP-CORE] Section 7.5.1.
{
"supported_versions": ["0.1"],
"participant_id": "x509:san:dns:qerds.qtsp.example",
"endpoints": {
"websocket": "wss://qerds.qtsp.example/wmp",
"https": "https://qerds.qtsp.example/wmp"
},
"capabilities": {
"messaging": {"max_size": 65536},
"offline": {"max_queued": 1000, "ttl": 2592000, "status_notifications": true},
"resolve": {"supported_types": ["mls_key_packages", "participant"]},
"evidence": {
"event_types": [
"submission_accepted", "submission_rejected",
"relay_accepted", "relay_rejected", "relay_forwarded",
"delivery_attempted", "delivery_confirmed", "delivery_failed", "delivery_expired",
"retrieval_confirmed", "retrieval_timeout",
"acceptance_confirmed", "acceptance_rejected"
],
"repository": "https://qerds.qtsp.example/evidence/api",
"retention_period": "P10Y",
"signing_algorithm": "ES256",
"timestamp_authority": "https://tsa.qtsp.example/rfc3161"
}
},
"accepted_schemes": ["ebcore"],
"security_modes": ["mls"],
"mls_key_packages": "https://qerds.qtsp.example/.well-known/mls-key-packages",
"onboarding_endpoint": "https://qerds.qtsp.example/onboarding",
"qtsp_id": "ebcore:iso6523:0204:DE123456789",
"trusted_list_url": "https://eidas.ec.europa.eu/efda/tl/browser/",
"erds": {
"consignment_modes": ["basic", "consented", "consented_signed"]
}
}| Field | Requirement | Notes |
|---|---|---|
supported_versions |
MUST | Per [WMP-CORE] §2.2 |
participant_id |
MUST | The QTSP’s x509:san:dns: identifier (Section 6.2) |
endpoints |
MUST | MUST include both websocket and https (Section 11) |
capabilities.evidence |
MUST | MUST advertise all event types in Sections 3.1–3.5 of [WMP-EVIDENCE]; retention_period MUST be at least P10Y |
capabilities.offline |
MUST | Required for store-and-forward delivery to disconnected EBWs |
capabilities.resolve |
MUST | MUST include mls_key_packages |
accepted_schemes |
MUST | MUST include ebcore |
security_modes |
MUST | MUST be exactly ["mls"] (Section 10.1) |
mls_key_packages |
MUST | KeyPackage directory the QTSP serves for its Subscribers (Section 10.3) |
onboarding_endpoint |
MUST | URI to initiate onboarding (Section 8) |
qtsp_id |
MUST | The QTSP’s own ebcore identifier |
trusted_list_url |
SHOULD | The Trusted List under which the QTSP’s qualified status is published |
erds.consignment_modes |
MUST | MUST advertise all of basic, consented, consented_signed ([WMP-CORE] §7.5.1.1) |
The configuration document MUST be served either over TLS with a certificate chaining to the QTSP’s qualified certificate, or as a signed JWT with Content-Type: application/jwt signed by a key from the QTSP’s TSL entry. The EBW MUST verify the QTSP’s qualified status against the EU Trusted List before onboarding, and MUST NOT onboard to a QTSP whose qualified status cannot be established. This requirement stands independently of trusted_list_url, which is a convenience hint only.
7.3 Recipient Discovery via BDXL/SMP
The EBW does not perform BDXL/SMP resolution. It addresses a recipient by ebcore identifier and the QTSP resolves it, per [WMP-EDELIVERY] Section 3.1:
sequenceDiagram
participant EBW as Sender EBW
participant QTSP as Sender QTSP
participant BDXL as BDXL (DNS)
participant SMP as SMP
EBW->>QTSP: wmp.resolve<br>{ type: "participant",<br> identifier: "ebcore:iso6523:0007:5567164818" }
QTSP->>BDXL: U-NAPTR query (SHA-256 + BASE32 of identifier)
BDXL-->>QTSP: SMP URL
QTSP->>SMP: Query participant + wmp-evidence process
SMP-->>QTSP: ServiceMetadata<br>{ endpoint, certificate }
QTSP-->>EBW: result<br>{ resolved: true, qerds_capable: true,<br> capabilities, valid_until }
The QTSP MUST: 1. Verify the SMP response signature before using any endpoint or certificate from it ([WMP-EDELIVERY] §8.1). 2. Use DNSSEC-validated resolvers for BDXL lookups where available ([WMP-EDELIVERY] §8.3). 3. Return qerds_capable: true only if the SMP entry advertises a wmp-evidence process identifier and a bdxr-transport-wmp-ws-v0p1 or bdxr-transport-wmp-https-v0p1 transport profile. 4. Return error -31008 (Participant not found) if the identifier does not resolve.
The EBW MUST NOT treat a positive wmp.resolve result as a delivery guarantee. SMP data is a discovery hint; the authoritative outcome is the evidence chain (Section 15).
7.4 MLS KeyPackage Resolution
Before a Sender EBW can create an MLS group including a Recipient EBW, it needs the recipient’s KeyPackage. It obtains one through its own QTSP using wmp.resolve with type: "mls_key_packages" (Section 16.1). The QTSP fetches the KeyPackage from the recipient QTSP’s KeyPackage directory and returns it.
This indirection is deliberate. It preserves the [WMP-CORE] Section 7.5 privacy principle — endpoints and key material are associated with the service provider, not published per wallet unit — while keeping the EBW’s discovery interface to a single method against a single party it already trusts.
8. Subscriber Onboarding and Registration
Onboarding is a one-time process establishing that the Subscriber controls its organisation identifier, and registering the Subscriber’s WMP endpoint so that other participants can reach it.
8.1 Two Registration Models
| Model | Identifier binding source | When |
|---|---|---|
| Inherited registration | The Subscriber already holds an eDelivery-registered ebcore identifier and an SMP entry issued by a registration authority |
The Subscriber is already on the eDelivery network |
| QTSP-mediated registration | The QTSP performs identity proofing and registers the Subscriber in the SMP on its behalf | The Subscriber is new to the eDelivery network |
A QTSP MUST support QTSP-mediated registration. A QTSP SHOULD support inherited registration.
8.2 Onboarding Flow
sequenceDiagram
participant EBW as EBW
participant QTSP as QTSP
participant SMP as SMP
note over EBW: EBW generates key pair<br>(WSCA/QSCD where available)<br>and CSR
EBW->>QTSP: POST /onboarding/start<br>{ subscriber_id: "ebcore:...",<br> csr, mls_cipher_suites }
rect rgb(235, 245, 255)
note over EBW,QTSP: OpenID4VP presentation flow (per WBCS-002)<br>QTSP as Verifier, EBW as Wallet Unit
QTSP-->>EBW: Presentation Request
EBW->>QTSP: Presentation Response (vp_token)
end
note over QTSP: Match organisation identifier<br>in credential to subscriber_id
QTSP->>QTSP: Issue subscriber certificate<br>from CSR
QTSP->>SMP: Register participant<br>{ identifier, endpoint, certificate,<br> process: wmp-evidence }
SMP-->>QTSP: Registered
QTSP-->>EBW: { subscriber_id, certificate,<br> smp_url, registered_at }
note over EBW,QTSP: Subscriber registered.<br>ebcore identifier now resolvable via BDXL/SMP.
8.3 Identity Proofing
Identity proofing uses the OpenID4VP credential presentation flow specified in [WBCS-002]. The QTSP MUST act as Verifier and the EBW as Wallet Unit, and both MUST conform to [WBCS-002] for the presentation exchange. This specification adds no requirements to that flow.
Two requirements are specific to onboarding and are not covered by [WBCS-002]. The QTSP MUST: - Verify that the organisation identifier in the presented credential corresponds to the subscriber_id in the onboarding request. - Not register a Subscriber or issue a certificate without a successfully verified presentation.
The credential types accepted for identity proofing, and the assurance level required, are governed by the WP4 QTSP group specification [QTSP-SPEC] and by the QTSP’s own qualified service policy.
8.4 Subscriber Certificate
On successful identity proofing, the QTSP MUST issue an X.509 certificate to the Subscriber from the submitted CSR. The certificate:
- MUST contain a SAN URI encoding the Subscriber’s
ebcoreidentifier, per [WMP-EDELIVERY] Section 4.3 - MUST chain to a CA accepted by the eDelivery network the Subscriber is registered in
- MUST be the certificate registered in the Subscriber’s SMP entry
- SHOULD have a validity period no longer than 12 months
The Subscriber’s private key MUST be generated inside a hardware-backed secure element or WSCA/QSCD where available, and MUST NOT leave it.
This certificate is what the EBW authenticates with on every subsequent session (Section 9). There is no bearer access token in this profile: the certificate is long-lived, the identity proofing is not repeated per session, and session authentication is a signature the EBW can always produce. This removes the token renewal cycle that a short-lived bearer token would otherwise force on every EBW.
8.5 SMP Registration
The QTSP MUST register, or cause to be registered, an SMP entry for the Subscriber containing:
- The Subscriber’s participant identifier in
iso6523-actorid-upisform - A
wmp-evidenceProcess entry (per [WMP-EDELIVERY] §3.4), pointing at the QTSP’s WMP endpoint - Both
bdxr-transport-wmp-ws-v0p1andbdxr-transport-wmp-https-v0p1transport profile endpoints - The Subscriber’s certificate
The endpoint registered in SMP is the QTSP’s endpoint, not the EBW’s. The QTSP relays inbound messages to the correct wallet unit internally. This follows the [WMP-CORE] Section 7.5 privacy principle and means the EBW needs no publicly reachable network position.
<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05">
<ServiceInformation>
<ParticipantIdentifier scheme="iso6523-actorid-upis">
0007:5567164818
</ParticipantIdentifier>
<DocumentIdentifier scheme="busdox-docid-qns">
urn:wmp:session:v0.1
</DocumentIdentifier>
<ProcessList>
<Process>
<ProcessIdentifier scheme="wmp-process">wmp-evidence</ProcessIdentifier>
<ServiceEndpointList>
<Endpoint transportProfile="bdxr-transport-wmp-ws-v0p1">
<EndpointURI>wss://qerds.qtsp.example/wmp</EndpointURI>
<Certificate>MIICxz...</Certificate>
<ServiceDescription>QERDS WMP WebSocket endpoint</ServiceDescription>
</Endpoint>
<Endpoint transportProfile="bdxr-transport-wmp-https-v0p1">
<EndpointURI>https://qerds.qtsp.example/wmp</EndpointURI>
<Certificate>MIICxz...</Certificate>
<ServiceDescription>QERDS WMP HTTPS endpoint</ServiceDescription>
</Endpoint>
</ServiceEndpointList>
</Process>
</ProcessList>
</ServiceInformation>
</ServiceMetadata>The QTSP MUST update the SMP entry within 24 hours of any certificate rotation or endpoint change.
8.6 Key Rotation
A Subscriber MAY rotate its key at any time. Rotation reissues the Subscriber certificate and updates the SMP entry. It does not repeat identity proofing if the existing certificate is still valid and is used to authenticate the rotation request.
sequenceDiagram
participant EBW as EBW
participant QTSP as QTSP
participant SMP as SMP
note over EBW: EBW generates new key pair + CSR
EBW->>QTSP: POST /onboarding/rotate<br>{ subscriber_id, csr }<br>(mTLS with current certificate)
QTSP->>QTSP: Verify current certificate<br>Match to registered subscriber
QTSP->>QTSP: Issue new certificate from CSR
QTSP->>SMP: Update participant certificate
QTSP-->>EBW: { certificate, rotated_at,<br> old_certificate_valid_until }
The QTSP MUST: - Authenticate the rotation request with the Subscriber’s current valid certificate, or require full re-proofing (Section 8.3) if the current certificate has expired or been revoked. - Update the SMP entry within 24 hours. - Honour the previous certificate for a grace period of no more than 24 hours after rotation, and state the grace period end in old_certificate_valid_until.
The EBW MUST publish fresh MLS KeyPackages bound to the new certificate before the grace period ends (Section 10.3).
Note on in-flight messages: MLS key material is separate from the Subscriber certificate. Rotating the certificate does not invalidate existing MLS groups — the group’s epoch keys are unaffected. An EBW SHOULD perform an MLS key update (Section 10.4) after certificate rotation, but in-flight messages encrypted under the current epoch remain decryptable throughout.
9. Session Establishment and Authentication
9.1 Session Creation
The EBW creates a WMP session with its QTSP per [WMP-CORE] Section 4.1. The session is the container for all subsequent QERDS interactions.
sequenceDiagram
participant EBW as EBW
participant QTSP as QTSP
EBW->>QTSP: Connect (WSS or HTTPS)<br>mTLS with subscriber certificate
EBW->>QTSP: wmp.session.create<br>{ sender: "ebcore:...",<br> participants: ["x509:san:dns:qerds.qtsp.example"],<br> auth: {type: "mtls"},<br> capabilities_offered: {...},<br> security: {mode: "mls", cipher_suites: [1]} }
QTSP->>QTSP: Verify client certificate chain<br>Match SAN URI to sender identifier<br>Check subscriber registration
QTSP-->>EBW: result<br>{ session_id, capabilities, security,<br> challenge, resumption_token }
note over EBW,QTSP: Session active. QERDS capabilities negotiated.
wmp.session.create params:
{
"wmp": {
"version": "0.1",
"sender": "ebcore:iso6523:0007:5567164818",
"timestamp": "2026-07-16T10:15:30Z"
},
"participants": ["x509:san:dns:qerds.qtsp.example"],
"auth": {"type": "mtls"},
"capabilities_offered": {
"messaging": {"max_size": 65536},
"offline": {"max_queued": 1000, "ttl": 2592000, "status_notifications": true},
"resolve": {"supported_types": ["mls_key_packages", "participant"]},
"evidence": {
"event_types": [
"submission_accepted", "relay_accepted", "relay_forwarded",
"delivery_attempted", "delivery_confirmed", "delivery_failed",
"retrieval_confirmed", "acceptance_confirmed"
]
}
},
"security": {"mode": "mls", "cipher_suites": [1]},
"ttl": 3600
}9.2 Authentication
Per [WMP-CORE] Section 4.4.6, the ebcore scheme authenticates with mtls or bearer. This profile constrains that choice:
- The EBW MUST authenticate using
auth.typeofmtls, presenting its Subscriber certificate (Section 8.4) as the TLS client certificate. - The EBW MAY additionally use
x5cchallenge-response authentication where the deployment terminates TLS at a component that cannot forward the client certificate. In that case the EBW MUST completewmp.session.authenticatewith asigned_challengeover the challenge issued in the session create result, per [WMP-CORE] Section 4.4.3. - The QTSP MUST NOT accept
auth.typeofbeareroropaqueon a QERDS session.
The QTSP MUST: 1. Verify the client certificate chain against the trust anchor for the Subscriber’s eDelivery network. 2. Verify that the certificate’s SAN URI encodes exactly the ebcore identifier presented in wmp.sender. A mismatch MUST be rejected with error -31002. 3. Verify that the certificate has not been revoked. 4. Verify that the Subscriber is registered (Section 8) and not suspended. 5. Reject with -31002 (Not authorized) on any failure.
The QTSP MUST authenticate itself to the EBW. It does so implicitly via its TLS server certificate, and MUST additionally return an auth object of type x5c in the session create result ([WMP-CORE] §4.4.5) carrying its qualified certificate chain. The EBW MUST verify that chain against the EU Trusted List and MUST NOT proceed on a session with a QTSP whose qualified status it cannot establish.
9.3 Session Resumption
The QTSP MUST issue a resumption_token in the session create result and MUST support wmp.session.resume ([WMP-CORE] §4.5).
On resumption, the MLS epoch is preserved and the QTSP replays messages queued since last_received_id. Resumption is what makes an intermittently-connected EBW — a mobile wallet, a backgrounded app — workable without repeating capability negotiation or MLS group setup on every reconnect.
The QTSP MUST rotate the resumption token on each successful resume and MUST bind it to the authenticated Subscriber identity. A resumed session MUST re-verify the client certificate: resumption restores session state, not authentication.
9.4 Session Termination
Either party MAY close the session with wmp.session.close. Closing a session MUST NOT discard undelivered queued messages or pending evidence. The QTSP MUST deliver outstanding evidence in a new session created for that purpose, per [WMP-EVIDENCE] Section 5.3.
10. MLS Encryption Layer
10.1 MLS Is Mandatory
MLS is OPTIONAL in [WMP-MLS] Section 1. In this profile it is mandatory.
- The QTSP MUST advertise
security_modes: ["mls"]and MUST NOT accept a QERDS session withsecurity.modeoftlsormls-optional. - The EBW MUST request
security.mode: "mls"on session creation. - Every message carrying Subscriber content MUST be MLS-encrypted. The QTSP MUST reject an unencrypted content message with error
-31003(Encryption required).
End-to-end encryption of Subscriber content is a requirement of the QERDS: the QTSP attests to delivery events, and has no need of the content itself.
10.2 Cipher Suites
The EBW and QTSP MUST support:
MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519(0x0001)
The EBW and QTSP SHOULD support:
MLS_128_DHKEMP256_AES128GCM_SHA256_P256(0x0002)
10.3 Credential Type and KeyPackages
Per [WMP-MLS] Section 2.2, the ebcore identifier scheme maps to the x509 MLS credential type. Each EBW’s MLS leaf node MUST carry its Subscriber certificate (Section 8.4) as the MLS credential. Validation follows the eDelivery network’s trust anchor rules.
This binds the MLS group membership to the same certificate that authenticates the session and appears in the SMP entry. A participant in an MLS group is therefore provably the registered legal entity, not merely a party holding a group key.
Each EBW MUST publish MLS KeyPackages to its QTSP’s KeyPackage directory. The QTSP MUST serve them at the mls_key_packages URL advertised in its well-known configuration:
GET /.well-known/mls-key-packages?participant=ebcore%3Aiso6523%3A0007%3A5567164818
{
"participant": "ebcore:iso6523:0007:5567164818",
"key_packages": [
{
"id": "kp-001",
"cipher_suite": 1,
"key_package": "<base64url-encoded MLS KeyPackage>",
"expires": "2026-08-15T00:00:00Z"
}
]
}The EBW MUST publish fresh KeyPackages before the previous set expires. The RECOMMENDED validity period is 30 days ([WMP-MLS] §7.2). The QTSP MUST NOT serve an expired KeyPackage and MUST return an empty key_packages array if none are valid — a Sender EBW that receives an empty array MUST NOT submit to that recipient and SHOULD surface the condition rather than fall back to an unencrypted send.
10.4 Group Lifecycle
An MLS group is created per QERDS correspondence, spanning the Sender EBW and the Recipient EBW. Both QTSPs are Delivery Service only — they are not MLS group members and MUST NOT be added to the group.
sequenceDiagram
participant S_EBW as Sender EBW
participant S_QTSP as Sender QTSP
participant R_QTSP as Recipient QTSP
participant R_EBW as Recipient EBW
S_EBW->>S_QTSP: wmp.resolve<br>{ type: "mls_key_packages",<br> identifier: "ebcore:...recipient" }
S_QTSP->>R_QTSP: Fetch KeyPackage directory
R_QTSP-->>S_QTSP: KeyPackages
S_QTSP-->>S_EBW: result { key_packages }
note over S_EBW: Verify KeyPackage credential:<br>X.509 chain + SAN URI matches<br>recipient ebcore identifier
S_EBW->>S_EBW: Create MLS group<br>Generate Welcome + GroupInfo
S_EBW->>S_QTSP: wmp.mls.group.create<br>{ group_id, cipher_suite: 1,<br> accepted_credential_types: ["x509"],<br> accepted_identity_schemes: ["ebcore"],<br> group_info, welcomes: { "ebcore:...": "<Welcome>" } }
S_QTSP->>R_QTSP: Relay
R_QTSP->>R_EBW: wmp.mls.group.create (relayed)
note over R_EBW: Verify group creator's credential<br>against eDelivery trust anchor
R_EBW->>R_QTSP: wmp.mls.group.join<br>{ welcome_processed: true }
R_QTSP->>S_QTSP: Relay
S_QTSP->>S_EBW: wmp.mls.group.join (relayed)
note over S_EBW,R_EBW: MLS group established.<br>Epoch 0. QTSPs hold no group key.
The Sender EBW MUST verify the recipient’s KeyPackage credential before adding it to the group: the X.509 chain MUST validate to the eDelivery trust anchor and the SAN URI MUST encode exactly the ebcore identifier the sender intends to address. Skipping this check would let a compromised KeyPackage directory silently substitute a recipient — the evidence chain would then attest to correct delivery of content encrypted to the wrong party.
An EBW MUST perform an MLS key update ([WMP-MLS] §3.5) after every 100 messages or every hour, whichever comes first ([WMP-MLS] §7.3).
10.5 Encryption Scope
Per [WMP-MLS] Section 4.3, the split between ciphertext and plaintext framing is fixed:
| Encrypted (inside the MLS ciphertext) | Plaintext (outer JSON-RPC envelope) |
|---|---|
to, content_type, body |
jsonrpc, method, id |
All other content fields in params |
wmp.version, wmp.session_id, wmp.sender |
result / error on responses |
wmp.encrypted, wmp.epoch, wmp.timestamp |
wmp.signature, wmp.timestamp_token, wmp.relay_chain |
The QTSP routes on the plaintext wmp metadata alone. It MUST NOT attempt to decrypt, log, or inspect the ciphertext.
Metadata is not confidential. The QTSP necessarily sees who is corresponding with whom, when, and how much — that is inherent to operating a delivery service, and it is what the evidence attests to. MLS protects content, not the fact of correspondence. Section 21 addresses the consequences.
11. Transport
11.1 Transport Bindings
| Transport | QTSP | EBW | Notes |
|---|---|---|---|
WebSocket (wmp.v1 subprotocol) |
MUST | SHOULD | Push delivery; required for real-time automated flows |
| HTTPS (POST + SSE) | MUST | MUST | Baseline; works for any EBW deployment model |
A conforming QTSP MUST support both so that any EBW can connect regardless of deployment model. A conforming EBW MUST support HTTPS and SHOULD support WebSocket where it is a server-side or always-on deployment.
Transport details follow [WMP-TRANSPORT]. TLS 1.3 is REQUIRED on both bindings. The default message size limit is 64 KiB; a QTSP MAY negotiate a larger messaging.max_size and SHOULD do so where its service supports large consignments.
11.2 Offline Delivery
The offline capability ([WMP-CORE] §5.3.1) MUST be negotiated on every QERDS session. It is what allows an EBW to be disconnected without the delivery failing — the QTSP queues, and the evidence chain records the queuing rather than a false non-delivery.
The QTSP MUST: - Queue messages for disconnected EBWs for at least 30 days. - Set status_notifications: true so senders receive wmp.message.status notifications. - Send exactly one terminal status per message: delivered, expired, or dropped. - Generate delivery_expired evidence when a queued message expires, and retrieval_timeout evidence when the recipient does not retrieve within the retention period.
[WMP-CORE] §5.3.1 defines the wire-level mechanics for this case: when the recipient’s queue is at max_queued, the QTSP rejects the message with error -31014 (Queue full), and the terminal wmp.message.status sent to the sender is dropped. Neither of those is itself evidence — -31014 is a JSON-RPC error and dropped is a delivery-status notification, and a QTSP MUST NOT treat either as a substitute for an ERDS evidence record. A QTSP that returns -31014 MUST also reject the relay and generate relay_rejected evidence (Section 15.2), with EventReasons set to quota_exceeded ([WMP-EVIDENCE] §4.2.1; Section 15.4) — the same evidentiary treatment submission_rejected gets for policy/quota/format rejections at the origin (Section 13). This keeps queue exhaustion visible in the Sender QTSP’s evidence chain instead of indistinguishable from a service outage.
An EBW MUST NOT set expires_at shorter than the QERDS service’s minimum retention without understanding that doing so converts a slow delivery into a non-delivery, with corresponding evidence.
12. Capability Negotiation
12.1 Required Capabilities
A QERDS session MUST negotiate all of:
| Capability | Purpose | Notes |
|---|---|---|
messaging |
Content delivery | max_size at least 65536 |
evidence |
Registered delivery evidence | Section 15; this is what makes the session a QERDS session |
offline |
Store-and-forward for disconnected EBWs | Section 11.2 |
resolve |
Participant and KeyPackage resolution | Section 7 |
If the QTSP’s session create result omits evidence, the session is not a QERDS session. The EBW MUST close it and MUST NOT submit content expecting registered delivery.
12.2 Evidence Capability Parameters
The QTSP’s negotiated evidence capability MUST specify, per [WMP-EVIDENCE] Section 9.2:
| Parameter | Requirement | Value |
|---|---|---|
event_types |
MUST | All event types in Sections 3.1–3.5 of [WMP-EVIDENCE] |
repository |
MUST | URL of the evidence repository API (Section 19.4) |
retention_period |
MUST | At least P10Y |
signing_algorithm |
MUST | An algorithm permitted for qualified seals under eIDAS |
timestamp_authority |
MUST | RFC 3161 endpoint of a qualified TSA |
A QTSP that narrows event_types or shortens retention_period below P10Y in the negotiated result is not offering a qualified service on that session, and the EBW MUST treat the session as non-qualified.
Part 2: QERDS Delivery
13. Message Submission Flow
This flow covers the Sender EBW submitting a message to the QERDS (Interfaces 14 and 11).
The Sender EBW’s identity is established by the mutually-authenticated Subscriber certificate on the session (Section 9.2). No additional identity check is required at submission.
sequenceDiagram
actor User as Sender (User/Agent)
participant EBW as Sender EBW
participant S_QTSP as Sender QTSP
participant R_QTSP as Recipient QTSP
participant R_EBW as Recipient EBW
User->>EBW: Request to send message<br>(recipient ebcore id, payload)
note over EBW: MLS group established (Section 10.4)<br>Encrypt content to group epoch key<br>Sign detached JWS over content
EBW->>S_QTSP: wmp.message.deliver<br>{ wmp: { encrypted: true, epoch: 3,<br> signature, identity_assertions },<br> ciphertext }
note over S_QTSP: Verify signature over ciphertext<br>Obtain qualified timestamp<br>Create submission_accepted evidence:<br>ERDS record (JAdES seal) + notification<br>(Interfaces 5-9 internal)
S_QTSP-->>EBW: wmp.evidence.notify<br>{ event_type: submission_accepted,<br> original_content_hash, timestamp_token }
EBW-->>S_QTSP: wmp.evidence.ack
note over S_QTSP,R_QTSP: QTSP resolves recipient QTSP endpoint<br>via BDXL/SMP, appends relay_chain entry,<br>then relays (Interface 16 — out of scope)
S_QTSP->>R_QTSP: Relay
R_QTSP-->>S_QTSP: relay_accepted
S_QTSP-->>EBW: wmp.evidence.notify<br>{ event_type: relay_accepted }
note over R_QTSP,R_EBW: Recipient delivery flow (Section 14)
R_QTSP-->>S_QTSP: Delivery + retrieval confirmed
S_QTSP-->>EBW: wmp.evidence.notify<br>{ event_type: delivery_confirmed }
S_QTSP-->>EBW: wmp.evidence.notify<br>{ event_type: retrieval_confirmed }
Key ordering rule (submission): The QTSP MUST generate and deliver submission_accepted evidence to the Sender EBW before relaying the message to the Recipient QTSP. The evidence timestamp records the moment of submission acceptance. Relaying first would leave a window in which the message is in transit with no evidence that it was ever accepted.
The Sender EBW MUST: - MLS-encrypt the content (Section 10.1). - Include a detached JWS signature over the content object ([WMP-CORE] §5.4), signed with the key bound to its Subscriber certificate. This is the sender’s non-repudiable attestation of what it submitted; the QTSP’s evidence attests only that it received it. - Include identity_assertions ([WMP-CORE] §5.6) on the first message of a correspondence, and on every subsequent message where per-message legal identity binding is required. The assertion MUST be of type verifiable_presentation and MUST present the Subscriber’s EBWOID (European Business Wallet Organisation Identity Document), disclosing at least the organisation identifier corresponding to the sender’s ebcore identifier. Per [WMP-CORE] §5.6 the presentation binds to the session via audience and to the session challenge via nonce, and SHOULD carry an eidas_lote trust hint. An assertion sent once is valid for the session lifetime. - Set consignment_mode ([WMP-CORE] §3.5) to consented or consented_signed where the use case requires the recipient to explicitly accept or reject content, or to produce a signed acceptance record, before it is presented. Where consignment_mode is absent, this profile’s default is basic.
The QTSP MUST: - Verify the sender’s signature before accepting. Reject with -31010 (Signature invalid) on failure. - Verify wmp.timestamp is within its clock skew tolerance. Reject with -31011 on failure. - Compute original_content_hash over the JCS-canonicalized content object exactly as the signature payload is constructed ([WMP-EVIDENCE] §4.3), so that the evidence and the sender’s signature cover the same bytes. - Generate submission_rejected evidence — not a bare JSON-RPC error — where it rejects a well-formed submission on policy, quota, or format grounds. A rejection that produces no evidence is indistinguishable to the Subscriber from a service failure. - Where consignment_mode is set, verify it appears in the Recipient QTSP’s advertised erds.consignment_modes (Section 7.2; [WMP-CORE] §7.5.1.1) before relaying, and reject with -31005 (Capability not supported) if it does not. Since this profile requires every QTSP to advertise all three modes, this check only ever fails against a non-conforming Recipient QTSP.
14. Message Reception Flow
This flow covers the Recipient EBW receiving a message from the QERDS (Interfaces 10, 11, and 4).
sequenceDiagram
participant S_QTSP as Sender QTSP
participant R_QTSP as Recipient QTSP
participant R_EBW as Recipient EBW
actor User as Recipient (User/Agent)
S_QTSP->>R_QTSP: Relay (Interface 16)
note over R_QTSP: Append relay_chain entry (signed)<br>Create relay_accepted evidence
R_QTSP-->>S_QTSP: relay_accepted
alt EBW connected
R_QTSP->>R_EBW: wmp.message.deliver<br>{ encrypted: true, epoch, ciphertext,<br> relay_chain, identity_assertions }
else EBW offline
note over R_QTSP: Queue message (offline capability)
R_QTSP-->>S_QTSP: delivery_attempted
R_EBW->>R_QTSP: wmp.session.resume<br>{ last_received_id }
R_QTSP->>R_EBW: wmp.message.deliver (replayed)
end
note over R_QTSP: Create delivery_confirmed evidence<br>(message reached the endpoint)
note over R_EBW: Decrypt with MLS epoch key<br>Verify sender signature<br>Verify identity_assertions (Interface 4)<br>Verify relay_chain signatures
R_EBW->>R_QTSP: wmp.message.ack<br>{ status: "received" }
note over R_QTSP: Create retrieval_confirmed evidence<br>(triggered by ack — JAdES seal + QTS internal)
R_QTSP-->>S_QTSP: retrieval_confirmed
R_QTSP->>R_EBW: wmp.evidence.notify<br>{ event_type: retrieval_confirmed }
R_EBW-->>R_QTSP: wmp.evidence.ack
R_EBW->>User: Display incoming message
User->>R_EBW: Accept / auto-accept
R_EBW->>R_QTSP: wmp.message.ack<br>{ status: "processed" }
note over R_QTSP: Create acceptance_confirmed evidence
R_QTSP-->>S_QTSP: acceptance_confirmed
Key ordering rule (reception): The QTSP MUST NOT generate retrieval_confirmed evidence before receiving wmp.message.ack from the Recipient EBW. delivery_confirmed records that the QTSP delivered to the endpoint; retrieval_confirmed records that the EBW acknowledged it. These are different facts with different legal weight, and conflating them would let the QTSP attest to receipt it did not observe.
Consignment identity verification (Interface 4): The Recipient EBW MUST verify the Sender’s identity_assertions per [WMP-CORE] §5.6 before presenting the message content to a user or downstream system, and MUST additionally verify that the organisation identifier disclosed in the sender’s EBWOID corresponds to the wmp.sender identifier. It MUST reject the assertion with error -31012 ([WMP-CORE] §5.6.2) where verification fails.
The EBW MUST NOT present content as originating from a named legal entity on the strength of the wmp.sender field alone — that field is routing metadata, and its binding to a legal identity is exactly what the EBWOID assertion establishes.
Consignment mode (consented, consented_signed). [WMP-CORE] §3.5 describes consented as gating content on explicit accept/reject before it becomes accessible. In this profile that gate is the existing wmp.message.ack step above: the Recipient EBW MUST NOT present content to a user or downstream system, nor send wmp.message.ack with status processed, until the acceptance decision has actually been made — the received ack already confirms delivery; it is the processed (or explicit rejection) ack that carries consent. No separate pre-delivery notification exchange is required, because the ciphertext reaching the EBW is not itself “access” to the content.
consented_signed adds one requirement on top of consented: the Recipient EBW MUST sign the wmp.message.ack that carries its accept or reject decision — a detached JWS signature in its wmp metadata ([WMP-CORE] §5.4), with the key bound to its Subscriber certificate. This is the “signed acknowledgment” [WMP-CORE] §3.5 requires, and it is the recipient-side counterpart to the sender’s submission signature (Section 13): the QTSP’s acceptance_confirmed/acceptance_rejected evidence attests that it observed the decision; the recipient’s own signature is what makes the decision itself non-repudiable. The Recipient QTSP MUST verify this signature before generating acceptance_confirmed or acceptance_rejected evidence when consented_signed was negotiated, and MUST reject an unsigned or invalidly-signed decision ack with -31010 rather than generating evidence for a decision it cannot attribute.
The Recipient EBW MUST: - Verify the sender’s detached JWS signature over the content, and reject the message if it does not verify. - Verify each relay_chain entry’s signature ([WMP-CORE] §5.7), and surface any relay in the chain it does not recognise rather than silently accepting the route. - Send wmp.message.ack with status received on successful decryption and verification. - Send wmp.message.ack with status processed on explicit user or system acceptance, where the use case requires an acceptance record. - Send wmp.message.ack with status failed where decryption or verification fails, so that the QTSP generates delivery_failed evidence rather than leaving the correspondence unresolved. - Sign the processed/rejection wmp.message.ack per [WMP-CORE] §5.4 where consignment_mode is consented_signed.
15. Evidence
Evidence is the mechanism by which WMP satisfies eIDAS ERDS obligations. Everything else in this profile is transport; this section is the part that makes it a QERDS.
15.1 Two Artefacts, One Event
Every QERDS delivery event produces two things, and keeping them distinct is what allows this profile to satisfy both WMP and eIDAS without either specification bending:
| Artefact | Defined by | Role |
|---|---|---|
WMP evidence notification — wmp.evidence.notify |
[WMP-EVIDENCE] §4 | Tells the EBW an event occurred, when, and over what content. Signed and timestamped. This is the real-time signal. |
| ERDS evidence record — JSON conforming to [ERDS-EVIDENCE-SCHEMA] | ETSI EN 319 522-3, as JSON | The legally-binding artefact. JAdES-signed, self-contained, verifiable by a third party with no knowledge of WMP. Retrieved from the evidence repository. |
The notification is not a second evidence format and the ERDS record is not a WMP extension. They are the notification and the artefact, and WMP already anticipates exactly this split: [WMP-EVIDENCE] Section 6.2 types the repository’s signed_evidence field as a JWS compact serialization — which is precisely what a detached compact JAdES signature over the ERDS evidence JSON is.
This profile therefore adds no field to any WMP message. The wmp.evidence.notify message is byte-for-byte as [WMP-EVIDENCE] Section 4 specifies it, and the ERDS record travels through the repository field WMP already defines for it.
15.2 Mapping to ETSI EN 319 522
A QTSP MUST generate one ERDS evidence record for each WMP evidence event, with ERDSEventId set per the following mapping.
ERDSEventId values are URIs of the form http://uri.etsi.org/19522/Event/<event>, per Table 2 of [EN-319-522-3]. The table below gives <event>; a QTSP MUST set ERDSEventId to the full URI.
| WMP event type | ERDSEventId event |
Generated by | Trigger |
|---|---|---|---|
submission_accepted |
SubmissionAcceptance |
Sender QTSP | Submission accepted, before relay |
submission_rejected |
SubmissionRejection |
Sender QTSP | Submission rejected on policy/quota/format |
relay_accepted |
RelayAcceptance |
Recipient QTSP | Message accepted from previous hop |
relay_rejected |
RelayRejection |
Recipient QTSP | Message rejected from previous hop, including inability to admit it under exhausted offline queue capacity (Section 11.2) |
relay_forwarded |
ContentConsignment |
Sender QTSP | Message forwarded to next hop |
delivery_attempted |
ConsignmentNotification |
Recipient QTSP | Recipient offline; message queued and notification raised |
delivery_confirmed |
ContentHandover |
Recipient QTSP | Content handed over to the EBW endpoint |
delivery_failed |
ContentHandoverFailure |
Recipient QTSP | Handover permanently failed |
delivery_expired |
ContentHandoverFailure |
Sender QTSP | Queued message expired before handover |
retrieval_confirmed |
ContentAccessTracking |
Recipient QTSP | wmp.message.ack status received |
retrieval_timeout |
ContentHandoverFailure |
Recipient QTSP | No ack within the retention period |
acceptance_confirmed |
ConsignmentAcceptance |
Recipient QTSP | wmp.message.ack status processed |
acceptance_rejected |
ConsignmentRejection |
Recipient QTSP | Recipient explicitly rejected the content |
Three WMP events map to ContentHandoverFailure, because ETSI models them as a single event — handover did not occur — distinguished by cause rather than by identifier. EventReasons, which Section 15.4 requires on every negative record, is what keeps a permanent failure, an expiry in the sender’s queue, and a recipient that never retrieved distinguishable. The generating party disambiguates them further: delivery_expired originates at the Sender QTSP, the other two at the Recipient QTSP.
ConsignmentModeType in [ERDS-EVIDENCE-SCHEMA] defines four values; the table below gives this profile’s mapping for each, in terms of [WMP-CORE] §3.5’s consignment_mode field.
| Consignment mode | ETSI ConsignmentModeType URI |
[WMP-CORE] consignment_mode |
Evidence generated | Support |
|---|---|---|---|---|
| Basic | .../consignment/basic |
basic (default when consignment_mode is absent) |
Exchange completes at ContentAccessTracking (retrieval_confirmed); no acceptance record arises |
Supported |
| Consent | .../consignment/consent |
consented |
acceptance_confirmed / acceptance_rejected, on wmp.message.ack status processed / explicit rejection (Section 14) |
Supported |
| Signed | .../consignment/signed |
consented_signed |
Same events as Consent, except the underlying wmp.message.ack additionally carries the recipient’s own detached JWS over its decision (Section 14) — no new event type, an added property of the same evidence |
Supported |
| Other | .../consignment/other |
No [WMP-CORE] counterpart | — | Not supported. Undefined by construction — ETSI reserves it for bilaterally-agreed semantics with no fixed content to map against. A deployment negotiating it outside this profile is responsible for defining its own event mapping. |
A QTSP MUST support all thirteen event types. [WMP-EVIDENCE] Section 9.2 requires support for all event types in its Sections 3.1–3.5 for ERDS conformance; this table is the QERDS-specific reading of that requirement.
The non-ERDS events of [WMP-EVIDENCE] Section 3.6 (read_confirmed, processed_confirmed, flow_completed, session_evidence) are OPTIONAL in this profile, produce no ERDS evidence record, and carry no qualified status.
15.2.1 ETSI Events Not Generated on This Leg
Table 2 of [EN-319-522-3] defines events beyond those mapped above. They are unmapped for reasons of scope rather than oversight:
| ETSI event | Why not generated on the EBW–QTSP leg |
|---|---|
RelayFailure, ContentConsignmentFailure |
Inter-QTSP relay conditions (Interface 16) — out of scope (Section 2). A QTSP generates these on the relay leg where its topology requires them. |
NotificationForAcceptance, NotificationForAcceptanceFailure, AcceptanceRejectionExpiry |
Belong to consignment modes that solicit recipient consent before handover. WMP’s event model has no equivalent; a deployment using .../consignment/consent with an out-of-band acceptance step MAY generate them. |
NotificationDelivered, NotificationAccessTracking, ConsignmentNotificationFailure |
Presuppose a notification channel separate from the content channel. In this profile the WMP session carries both, so ConsignmentNotification, ContentAccessTracking, and ContentHandoverFailure already record these facts. |
RelayToNonERDS, RelayToNonERDSFailure, ReceivedFromNonERDS |
Gateway flows to non-ERDS systems — out of scope (Section 2). |
A QTSP MAY generate any of these where its deployment warrants it. Doing so MUST NOT displace the records mandated in Section 15.2.
15.3 Evidence Notification Format
Evidence is notified with wmp.evidence.notify per [WMP-EVIDENCE] Section 4.1, using that section’s fields and no others.
{
"jsonrpc": "2.0",
"method": "wmp.evidence.notify",
"params": {
"wmp": {
"version": "0.1",
"session_id": "ses-a1b2c3d4",
"sender": "x509:san:dns:qerds.qtsp.example",
"timestamp": "2026-07-16T10:15:31Z",
"timestamp_token": "<base64url-encoded RFC 3161 TimeStampToken from qualified TSA>",
"signature": "<BASE64URL(protected header)>..<BASE64URL(signature)>"
},
"evidence": {
"evidence_id": "evi-7f8e9d0c-b1a2-43e5-8f6d-7e8a9b0c1d2e",
"event_type": "submission_accepted",
"original_message_id": "msg-550e8400-e29b-41d4-a716-446655440000",
"original_sender": "ebcore:iso6523:0007:5567164818",
"original_recipient": "ebcore:iso6523:0204:DE123456789",
"original_content_hash": {
"algorithm": "sha-256",
"value": "<base64url-encoded hash of JCS-canonicalized content object>"
},
"event_time": "2026-07-16T10:15:31Z",
"previous_evidence_id": null,
"details": {
"service_class": "registered",
"submission_endpoint": "wss://qerds.qtsp.example/wmp"
}
}
}
}Every field above is defined in [WMP-EVIDENCE] Section 4.2. The details object carries event-type-specific information only, per that section. A QTSP MUST NOT place an ERDS evidence record, or any other evidence format, in details — the ERDS record is retrieved from the repository (Section 15.4), and duplicating it inline would create two artefacts that can disagree.
The evidence_id in the notification MUST equal the EvidenceIdentifier of the corresponding ERDS evidence record, so the EBW can retrieve the record without an intermediate lookup.
15.4 ERDS Evidence Record
The QTSP MUST generate, for every evidence event, an ERDS evidence record that is a JSON document conforming to [ERDS-EVIDENCE-SCHEMA] — the JSON representation of the ETSI EN 319 522-3 V1.2.1 EvidenceType, structurally equivalent to the XML schema in that standard.
The record MUST populate at least the schema’s required properties:
| Property | Requirement | Value in this profile |
|---|---|---|
version |
REQUIRED | Schema version per [ERDS-EVIDENCE-SCHEMA] |
EvidenceIdentifier |
REQUIRED | MUST equal the evidence_id of the corresponding wmp.evidence.notify |
ERDSEventId |
REQUIRED | The Table 2 URI for the mapped event (Section 15.2) |
EventTime |
REQUIRED | MUST equal the event_time of the corresponding notification |
EvidenceIssuerDetails |
REQUIRED | The generating QTSP, with its qualified certificate in CertificateDetails |
SenderDetails |
REQUIRED | The Sender EBW’s ebcore identifier and certificate details |
RecipientDetails |
REQUIRED | The Recipient EBW’s ebcore identifier and certificate details |
The QTSP MUST additionally:
- Set
MessageIdentifierto theoriginal_message_idof the corresponding notification, binding the record to the WMP message it attests to. - Set
SubmissionTimeon records generated after submission acceptance. - Populate
EventReasonson every rejection, failure, non-delivery, and non-retrieval record. A negative evidence record that does not say why is of little use to the party it is issued against. - Sign the record with
jadesSignature, per Section 15.5.
Identifiers carried in SenderDetails and RecipientDetails MUST be the parties’ ebcore identifiers (Section 6.1), consistent with original_sender and original_recipient in the notification. The ERDS record and the WMP notification describe one event, and an EBW MUST be able to correlate them on EvidenceIdentifier / evidence_id alone.
UserContentInfoand confidentiality. The schema’sUserContentInfodescribes the delivered content. Because content is MLS-encrypted end-to-end (Section 10), a QTSP cannot populateComposingPartsorPartsInfowith anything derived from plaintext, and MUST NOT attempt to. It populates only what it legitimately observes: the content hash and, where applicable,AppLayerIdentifier. This is not a limitation to work around — an ERDS attests that content was delivered, not what the content was.
Interoperability with non-WMP ERDS: EN 319 522-3 XML formats and the EN 319 522-4-1 bindings remain relevant where a QERDS exchanges evidence with an ERDS that does not speak WMP. Because [ERDS-EVIDENCE-SCHEMA] is structurally equivalent to the EN 319 522-3 XML schema, that translation is mechanical. It belongs to the inter-QTSP leg (Interface 16) and to internal QTSP evidence creation (Interfaces 5–9), both out of scope here (Section 2). On the EBW–QTSP leg, an EBW consumes JSON and is never required to parse XML.
15.5 Qualified Signature and Timestamp
Per [WMP-EVIDENCE] Section 9.2, ERDS conformance requires qualified signatures and qualified timestamps. Both artefacts are signed, with different mechanisms, because they answer to different specifications.
The notification. The QTSP MUST: 1. Sign every wmp.evidence.notify with a key bound to its qualified certificate, included in the x5c chain, using the detached JWS of [WMP-CORE] Section 5.4. 2. Include a timestamp_token from a qualified TSA on every evidence notification. 3. Sign every relay_chain entry it appends ([WMP-CORE] §5.7; [WMP-EVIDENCE] §4.4).
The ERDS record. The QTSP MUST: 1. Sign every ERDS evidence record with jadesSignature, using the compactDetached form of [ERDS-EVIDENCE-SCHEMA] — a detached compact JAdES signature. This is the form [WMP-EVIDENCE] Section 6.2 expects in signed_evidence, which it types as a JWS compact serialization. 2. Produce that signature as a qualified electronic seal under [EIDAS], with the QTSP’s qualified certificate resolvable from the JAdES header. 3. Include the qualified TSA’s RFC 3161 token, reaching JAdES-B-T per [EN-319-182-1].
JAdES-B-T is the form at issuance. Section 15.8 requires extending each record to JAdES-B-LTA over its retention period, before the certificate chain or algorithms backing the existing seal are no longer safe to rely on.
The flattenedJson and generalJson forms permitted by [ERDS-EVIDENCE-SCHEMA] MUST NOT be used on the EBW–QTSP leg. signed_evidence is a compact serialization field; the other two forms would not survive it.
The two signatures are not redundant. The notification’s JWS authenticates a WMP message in a WMP session and is verified by a WMP implementation. The record’s JAdES seal is what an auditor or a court verifies years later, with no WMP session, no relay, and possibly no WMP implementation in existence. Only the latter needs to be a qualified seal in the eIDAS sense; only the former needs to be intelligible to a relay.
Verification. The EBW MUST verify all three of the following before accepting an evidence notification, per [WMP-EVIDENCE] Section 8.1: 1. The detached JWS signature, with the x5c chain validated to the EU Trusted List and the QTSP’s qualified status confirmed. 2. The RFC 3161 timestamp token, with the TSA’s qualified status confirmed. 3. The original_content_hash, recomputed against the content the EBW actually submitted or received.
Verifying the signature but not the content hash would accept a validly-signed record attesting to a different message. Verifying the hash but not the timestamp would accept a record whose time — the entire point of registered delivery — is unattested.
On retrieving an ERDS evidence record, the EBW MUST verify the jadesSignature and the qualified status of the certificate that produced it, and MUST confirm that EvidenceIdentifier, EventTime, and MessageIdentifier agree with the notification it already holds. Where the two disagree, the ERDS evidence record is authoritative — it is the signed legal artefact; the notification is a message about it.
15.6 Evidence Routing and Acknowledgement
Evidence routing follows [WMP-EVIDENCE] Section 5.1:
| Event category | Delivered to |
|---|---|
| Submission events | Sender EBW |
| Relay events | Sender EBW + previous relay |
| Consignment/delivery events | Sender EBW |
| Retrieval events | Sender EBW |
| Acceptance events | Sender EBW |
In addition, and specific to this profile, the Recipient QTSP MUST deliver retrieval_confirmed and acceptance_confirmed evidence to the Recipient EBW as well as to the Sender. The recipient of a registered delivery needs its own evidence that it acknowledged, independent of the sender’s copy.
Where no session exists between the evidence generator and recipient, the QTSP MUST create one for evidence delivery per [WMP-EVIDENCE] Section 5.3.
The EBW MUST acknowledge every received evidence record with wmp.evidence.ack ([WMP-EVIDENCE] §5.4) and MUST store it durably, associated with its original_message_id and session_id.
15.7 Evidence Chain
Each evidence record SHOULD set previous_evidence_id to the preceding record for the same original_message_id, producing a verifiable chain across the message lifecycle.
At the end of a successful QERDS exchange, the parties hold:
| Evidence | Held by |
|---|---|
submission_accepted |
Sender EBW |
relay_accepted |
Sender EBW |
relay_forwarded |
Sender EBW |
delivery_confirmed |
Sender EBW |
retrieval_confirmed |
Sender EBW + Recipient EBW |
acceptance_confirmed (where the use case requires acceptance) |
Sender EBW + Recipient EBW |
Every record carries a qualified timestamp and binds to the content hash, giving both parties an independently verifiable record of the transmission — of the fact of transmission, at an attested time, of specific content. The content itself remains known only to the two EBWs.
15.8 Retention
The QTSP MUST retain ERDS evidence records for at least 10 years ([WMP-EVIDENCE] §6.3 and §9.2) and MUST provide the evidence repository API (Section 19.4). Retention applies to the JAdES-signed ERDS record — the artefact with legal weight — not merely to the notification summary fields.
Per [WMP-EVIDENCE] Section 8.5, evidence signatures must remain verifiable across that period. Archiving the certificate chain and re-timestamping the algorithm are independent MUSTs, because they protect against different failures: an archived chain preserves the trust path a verifier walks, but it does not rescue a signature algorithm that has become forgeable — recomputing that proof is exactly what the archived chain cannot do. Section 21 addresses why this matters more for evidence than for the MLS layer.
The QTSP MUST: - Archive the full X.509 chains used for verification. - Extend every ERDS evidence record to JAdES-B-LTA by adding a JAdES archive timestamp (arcTst, [EN-319-182-1]) before either the signature/hash algorithm backing its existing seal is no longer recommended for use (per [TS-119-312] or an equivalent national cryptographic suite recommendation), or the certificate chain validating that seal is due to expire — whichever comes first. Absent an earlier deprecation trigger, this MUST happen at least every 5 years as a backstop.
16. Method Reference
All methods are defined in [WMP-CORE], [WMP-MLS], and [WMP-EVIDENCE]. This section states which are required on the EBW–QTSP leg and any profile-specific constraints. This profile defines no new methods — a QERDS session is a WMP session with a specific capability set and specific normative constraints.
| Method | Direction | Requirement | Profile constraint |
|---|---|---|---|
wmp.session.create |
EBW → QTSP | MUST | security.mode MUST be mls; auth.type MUST be mtls (Section 9) |
wmp.session.authenticate |
EBW → QTSP | MAY | Only for x5c challenge-response where mTLS is unavailable (Section 9.2) |
wmp.session.resume |
EBW → QTSP | MUST | QTSP MUST re-verify the client certificate (Section 9.3) |
wmp.session.close |
Both | MUST | MUST NOT discard queued messages or pending evidence (Section 9.4) |
wmp.capability.list |
Both | MUST | — |
wmp.capability.update |
Both | MAY | MUST NOT downgrade security.mode below mls |
wmp.resolve |
EBW → QTSP | MUST | Types participant and mls_key_packages (Sections 7.3, 7.4) |
wmp.mls.group.create |
EBW → QTSP | MUST | Credential type x509; identity scheme ebcore (Section 10.4) |
wmp.mls.group.join |
EBW → QTSP | MUST | — |
wmp.mls.group.add / .remove |
EBW → QTSP | MUST | QTSP MUST NOT be added to the group (Section 10.4) |
wmp.mls.group.update |
EBW → QTSP | MUST | Every 100 messages or 1 hour (Section 10.4) |
wmp.message.deliver |
Both | MUST | MUST be MLS-encrypted; MUST carry a detached JWS signature (Section 13) |
wmp.message.ack |
EBW → QTSP | MUST | Drives retrieval_confirmed and acceptance_confirmed (Section 14) |
wmp.message.fetch |
EBW → QTSP | MUST | For polling EBWs on the HTTPS binding |
wmp.message.status |
QTSP → EBW | MUST | status_notifications MUST be true (Section 11.2) |
wmp.evidence.notify |
QTSP → EBW | MUST | Qualified signature + qualified timestamp; format exactly as [WMP-EVIDENCE] §4 (Section 15) |
wmp.evidence.ack |
EBW → QTSP | MUST | EBW MUST acknowledge every evidence record (Section 15.4) |
16.1 wmp.resolve — QERDS Resolution Types
Request (participant resolution):
{
"jsonrpc": "2.0",
"id": "res-1",
"method": "wmp.resolve",
"params": {
"wmp": {
"version": "0.1",
"session_id": "ses-a1b2c3d4",
"sender": "ebcore:iso6523:0007:5567164818"
},
"type": "participant",
"identifier": "ebcore:iso6523:0204:DE123456789"
}
}Result:
{
"jsonrpc": "2.0",
"id": "res-1",
"result": {
"wmp": {"version": "0.1", "session_id": "ses-a1b2c3d4"},
"resolved": true,
"identifier": "ebcore:iso6523:0204:DE123456789",
"qerds_capable": true,
"capabilities": {
"messaging": {"max_size": 65536},
"evidence": {"event_types": ["submission_accepted", "delivery_confirmed", "retrieval_confirmed"]}
},
"resolved_at": "2026-07-16T10:15:30Z",
"valid_until": "2026-07-16T22:15:30Z"
}
}Request (KeyPackage resolution):
{
"jsonrpc": "2.0",
"id": "res-2",
"method": "wmp.resolve",
"params": {
"wmp": {
"version": "0.1",
"session_id": "ses-a1b2c3d4",
"sender": "ebcore:iso6523:0007:5567164818"
},
"type": "mls_key_packages",
"identifier": "ebcore:iso6523:0204:DE123456789",
"cipher_suites": [1, 2]
}
}Result:
{
"jsonrpc": "2.0",
"id": "res-2",
"result": {
"wmp": {"version": "0.1", "session_id": "ses-a1b2c3d4"},
"resolved": true,
"identifier": "ebcore:iso6523:0204:DE123456789",
"key_packages": [
{
"id": "kp-001",
"cipher_suite": 1,
"key_package": "<base64url-encoded MLS KeyPackage>",
"expires": "2026-08-15T00:00:00Z"
}
],
"resolved_at": "2026-07-16T10:15:30Z"
}
}The EBW SHOULD cache resolution results until valid_until and MUST NOT cache beyond it. A KeyPackage MUST NOT be reused across MLS groups — the EBW MUST resolve fresh KeyPackages for each new group.
If resolution fails, the QTSP MUST return error -31008 (Participant not found) with diagnostic data.
17. Normative Requirements
17.1 QTSP Requirements
The QTSP MUST:
- Serve a valid WMP configuration document at
/.well-known/wmp-configuration(Section 7.2), authenticated by its qualified certificate. - Support the
ebcoreidentifier scheme and reject any other scheme on a QERDS session. - Implement BDXL → SMP resolution for
ebcoreidentifiers, verifying SMP response signatures before use. - Support QTSP-mediated onboarding, acting as an OpenID4VP Verifier per [WBCS-002] for identity proofing (Section 8.3), and register the Subscriber in the SMP.
- Issue Subscriber certificates carrying the
ebcoreidentifier in a SAN URI (Section 8.4). - Authenticate every session with mutual TLS against the Subscriber certificate, verifying that the SAN URI matches
wmp.sender. - Present its own qualified certificate chain as an
x5cauthobject in the session create result. - Support both WebSocket and HTTPS transports with TLS 1.3.
- Enforce
security.mode: "mls"on every QERDS session and reject unencrypted content with-31003. - Act as MLS Delivery Service only, and never join an MLS group between EBWs.
- Serve an MLS KeyPackage directory for its Subscribers, never serving expired KeyPackages.
- Negotiate
messaging,evidence,offline, andresolveon every QERDS session. - Support all thirteen evidence event types and the EN 319 522 mapping in Section 15.2.
- Generate
submission_acceptedevidence before relaying to the Recipient QTSP. - Generate
delivery_confirmedevidence only when the content reached the EBW endpoint. - Sign every evidence notification with a key bound to its qualified certificate and include a qualified timestamp token, using the message format of [WMP-EVIDENCE] Section 4 without extension.
- Generate, for every evidence event, an ERDS evidence record conforming to [ERDS-EVIDENCE-SCHEMA], JAdES-signed as a qualified electronic seal in
compactDetachedform, and serve it assigned_evidencefrom the evidence repository (Sections 15.4, 15.5, 19.4). - Set the record’s
EvidenceIdentifierequal to the corresponding notification’sevidence_id, and itsMessageIdentifierto theoriginal_message_id. - Populate
EventReasonson every rejection, failure, non-delivery, and non-retrieval record. - Sign every
relay_chainentry it appends. - Deliver
retrieval_confirmedandacceptance_confirmedevidence to the Recipient EBW as well as the Sender EBW. - Queue messages for disconnected EBWs for at least 30 days with
status_notificationsenabled; where it cannot admit a message under exhaustedofflinequeue capacity, reject it with-31014and terminal statusdropped([WMP-CORE] §5.3.1), and in every such case also generaterelay_rejectedevidence withEventReasons: quota_exceeded(Section 11.2) — the error and status notify the sender; the evidence is what makes the non-delivery provable. - Retain evidence for at least 10 years and provide the evidence repository API; archive the full certificate chains used to verify evidence signatures, and extend every ERDS evidence record to JAdES-B-LTA by algorithm or certificate deprecation, at least every 5 years absent an earlier trigger (Section 15.8).
- Verify the sender’s detached JWS signature on every submission, rejecting with
-31010on failure. - Update the SMP entry within 24 hours of any certificate rotation or endpoint change.
- Advertise
basic,consented, andconsented_signedinerds.consignment_modes(Section 7.2), and verify a requestedconsignment_modeagainst the Recipient QTSP’s advertised support before relaying (Section 13). - Verify the recipient’s signature on a
consented_signeddecision ack before generatingacceptance_confirmedoracceptance_rejectedevidence, rejecting an unsigned or invalid one with-31010(Section 14).
The QTSP MUST NOT:
- Generate
retrieval_confirmedevidence before receivingwmp.message.ackfrom the Recipient EBW. - Accept a session with
auth.typeofbeareroropaque, or withsecurity.modeoftlsormls-optional. - Attempt to decrypt, log, or inspect the MLS ciphertext.
- Register a Subscriber or issue a certificate without a successfully verified OpenID4VP presentation whose organisation identifier matches the requested
subscriber_id. - Serve an expired KeyPackage or an expired SMP-registered certificate.
- Place an ERDS evidence record, or any other evidence format, in
evidence.detailsof awmp.evidence.notifymessage, or otherwise add fields to a WMP message. - Populate
UserContentInfo.ComposingPartsorUserContentInfo.PartsInfowith data derived from message plaintext. - Use the
flattenedJsonorgeneralJsonJAdES forms forsigned_evidence.
The QTSP SHOULD:
- Use DNSSEC-validated resolvers for BDXL lookups.
- Implement reconnection deduplication using JSON-RPC message
idfields. - Set
previous_evidence_idon each evidence record to chain the message lifecycle.
17.2 EBW Requirements
The EBW MUST:
- Verify the QTSP’s qualified status against the EU Trusted List before onboarding, and on every session.
- Generate its Subscriber key pair inside a hardware-backed secure element or WSCA/QSCD where available.
- Complete identity proofing during onboarding as an OpenID4VP Wallet Unit per [WBCS-002].
- Authenticate every session with its Subscriber certificate via mutual TLS.
- Request
security.mode: "mls"and never submit content unencrypted. - Verify a recipient’s KeyPackage credential — X.509 chain and SAN URI — before adding it to an MLS group.
- Publish fresh MLS KeyPackages before the previous set expires.
- Perform an MLS key update after every 100 messages or every hour, whichever comes first.
- Include, on every submission, a detached JWS signature over the content; and include
identity_assertionspresenting its EBWOID on the first message of a correspondence, and wherever per-message legal identity binding is required (Section 13). - Verify the sender’s signature, the
identity_assertions, and therelay_chainsignatures on every received message before presenting content, including that the EBWOID’s organisation identifier matcheswmp.sender(Interface 4, Section 14). - Send
wmp.message.ackwith the appropriate status on receipt, acceptance, or failure. - Verify every evidence notification’s signature, timestamp token, and content hash before accepting it (Section 15.5).
- Acknowledge every evidence notification with
wmp.evidence.ackand store it durably against itsoriginal_message_id. - Verify the
jadesSignatureand the signer’s qualified status on every ERDS evidence record it retrieves, and confirm the record agrees with the notification it holds (Section 15.5). - Close a session and refrain from submitting content where the QTSP’s session create result omits the
evidencecapability. - Support the HTTPS transport.
- Set
consignment_modetoconsentedorconsented_signedwhere the use case requires the recipient’s explicit acceptance, or a signed acceptance record, before content is presented (Section 13). - As recipient, withhold
wmp.message.ackstatusprocesseduntil an actual accept/reject decision is made, and sign that ack per [WMP-CORE] §5.4 whereconsignment_modeisconsented_signed(Section 14).
The EBW SHOULD:
- Support the WebSocket transport where it is a server-side or always-on deployment.
- Use
wmp.session.resumerather than creating a new session after transport loss. - Cache
wmp.resolveresults untilvalid_until, and never beyond. - Retrieve and durably store the ERDS evidence record for every evidence notification it receives, rather than relying on the notification alone — the notification is a message about an event; the ERDS record is the artefact that will still be verifiable, and admissible, in ten years — and retain it for at least as long as the underlying transaction’s legal relevance.
Part 3: Extensions
18. Credential Issuance and Presentation
Credential issuance and presentation between EBWs are out of scope for this specification. They are not required for QERDS operation: a QERDS delivers content and produces evidence, and neither obligation involves issuing or verifying a credential.
Where a deployment does need credential exchange over the same channel, WMP provides it as an extension: the OpenID4x profile [WMP-OPENID4X] defines oid4vci and oid4vp capabilities, negotiated on a WMP session exactly as the QERDS capabilities in Section 12 are. A session MAY negotiate them alongside evidence, in which case credential exchange inherits the registered-delivery evidence, the MLS encryption, and the qualified timestamps defined here.
A profile for credential exchange over QERDS, if the consortium determines one is needed, belongs in a separate WBCS that composes [WMP-OPENID4X] with this one. It MUST NOT weaken any requirement in this specification.
19. Interface Definitions
19.1 QTSP Well-Known Configuration Endpoint
Direction: EBW → QTSP Method: HTTPS GET Path: /.well-known/wmp-configuration
Response fields are defined in Section 7.2.
| Status | Meaning |
|---|---|
200 OK |
Configuration document (application/json or application/jwt) |
404 Not Found |
Endpoint does not offer WMP |
19.2 MLS KeyPackage Directory
Direction: EBW → QTSP (fetch), QTSP → QTSP (fetch on behalf of a Subscriber) Method: HTTPS GET Path: Value of mls_key_packages from the QTSP configuration
Query parameters:
| Parameter | Requirement | Description |
|---|---|---|
participant |
MUST | URL-encoded ebcore identifier of the Subscriber |
cipher_suite |
MAY | Filter by MLS cipher suite identifier |
Response fields:
| Field | Type | Requirement | Description |
|---|---|---|---|
participant |
string | MUST | The Subscriber’s ebcore identifier |
key_packages |
array | MUST | Valid KeyPackages; empty array if none |
key_packages[].id |
string | MUST | KeyPackage identifier |
key_packages[].cipher_suite |
integer | MUST | MLS cipher suite identifier |
key_packages[].key_package |
string | MUST | Base64url-encoded MLS KeyPackage |
key_packages[].expires |
string | MUST | ISO 8601 expiry |
| Status | Meaning |
|---|---|
200 OK |
KeyPackage list (possibly empty) |
404 Not Found |
Participant not registered with this QTSP |
Publication by a Subscriber uses HTTPS POST to the same path, authenticated by mutual TLS with the Subscriber certificate.
19.3 Onboarding Endpoint
Direction: EBW → QTSP Method: HTTPS POST Path: Value of onboarding_endpoint from the QTSP configuration
Step 1 — Start: {onboarding_endpoint}/start
Request fields:
| Field | Type | Requirement | Description |
|---|---|---|---|
subscriber_id |
string | MUST | The Subscriber’s intended ebcore identifier |
csr |
string | MUST | PEM-encoded PKCS#10 certificate signing request |
mls_cipher_suites |
array of integer | MUST | MLS cipher suites the EBW supports |
Response: An OpenID4VP Authorization Request per [WBCS-002], carrying the onboarding_id in the state parameter so the QTSP can correlate the presentation with the CSR submitted in step 1.
Step 2 — Presentation: The EBW completes the OpenID4VP presentation exchange with the QTSP as Verifier, per [WBCS-002]. Request and response formats, and the error responses, are defined there.
Step 3 — Result: On successful verification, the QTSP registers the Subscriber and returns:
Response fields:
| Field | Type | Requirement | Description |
|---|---|---|---|
subscriber_id |
string | MUST | The registered ebcore identifier |
certificate |
string | MUST | PEM-encoded Subscriber certificate |
certificate_chain |
array of string | MUST | Issuing chain, leaf first |
smp_url |
string | MUST | URL of the Subscriber’s SMP entry |
registered_at |
string | MUST | ISO 8601 registration time |
| Status | Meaning |
|---|---|
200 OK |
Subscriber registered; certificate issued |
400 Bad Request |
Malformed request, CSR, or unknown onboarding_id |
401 Unauthorized |
Presentation verification failed, or the credential’s organisation identifier does not match subscriber_id |
409 Conflict |
subscriber_id already registered with a different key |
Presentation-level errors are returned per [WBCS-002] within the OpenID4VP exchange of step 2.
Rotate (optional): {onboarding_endpoint}/rotate
Authenticated by mutual TLS with the Subscriber’s current certificate.
Request fields:
| Field | Type | Requirement | Description |
|---|---|---|---|
subscriber_id |
string | MUST | The registered ebcore identifier |
csr |
string | MUST | PEM-encoded PKCS#10 CSR for the new key |
Response fields:
| Field | Type | Requirement | Description |
|---|---|---|---|
certificate |
string | MUST | New PEM-encoded Subscriber certificate |
certificate_chain |
array of string | MUST | Issuing chain, leaf first |
rotated_at |
string | MUST | ISO 8601 rotation time |
old_certificate_valid_until |
string | MUST | ISO 8601 end of the grace period (≤24 h after rotation) |
19.4 Evidence Repository API
Direction: EBW → QTSP Path: Value of evidence.repository from the negotiated capability Authentication: Mutual TLS with the Subscriber certificate
Defined by [WMP-EVIDENCE] Section 6.1. This profile constrains authorization: the QTSP MUST return only evidence records where the requesting Subscriber is the original_sender or the original_recipient.
Retrieve by ID:
GET /evidence/{evidence_id}
Accept: application/json
Search by message:
GET /evidence?message_id={original_message_id}
Accept: application/json
Search by session:
GET /evidence?session_id={session_id}&since={ISO8601}&until={ISO8601}
Accept: application/json
Response fields (per record):
| Field | Type | Requirement | Description |
|---|---|---|---|
evidence_id |
string | MUST | Unique identifier; equals the record’s EvidenceIdentifier |
event_type |
string | MUST | Per Section 15.2 |
event_time |
string | MUST | ISO 8601 |
original_message_id |
string | MUST | The original message id |
original_content_hash |
object | MUST | Algorithm + base64url hash |
signed_evidence |
string | MUST | Base64url-encoded JWS compact serialization — the JAdES-signed ERDS evidence record conforming to [ERDS-EVIDENCE-SCHEMA] (Sections 15.4, 15.5) |
timestamp_token |
string | MUST | Base64url-encoded RFC 3161 token from a qualified TSA |
The field set is exactly that of [WMP-EVIDENCE] Section 6.2. This profile adds no fields; it specifies what signed_evidence contains — the ERDS evidence record, JAdES-signed in compactDetached form. An EBW retrieving a record MUST verify it per Section 15.5 rather than relying on the surrounding summary fields, which are conveniences for indexing and are not themselves the signed artefact.
Example response:
{
"evidence_records": [
{
"evidence_id": "evi-7f8e9d0c-b1a2-43e5-8f6d-7e8a9b0c1d2e",
"event_type": "submission_accepted",
"event_time": "2026-07-16T10:15:31Z",
"original_message_id": "msg-550e8400-e29b-41d4-a716-446655440000",
"original_content_hash": {
"algorithm": "sha-256",
"value": "<base64url-encoded hash>"
},
"signed_evidence": "<base64url-encoded JAdES compact detached signature over the ERDS evidence JSON>",
"timestamp_token": "<base64url-encoded RFC 3161 TimeStampToken>"
}
],
"total_count": 1,
"continuation_token": null
}| Status | Meaning |
|---|---|
200 OK |
Evidence records |
401 Unauthorized |
Missing or invalid client certificate |
403 Forbidden |
Subscriber is neither sender nor recipient of the referenced evidence |
404 Not Found |
Evidence record not found or outside the retention period |
20. Conformance
An implementation conforms to this specification if it implements the requirements in Section 17 for its role and supports the flows in Sections 8–15.
Conformance to this specification presupposes conformance to [WMP-CORE] Section 10, the [WMP-MLS] configuration in its Section 2, [WMP-EDELIVERY] Section 9.2 (eDelivery + ERDS), and [WMP-EVIDENCE] Section 9.2 (ERDS). Where this profile and a WMP specification differ, this profile is authoritative for the EBW–QTSP leg — but only ever by narrowing WMP, never by contradicting it.
Conformance class: QTSP
An implementation conforms as a QTSP if it:
- Implements all MUST and MUST NOT requirements in Section 17.1
- Supports onboarding (Section 8), submission (Section 13), and reception (Section 14)
- Serves a valid WMP configuration document (Section 7.2) and an MLS KeyPackage directory (Section 10.3)
- Implements BDXL/SMP resolution and SMP registration (Sections 7.3, 8.5)
- Conforms to [WMP-EVIDENCE] Section 9.2 (ERDS), implements the EN 319 522 mapping in Section 15.2, and issues JAdES-signed ERDS evidence records conforming to [ERDS-EVIDENCE-SCHEMA] (Sections 15.4, 15.5)
- Conforms to [WMP-EDELIVERY] Section 9.2 (eDelivery + ERDS)
- Acts as MLS Delivery Service without joining EBW groups, and relays ciphertext without inspection
Conformance class: EBW
An implementation conforms as an EBW if it:
- Implements all MUST requirements in Section 17.2
- Completes onboarding as a Subscriber (Section 8)
- Supports the HTTPS transport; WebSocket is OPTIONAL
- Supports mandatory MLS with the
x509credential type bound to its Subscriber certificate (Section 10) - Submits (Section 13) and receives (Section 14) QERDS messages, including consignment identity verification
- Verifies and durably stores every evidence notification, and verifies the JAdES signature on every ERDS evidence record it retrieves (Section 15.5)
Conformance class: EBW (Sender-only)
An EBW that only submits messages conforms if it meets the EBW class requirements excluding Section 14 (reception) and the reception-specific items of Section 17.2.
Conformance class: EBW (Recipient-only)
An EBW that only receives messages conforms if it meets the EBW class requirements excluding Section 13 (submission) and the submission-specific items of Section 17.2.
An EBW implementation MAY conform to multiple classes simultaneously. Additional WE BUILD profiles MAY define stricter requirements for specific use cases. Such profiles MUST NOT weaken the mandatory requirements in this specification.
21. Security Considerations
The considerations in [WMP-CORE] Section 8, [WMP-MLS] Section 7, [WMP-EDELIVERY] Section 8, and [WMP-EVIDENCE] Section 8 apply in full. This section addresses what is specific to QERDS.
No bearer tokens. This profile authenticates with certificates rather than bearer access tokens. A bearer token is a credential that anyone holding it can use, which forces a short lifetime, which forces a renewal cycle on every EBW. A certificate bound to a key in a QSCD cannot be replayed by a party that does not hold the key. The cost is certificate lifecycle management; the benefit is that session authentication is a signature the EBW can always produce, and that the same certificate binds the session, the MLS credential, and the SMP entry to one legal identity.
Certificate compromise. A compromised Subscriber key lets an attacker authenticate sessions and join MLS groups as the Subscriber. The QTSP MUST support certificate revocation, MUST check revocation status on every session establishment, and MUST remove revoked certificates’ KeyPackages from its directory immediately. Evidence generated before the revocation remains valid — it attests to what happened at an attested time, which revocation does not retroactively change.
Metadata is exposed to the QTSP. MLS protects content, not the fact of correspondence. The QTSP sees sender, recipient, timing, and message size for every delivery, and it must — that is what it attests to. Subscribers who need to conceal correspondence patterns from their QTSP cannot achieve that within this profile, and this profile does not claim otherwise ([WMP-MLS] §7.4).
Relay compromise. A compromised QTSP cannot read content — MLS holds. It can suppress messages, delay them, or generate false evidence about deliveries that did not occur. The mitigations are structural: the relay_chain gives each hop independent, signed provenance the recipient can verify; both QTSPs generate evidence in the four-corner model, so a single relay’s account can be contradicted; and the recipient’s own retrieval_confirmed evidence, triggered by an ack the recipient actually sent, is not something the sender’s QTSP can manufacture. A QTSP cannot forge the recipient’s acknowledgement ([WMP-EVIDENCE] §8.4).
Evidence forgery. Evidence is only as trustworthy as the key that signed it. EBWs MUST validate the x5c chain to the EU Trusted List rather than to any trust anchor the message itself suggests. A trust_hint is a hint ([WMP-CORE] §5.6.1); treating it as authoritative would let a sender nominate its own trust anchor.
Content hash binding. Verifying an evidence signature without recomputing original_content_hash accepts a validly-signed attestation about a different message. Both checks are required, and neither substitutes for the other ([WMP-EVIDENCE] §8.1).
Identity assertion replay. For assertions carried on WMP messages, the session challenge (nonce) and session ID (audience) bind a presentation to one session. Challenges MUST be single-use, ≥128 bits of entropy, and valid for ≤60 seconds ([WMP-CORE] §4.4.7). A party that accepts a challenge twice accepts a replayed proof of identity. Replay protection for the onboarding presentation is [WBCS-002]’s concern, not this specification’s.
KeyPackage substitution. The KeyPackage directory is served by a QTSP. If a Sender EBW adds a KeyPackage to an MLS group without validating its X.509 credential against the recipient’s ebcore identifier, a compromised directory can substitute a recipient — and the evidence chain will faithfully attest to correct delivery of content encrypted to the wrong party. The evidence is not wrong; it attests to delivery, not to whom the sender intended. This is why the credential check in Section 10.4 is a MUST rather than a SHOULD.
SMP and DNS. Endpoint and certificate data come from SMP. Clients MUST verify SMP response signatures and SHOULD use DNSSEC-validated resolvers for BDXL ([WMP-EDELIVERY] §8.1, §8.3). An unsigned SMP response is an unauthenticated redirect.
Post-quantum readiness. The mandatory cipher suite (X25519, Ed25519, AES-128-GCM) is not post-quantum safe. MLS cipher suite negotiation means migration requires configuration changes rather than protocol changes, which is a genuine structural advantage over AS4/XML-DSIG ([WMP-MLS] §8.1). Implementations MUST keep cipher suite selection configuration-driven, and SHOULD follow the three-phase migration of [WMP-MLS] Section 8.3.
The urgency is asymmetric, and the asymmetry matters. MLS ciphertext is ephemeral and forward-secret; a future quantum adversary recovering a 2026 epoch key learns the content of messages that are by then years stale — assuming it recorded the ciphertext at the time. Evidence signatures are the opposite. They are retained for 10 years by mandate, are designed to be verified by third parties long after issuance, and are exactly the artefacts whose forgeability would undermine the service’s legal standing. A signature that becomes forgeable in year 8 of its retention period retroactively devalues every record it protects. The JAdES seal on the ERDS evidence record (Section 15.5) SHOULD therefore move to hybrid or PQC algorithms ahead of the MLS layer, not behind it ([WMP-MLS] §8.5, [WMP-EVIDENCE] §8.5). Of the two signatures in this profile, it is the one that has to survive; the notification’s JWS is verified within seconds of issue and then never again.
Long-term evidence validity. Beyond algorithm migration, evidence must remain verifiable across its retention period. QTSPs MUST archive the full certificate chains used for verification and MUST re-timestamp to JAdES-B-LTA before deprecation, on the trigger and cadence of Section 15.8 ([WMP-EVIDENCE] §8.5).
References
[RFC 2119] Bradner, S. (1997) Key words for use in RFCs to indicate Requirement Levels. IETF. Available at: https://datatracker.ietf.org/doc/html/rfc2119
[WMP-CORE] Johansson, L. et al. (2026) Wallet Messaging Protocol — Core Specification. Available at: https://wmp.name/spec/wmp-core
[WMP-MLS] Johansson, L. et al. (2026) Wallet Messaging Protocol — MLS Encryption Layer. Available at: https://wmp.name/spec/wmp-mls
[WMP-EVIDENCE] Johansson, L. et al. (2026) Wallet Messaging Protocol — Evidence Profile. Available at: https://wmp.name/spec/wmp-evidence/
[WMP-EDELIVERY] Johansson, L. et al. (2026) Wallet Messaging Protocol — eDelivery Integration Profile. Available at: https://wmp.name/spec/wmp-edelivery/
[WMP-TRANSPORT] Johansson, L. et al. (2026) Wallet Messaging Protocol — Transport Bindings. Available at: https://wmp.name/spec/wmp-transport
[WMP-OPENID4X] Johansson, L. et al. (2026) Wallet Messaging Protocol — OpenID4x Profile. Available at: https://wmp.name/spec/wmp-openid4x/
[RFC 9420] Barnes, R. et al. (2023) The Messaging Layer Security (MLS) Protocol. IETF RFC 9420. Available at: https://www.rfc-editor.org/rfc/rfc9420
[RFC 3161] Adams, C. et al. (2001) Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP). IETF RFC 3161. Available at: https://www.rfc-editor.org/rfc/rfc3161
[RFC 7515] Jones, M. et al. (2015) JSON Web Signature (JWS). IETF RFC 7515. Available at: https://www.rfc-editor.org/rfc/rfc7515
[RFC 7797] Jones, M. (2016) JSON Web Signature (JWS) Unencoded Payload Option. IETF RFC 7797. Available at: https://www.rfc-editor.org/rfc/rfc7797
[RFC 8785] Rundgren, A. et al. (2020) JSON Canonicalization Scheme (JCS). IETF RFC 8785. Available at: https://www.rfc-editor.org/rfc/rfc8785
[JSON-RPC] JSON-RPC Working Group (2010) JSON-RPC 2.0 Specification. Available at: https://www.jsonrpc.org/specification
[ADR-QERDS] Dijkhuis, S., Johansson, L. (2026) WE BUILD ADR: Deliver business wallet data using QERDS. WE BUILD Consortium. Available at: https://github.com/webuild-consortium/wp4-architecture/blob/main/adr/build-qerds.md
[QERDS-ARCH] WP4 QTSP Group (2026) Architecture overview for QERDS in WE BUILD. WE BUILD Consortium. Available at: https://github.com/webuild-consortium/wp4-qtsp-group/blob/main/docs/qerds/architecture.md
[QERDS-INTEROP] WP4 QTSP Group (2026) QERDS Interoperability Framework Requirements. WE BUILD Consortium. Available at: https://github.com/webuild-consortium/wp4-qtsp-group/blob/main/docs/qerds/interop-framework.md
[QTSP-SPEC] WP4 QTSP Group (2026) WE BUILD QTSP Specification. WE BUILD Consortium. Available at: https://github.com/webuild-consortium/wp4-qtsp-group (URL to be confirmed)
[ERDS-EVIDENCE-SCHEMA] WP4 QTSP Group (2026) ETSI EN 319 522-3 V1.2.1 Evidence — JSON Schema. WE BUILD Consortium. Available at: https://github.com/webuild-consortium/wp4-qtsp-group/blob/main/docs/qerds/data-schemas/erds-evidence.json
[EN-319-522-1] ETSI (2018) Electronic Signatures and Infrastructures (ESI); Electronic Registered Delivery Services; Part 1: Framework and Architecture. ETSI EN 319 522-1.
[EN-319-522-2] ETSI (2018) Electronic Signatures and Infrastructures (ESI); Electronic Registered Delivery Services; Part 2: Semantic Contents. ETSI EN 319 522-2.
[EN-319-522-3] ETSI (2022) Electronic Signatures and Infrastructures (ESI); Electronic Registered Delivery Services; Part 3: Formats. ETSI EN 319 522-3.
[EN-319-522-4-1] ETSI (2023) Electronic Signatures and Infrastructures (ESI); Electronic Registered Delivery Services; Part 4-1: Bindings; Sub-part 1: Bindings for Message Transfer. ETSI EN 319 522-4-1.
[EN-319-182-1] ETSI (2021) Electronic Signatures and Infrastructures (ESI); JAdES digital signatures; Part 1: Building blocks and JAdES baseline signatures. ETSI EN 319 182-1.
[TS-119-312] ETSI (2024) Electronic Signatures and Infrastructures (ESI); Cryptographic Suites. ETSI TS 119 312.
[EIDAS] European Parliament and Council (2014) Regulation (EU) No 910/2014 on electronic identification and trust services for electronic transactions in the internal market (eIDAS). Available at: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32014R0910
[EU-2025-1944] European Commission (2025) Commission Implementing Regulation (EU) 2025/1944. Available at: https://eur-lex.europa.eu/eli/reg_impl/2025/1944/oj
[SMP-2.0] OASIS (2018) Service Metadata Publishing (SMP) Version 2.0. Available at: http://docs.oasis-open.org/bdxr/bdx-smp/v2.0/
[BDXL] European Commission (2020) eDelivery BDXL 2.0. Available at: https://ec.europa.eu/digital-building-blocks/sites/spaces/DIGITAL/pages/843612547/
[EBCORE] OASIS (2010) ebCore Party Id Type Technical Specification Version 1.0. Available at: http://docs.oasis-open.org/ebcore/PartyIdType/v1.0/
[ISO-6523] ISO (1998) Information technology — Structure for the identification of organisations and organisation parts. ISO 6523.
[WBCS-002] WE BUILD Consortium (2025) WE BUILD Conformance Specification: Credential Presentation v1.0. Available at: https://github.com/webuild-consortium/wp4-architecture/blob/main/conformance-specs/cs-02-credential-presentation.md