Skip to content

Commit 58eb864

Browse files
committed
Fix: Updated filter logic for sdjwt credentials
1 parent 889c97d commit 58eb864

File tree

2 files changed

+77
-28
lines changed

2 files changed

+77
-28
lines changed

Sources/eudiWalletOidcIos/Service/SDJWTService.swift

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ public class SDJWTService {
1212
private init() {}
1313

1414
/**
15-
* Calculates the SHA-256 hash of the input string and returns it in base64url encoding.
16-
*
17-
* @param inputString The input string to be hashed.
18-
* @return The SHA-256 hash of the input string in base64url encoding, or null if the input is null.
19-
*/
15+
* Calculates the SHA-256 hash of the input string and returns it in base64url encoding.
16+
*
17+
* @param inputString The input string to be hashed.
18+
* @return The SHA-256 hash of the input string in base64url encoding, or null if the input is null.
19+
*/
2020
public func calculateSHA256Hash(inputString: String?) -> String? {
2121
guard let inputString = inputString,
2222
let inputData = inputString.data(using: .utf8) else {
@@ -50,28 +50,28 @@ public class SDJWTService {
5050
presentationDefinition: VerificationService.processPresentationDefinition(presentationRequest.presentationDefinition)
5151
)
5252

53-
// let iat = Date()
54-
// let payload =
55-
// ([
56-
// "audience": "\(presentationRequest.clientId ?? "")",
57-
// "issueTime": "\(iat)",
58-
// "nonce": "\(UUID().uuidString)",
59-
// "exp": SDJWTService().calculateSHA256Hash(inputString: processedCredentialWithRequiredDisclosures) ?? ""
60-
// ] as [String : Any]).toString() ?? ""
61-
//
62-
// let header =
63-
// ([
64-
// "algorithm": "ES256",
65-
// "type": "kb_jwt"
66-
// ]).toString() ?? ""
67-
//
68-
// // Create JWT token
69-
// let headerData = Data(header.utf8)
70-
// let payloadData = Data(payload.utf8)
71-
// let unsignedToken = "\(headerData.base64URLEncodedString()).\(payloadData.base64URLEncodedString())"
72-
// let signatureData = try! privateKey.signature(for: unsignedToken.data(using: .utf8)!)
73-
// let signature = signatureData.rawRepresentation
74-
// let idToken = "\(unsignedToken).\(signature.base64URLEncodedString())"
53+
// let iat = Date()
54+
// let payload =
55+
// ([
56+
// "audience": "\(presentationRequest.clientId ?? "")",
57+
// "issueTime": "\(iat)",
58+
// "nonce": "\(UUID().uuidString)",
59+
// "exp": SDJWTService().calculateSHA256Hash(inputString: processedCredentialWithRequiredDisclosures) ?? ""
60+
// ] as [String : Any]).toString() ?? ""
61+
//
62+
// let header =
63+
// ([
64+
// "algorithm": "ES256",
65+
// "type": "kb_jwt"
66+
// ]).toString() ?? ""
67+
//
68+
// // Create JWT token
69+
// let headerData = Data(header.utf8)
70+
// let payloadData = Data(payload.utf8)
71+
// let unsignedToken = "\(headerData.base64URLEncodedString()).\(payloadData.base64URLEncodedString())"
72+
// let signatureData = try! privateKey.signature(for: unsignedToken.data(using: .utf8)!)
73+
// let signature = signatureData.rawRepresentation
74+
// let idToken = "\(unsignedToken).\(signature.base64URLEncodedString())"
7575

7676
return processedCredentialWithRequiredDisclosures
7777
} catch {
@@ -134,6 +134,55 @@ public class SDJWTService {
134134
guard let jsonData = try? JSONSerialization.data(withJSONObject: object) else { return nil }
135135
return String(data: jsonData, encoding: .utf8)
136136
}
137+
public func updateIssuerJwtWithDisclosuresForFiltering(credential: String?) -> String? {
138+
guard let split = credential?.split(separator: "."), split.count > 1,
139+
let jsonString = "\(split[1])".decodeBase64(),
140+
let jsonObject = UIApplicationUtils.shared.convertStringToDictionary(text: jsonString) else { return nil }
141+
142+
var object = jsonObject
143+
144+
var hashList: [String] = []
145+
let disclosures = getDisclosuresFromSDJWT(credential) ?? []
146+
disclosures.forEach { encodedString in
147+
guard let hash = calculateSHA256Hash(inputString: encodedString) else { return }
148+
hashList.append(hash)
149+
}
150+
151+
object = addDisclosuresToCredentialForFiltering(jsonElement: jsonObject, disclosures: disclosures, hashList: hashList)
152+
153+
guard let jsonData = try? JSONSerialization.data(withJSONObject: object) else { return nil }
154+
return String(data: jsonData, encoding: .utf8)
155+
}
156+
private func addDisclosuresToCredentialForFiltering(jsonElement: [String: Any], disclosures: [String], hashList: [String]) -> [String: Any] {
157+
var modifiedJsonElement = jsonElement
158+
159+
if modifiedJsonElement["_sd"] != nil {
160+
guard let sdList = modifiedJsonElement["_sd"] as? [String] else { return [:] }
161+
for (index, hash) in hashList.enumerated() {
162+
if isStringPresentInJSONArray(jsonArray: sdList, searchString: hash) {
163+
164+
if let disclosure = disclosures[index].decodeBase64() {
165+
let (decodedKey, decodedValue) = extractKeyValue(from: disclosure) ?? ("","" as Any)
166+
if let decodedValue = decodedValue as? [String: Any] {
167+
modifiedJsonElement[decodedKey] = disclosure
168+
} else if let decodedValue = decodedValue as? [Any] {
169+
modifiedJsonElement[decodedKey] = disclosure
170+
} else {
171+
modifiedJsonElement[decodedKey] = disclosure
172+
}
173+
}
174+
}
175+
}
176+
}
177+
178+
for (key, value) in modifiedJsonElement {
179+
if(value is [String: Any]){
180+
modifiedJsonElement[key] = addDisclosuresToCredentialForFiltering(jsonElement: value as! [String : Any], disclosures: disclosures, hashList: hashList)
181+
}
182+
}
183+
184+
return modifiedJsonElement
185+
}
137186

138187
private func addDisclosuresToCredential(jsonElement: [String: Any], disclosures: [String], hashList: [String]) -> [String: Any] {
139188
var modifiedJsonElement = jsonElement

Sources/eudiWalletOidcIos/Service/VerificationService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ public func filterNameSpaces(nameSpacesValue: CBOR, requestedParams: [String]) -
821821

822822
let jsonString: String
823823
if (cred.split(separator: "~").count) > 0 {
824-
jsonString = SDJWTService.shared.updateIssuerJwtWithDisclosures(credential: cred) ?? ""
824+
jsonString = SDJWTService.shared.updateIssuerJwtWithDisclosuresForFiltering(credential: cred) ?? ""
825825
} else if split.count > 1,
826826
let base64Data = Data(base64Encoded: String(split[1]), options: .ignoreUnknownCharacters),
827827
let decodedString = String(data: base64Data, encoding: .utf8) {

0 commit comments

Comments
 (0)