1.1.x
1.1.1
Fixes and improvements
- Closed a role upsert privilege gap. Creating or updating a role with
PUTnow runs the same permission checks as role create and add-permission, so a caller cannot grant rights they do not hold or target another organization's tree. - Restored Issuer2 Open Badge v3 schema validation by accepting
1EdTechJsonSchemaValidator2019, matching Issuer v1. - Stopped Swagger UI from crashing when expanding the service-create request schema. The documented body is a generic JSON object, matching the runtime type.
- Patched Enterprise UI fast-uri 3.1.8 for CVE-2026-86472 (inconsistent host case normalization).
1.1.0
Highlights
- Enforced authenticated OpenID4VP Request Objects on Wallet2. Signed requests with a signable client ID are checked against pinned certificates, a linked Trust Registry, or stored client metadata. Unsigned
redirect_urirequests fetched viarequest_uristay accepted. - Added OpenID4VCI 1.0 batch issuance on Issuer2. One offer can hold several credential selections, and a wallet can request multiple proof-bound copies of a selected credential. Existing single-profile offer calls keep their previous request and receipt shape.
- Extended X.509 across verifier signing, credential-status signing, certificate issuance, and issuer setup. Verifier2 and Credential Status can sign from an x509-store. Certificate issuance is one stored model.
services/initcan build an IACA and document-signer chain. EUDI PID Provider, Wallet Provider, and Wallet Relying Party profiles are available on the X.509 service. - Resolved public-key and DID issuers on ETSI trust lists. A trust-list entity registered with a public key and no certificate can be matched during verification, including from a Trust Registry linked to Verifier2.
- Folded credential status into the Enterprise API, added a status read by issuance session or list index, and applied one shared status-list codec for Token Status List, Bitstring Status List, StatusList2021, and RevocationList2020.
- Hardened operations: dev-mode routes require an access token, superadmin bootstrap tokens fail closed,
pagination.confanddev-mode.confare actually loaded, events filters match the stored event shape, and OpenTelemetry plus Prometheus export is configurable.
Features
OpenID4VP request authentication
- Wallet2 authenticates the final Authorization Request before match and present.
- Signed requests with
x509_san_dns,x509_hash, a DID,verifier_attestation, orpre-registeredsucceed when trust material matches. They fail closed when it does not. - A linked Trust Registry can supply relying-party certificates as JAR trust anchors, combined with optional PEM pins.
- Unsigned JSON fetched with
request_uriand aredirect_uriclient ID stays accepted. Unsignedpre-registeredclients are accepted when stored metadata includesredirect_uristhat match the request destination. - There is no operator switch that turns this check off.
Issuer2 batch issuance
POST /v2/{target}/issuer-service-api/credentials/offersstill accepts a profile-targeted body and returns the original flat receipt, includingprofileIdandprofileVersion.- A body aimed at the issuer service may send
credentials: [{ profileId, runtimeOverrides? }]. That receipt is the shared offer metadata and does not repeat a per-credential inventory. - Issuer metadata advertises
batch_credential_issuance.batch_sizewhen batch issuance is configured. - A credential request with
proofs.jwtreturns one credential per verified proof, in order.credential_identifierseparates datasets that share a configuration. - One original selection keeps the previous session and event JSON. Several selections use
issuanceRequestsandissuanceResults. Stored sessions from 1.0.0 remain readable.
mDoc issuance
- Issuer2 profiles, offer
runtimeOverrides, and issuance sessions accept optionalmsoData(validFrom,validUntil,expectedUpdate) formso_mdoccredentials. Each value is a static timestamp or a timestamp data function, resolved when the credential is claimed. - Omitting
msoDatakeeps the previous MSO window:validFromis the signed time,validUntilis 365 days after claim, andexpectedUpdateis omitted. msoDataon a non-mDoc profile or offer is rejected. W3Cmappingdates and mdoc namespaceissue_date/expiry_datedo not set the MSO window.- mDoc
mappingis applied to namespace objects that already exist on the payload. Arrays replace, templates inside array items evaluate, and<date>,<date-in>, and<date-before>emit ISO full dates.<timestamp>stays for MSO windows. - Issuer v1 applies the same namespace mapping. Issuer v1 does not accept
msoData; its MSO window stays signed-at-claim and 365 days unless the credential request suppliesvalidUntil.
X.509, verifier signing, and issuer setup
- Verifier2 service and session create accept
x5cReferencespointing at x509-store certificates. Inlinex5cremains the certificate chain itself. Resolution order is session references, sessionx5c, service references, then servicex5c. - Credential Status configuration accepts
keyorkeyReference, andx5corx5cReferences. Storedkidandx5Chainvalues still sign. - Certificate issuance persists one record (profile, issuer and subject DN, validity, key and certificate references).
POST /certificatescreates.PUT /certificates/{id}creates or updates. The previous generic, IACA, and document-signer routes delegate to that service. - Attached X.509 stores can receive a new certificate under configurable create, upsert, and success strategies. Existing stored certificates are migrated to the richer record shape.
POST /v1/{target}/resource-api/services/initcan onboard an X.509 issuer: KMS keys, X.509 service and store, IACA, and document signer, or it can start from an existing IACA.- The X.509 service can issue ETSI TS 119 412-6 PID Provider and Wallet Provider certificates, and Wallet Relying Party certificates (WRPAC, with draft WRPRC).
- X.509 helpers copy a CSR subject DN into the issued certificate, check basic constraints, and expose a Java-friendly creation API.
Trust Registry
POST .../trust-registry-api/resolve/public-keyresolves a JWK thumbprint against identities loaded from an ETSI trust list.- Verifier2 sessions that use a linked Trust Registry resolve a JWT or SD-JWT issuer with no
x5cby that thumbprint. An inlinejwkheader is not treated as trust evidence.
Credential status
- Status list encode and decode for IETF Token Status List, W3C Bitstring Status List, StatusList2021, and RevocationList2020 go through one shared codec. Verification policies use that codec.
GET /v1/{target}/credential-status-service-api/status-credential/statusreturns the current index status. Pass exactly one ofsessionorindex.- Session reads require
credential-status.getandES_ISSUER_GET_SESSION, and the session must belong to that status list. Index reads requirecredential-status.geton the status configuration. - The separate credential-status process is no longer shipped. The same status APIs run inside the Enterprise API.
Wallet2 and presentations
- Issued mdocs stay bound to the holder key that signed the key binding. Enterprise stores that binding as an optional field; existing wallet resources stay readable.
- OpenID4VCI proofs for authorization-code and other client-bound grants include
issset to the token-requestclient_id. Anonymous pre-authorized proofs still omitiss. Issuer2 accepts a missingissand checks it when it is present. - Isolated Wallet2 sign-proof accepts an optional
clientIdfor the same claim. credential_policy_results_availableis emitted once per verification session.- Newly issued portrait capture dates are full timestamps. Date-only JSON input and stored profiles stay valid.
Service defaults and wallet init
- Each service operation can store a partial default request. The live call deep-merges on top of that default, so a verifier can keep
flow_type, signing, and keys on the service and send the DCQL query per session. POST /v1/{target}/resource-api/services/initpersistswallet.config(including static DID and key settings) and rejects a config that does not decode.
Licensing
- A monthly issuance, verification, or wallet-creation cap returns HTTP 429 with month-scoped text. Hourly caps still say to retry next hour.
- A configured license seed can recover an installation whose stored license state cannot be read. A failed activation releases its lease so another node can take it over.
- Usage reports can be checked end to end against the license server. Metering uses the checkpoint engine by default, and a mid-period engine switch still bills every operation.
Auth, events, and configuration
POST /v1/superadmin/create-by-tokenaccepts a token withdevModeOnlyomitted ortrueonly whiledev-modeis enabled. SetdevModeOnlytofalsefor a production bootstrap token. The route is limited to 5 requests per minute per client address.- With
dev-modeenabled,/v1/dev/*requires theaccessTokenfromdev-mode-access.conf. The placeholder valuereplace-with-a-per-deployment-secretprevents startup. - Enabling
dev-modeloadsdev-mode.conf. The shipped file setsenableDidWebResolverHttpstofalse. - List endpoints read
pagination.conf. The shipped defaults stay 100 and 1000. POST /v1/events/querycomparesfromTimestampandtoTimestampas epoch milliseconds, matchesstatus.typeandaction.type, and matchescallIdexactly.groupByreturns 400.- OpenTelemetry and Prometheus export can be configured for the API process.
Verifier capacity and stored payloads
- In-memory Verifier2 sessions default to 2000 sessions and 256 MiB. A presentation that does not fit the budget is refused. A database-backed session store is bounded by the database instead.
- Bulky disclosed element values and credential-policy payloads stored on a session are truncated to descriptors. Small claims are kept.
- Byte-array claims in stored session and credential data are a single base64url string. Readers still accept the previous JSON array of bytes.
- A verifier dependency that is down returns 503. That failure is not reported as
invalid_request. - Issuer2 token rate limits are bucketed by grant code, so one wallet's failures do not block another wallet's token request.
- Credential-store writes bound the decoded copy kept beside a stored credential, which keeps a portrait from dominating the stored document.
Fixes and improvements
- Verifier2 logs the verification session id on session updates.
- Webhook coverage locks issuer2 event order for the v1 and v2 issuance and presentation paths.
- Document Signer certificate creation rejects an out-of-window validity period and a subject DN that does not match the IACA.
PUTof a certificate through the X.509 service succeeds when no store is attached only on the paths that still allow a local write. A composite store with nothing attached returns 405.- EUDI examples, Annex C verifier setup, and pinned certificate validity in tests were aligned with the current X.509 and signed-request rules.
- Trivy HIGH
fast-urifindings in the Enterprise UI dependency tree are patched. - ZAP baseline scanning runs on pull requests. The daily scan fails on High or Medium findings that are not in the rules file.
- CLI integration tests run on pull requests that change the API.
- Security scan workflows run on the shared runner pool again, and the
devalueadvisory in the UI tree is updated. - Sonar findings were cleared, including example logo URIs served over HTTPS.
- Load-test runs can place worker nodes on spot capacity, size MongoDB from the node type, and generate load from inside the cluster. The API process exits non-zero when startup fails. PostgreSQL engine capabilities match what that profile can actually do.
Breaking changes
These are request, response, or deployment changes that affect running integrations. Mobile SDK types and internal library constructors are not listed here.
Wallet2 request authentication
Wallet2 rejects an Authorization Request that 1.0.0 would have presented.
- A signed request with
x509_san_dns,x509_hash, a DID,verifier_attestation, orpre-registeredfails closed unless trust material matches (PEM pins, a linked Trust Registry, or stored JWKS forpre-registered). - An unsigned
pre-registeredrequest without storedredirect_uristhat match the destination fails withinvalid_client. - Unsigned
redirect_urirequests fetched viarequest_uriare unchanged. - No presentation route was removed. There is no configuration flag to skip the check.
X.509 certificate API
PUT /v1/{target}/x509-service-api/certificatesrequires theES_X509_SERVICE_UPSERT_CERTIFICATEpermission.- Certificate creation (generic certificates and ISO document signers) returns 400 when the validity window is inconsistent or a document-signer subject DN does not match its IACA.
PUTagainst a composite certificate store that has no store attached returns405 Method Not Allowed.
Superadmin bootstrap
- A registration token with
devModeOnlyomitted or set totrueworks only whiledev-modeis enabled. Production tokens must setdevModeOnlytofalse. POST /v1/superadmin/create-by-tokenmay return 429 after 5 requests per minute from one client address.
Dev mode
- A deployment with
dev-modeenabled and noaccessTokenindev-mode-access.confrefuses/v1/dev/*with 503 until the token is set. accessTokenset toreplace-with-a-per-deployment-secretprevents the process from starting.- With
dev-modeenabled, the shippeddev-mode.confis loaded, includingenableDidWebResolverHttps = false.
Last updated on September 30, 2026
