Skip to content

Commit 177bca7

Browse files
committed
OID4VCI: Make client attestation optional
1 parent ce585aa commit 177bca7

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ Release 5.6.4:
4343
- OpenID for Verifiable Credential Issuance:
4444
- Sign authn request as JAR only when AS supports it
4545
- Support extracting `credential_configuration_id` from server's authorization details
46+
- In `OpenId4VciClient` make constructor parameter `loadClientAttestationJwt` optional
47+
- In `OpenId4VciClient` make constructor parameter `signClientAttestationPop` optional
4648

4749
Release 5.6.3:
4850
- OpenID for Verifiable Credential Issuance:

vck-openid-ktor/src/commonMain/kotlin/at/asitplus/wallet/lib/ktor/openid/OpenId4VciClient.kt

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ class OpenId4VciClient(
7171
* the key behind [signClientAttestationPop], see
7272
* [OAuth 2.0 Attestation-Based Client Authentication](https://www.ietf.org/archive/id/draft-ietf-oauth-attestation-based-client-auth-04.html)
7373
*/
74-
private val loadClientAttestationJwt: suspend () -> String,
74+
private val loadClientAttestationJwt: (suspend () -> String)? = null,
7575
/** Used for authenticating the client at the authorization server with client attestation. */
76-
private val signClientAttestationPop: SignJwtFun<JsonWebToken> = SignJwt(
76+
private val signClientAttestationPop: SignJwtFun<JsonWebToken>? = SignJwt(
7777
EphemeralKeyWithoutCert(),
7878
JwsHeaderNone()
7979
),
@@ -280,16 +280,17 @@ class OpenId4VciClient(
280280
Napier.i("postToken: $tokenEndpointUrl with $tokenRequest")
281281

282282
val clientAttestationJwt = if (oauthMetadata.useClientAuth()) {
283-
loadClientAttestationJwt.invoke()
284-
} else null
285-
val clientAttestationPoPJwt = if (oauthMetadata.useClientAuth()) {
286-
BuildClientAttestationPoPJwt(
287-
signClientAttestationPop,
288-
clientId = oid4vciService.clientId,
289-
audience = issuerMetadata.credentialIssuer,
290-
lifetime = 10.minutes,
291-
).serialize()
283+
loadClientAttestationJwt?.invoke()
292284
} else null
285+
val clientAttestationPoPJwt =
286+
if (oauthMetadata.useClientAuth() && signClientAttestationPop != null && clientAttestationJwt != null) {
287+
BuildClientAttestationPoPJwt(
288+
signClientAttestationPop,
289+
clientId = oid4vciService.clientId,
290+
audience = issuerMetadata.credentialIssuer,
291+
lifetime = 10.minutes,
292+
).serialize()
293+
} else null
293294
val dpopHeader = if (oauthMetadata.hasMatchingDpopAlgorithm()) {
294295
BuildDPoPHeader(signDpop, url = tokenEndpointUrl)
295296
} else null
@@ -535,16 +536,17 @@ class OpenId4VciClient(
535536
): AuthenticationRequestParameters {
536537
val shouldIncludeClientAttestation = tokenAuthMethods?.contains(AUTH_METHOD_ATTEST_JWT_CLIENT_AUTH) == true
537538
val clientAttestationJwt = if (shouldIncludeClientAttestation) {
538-
loadClientAttestationJwt.invoke()
539-
} else null
540-
val clientAttestationPoPJwt = if (shouldIncludeClientAttestation) {
541-
BuildClientAttestationPoPJwt(
542-
signClientAttestationPop,
543-
clientId = oid4vciService.clientId,
544-
audience = credentialIssuer,
545-
lifetime = 10.minutes,
546-
).serialize()
539+
loadClientAttestationJwt?.invoke()
547540
} else null
541+
val clientAttestationPoPJwt =
542+
if (shouldIncludeClientAttestation && signClientAttestationPop != null && clientAttestationJwt != null) {
543+
BuildClientAttestationPoPJwt(
544+
signClientAttestationPop,
545+
clientId = oid4vciService.clientId,
546+
audience = credentialIssuer,
547+
lifetime = 10.minutes,
548+
).serialize()
549+
} else null
548550
val response = client.submitForm(
549551
url = url,
550552
formParameters = parameters {

0 commit comments

Comments
 (0)