@@ -12,11 +12,11 @@ public class SDJWTService {
12
12
private init ( ) { }
13
13
14
14
/**
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
+ */
20
20
public func calculateSHA256Hash( inputString: String ? ) -> String ? {
21
21
guard let inputString = inputString,
22
22
let inputData = inputString. data ( using: . utf8) else {
@@ -50,28 +50,28 @@ public class SDJWTService {
50
50
presentationDefinition: VerificationService . processPresentationDefinition ( presentationRequest. presentationDefinition)
51
51
)
52
52
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())"
75
75
76
76
return processedCredentialWithRequiredDisclosures
77
77
} catch {
@@ -134,6 +134,55 @@ public class SDJWTService {
134
134
guard let jsonData = try ? JSONSerialization . data ( withJSONObject: object) else { return nil }
135
135
return String ( data: jsonData, encoding: . utf8)
136
136
}
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
+ }
137
186
138
187
private func addDisclosuresToCredential( jsonElement: [ String : Any ] , disclosures: [ String ] , hashList: [ String ] ) -> [ String : Any ] {
139
188
var modifiedJsonElement = jsonElement
0 commit comments