Repository navigation
8.0.0
New features:
- Generate holder-side ISO mDoc zero-knowledge proofs through pluggable backends, including the new
vck-longfellowmodule. - Present mDocs through direct ISO 18013-5 Device Retrieval, including matching and multi-document responses.
- Use encrypted OpenID4VP authorization requests and request-specific keys for encrypted presentation responses.
- Encrypt OpenID4VCI credential requests and responses with keys bound to each credential request.
- Configure trust for credential issuers and relying parties, including WRPAC and WRPRC validation for EU wallet presentations.
- Filter EU Lists of Trusted Entities by profile and provide trust anchors for issuers and status list signers.
- Use OAuth 2.0 attestation-based client authentication Draft 10, combined DPoP proofs, and transaction codes in pre-authorized issuance flows.
Technical changes and migration notes:
- Build:
- Upgrade the Android JVM target to 17 for compatibility with
vck-longfellow - Upgrade to the 20260828 conventions plugin and AGP 9
- Migrate Android library targets to the new Kotlin Multiplatform Android library plugin API
- Remove the conventions plugin submodule and version catalog workarounds
- Remove obsolete build hacks
- Upgrade the Android JVM target to 17 for compatibility with
- ETSI data classes:
- Normalize decoded RFC 5646 language tags to lowercase instead of rejecting non-lowercase input
- Add
WalletRelyingPartyETSI data classes forWRPACandWRPRCvalidation
- ISO mdoc data classes:
- BREAKING: Update
ZkDocumentData.timestamptype toInstantinstead ofDateTimeto conform to upcoming ISO-18013-5 draft - Add support for correctly (de-)serializing RFC9360-conformant single-chain cbor-encoded
ZkDocumentData - Add missing equality overrides for
ZkDocumentData,ZkSignedItem
- BREAKING: Update
- Openid data classes:
- Add fields
eUWrprcandeuWrpRegistrarInfoto data classDocRequestInfo
- Add fields
- ISO mDoc Zero-Knowledge Proofs:
- Add the
ZkRequest-based ISO mDoc ZK presentation path and convert DCQL ZK metadata intoZkRequestfor holder-side proof generation - Add the
IsoMdocZkBackend,IsoMdocZkBackendRegistry,IsoMdocZkEngine, andIsoMdocZkProofextension layer
for application- and library-provided proving systems - Add holder-side ZK proof generation and optional plain-mDoc fallback through
VerifiablePresentationFactory - Add backend routing for ISO mDoc ZK system specifications, including application-defined proving systems and
backend-specific parameter serializers - BREAKING: Rename
ZkSystemSpec.zkSystemIdtoidwhile retainingzkSystemIdon the wire - Rename
ZkMetadata.IsoMdocZk.zkInfotozkRequest, change DCQL ZK numeric parameters fromInttoLong,
and update the ZK integration APIs to useZkSystemSpec - Remove the unused
ZkInfoandZkSystempreparation abstractions - Add
vck-longfellowmodule containing an implementation of a registerableLongfellow-ZKbackend
- Add the
- Credentials:
- In
SubjectCredentialStore.StoreEntrymake theschemeIdentifiernon-nullable. Deserialization of old previously stored entries need to be handled by calling applications. - Derive SD-JWT Digital Credentials API identifiers from the JWT ID or serialized credential instead of the subject
- Preserve and validate every status mechanism when a credential's
statusobject contains bothstatus_listandidentifier_list; combined values are exposed throughStatusListInfo.tokenStatusInfowhile the 7.0.1RevocationListInfoproperties and singleton behavior remain compatible
- In
- Verifiable Presentations:
- Compute ISO mDoc
DeviceAuthenticationsignatures automatically using thecalcIsoSessionTranscriptcallback instead of requiringcalcIsoDeviceSignaturePlain - Replace
PresentationRequestParameters.calcIsoDeviceSignaturePlainwith thePresentationRequestParameters.calcIsoSessionTranscriptcallback to return a nullableSessionTranscript. DeviceSignature and DeviceAuth is now calculated based on the Transcript. - Add optional
signDeviceAuthDetachedparameter toHolderAgentandVerifiablePresentationFactoryto centralize ISO mDoc device authentication within the holder
- Compute ISO mDoc
- OpenID for Verifiable Presentations:
- Deprecate Presentation Exchange APIs in favor of DCQL, since OpenID4VP 1.0 only supports DCQL
- Implement direct presentation requests and responses according to ISO 18013-5 Device Retrieval with new subtypes
CredentialPresentationRequest.IsoDeviceRetrieval,CredentialPresentation.IsoDeviceRetrievalPresentation,IsoDeviceRetrievalMatchingResultforCredentialMatchingResult,HolderIsoDeviceRetrievalQueryMatchingResultforHolderPresentationRequestMatchingResult, andPresentationResponseParameters.DeviceRetrievalParameters - Add
DeviceRequestCredentialDisclosure,IsoDeviceRetrievalQueryMatchingResult,IsoDeviceRetrievalCredentialMatch, andIsoDeviceRetrievalClaimMatchfor ISO submission and matching details - Match every
DocRequestagainst stored mdocs, requiring all requested data elements while preserving repeated docTypes and multiple matching credentials; validate explicit submissions and create a single, possibly multi-documentDeviceResponse - Keep direct ISO Device Retrieval responses separate from OpenID4VP
vp_tokenresponses, and fix JSON round trips for ISO presentation requests - Migrate ISO/IEC 18013-7 Annex C holder and iOS pre-request matching from Presentation Exchange to ISO Device Retrieval; replace
IosDcApiMdocPreRequestSummary.toDifInputDescriptors()withtoDeviceRequest() - Add
Holder.matchPresentationRequestAgainstCredentialStore()as a protocol-neutral matching entry point and moveCredentialMatchingResultwith itsDCQLMatchingResult,IsoDeviceRetrievalMatchingResult, and deprecatedPresentationExchangeMatchingResultsubtypes fromvck-openidtovck - Use correct digest for validating KB JWT of SD-JWT VC
- Extract format-specific submission resolution, validation, and response creation from
HolderAgentinto an internal presentation response coordinator - Deprecate format specific methods in
Holder, all to be replaced withmatchPresentationRequestAgainstCredentialStore():matchInputDescriptorsAgainstCredentialStoreV2(),matchDeviceRetrievalAgainstCredentialStore(),evaluateInputDescriptorAgainstCredential(),matchDCQLQueryAgainstCredentialStoreV2() - Match non-fully specified COSE algorithms with fully specified ones
- Reject credential presentations containing any invalid issuer signed items according to ISO 18013-5 9.3.1 Inspection procedure for issuer data authentication
- Correctly validate credential submissions for DCQL queries
- Add
VerifierInfotoOpenId4VpRequestOptions - Do not accept responses for the same
statetwice for OpenID4VP flows - Do not accept responses for the same
externalIdtwice for DCAPI flows - Supply an ephemeral response encryption key specific to each authentication request in its client metadata, as required by OpenID4VP 1.0, Section 8.3, and OpenID4VC HAIP. Keys are identified by the
kidof the JWE, and also used as the HPKE recipient key for ISO/IEC 18013-7 Annex C requests, where they are identified by the request'sstate - Add
EphemeralEncryptionKeyServiceholding these keys in aMapStore<String, String>, PKCS#8 PEM encoded, so that applications running several instances can synchronize them, along with the parameterephemeralEncryptionKeyServiceonOpenId4VpVerifierandDcApiVerifier. Every key decrypts at most one response - Add
DecryptJweWithEphemeralKey, resolving the decryption key from thekidheader of the JWE - In
OpenId4VpVerifierandDcApiVerifierthedecryptionKeyMaterialis now nullable and defaults tonull: it is only advertised inmetadataWithEncryption, i.e. for client identifier schemes that distribute it out-of-band, which is not conformant to HAIP.metadatacarries no key to encrypt responses to at all - In
OpenId4VpVerifierandDcApiVerifierremove thedecryptJwefunction from the list of constructor arguments - Consume the request's nonce when validating an authentication response, regardless of the validation result, i.e. authentication responses are not retryable
- Support requesting and serving encrypted authorization requests as per OpenID4VP 1.0, Section 5.10
- Add
jwks,request_object_encryption_alg_values_supportedandrequest_object_encryption_enc_values_supportedtoOAuth2AuthorizationServerMetadata - Fix decoding of form-encoded parameters whose value is a JSON string, e.g.
wallet_metadataposted to the request URI endpoint - Send
wallet_metadataandwallet_nonceonly when fetching the request object withrequest_uri_method=post - Terminate request processing if the request object does not carry back the
wallet_noncewe sent, as required by OpenID4VP 1.0, Section 5.10.1 - Reject a JAR request whose request object can not be retrieved from
request_uri, that carries neitherrequestnorrequest_uri, or whose request object nests anotherrequest/request_uri(RFC 9101, Section 6.2), withinvalid_requestinRequestParser - Retain the underlying payload deserialization failure as the cause of
invalid_requestwhen parsing a structurally valid signed request object - In
OpenId4VpHolderreject requests that are not authorization requests, e.g. RQES signature requests, withinvalid_requestinstead of failing with aClassCastExceptionduring request validation - Pass
requireEncryptedRequests = truetoOpenId4VpHolderto reject a plain request object served at arequest_urifetched with POST - Add
decryptedFromtoRequestParametersFrom.JwsandRequestParametersFrom.Json, holding the header of the JWE a request was decrypted from, andrequestWasEncryptedtoAuthorizationResponsePreparationState - Reject request objects that are not a JWS (and optionally encrypted) per RFC 9101, Section 4
- Reject request objects that do not carry
typ: oauth-authz-req+jwtas required by OpenID4VP 1.0, Section 5, also for signed and multi-signed requests over the DC API - Deprecate
CreationOptions.RequestByReferenceat error level: it serves an unsigned request object by reference, which OpenID4VP 1.0, Section 5.10.1 forbids, instead useCreationOptions.SignedRequestByReference
- OpenID for Verifiable Credential Issuance:
- Preserve credential-offer retrieval failures instead of masking them with a JSON parsing error
- Rework validation of key attestation statements
- In
ProofValidatorreplace the unreleasedkeyAttestationIssuerwithverifyKeyAttestationSignatureto accept key attestations of trusted wallet providers, e.g. withVerifyJwsObjectTrustedCertificate; key attestations are rejected unless a trusted verifier is configured - Sign metadata in
CredentialIssuer.signedMetadata()as per OpenID4VCI 1.0, Section 12.2.3, i.e. withtypset toopenidvci-issuer-metadata+jwtand the claimssubandiat, added assubject,issuedAtandexpirationtoIssuerMetadata - Add
displayPropertiestoCredentialIssuer, to include them in bothmetadataandsignedMetadata() - Make sure a
nonceprovided by the credential issuer can only be used for one request to the credential endpoint - Security fix: encrypt the credential request whenever it carries
credential_response_encryption, as required by OpenID4VCI 1.0, i.e. "Credential Request encryption MUST be used if thecredential_response_encryptionparameter is included, to prevent it being substituted by an attacker".WalletEncryptionServicepreviously sent its response encryption key in a plain request unless request encryption was required by either side, andCredentialIssueraccepted such requests - In
WalletEncryptionService, if the issuer publishes no key to encrypt the request with,credential_response_encryptionis omitted, or the request fails if the issuer requires response encryption - Announce a response encryption key specific to each credential request, with a
kidfor the issuer to echo in the JWE header. ReplaceWalletEncryptionService.decryptionKeyMaterialwithephemeralEncryptionKeyService, which may hold aMapStoreto synchronize these keys between the wallet component creating the request and the one receiving the response - Bind encrypted credential responses to their originating
CredentialRequest, reject encryption downgrades and response/request key swaps, and consume a response key only after authenticated decryption. Parsing an encrypted response now requires passing the originating request toWalletService.parseCredentialResponse - Negotiate credential response
algandencstrictly against issuer metadata: omit optional encryption when no combination is shared, fail when encryption is required, and reject algorithms the issuer did not advertise IssuerEncryptionServiceadvertisescredential_response_encryptionwhenever it can encrypt responses, andcredential_request_encryptionwhenever it can decrypt requests, instead of only when some encryption is required, so that clients can opt into encryption. Requiring response encryption now also declarescredential_request_encryption.encryption_required, since the client's key may only be sent in an encrypted request- Select the issuer's credential request encryption key by its intended use instead of taking the first key of the set, and use the
algof the client's response encryption key for the JWE, as required by OpenID4VCI 1.0
- Signature verification:
VerifyJwsObjectandVerifyCoseSignaturenow only ever use the key material asserted by the JWS header resp. the COSE headers, and make no trust decision- Add
VerifyJwsObjectTrustedandVerifyCoseSignatureTrusted, where the supplied keys are the only accepted signers - Note that neither builds a certificate path to a trust anchor, they compare public keys
- In
ValidatorSdJwt.verifyVpSdJwt()reject presentations whose SD-JWT carries nocnf: the key binding JWT used to be verified against a key asserted in its own header in that case, which proves nothing about the holder - Delegate ISO mDoc device authentication calculation directly to the holder during OpenID4VP and DCAPI presentation creation
- Trusted issuers:
- Accept an exactly listed, CA-issued end-entity certificate as a direct credential signer, without requiring it to be self-signed
- Add
TrustedCertificates, supplying the certificates of the parties to trust, e.g. extracted from an ETSI trust list withLoTEFilterService - Add
VerifyJwsObjectTrustedCertificateandVerifyCoseSignatureTrustedCertificate, requiring the certificate transported with a credential to be signed by one of the trusted issuer certificates. - The certificate of the trust anchor must be known out-of-band, so no trusted certificate may be transported with the credential, and the signing certificate must not be self-signed.
- Add a
trustedIssuersparameter toVerifierAgentandHolderAgent, which builds validators enforcing it for issuer signatures on SD-JWT, VC-JWS and mdoc credentials. - Use
issuerJwsVerifier()andissuerCoseVerifier()to wire it into validators directly, and passVerifyJwsObjectTrustedCertificateasverifyJwsObjectIntegrityofTokenStatusResolverImplresp. asverifyJwsObjectofClientAuthenticationServicefor status list tokens and client attestations, which are separate trust domains - In
VerifyStatusListTokenHAIPimplement the certificate checks. ReplacetrustStoreLookupwithtrustedIssuers, and deprecate the now unusedTrustStoreLookup. - In
VerifyStatusListTokenHAIPfix the check that the signing certificate must not be self-signed
- Trusted relying parties:
- Add
RelyingPartyTrust, a sealed interface with one subtype per client identifier scheme, configuring how a wallet establishes trust in the relying party sending an authorization request, and arelyingPartyTrustparameter taking aSetof them onOpenId4VpHolderand onOpenId4VpWallet. Several sources of the same kind form a union, i.e. trust established by any one of them is enough, so e.g. a trust list may sit next to a locally pinned certificate. Passingnulltrusts every relying party, an empty set trusts none AuthorizationRequestValidatornow verifies the signature of a signed request object, forJwsCompactas well as for multi-signedJwsGeneralrequests.- For
x509_san_dnsandx509_hash, validate thex5cchain againstRelyingPartyTrust.Certificates - Implement the
verifier_attestationclient identifier scheme - Enforce the
pre-registeredclient identifier scheme againstRelyingPartyTrust.PreRegisteredClients - Requests using a scheme for which no trust material is configured are rejected. This includes
entity_idanddid, which are handed toRelyingPartyTrust.Customand rejected when none is configured, so that a relying party cannot bypass the configured trust anchors by naming itself with a scheme this library does not evaluate natively. Onlyredirect_uriis not covered, as it forbids signed requests anyway RequestParserno longer verifies anything and lost itsrequestObjectJwsVerifierparameter, so parsing a request is purely parsing. ConsequentlyRequestParametersSigned.verifiedis removed, with theverifiedproperty ofJws,OpenId4VpDcApiSignedandOpenId4VpDcApiMultiSignedand its serialized form. Stored JSON still carrying"verified"deserializes fine, as unknown keys are ignored- Add
WrprcValidator,WrpacValidator,WrpAuthenticationRequestValidatorandWrpChainValidatorto validate WRPAC and WRPRC during presentation. - Verify ISO mdoc
readerAuth/readerAuthAllagainst the session transcript before accepting a WRPAC from the request. ISO mdoc validation now uses a suspendWrpAuthenticationRequestValidator.invokeoverload requiring aSessionTranscript;IsoMdocDcApi.validateWrpAuthenticationRequest()calculates it from the DC API request. Remove the unauthenticatedDeviceRequest.extractCertificateChain()helper. DcApiVerifiersignsreaderAuthof every ISO 18013-7 Annex C document request with its key material, when that has a certificate, transporting the chain of the certificate-based client identifier scheme. Pass the CBOR-encoded WRPRC in the newOpenId4VpRequestOptions.euWrprcto set it in theDocRequestInfoof every document request.
- Add
- Trust List filtering:
- Replace
LoTEServiceType/LoTEFilterCriteriawithLoteProfile, a sealed class defining PID, mDL, WRPAC, WALLET, and EAA profiles with built-in matching against scheme type, status approach, community rules URIs, and country code - Add support for LoTEs with issuance and revocation certificates
- Add
LoTEStage, enumerating the base URLs of the European Commission's development, acceptance, and production trust infrastructure, so that applications can fetch the lists of any stage - Replace the hardcoded acceptance URL in
LoteProfile.fetchUrlwith the relativeLoteProfile.fileName, resolved against a base URL byLoteProfile.fetchUrl(baseUrl)orLoteProfile.fetchUrl(stage) - Replace
LoteProfile.defaultUrlswithLoteProfile.entriesandLoteProfile.fetchUrls(), which take the stages or the base URL to fetch from - Add
TrustAnchorProviderwhich lets apps supply trust anchors per credential type (vct/doctype) or perLoteProfile, for issuers as well as for status list signers (JWT and CWT)
- Replace
- Form-url-encoded parameters:
- Preserve opaque string parameters when decoding polymorphic requests, and ignore unknown object parameters before parsing their values as JSON
- Use
RequestParametersSerializer.decodeFormParameters()to decode form parameters whose concrete request type is determined by their parameter names - Extract the sketch in
SerializerSketch.ktofvck-openidinto a documented API inFormUrlEncoding.kt, covered byFormUrlEncodingTest - Move it from
at.asitplus.wallet.lib.oidvciinvck-openidtoat.asitplus.openidinopenid-data-classes, next to the parameter classes it encodes, since it is specific to neither issuance nor presentation. The previous declarations remain as deprecated forwarders - Rename
ParameterstoFormParameters, to disambiguate it fromio.ktor.http.Parameters - Replace
String.decodeFromPostBody()andString.decodeFromUrlQuery(), which were two names for the same thing, withString.decodeFromFormUrlEncoded() - Add
Url.decodeFromQuery(),Url.decodeFromFragment()andUrl.decodeFromFragmentOrQuery(), which read the parameters off a URL instead of leaving that to callers - Add
T.encodeToFormUrlEncoded()andString.toFormParameters() - Deprecate
FormParameters.decodeFromUrlQuery(): its receiver is already decoded in nearly all call sites, so it decoded percent-encoding a second time and mangled every value containing a percent sign. This fixes parsing credential offers, authentication requests and authentication responses carrying such values - Split the payload with
io.ktor.http.parseQueryString()instead of by hand, which drops names without a value instead of throwing, and reads+as a space in URL queries too
- OAuth 2.0:
- Update implementation of OAuth 2.0 Attestation-Based Client Authentication to Draft 10 from 2026-07-06
- Support DPoP combined mode, advertised with
dpop_combinedinclient_attestation_pop_methods_supportedto combine client authentication with DPoP proofs from RFC 9449 - Support DPoP combined mode on the client side in
OAuth2KtorClient - Add method
attestationChallenge()toSimpleAuthorizationServiceto deliver challenges for Attestation-Based Client Authentication - Support
use_client_attestationerrors and parse challenges fromOAuth-Client-Attestation-ChallengeinOAuth2KtorClient - Strengthen validation of DPoP proofs from OAuth 2.0 Demonstrating Proof of Possession (DPoP)
- Validate the access token in
SimpleAuthorizationService.getUserInfo()before returning any user info, i.e. it now behaves the same asuserInfo(). Previously the token was only parsed, so neither its signature, nor its expiration, nor the DPoP proof were verified - Compare scopes as space-delimited values instead of substrings, when issuing access tokens in
SimpleAuthorizationServiceand when authorizing credential requests inCredentialIssuer - Authorize several credential requests with a single JWT access token
- Add
TokenService.validateAccessToken(), which validates the access token and resolves the user info stored at issuance - Bind client authentication to internal state to prevent client mismatches in subsequent requests
- Add
dpopKeyMaterialas explicit constructor argument toOAuth2KtorClient - Enforce
require_pushed_authorization_requestsinSimpleAuthorizationService.authorize()as mandated by RFC 9126, Section 4 - Require PKCE with
code_challenge_method=S256on every authorization request, as mandated by OpenID4VC HAIP, and advertise it incode_challenge_methods_supported - Make
CodeService.provideCode()andCodeService.verifyAndRemove()suspending functions, and implementDefaultCodeServiceon top ofNonceService, so codes are stored thread-safely and expire. - Keep authorization codes, pre-authorized codes and
issuer_statevalues in separate stores inSimpleAuthorizationService - Make OAuth 2.0 Token Exchange opt-in with the new
supportTokenExchangeconstructor argument ofSimpleAuthorizationService, defaulting tofalse, and only advertise the grant ingrant_types_supportedwhen it is enabled. - Add
OAuth2Exception.UnsupportedGrantTypefor theunsupported_grant_typeerror of RFC 6749 - Restrict pre-authorized codes to the credential configuration IDs of the offer they belong to, tracked in the new
ClientAuthRequest.configurationIds. - Support OID4VCI transaction codes for the pre-authorized code flow, with the new
transactionCodeparameters ofSimpleAuthorizationService.offerWithPreAuthnForUserForSchemes()andprovidePreAuthorizedCode(). - Return
nullfromCredentialAuthorizationServiceStrategy.filterScope()when no requested scope is supported to triggerinvalid_scopeerror - Grant only the scopes the authorization server accepted:
SimpleAuthorizationServicekeeps the filtered scope with the authorization code - Implement
validScopes()andfilterScope()inQtspAuthorizationServiceStrategyfor the CSC scopesserviceandcredential, which the delegateCredentialAuthorizationServiceStrategydoes not know
- Deprecations:
- Remove code deprecated in 7.0.0, e.g. various
Iso180137AnnexC*and related classes - Deprecate all classes used for Presentation Exchange requests and so on, e.g.,
CredentialPresentationRequest.PresentationExchangeRequestorPresentationExchangeCredentialDisclosureorCredentialPresentation.PresentationExchangePresentation - Deprecate member
invalidItemsinIsoDocumentParsed, methodValidatorMdoc.verifyDocument()will throw instead of filling invalid items - In
ProofValidatordeprecate constructor argumentverifyAttestationProof, replace withstatusListTokenResolverandverifyKeyAttestationSignature - In
NonceChallengeVerifierdeprecateverifyPresentationSdJwt(),verifyPresentationVcJwt()andverifyPresentationIsoMdoc(), which take the challenge from the presentation itself, to be replaced withconsumeChallenge()and the returnedChallengeSession NonceChallengeVerifierdoes not implementVerifierandNonceServiceanymore, so a presentation cannot be verified without accounting for the challenge it answers; use theChallengeSessionfromconsumeChallenge(), or the propertiesverifierfor challenge-free verification andnonceServicefor raw nonce access- Deprecate passing
publicKeyLookuptoVerifyJwsObjectandVerifyCoseSignature, callers are rerouted to the trusted variants, useVerifyJwsObjectTrustedresp.VerifyCoseSignatureTrustedexplicitly, or drop the parameter to keep verifying against the asserted key - Deprecate
PresentationRequestParameters.calcIsoDeviceSignaturePlainin favor of computing device signatures automatically viacalcIsoSessionTranscript - Deprecate the
NonceChallengeVerifier.createPresentationRequest()overload acceptingcalcIsoDeviceSignaturePlain - Deprecate
signDeviceAuthDetachedparameter inbuildEncryptedResponse(),OpenId4VpHolder, andIso180137AnnexCHolder, as device authentication signature functions are now managed internally by the holder - Deprecate
TrustStoreLookup, as trusted certificates are not selected per signed object, replaced byTrustedCertificates - Deprecate
RequestObjectJwsVerifierand therequestObjectJwsVerifierparameter ofOpenId4VpHolder, superseded byRelyingPartyTrust. It is no longer invoked: verifying a request object needs to know where to load the relying party's key from, which depends on the client identifier scheme, so it moved toAuthorizationRequestValidator. Supplying one now logs a warning and has no effect, so migrate torelyingPartyTrust—RelyingPartyTrust.PreRegisteredClientsfor the pre-registered case,RelyingPartyTrust.Customfor schemes this library does not evaluate natively. To be removed in 9.0.0 - Deprecate
ClientAuthenticationService.verifyClientAttestationJwt, which never validated thex5cit required; passVerifyJwsObjectTrustedCertificatewith the trusted wallet provider certificates asverifyJwsObjectinstead - Deprecate constructor in
RequestInfotaking single values for some HTTP headers, replace with constructor taking in all HTTP headers - Deprecate constructor parameter
enforceClientAuthenticationinAttestationBasedClientAuthenticationServiceas the new default istrue. Callers might use aNoopClientAuthenticationService - Deprecate
TokenService.readUserInfo(), since it does not prove possession of the key the access token is bound to. Replace withTokenService.validateAccessToken(), which validates the access token including the DPoP proof and returns the user info inValidatedAccessToken.userInfoExtended - Deprecate constructor parameter
signDpopinOAuth2KtorClient, replace by settingdpopKeyMaterial - Deprecate
LoTEFilterCriteriaandLoTEServiceType, replace byLoteProfile - Deprecate
LoTEFilterService.extractTrustedCertificates(), replace byLoTEFilterService.extractIssuanceCertificates()andLoTEFilterService.extractRevocationCertificates()
- Remove code deprecated in 7.0.0, e.g. various
- Refactorings:
- In
MdocInputValidatorandValidatorMdocreplaceverifyCoseSignatureWithKeywith aVerifyCoseSignatureFun<MobileSecurityObject>, which resolves the issuer key from the COSE headers itself. ConsequentlyMdocInputValidator.invoke()andValidatorMdoc.verifyIsoCred()lose theirissuerKeyparameter,MdocInputValidationSummary.IntegrityValidationSummary.IntegrityValidationResultloses itsissuerKeyproperty, andIntegrityNotValidatedis removed ValidatorMdoc.verifyDocument()no longer extracts the issuer certificate itself, but delegates toMdocInputValidatorlike the credential path does- Remove
requestObjectVerifiedfromAuthorizationResponsePreparationState: request verification is enforced inAuthorizationRequestValidator, which every holder flow passes through, so the flag had no remaining job. It could never be satisfied for signed DC API requests anyway, since nothing ever set it - In ISO data classes like
DeviceResponse,DeviceRequest,MobileSecurityObjectreplace the Stringversionwith a typedparsedVersionfrom kotlin-semver - In ISO data class
MobileSecurityObjectreplace the StringdigestAlgorithmwith a typeddigestfrom Signum - In
CredentialToBeIssued.Isoadd a property to specify the digest algorithm to be used in the MSO - Add method
getCertificateChainto classKeyStoreMaterial - In
NonceChallengeVerifieraddconsumeChallenge(), which consumes the challenge of the request an authentication response refers to and returns aNonceChallengeVerifier.ChallengeSessionto verify all presentations of that response with, as used byOpenId4VpVerifierandDcApiVerifier - Add main constructor to
RequestInfothat takes in all HTTP headers for future extensions to client authentication methods - Rename existing
ClientAuthenticationServicetoAttestationBasedClientAuthenticationServiceand extract an interface - Return the validated token from
validateAccessToken()inTokenVerificationServiceandOAuth2AuthorizationServerAdapterasValidatedAccessToken, and movevalidCredentialIdentifiersfromTokenInfotoValidatedAccessToken - Authorize credential requests in
CredentialIssuerfrom theValidatedAccessToken - In
EncryptJweremovekeyMaterialas it always relies on ephemeral keys embedded in the JWE header - Add
SingleClaimReference(moved from Valera) - Additional Java-Safe APIs for
IssuerMetadata,ClaimDescrption,StatusIssuer,ReferencedTokenStore
- In
- Dependencies:
- Update to Signum 3.26.0 for HPKE support
- Add
etsi-data-classesas api dependency toopenid-data-classes - Bouncy Castle 1.86 on the JVM
- JsonPath4K 4.0.0