Skip to content

Commit beef8d2

Browse files
committed
Require the holder's identifier to be a URI
1 parent ad69d3a commit beef8d2

36 files changed

Lines changed: 175 additions & 138 deletions

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Release 5.9.0 (unreleased):
99
- Introduce interface `PublishedKeyMaterial` to indicate clients can lookup that key with the `identifier` used as a `keyId` in a key set
1010
- Other key material gets randomly assigned identifiers to not rely on DIDs
1111
- For JVM add `PublishedKeyStoreMaterial` to load keys from Java key stores with a fixed identifier
12-
- In class `HolderAgent` require the `identifier` to be set in the constructor, as this needs to be an URI for SD-JWT and JWT VC
12+
- In class `HolderAgent` require the `identifier` to be a URI, set in the constructor, as required for SD-JWT and JWT VC
1313
- Key material will be referenced by its `keyId` and key set URL or by its certificate or plain public key in JWS proofs
1414

1515
Release 5.8.0:

openid-data-classes/src/commonMain/kotlin/at/asitplus/wallet/lib/data/rfc3986/UniformResourceIdentifier.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ import kotlin.jvm.JvmInline
2121
get() = url.toString()
2222
}
2323

24+
fun String.toUri() = UniformResourceIdentifier(this)
25+

vck-openid-ktor/src/commonTest/kotlin/at/asitplus/wallet/lib/ktor/openid/OpenId4VciClientTest.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import at.asitplus.wallet.lib.agent.ValidatorSdJwt
2929
import at.asitplus.wallet.lib.agent.Verifier.VerifyCredentialResult
3030
import at.asitplus.wallet.lib.data.ConstantIndex
3131
import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.*
32+
import at.asitplus.wallet.lib.data.rfc3986.toUri
3233
import at.asitplus.wallet.lib.data.vckJsonSerializer
3334
import at.asitplus.wallet.lib.jws.JwsHeaderCertOrJwk
3435
import at.asitplus.wallet.lib.jws.JwsHeaderNone
@@ -56,12 +57,8 @@ import io.kotest.matchers.types.shouldBeInstanceOf
5657
import io.ktor.client.*
5758
import io.ktor.client.engine.mock.*
5859
import io.ktor.client.request.*
59-
import io.ktor.http.ContentType
60-
import io.ktor.http.HttpHeaders
61-
import io.ktor.http.HttpStatusCode
62-
import io.ktor.http.fullPath
63-
import io.ktor.http.headersOf
64-
import io.ktor.util.toMap
60+
import io.ktor.http.*
61+
import io.ktor.util.*
6562
import kotlinx.serialization.json.jsonPrimitive
6663
import kotlin.random.Random
6764
import kotlin.time.Clock
@@ -242,7 +239,7 @@ class OpenId4VciClientTest : FunSpec() {
242239
)
243240
val issuer = IssuerAgent(
244241
keyMaterial = EphemeralKeyWithSelfSignedCert(),
245-
identifier = "https://issuer.example.com/"
242+
identifier = "https://issuer.example.com/".toUri()
246243
)
247244
credentialIssuer = CredentialIssuer(
248245
authorizationService = authorizationService,

vck-openid-ktor/src/commonTest/kotlin/at/asitplus/wallet/lib/ktor/openid/OpenId4VpWalletTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.SD_JWT
2828
import at.asitplus.wallet.lib.data.CredentialPresentation.DCQLPresentation
2929
import at.asitplus.wallet.lib.data.CredentialPresentationRequest.DCQLRequest
3030
import at.asitplus.wallet.lib.data.SelectiveDisclosureItem
31+
import at.asitplus.wallet.lib.data.rfc3986.toUri
3132
import at.asitplus.wallet.lib.oidvci.OAuth2Exception
3233
import at.asitplus.wallet.lib.openid.*
3334
import at.asitplus.wallet.lib.openid.AuthnResponseResult.SuccessIso
@@ -305,7 +306,7 @@ class OpenId4VpWalletTest : FunSpec() {
305306
) = storeCredential(
306307
IssuerAgent(
307308
keyMaterial = EphemeralKeyWithSelfSignedCert(),
308-
identifier = "https://issuer.example.com/"
309+
identifier = "https://issuer.example.com/".toUri()
309310
).issueCredential(
310311
representation.toCredentialToBeIssued(scheme, attributes)
311312
).getOrThrow().toStoreCredentialInput()

vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidvci/OidvciAttestationTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import at.asitplus.wallet.lib.data.AtomicAttribute2023
1212
import at.asitplus.wallet.lib.data.ConstantIndex
1313
import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation
1414
import at.asitplus.wallet.lib.data.VerifiableCredentialJws
15+
import at.asitplus.wallet.lib.data.rfc3986.toUri
1516
import at.asitplus.wallet.lib.data.vckJsonSerializer
1617
import at.asitplus.wallet.lib.jws.JwsHeaderCertOrJwk
1718
import at.asitplus.wallet.lib.jws.SignJwt
@@ -64,7 +65,7 @@ class OidvciAttestationTest : FunSpec({
6465
)
6566
issuer = CredentialIssuer(
6667
authorizationService = authorizationService,
67-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
68+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
6869
credentialSchemes = setOf(ConstantIndex.AtomicAttribute2023, MobileDrivingLicenceScheme),
6970
proofValidator = ProofValidator(
7071
verifyAttestationProof = { true },
@@ -106,7 +107,7 @@ class OidvciAttestationTest : FunSpec({
106107
test("use key attestation for proof, issuer does not verify it") {
107108
issuer = CredentialIssuer(
108109
authorizationService = authorizationService,
109-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
110+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
110111
credentialSchemes = setOf(ConstantIndex.AtomicAttribute2023, MobileDrivingLicenceScheme),
111112
proofValidator = ProofValidator(
112113
verifyAttestationProof = { false }, // do not accept key attestation

vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidvci/OidvciCodeFlowTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import at.asitplus.wallet.lib.data.ConstantIndex.AtomicAttribute2023
1717
import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.*
1818
import at.asitplus.wallet.lib.data.VerifiableCredentialJws
1919
import at.asitplus.wallet.lib.data.VerifiableCredentialSdJwt
20+
import at.asitplus.wallet.lib.data.rfc3986.toUri
2021
import at.asitplus.wallet.lib.data.vckJsonSerializer
2122
import at.asitplus.wallet.lib.oauth2.AuthorizationServiceStrategy
2223
import at.asitplus.wallet.lib.oauth2.ClientAuthRequest
@@ -59,7 +60,7 @@ class OidvciCodeFlowTest : FreeSpec({
5960
)
6061
issuer = CredentialIssuer(
6162
authorizationService = authorizationService,
62-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
63+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
6364
credentialSchemes = setOf(AtomicAttribute2023, MobileDrivingLicenceScheme),
6465
)
6566
client = WalletService()
@@ -230,7 +231,7 @@ class OidvciCodeFlowTest : FreeSpec({
230231
)
231232
issuer = CredentialIssuer(
232233
authorizationService = authorizationService,
233-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
234+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
234235
credentialSchemes = setOf(AtomicAttribute2023),
235236
)
236237
val requestOptions = RequestOptions(AtomicAttribute2023, PLAIN_JWT)

vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidvci/OidvciEncryptionTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import at.asitplus.wallet.lib.agent.IssuerAgent
1212
import at.asitplus.wallet.lib.data.AtomicAttribute2023
1313
import at.asitplus.wallet.lib.data.ConstantIndex
1414
import at.asitplus.wallet.lib.data.VerifiableCredentialJws
15+
import at.asitplus.wallet.lib.data.rfc3986.toUri
1516
import at.asitplus.wallet.lib.data.vckJsonSerializer
1617
import at.asitplus.wallet.lib.jws.DecryptJwe
1718
import at.asitplus.wallet.lib.jws.DecryptJweFun
@@ -62,7 +63,7 @@ class OidvciEncryptionTest : FunSpec({
6263
)
6364
issuer = CredentialIssuer(
6465
authorizationService = authorizationService,
65-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
66+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
6667
credentialSchemes = setOf(ConstantIndex.AtomicAttribute2023),
6768
requireEncryption = true, // this is important, to require encryption
6869
)
@@ -78,7 +79,7 @@ class OidvciEncryptionTest : FunSpec({
7879
test("issuer fails to encrypt") {
7980
issuer = CredentialIssuer(
8081
authorizationService = authorizationService,
81-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
82+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
8283
credentialSchemes = setOf(ConstantIndex.AtomicAttribute2023),
8384
requireEncryption = true, // this is important, to require encryption
8485
encryptCredentialRequest = object : EncryptJweFun {

vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidvci/OidvciOfferCodeTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import at.asitplus.openid.CredentialOffer
66
import at.asitplus.openid.TokenResponseParameters
77
import at.asitplus.wallet.lib.agent.IssuerAgent
88
import at.asitplus.wallet.lib.data.ConstantIndex.AtomicAttribute2023
9+
import at.asitplus.wallet.lib.data.rfc3986.toUri
910
import at.asitplus.wallet.lib.oauth2.OAuth2Client
1011
import at.asitplus.wallet.lib.oauth2.SimpleAuthorizationService
1112
import at.asitplus.wallet.lib.openid.AuthenticationResponseResult
@@ -32,7 +33,7 @@ class OidvciOfferCodeTest : FreeSpec({
3233
)
3334
issuer = CredentialIssuer(
3435
authorizationService = authorizationService,
35-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
36+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
3637
credentialSchemes = setOf(AtomicAttribute2023, MobileDrivingLicenceScheme),
3738
)
3839
client = WalletService()

vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidvci/OidvciPreAuthTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import at.asitplus.wallet.lib.agent.IssuerAgent
1010
import at.asitplus.wallet.lib.data.ConstantIndex.AtomicAttribute2023
1111
import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.PLAIN_JWT
1212
import at.asitplus.wallet.lib.data.VerifiableCredentialJws
13+
import at.asitplus.wallet.lib.data.rfc3986.toUri
1314
import at.asitplus.wallet.lib.data.vckJsonSerializer
1415
import at.asitplus.wallet.lib.oauth2.OAuth2Client
1516
import at.asitplus.wallet.lib.oauth2.SimpleAuthorizationService
@@ -37,7 +38,7 @@ class OidvciPreAuthTest : FreeSpec({
3738
)
3839
issuer = CredentialIssuer(
3940
authorizationService = authorizationService,
40-
issuer = IssuerAgent(identifier = "https://issuer.example.com"),
41+
issuer = IssuerAgent(identifier = "https://issuer.example.com".toUri()),
4142
credentialSchemes = setOf(AtomicAttribute2023, MobileDrivingLicenceScheme),
4243
)
4344
client = WalletService()

vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/openid/CredentialJsonInteropTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.ISO_MD
88
import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.PLAIN_JWT
99
import at.asitplus.wallet.lib.data.ConstantIndex.CredentialRepresentation.SD_JWT
1010
import at.asitplus.wallet.lib.data.CredentialToJsonConverter
11+
import at.asitplus.wallet.lib.data.rfc3986.toUri
1112
import at.asitplus.wallet.lib.openid.DummyCredentialDataProvider
1213
import com.benasher44.uuid.uuid4
1314
import io.kotest.assertions.throwables.shouldThrow
@@ -30,7 +31,7 @@ class CredentialJsonInteropTest : FreeSpec({
3031
holderAgent = HolderAgent(holderKeyMaterial, subjectCredentialStore)
3132
issuerAgent = IssuerAgent(
3233
keyMaterial = EphemeralKeyWithSelfSignedCert(),
33-
identifier = "https://issuer.example.com/"
34+
identifier = "https://issuer.example.com/".toUri()
3435
)
3536
}
3637

0 commit comments

Comments
 (0)