Skip to content

Commit b03d885

Browse files
author
dtsiflit
committed
[fix] updated configuration in tests
1 parent 9b9b7f0 commit b03d885

File tree

6 files changed

+127
-43
lines changed

6 files changed

+127
-43
lines changed

Tests/AttestationBased/AttestationBasedTests.swift

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,27 +60,17 @@ class AttestationBasedTests: XCTestCase {
6060
compactSerialization: TestsConstants.CNF_JWT
6161
)
6262
)
63+
6364
XCTAssertNotNil(clientAttestationPop)
65+
}
66+
67+
func testClientAttestationJWT() async throws {
6468

65-
let clientAttestation = try ClientAttestationJWT(
66-
jws: JWS(
67-
compactSerialization: TestsConstants.CNF_JWT
68-
)
69+
let client = try selfSignedClient(
70+
clientId: "wallet-dev",
71+
privateKey: try! KeyController.generateECDHPrivateKey()
6972
)
7073

71-
let jwk = clientAttestation.pubKey
72-
XCTAssertNotNil(jwk)
73-
74-
let client: Client? = try? .init(
75-
attestationJWT: clientAttestation,
76-
popJwtSpec: try .init(
77-
signingAlgorithm: .ES256,
78-
jwsSigner: .init(
79-
signatureAlgorithm: .ES256,
80-
key: KeyController.generateECDHPrivateKey()
81-
)!
82-
)
83-
)
8474
XCTAssertNotNil(client)
8575
}
8676
}

Tests/Constants/TestsConstants.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,21 @@ let MDL_CredentialOffer = """
7777
}
7878
"""
7979

80-
let config: OpenId4VCIConfig = .init(
80+
let clientConfig: OpenId4VCIConfig = .init(
8181
client: .public(id: "wallet-dev"),
8282
authFlowRedirectionURI: URL(string: "urn:ietf:wg:oauth:2.0:oob")!,
8383
authorizeIssuanceConfig: .favorScopes
8484
)
8585

86+
let attestationConfig: OpenId4VCIConfig = .init(
87+
client: try! selfSignedClient(
88+
clientId: "wallet-dev",
89+
privateKey: try KeyController.generateECDHPrivateKey()
90+
),
91+
authFlowRedirectionURI: URL(string: "urn:ietf:wg:oauth:2.0:oob")!,
92+
authorizeIssuanceConfig: .favorScopes
93+
)
94+
8695
public struct ActingUser {
8796
public let username: String
8897
public let password: String
@@ -274,7 +283,7 @@ struct TestsConstants {
274283
).get()
275284
}
276285

277-
static let CNF_JWT = "eyJ4NWMiOlsiTUlJRExUQ0NBcktnQXdJQkFnSVVMOHM1VHM2MzVrNk9oclJGTWxzU1JBU1lvNll3Q2dZSUtvWkl6ajBFQXdJd1hERWVNQndHQTFVRUF3d1ZVRWxFSUVsemMzVmxjaUJEUVNBdElGVlVJREF4TVMwd0t3WURWUVFLRENSRlZVUkpJRmRoYkd4bGRDQlNaV1psY21WdVkyVWdTVzF3YkdWdFpXNTBZWFJwYjI0eEN6QUpCZ05WQkFZVEFsVlVNQjRYRFRJME1URXlPVEV4TWpnek5Wb1hEVEkyTVRFeU9URXhNamd6TkZvd2FURWRNQnNHQTFVRUF3d1VSVlZFU1NCU1pXMXZkR1VnVm1WeWFXWnBaWEl4RERBS0JnTlZCQVVUQXpBd01URXRNQ3NHQTFVRUNnd2tSVlZFU1NCWFlXeHNaWFFnVW1WbVpYSmxibU5sSUVsdGNHeGxiV1Z1ZEdGMGFXOXVNUXN3Q1FZRFZRUUdFd0pWVkRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkFXYTlVYXI3b1AxWmJHRmJzRkE0ZzMxUHpOR1pjd2gydlI3UENrazBZaUFMNGNocnNsZzljajFrQnlueVppN25acllnUE9KN3gwYXRSRmRreGZYanRDamdnRkRNSUlCUHpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkxOc3VKRVhITmVrR21ZeGgwTGhpOEJBekpVYk1DY0dBMVVkRVFRZ01CNkNIR1JsZGk1cGMzTjFaWEl0WW1GamEyVnVaQzVsZFdScGR5NWtaWFl3RWdZRFZSMGxCQXN3Q1FZSEtJR01YUVVCQmpCREJnTlZIUjhFUERBNk1EaWdOcUEwaGpKb2RIUndjem92TDNCeVpYQnliMlF1Y0d0cExtVjFaR2wzTG1SbGRpOWpjbXd2Y0dsa1gwTkJYMVZVWHpBeExtTnliREFkQmdOVkhRNEVGZ1FVOGVIQS9NWHZreUNGNFExaW91WFAwc3BpTVVnd0RnWURWUjBQQVFIL0JBUURBZ2VBTUYwR0ExVWRFZ1JXTUZTR1VtaDBkSEJ6T2k4dloybDBhSFZpTG1OdmJTOWxkUzFrYVdkcGRHRnNMV2xrWlc1MGFYUjVMWGRoYkd4bGRDOWhjbU5vYVhSbFkzUjFjbVV0WVc1a0xYSmxabVZ5Wlc1alpTMW1jbUZ0WlhkdmNtc3dDZ1lJS29aSXpqMEVBd0lEYVFBd1pnSXhBSmpLU0EzQTdrWU9CWXdKQ09PY3JjYVJDRGVWVGZjdllZQ1I4QWp5blVpMjVJL3Rrc0RDRkE1K21hQ0xmbWtVS1FJeEFPVmpHc2dsdVF3VE41MG85N1dtaWxIYmxXNE44K3FBcm1zQkM4alRJdXRuS2ZjNHlaM3U1UTF1WllJbGJ0S1NyZz09Il0sImtpZCI6IjI3Mjg1NDYwOTcyMTEyMDczMjkzODg2ODI5ODc5OTI0NTAzNDE3NDEwMjkzODUzNCIsInR5cCI6InZjK3NkLWp3dCIsImFsZyI6IkVTMjU2In0.eyJwbGFjZV9vZl9iaXJ0aCI6eyJfc2QiOlsiYldoMGNTdjdDbk9TZjlHczg1TDhPYkN0Y0hRUzRHVXEyYTBqSVdOUTl6byIsImtUbXhLMmFFU2YtbFNLOGpabjR3cDRtMUNsb0pVMmwyUm1ZWFlFR2tscm8iXX0sIl9zZCI6WyItSHZVbDhCQ2RxVHJjLTdyOU82dWdSMUdSSlR5cXdEeDVoVWxTX0M5X2pRIiwiMEgwWllkMm8xUzE4LWNyNnEzTFN6c01VNXpnbEt0RWxMWWNpZDRuTTBNRSIsIjF4YnQyal8zRm5XYmppNnNRbE1XaVV5Z1g0NWluZ2YzRmYzQV80NVdTQW8iLCJBaDZWemg5dExERTZKYkg0TENSdnJ4RV9BVFBMbWtRUlpJS0FtTVRSYktFIiwiRVU5REkzdXlLS3YtX3hRV3drUVVRWUdESVlkX2lGaVJMQ1JfY3lQcFhPOCIsIkY1TkEyT0J6SHFrR1c3RkhGYnZ1dUk5SWVfaVVlcFhMNU9OTWp5TkJpWUEiLCJHZmJrZlRvNDRjQy13aXg0UDFZVGdGX3VZUTMtQmduMkFadWJ1eDhvLXFRIiwiSkhINUFSd3RTZE44d3pncDh5M3NRQmg3SFNYQ2RuckZUa0xWbEhVVlV6USIsIkxwMHR2S1JPRGFhaVoyZjBPMy1SLUk5TjAwNnJ5MGozeExqdDN0MnhLX1EiLCJPTm12VVExYW5TNWtsY2M0QnFMU29oMXFYM0hrOUxESlltMFdCd3hVRDk0IiwiVlIzQXhGQjJqSVRMZUNFQmtvN2JyR3VfdkZPOFM1UHU3cnRBY0REbktPcyIsImNaemtWZ3lZMHJuYWp2X2xhSXM2UmZyaVJkUFozN25KWTJsdkdBa2dsQXciLCJsVmk2OGJNWnBVTF9xV0EweUNESGF1ZlA1dWlEUmpsZno2eXRNdUpBQk1BIiwic3JtSE9xWTE4ZFo1RnBNc3hQdUwxcGUwNEI1ZzcwMjRRUXlSQUZ4cjNWZyJdLCJhZGRyZXNzIjp7Il9zZCI6WyI2OWdNSVIxN1lqMk04YXEyTS1pOUdQLVVlVUpCQ2prLTNTQ2tqN19hSU00IiwiSG9rWEhrVWhuQWNLbFhyODJTb2YtZGdzMXVJemRDYVJQM2ltclJ2STZSTSIsIlRTMEZHR2dtZFE4ZGxOYXVFdEpQQ1MxSllCU3NjYjdVVmY4VXEwNlUwRnciLCJZWnBhaTlldGpNcTNMeHZiOHVBOGIyZUs3WnZYSUU3TWY2RTJoLTRKTUtvIiwiakRVYXVPYjh4NFVMV28xYnFjckw4VEN2bDR6YW9jMFJMVF85TnIyeVdIZyIsIm1mdWZpR2dWTmxXTEhSTFlnY0xIV3Z1VlQ3X2hjem1CMWFmemZ2WUlKNUUiXX0sInZjdCI6InVybjpldS5ldXJvcGEuZWMuZXVkaTpwaWQ6MSIsIl9zZF9hbGciOiJzaGEzLTI1NiIsImlzcyI6Imh0dHBzOi8vZGV2Lmlzc3Vlci1iYWNrZW5kLmV1ZGl3LmRldiIsImNuZiI6eyJqd2siOnsia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJjcnYiOiJQLTI1NiIsImtpZCI6IjAxMTU5MkZBLUY1MDEtNEM4OS04RTg3LTQ1NjJGMzNCNkZCRSIsIngiOiJ4OC1STzlNRFRZdG10U2RWV3dZcHc1SUZBYUhPaGRqLVhjeFhYV2RmWnhrIiwieSI6InVVSXB2TGJJWmFKQUFEVnp5U2VJQUxwcExLTzBhdDVfVFVLRTZiWGRUa3MiLCJhbGciOiJFUzI1NiJ9fSwiZXhwIjoxNzM3MDMzNzI4LCJpYXQiOjE3MzQ0NDE3MjgsImFnZV9lcXVhbF9vcl9vdmVyIjp7Il9zZCI6WyJxOGhfeE9vaUFxaFczOGhHeDV1ZWIxR1B1QnZFaUs0dUJ0ODUyRTREZUtFIl19fQ.pBDorCaD3rtuqYw6JJLCvxtNd1EAmnhLS2tUwBkJJYin5LdYLcDxbX8euAAcfVMUGio0-FOC2JDFlKSwn5ZQ9g"
286+
static let CNF_JWT = "eyJ4NWMiOlsiTUlJRExUQ0NBcktnQXdJQkFnSVVMOHM1VHM2MzVrNk9oclJGTWxzU1JBU1lvNll3Q2dZSUtvWkl6ajBFQXdJd1hERWVNQndHQTFVRUF3d1ZVRWxFSUVsemMzVmxjaUJEUVNBdElGVlVJREF4TVMwd0t3WURWUVFLRENSRlZVUkpJRmRoYkd4bGRDQlNaV1psY21WdVkyVWdTVzF3YkdWdFpXNTBZWFJwYjI0eEN6QUpCZ05WQkFZVEFsVlVNQjRYRFRJME1URXlPVEV4TWpnek5Wb1hEVEkyTVRFeU9URXhNamd6TkZvd2FURWRNQnNHQTFVRUF3d1VSVlZFU1NCU1pXMXZkR1VnVm1WeWFXWnBaWEl4RERBS0JnTlZCQVVUQXpBd01URXRNQ3NHQTFVRUNnd2tSVlZFU1NCWFlXeHNaWFFnVW1WbVpYSmxibU5sSUVsdGNHeGxiV1Z1ZEdGMGFXOXVNUXN3Q1FZRFZRUUdFd0pWVkRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkFXYTlVYXI3b1AxWmJHRmJzRkE0ZzMxUHpOR1pjd2gydlI3UENrazBZaUFMNGNocnNsZzljajFrQnlueVppN25acllnUE9KN3gwYXRSRmRreGZYanRDamdnRkRNSUlCUHpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkxOc3VKRVhITmVrR21ZeGgwTGhpOEJBekpVYk1DY0dBMVVkRVFRZ01CNkNIR1JsZGk1cGMzTjFaWEl0WW1GamEyVnVaQzVsZFdScGR5NWtaWFl3RWdZRFZSMGxCQXN3Q1FZSEtJR01YUVVCQmpCREJnTlZIUjhFUERBNk1EaWdOcUEwaGpKb2RIUndjem92TDNCeVpYQnliMlF1Y0d0cExtVjFaR2wzTG1SbGRpOWpjbXd2Y0dsa1gwTkJYMVZVWHpBeExtTnliREFkQmdOVkhRNEVGZ1FVOGVIQS9NWHZreUNGNFExaW91WFAwc3BpTVVnd0RnWURWUjBQQVFIL0JBUURBZ2VBTUYwR0ExVWRFZ1JXTUZTR1VtaDBkSEJ6T2k4dloybDBhSFZpTG1OdmJTOWxkUzFrYVdkcGRHRnNMV2xrWlc1MGFYUjVMWGRoYkd4bGRDOWhjbU5vYVhSbFkzUjFjbVV0WVc1a0xYSmxabVZ5Wlc1alpTMW1jbUZ0WlhkdmNtc3dDZ1lJS29aSXpqMEVBd0lEYVFBd1pnSXhBSmpLU0EzQTdrWU9CWXdKQ09PY3JjYVJDRGVWVGZjdllZQ1I4QWp5blVpMjVJL3Rrc0RDRkE1K21hQ0xmbWtVS1FJeEFPVmpHc2dsdVF3VE41MG85N1dtaWxIYmxXNE44K3FBcm1zQkM4alRJdXRuS2ZjNHlaM3U1UTF1WllJbGJ0S1NyZz09Il0sImtpZCI6IjI3Mjg1NDYwOTcyMTEyMDczMjkzODg2ODI5ODc5OTI0NTAzNDE3NDEwMjkzODUzNCIsInR5cCI6InZjK3NkLWp3dCIsImFsZyI6IkVTMjU2In0.eyJwbGFjZV9vZl9iaXJ0aCI6eyJfc2QiOlsiYldoMGNTdjdDbk9TZjlHczg1TDhPYkN0Y0hRUzRHVXEyYTBqSVdOUTl6byIsImtUbXhLMmFFU2YtbFNLOGpabjR3cDRtMUNsb0pVMmwyUm1ZWFlFR2tscm8iXX0sIl9zZCI6WyItSHZVbDhCQ2RxVHJjLTdyOU82dWdSMUdSSlR5cXdEeDVoVWxTX0M5X2pRIiwiMEgwWllkMm8xUzE4LWNyNnEzTFN6c01VNXpnbEt0RWxMWWNpZDRuTTBNRSIsIjF4YnQyal8zRm5XYmppNnNRbE1XaVV5Z1g0NWluZ2YzRmYzQV80NVdTQW8iLCJBaDZWemg5dExERTZKYkg0TENSdnJ4RV9BVFBMbWtRUlpJS0FtTVRSYktFIiwiRVU5REkzdXlLS3YtX3hRV3drUVVRWUdESVlkX2lGaVJMQ1JfY3lQcFhPOCIsIkY1TkEyT0J6SHFrR1c3RkhGYnZ1dUk5SWVfaVVlcFhMNU9OTWp5TkJpWUEiLCJHZmJrZlRvNDRjQy13aXg0UDFZVGdGX3VZUTMtQmduMkFadWJ1eDhvLXFRIiwiSkhINUFSd3RTZE44d3pncDh5M3NRQmg3SFNYQ2RuckZUa0xWbEhVVlV6USIsIkxwMHR2S1JPRGFhaVoyZjBPMy1SLUk5TjAwNnJ5MGozeExqdDN0MnhLX1EiLCJPTm12VVExYW5TNWtsY2M0QnFMU29oMXFYM0hrOUxESlltMFdCd3hVRDk0IiwiVlIzQXhGQjJqSVRMZUNFQmtvN2JyR3VfdkZPOFM1UHU3cnRBY0REbktPcyIsImNaemtWZ3lZMHJuYWp2X2xhSXM2UmZyaVJkUFozN25KWTJsdkdBa2dsQXciLCJsVmk2OGJNWnBVTF9xV0EweUNESGF1ZlA1dWlEUmpsZno2eXRNdUpBQk1BIiwic3JtSE9xWTE4ZFo1RnBNc3hQdUwxcGUwNEI1ZzcwMjRRUXlSQUZ4cjNWZyJdLCJhZGRyZXNzIjp7Il9zZCI6WyI2OWdNSVIxN1lqMk04YXEyTS1pOUdQLVVlVUpCQ2prLTNTQ2tqN19hSU00IiwiSG9rWEhrVWhuQWNLbFhyODJTb2YtZGdzMXVJemRDYVJQM2ltclJ2STZSTSIsIlRTMEZHR2dtZFE4ZGxOYXVFdEpQQ1MxSllCU3NjYjdVVmY4VXEwNlUwRnciLCJZWnBhaTlldGpNcTNMeHZiOHVBOGIyZUs3WnZYSUU3TWY2RTJoLTRKTUtvIiwiakRVYXVPYjh4NFVMV28xYnFjckw4VEN2bDR6YW9jMFJMVF85TnIyeVdIZyIsIm1mdWZpR2dWTmxXTEhSTFlnY0xIV3Z1VlQ3X2hjem1CMWFmemZ2WUlKNUUiXX0sInZjdCI6InVybjpldS5ldXJvcGEuZWMuZXVkaTpwaWQ6MSIsIl9zZF9hbGciOiJzaGEzLTI1NiIsImlzcyI6Imh0dHBzOi8vZGV2Lmlzc3Vlci1iYWNrZW5kLmV1ZGl3LmRldiIsImNuZiI6eyJqd2siOnsia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJjcnYiOiJQLTI1NiIsImtpZCI6IjAxMTU5MkZBLUY1MDEtNEM4OS04RTg3LTQ1NjJGMzNCNkZCRSIsIngiOiJ4OC1STzlNRFRZdG10U2RWV3dZcHc1SUZBYUhPaGRqLVhjeFhYV2RmWnhrIiwieSI6InVVSXB2TGJJWmFKQUFEVnp5U2VJQUxwcExLTzBhdDVfVFVLRTZiWGRUa3MiLCJhbGciOiJFUzI1NiJ9fSwiZXhwIjoxNzM3MDMzNzI4LCJqdGkiOiJpZCIsImF1ZCI6ImF1ZCIsImFnZV9lcXVhbF9vcl9vdmVyIjp7Il9zZCI6WyJxOGhfeE9vaUFxaFczOGhHeDV1ZWIxR1B1QnZFaUs0dUJ0ODUyRTREZUtFIl19fQ.pBDorCaD3rtuqYw6JJLCvxtNd1EAmnhLS2tUwBkJJYin5LdYLcDxbX8euAAcfVMUGio0-FOC2JDFlKSwn5ZQ9g"
278287
}
279288

280289
class TestSinger: AsyncSignerProtocol {

Tests/Helpers/SelfSignedClientAttestation.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ internal func selfSignedClient(
4141
"clientId": clientId,
4242
"cnf": [
4343
"jwk": ECPublicKey(
44-
publicKey: try! KeyController.generateECDHPublicKey(from: privateKey)
45-
)
44+
publicKey: try! KeyController.generateECDHPublicKey(
45+
from: privateKey
46+
)
47+
).toDictionary()
4648
]
4749
].toThrowingJSONData())
4850

Tests/Helpers/Wallet.swift

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ struct Wallet {
5050
extension Wallet {
5151
func issueByCredentialIdentifier(
5252
_ identifier: String,
53-
claimSet: ClaimSet? = nil
53+
claimSet: ClaimSet? = nil,
54+
config: OpenId4VCIConfig
5455
) async throws -> Credential {
5556
let credentialConfigurationIdentifier = try CredentialConfigurationIdentifier(value: identifier)
5657
let credentialIssuerIdentifier = try CredentialIssuerId(CREDENTIAL_ISSUER_PUBLIC_URL)
@@ -85,7 +86,8 @@ extension Wallet {
8586
return try await issueOfferedCredentialNoProof(
8687
offer: offer,
8788
credentialConfigurationIdentifier: credentialConfigurationIdentifier,
88-
claimSet: claimSet
89+
claimSet: claimSet,
90+
config: config
8991
)
9092

9193
} else {
@@ -98,7 +100,8 @@ extension Wallet {
98100

99101
private func issueMultipleOfferedCredentialWithProof(
100102
offer: CredentialOffer,
101-
claimSet: ClaimSet? = nil
103+
claimSet: ClaimSet? = nil,
104+
config: OpenId4VCIConfig
102105
) async throws -> [(String, Credential)] {
103106

104107
let issuerMetadata = offer.credentialIssuerMetadata
@@ -160,7 +163,8 @@ extension Wallet {
160163
private func issueOfferedCredentialNoProof(
161164
offer: CredentialOffer,
162165
credentialConfigurationIdentifier: CredentialConfigurationIdentifier,
163-
claimSet: ClaimSet? = nil
166+
claimSet: ClaimSet? = nil,
167+
config: OpenId4VCIConfig
164168
) async throws -> Credential {
165169

166170
let issuer = try Issuer(
@@ -203,7 +207,8 @@ extension Wallet {
203207

204208
func issueByCredentialOfferUrlMultipleFormats(
205209
offerUri: String,
206-
claimSet: ClaimSet? = nil
210+
claimSet: ClaimSet? = nil,
211+
config: OpenId4VCIConfig
207212
) async throws -> [(String, Credential)] {
208213
let resolver = CredentialOfferRequestResolver(
209214
fetcher: Fetcher(session: self.session),
@@ -226,7 +231,8 @@ extension Wallet {
226231
case .success(let offer):
227232
return try await issueMultipleOfferedCredentialWithProof(
228233
offer: offer,
229-
claimSet: claimSet
234+
claimSet: claimSet,
235+
config: config
230236
)
231237
case .failure(let error):
232238
throw ValidationError.error(reason: "Unable to resolve credential offer: \(error.localizedDescription)")
@@ -236,7 +242,8 @@ extension Wallet {
236242
func issueByCredentialOfferUrl(
237243
offerUri: String,
238244
scope: String,
239-
claimSet: ClaimSet? = nil
245+
claimSet: ClaimSet? = nil,
246+
config: OpenId4VCIConfig
240247
) async throws -> Credential {
241248
let result = await CredentialOfferRequestResolver(
242249
fetcher: Fetcher(session: self.session),
@@ -258,7 +265,8 @@ extension Wallet {
258265
return try await issueOfferedCredentialWithProof(
259266
offer: offer,
260267
scope: scope,
261-
claimSet: claimSet
268+
claimSet: claimSet,
269+
config: config
262270
)
263271
case .failure(let error):
264272
throw ValidationError.error(reason: "Unable to resolve credential offer: \(error.localizedDescription)")
@@ -268,7 +276,8 @@ extension Wallet {
268276
func issueByCredentialOfferUrl_DPoP(
269277
offerUri: String,
270278
scope: String,
271-
claimSet: ClaimSet? = nil
279+
claimSet: ClaimSet? = nil,
280+
config: OpenId4VCIConfig
272281
) async throws -> Credential {
273282
let result = await CredentialOfferRequestResolver(
274283
fetcher: Fetcher(session: self.session),
@@ -290,7 +299,8 @@ extension Wallet {
290299
return try await issueOfferedCredentialWithProof_DPoP(
291300
offer: offer,
292301
scope: scope,
293-
claimSet: claimSet
302+
claimSet: claimSet,
303+
config: config
294304
)
295305
case .failure(let error):
296306
throw ValidationError.error(reason: "Unable to resolve credential offer: \(error.localizedDescription)")
@@ -300,7 +310,8 @@ extension Wallet {
300310
private func issueOfferedCredentialWithProof(
301311
offer: CredentialOffer,
302312
scope: String,
303-
claimSet: ClaimSet? = nil
313+
claimSet: ClaimSet? = nil,
314+
config: OpenId4VCIConfig
304315
) async throws -> Credential {
305316

306317
let issuerMetadata = offer.credentialIssuerMetadata
@@ -345,7 +356,8 @@ extension Wallet {
345356
private func issueOfferedCredentialWithProof_DPoP(
346357
offer: CredentialOffer,
347358
scope: String,
348-
claimSet: ClaimSet? = nil
359+
claimSet: ClaimSet? = nil,
360+
config: OpenId4VCIConfig
349361
) async throws -> Credential {
350362

351363
let issuerMetadata = offer.credentialIssuerMetadata

Tests/Wallet/VCIFlowNoOffer.swift

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,67 @@ class VCIFlowNoOffer: XCTestCase {
268268

269269
XCTAssert(true)
270270
}
271+
272+
func testNoOfferSdJWTClientAuthentication() async throws {
273+
274+
let privateKey = try KeyController.generateECDHPrivateKey()
275+
let publicKey = try KeyController.generateECDHPublicKey(from: privateKey)
276+
277+
let alg = JWSAlgorithm(.ES256)
278+
let publicKeyJWK = try ECPublicKey(
279+
publicKey: publicKey,
280+
additionalParameters: [
281+
"alg": alg.name,
282+
"use": "sig",
283+
"kid": UUID().uuidString
284+
])
285+
286+
let bindingKey: BindingKey = .jwk(
287+
algorithm: alg,
288+
jwk: publicKeyJWK,
289+
privateKey: .secKey(privateKey)
290+
)
291+
292+
let user = ActingUser(
293+
username: "tneal",
294+
password: "password"
295+
)
296+
297+
let wallet = Wallet(
298+
actingUser: user,
299+
bindingKeys: [bindingKey],
300+
dPoPConstructor: nil
301+
)
302+
303+
do {
304+
try await walletInitiatedIssuanceNoOfferSdJwtClientAuthentication(
305+
wallet: wallet
306+
)
307+
308+
} catch {
309+
310+
XCTExpectFailure()
311+
XCTAssert(false, error.localizedDescription)
312+
}
313+
314+
XCTAssert(true)
315+
}
316+
}
317+
318+
private func walletInitiatedIssuanceNoOfferSdJwtClientAuthentication(
319+
wallet: Wallet,
320+
claimSet: ClaimSet? = nil
321+
) async throws {
322+
323+
print("[[Scenario: No offer passed, wallet initiates issuance by credetial scopes and client authentication]]")
324+
325+
let credential = try await wallet.issueByCredentialIdentifier(
326+
PID_SdJwtVC_config_id,
327+
claimSet: claimSet,
328+
config: attestationConfig
329+
)
330+
331+
print("--> [ISSUANCE] Issued PID in format \(PID_SdJwtVC_config_id): \(credential)")
271332
}
272333

273334
private func walletInitiatedIssuanceNoOfferSdJwt(
@@ -279,7 +340,8 @@ private func walletInitiatedIssuanceNoOfferSdJwt(
279340

280341
let credential = try await wallet.issueByCredentialIdentifier(
281342
PID_SdJwtVC_config_id,
282-
claimSet: claimSet
343+
claimSet: claimSet,
344+
config: clientConfig
283345
)
284346

285347
print("--> [ISSUANCE] Issued PID in format \(PID_SdJwtVC_config_id): \(credential)")
@@ -294,7 +356,8 @@ private func walletInitiatedIssuanceNoOfferMdoc(
294356

295357
let credential = try await wallet.issueByCredentialIdentifier(
296358
PID_MsoMdoc_config_id,
297-
claimSet: claimSet
359+
claimSet: claimSet,
360+
config: clientConfig
298361
)
299362

300363
print("--> [ISSUANCE] Issued PID in format \(PID_MsoMdoc_config_id): \(credential)")
@@ -306,7 +369,8 @@ private func walletInitiatedIssuanceNoOfferMDL(wallet: Wallet, claimSet: ClaimSe
306369

307370
let credential = try await wallet.issueByCredentialIdentifier(
308371
MDL_config_id,
309-
claimSet: claimSet
372+
claimSet: claimSet,
373+
config: clientConfig
310374
)
311375

312376
print("--> [ISSUANCE] Issued PID in format \(MDL_config_id): \(credential)")

Tests/Wallet/VCIFlowWithOffer.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,8 @@ private func walletInitiatedIssuanceWithOfferSdJWT(
460460
let credential = try await wallet.issueByCredentialOfferUrl(
461461
offerUri: url,
462462
scope: PID_SdJwtVC_config_id,
463-
claimSet: claimSet
463+
claimSet: claimSet,
464+
config: clientConfig
464465
)
465466

466467
print("--> [ISSUANCE] Issued credential: \(credential)")
@@ -477,7 +478,8 @@ private func walletInitiatedIssuanceWithOfferMDL(
477478
let credential = try await wallet.issueByCredentialOfferUrl(
478479
offerUri: url,
479480
scope: MDL_config_id,
480-
claimSet: claimSet
481+
claimSet: claimSet,
482+
config: clientConfig
481483
)
482484

483485
print("--> [ISSUANCE] Issued credential : \(credential)")
@@ -494,7 +496,8 @@ private func walletInitiatedIssuanceWithOfferMDL_DPoP(
494496
let credential = try await wallet.issueByCredentialOfferUrl_DPoP(
495497
offerUri: url,
496498
scope: MDL_config_id,
497-
claimSet: claimSet
499+
claimSet: claimSet,
500+
config: clientConfig
498501
)
499502

500503
print("--> [ISSUANCE] Issued credential : \(credential)")
@@ -511,7 +514,8 @@ private func walletInitiatedIssuanceWithOfferSDJWT_DPoP(
511514
let credential = try await wallet.issueByCredentialOfferUrl_DPoP(
512515
offerUri: url,
513516
scope: PID_SdJwtVC_config_id,
514-
claimSet: claimSet
517+
claimSet: claimSet,
518+
config: clientConfig
515519
)
516520

517521
print("--> [ISSUANCE] Issued credential : \(credential)")
@@ -528,7 +532,8 @@ private func walletInitiatedIssuanceWithOfferMdoc(
528532
let credential = try await wallet.issueByCredentialOfferUrl(
529533
offerUri: url,
530534
scope: PID_MsoMdoc_config_id,
531-
claimSet: claimSet
535+
claimSet: claimSet,
536+
config: clientConfig
532537
)
533538

534539
print("--> [ISSUANCE] Issued credential : \(credential)")
@@ -544,7 +549,8 @@ private func walletInitiatedIssuanceWithOfferArray(
544549
let url = "\(CREDENTIAL_ISSUER_PUBLIC_URL)/credentialoffer?credential_offer=\(All_Supported_CredentialOffer)"
545550
let credentials = try await wallet.issueByCredentialOfferUrlMultipleFormats(
546551
offerUri: url,
547-
claimSet: claimSet
552+
claimSet: claimSet,
553+
config: clientConfig
548554
)
549555

550556
print("--> [ISSUANCE] Issued credentials:")
@@ -569,7 +575,8 @@ private func walletInitiatedIssuanceWithOfferUrl(
569575

570576
let credentials = try await wallet.issueByCredentialOfferUrlMultipleFormats(
571577
offerUri: url,
572-
claimSet: claimSet
578+
claimSet: claimSet,
579+
config: clientConfig
573580
)
574581

575582
print("--> [ISSUANCE] Issued credentials:")

0 commit comments

Comments
 (0)