Skip to content

Commit ad69d3a

Browse files
committed
Eliminate usages of key material's identifier
1 parent 606463a commit ad69d3a

5 files changed

Lines changed: 38 additions & 33 deletions

File tree

vck/src/commonMain/kotlin/at/asitplus/wallet/lib/jws/JwsService.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ fun interface JwsHeaderIdentifierFun {
6666
class JwsHeaderCertOrJwk : JwsHeaderIdentifierFun {
6767
override suspend operator fun invoke(it: JwsHeader, keyMaterial: KeyMaterial) =
6868
when (keyMaterial) {
69-
is PublishedKeyMaterial -> it.copy(keyId = keyMaterial.identifier, jsonWebKeySetUrl = keyMaterial.keySetUrl)
69+
is PublishedKeyMaterial -> it.copy(
70+
keyId = keyMaterial.identifier,
71+
jsonWebKeySetUrl = keyMaterial.keySetUrl
72+
)
73+
7074
else -> keyMaterial.getCertificate()?.let { x5c ->
7175
it.copy(certificateChain = listOf(x5c))
7276
} ?: it.copy(jsonWebKey = keyMaterial.jsonWebKey)

vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import kotlin.random.Random
2929

3030
class AgentTest : FreeSpec({
3131

32+
lateinit var issuerIdentifier: String
3233
lateinit var issuer: Issuer
3334
lateinit var statusListIssuer: StatusListIssuer
3435
lateinit var holder: Holder
@@ -60,9 +61,10 @@ class AgentTest : FreeSpec({
6061
issuerCredentialStore = InMemoryIssuerCredentialStore()
6162
holderCredentialStore = InMemorySubjectCredentialStore()
6263

64+
issuerIdentifier = "https://issuer.example.com/${uuid4()}"
6365
issuer = IssuerAgent(
6466
issuerCredentialStore = issuerCredentialStore,
65-
identifier = "https://issuer.example.com/"
67+
identifier = issuerIdentifier
6668
)
6769
statusListIssuer = StatusListAgent(issuerCredentialStore = issuerCredentialStore)
6870

@@ -129,7 +131,7 @@ class AgentTest : FreeSpec({
129131
val presentationParameters = holder.createPresentation(
130132
request = PresentationRequestParameters(
131133
nonce = challenge,
132-
audience = issuer.keyMaterial.identifier
134+
audience = issuerIdentifier,
133135
),
134136
credentialPresentation = singularPresentationDefinition,
135137
).getOrThrow()
@@ -322,7 +324,7 @@ class AgentTest : FreeSpec({
322324
val presentationParameters = holder.createDefaultPresentation(
323325
request = PresentationRequestParameters(
324326
nonce = challenge,
325-
audience = issuer.keyMaterial.identifier
327+
audience = issuerIdentifier,
326328
),
327329
credentialPresentationRequest = CredentialPresentationRequest.DCQLRequest(singularDCQLRequest)
328330
).getOrThrow() as PresentationResponseParameters.DCQLParameters

vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorSdJwtTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ private suspend fun issueVcSd(
140140
val vcSdJwt = VerifiableCredentialSdJwt(
141141
subject = if (scrambleSubject) subjectId.reversed() else subjectId,
142142
notBefore = issuanceDate,
143-
issuer = holderKeyMaterial.identifier,
143+
issuer = "https://issuer.example.com/",
144144
expiration = expirationDate,
145145
issuedAt = issuanceDate,
146146
jwtId = vcId,

vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVcTest.kt

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import at.asitplus.wallet.lib.data.rfc.tokenStatusList.primitives.TokenStatusVal
1717
import at.asitplus.wallet.lib.data.rfc3986.UniformResourceIdentifier
1818
import at.asitplus.wallet.lib.jws.JwsContentTypeConstants
1919
import at.asitplus.wallet.lib.jws.JwsHeaderCertOrJwk
20+
import at.asitplus.wallet.lib.jws.JwsHeaderIdentifierFun
2021
import at.asitplus.wallet.lib.jws.SignJwt
2122
import at.asitplus.wallet.lib.jws.SignJwtFun
2223
import com.benasher44.uuid.uuid4
@@ -33,6 +34,7 @@ import kotlin.time.Duration.Companion.seconds
3334

3435
class ValidatorVcTest : FreeSpec() {
3536

37+
private lateinit var issuerIdentifier: String
3638
private lateinit var issuer: Issuer
3739
private lateinit var statusListIssuer: StatusListIssuer
3840
private lateinit var issuerCredentialStore: IssuerCredentialStore
@@ -64,10 +66,11 @@ class ValidatorVcTest : FreeSpec() {
6466
)
6567
issuerCredentialStore = InMemoryIssuerCredentialStore()
6668
issuerKeyMaterial = EphemeralKeyWithoutCert()
69+
issuerIdentifier = "https://issuer.example.com/"
6770
issuer = IssuerAgent(
6871
keyMaterial = issuerKeyMaterial,
6972
issuerCredentialStore = issuerCredentialStore,
70-
identifier = "https://issuer.example.com/"
73+
identifier = issuerIdentifier
7174
)
7275
statusListIssuer = StatusListAgent(issuerCredentialStore = issuerCredentialStore)
7376
issuerSignVc = SignJwt(issuerKeyMaterial, JwsHeaderCertOrJwk())
@@ -377,7 +380,7 @@ class ValidatorVcTest : FreeSpec() {
377380

378381
return VerifiableCredential(
379382
id = vcId,
380-
issuer = issuer.keyMaterial.identifier,
383+
issuer = issuerIdentifier,
381384
credentialStatus = credentialStatus,
382385
credentialSubject = sub,
383386
credentialType = type,
@@ -402,25 +405,23 @@ class ValidatorVcTest : FreeSpec() {
402405
jwtId = jwtId
403406
)
404407

405-
private suspend fun signJws(vcJws: VerifiableCredentialJws): String = issuerSignVc(
406-
JwsContentTypeConstants.JWT,
407-
vcJws,
408-
VerifiableCredentialJws.serializer()
409-
).getOrThrow().serialize()
410-
411-
private suspend fun wrapVcInJwsWrongKey(vcJws: VerifiableCredentialJws): String {
412-
val jwsHeader = JwsHeader(
413-
algorithm = JwsAlgorithm.Signature.ES256,
414-
keyId = verifierKeyMaterial.identifier,
415-
type = JwsContentTypeConstants.JWT
416-
)
417-
418-
val signatureInput =
419-
vckJsonSerializer.encodeToString(jwsHeader).encodeToByteArray().encodeToString(Base64UrlStrict) +
420-
"." + vckJsonSerializer.encodeToString(vcJws).encodeToByteArray().encodeToString(Base64UrlStrict)
421-
val signatureInputBytes = signatureInput.encodeToByteArray()
422-
val signature = issuerKeyMaterial.sign(signatureInputBytes).signature
423-
return JwsSigned(jwsHeader, vcJws, signature, signatureInputBytes).serialize()
424-
}
408+
private suspend fun signJws(vcJws: VerifiableCredentialJws): String =
409+
issuerSignVc(
410+
JwsContentTypeConstants.JWT,
411+
vcJws,
412+
VerifiableCredentialJws.serializer()
413+
).getOrThrow().serialize()
414+
415+
private suspend fun wrapVcInJwsWrongKey(vcJws: VerifiableCredentialJws) =
416+
SignJwt<VerifiableCredentialJws>(
417+
issuerKeyMaterial
418+
) { header: JwsHeader, keyMaterial: KeyMaterial ->
419+
// this should be issuerKeyMaterial.jsonWebKey, but is a wrong key
420+
header.copy(jsonWebKey = EphemeralKeyWithoutCert().jsonWebKey)
421+
}(
422+
JwsContentTypeConstants.JWT,
423+
vcJws,
424+
VerifiableCredentialJws.serializer()
425+
).getOrThrow().serialize()
425426

426427
}

vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVpTest.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,11 @@ class ValidatorVpTest : FreeSpec({
248248
"Wrong jwtId in VP is not valid" {
249249
val credentials = holderCredentialStore.getCredentials().getOrThrow()
250250
.filterIsInstance<SubjectCredentialStore.StoreEntry.Vc>()
251-
.map { it.vcSerialized }
252-
val vp = VerifiablePresentation(credentials)
251+
val vp = VerifiablePresentation(credentials.map { it.vcSerialized })
253252
val vpSerialized = VerifiablePresentationJws(
254253
vp = vp,
255254
challenge = challenge,
256-
issuer = holder.keyMaterial.identifier,
255+
issuer = credentials.first().vc.vc.credentialSubject.id,
257256
audience = verifierId,
258257
jwtId = "wrong_jwtId",
259258
)
@@ -270,16 +269,15 @@ class ValidatorVpTest : FreeSpec({
270269
"Wrong type in VP is not valid" {
271270
val credentials = holderCredentialStore.getCredentials().getOrThrow()
272271
.filterIsInstance<SubjectCredentialStore.StoreEntry.Vc>()
273-
.map { it.vcSerialized }
274272
val vp = VerifiablePresentation(
275273
id = "urn:uuid:${uuid4()}",
276274
type = "wrong_type",
277-
verifiableCredential = credentials
275+
verifiableCredential = credentials.map { it.vcSerialized }
278276
)
279277

280278
val vpSerialized = vp.toJws(
281279
challenge = challenge,
282-
issuerId = holder.keyMaterial.identifier,
280+
issuerId = credentials.first().vc.vc.credentialSubject.id,
283281
audienceId = verifierId,
284282
)
285283
val vpJws = holderSignVp(

0 commit comments

Comments
 (0)