Skip to content

Commit 52858a5

Browse files
committed
refactor!: update for encryption module container
To make sure its easy to select and diffuse a encryption module, so it works on swift 6 we now have a container
1 parent b00bda5 commit 52858a5

File tree

6 files changed

+108
-82
lines changed

6 files changed

+108
-82
lines changed

Sources/JSONWebEncryption/EncryptionModule/Encryptors/JWEEncrypter.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ public protocol JWEMultiEncryptor: Sendable {
9191
additionalAuthenticationData: Data?,
9292
password: Data?,
9393
saltLength: Int?,
94-
iterationCount: Int?,
95-
encryptionModule: JWEEncryptionModule
94+
iterationCount: Int?
9695
) throws -> [JWEParts<P, R>]
9796
}
9897

@@ -185,8 +184,7 @@ extension JWEMultiEncryptor {
185184
additionalAuthenticationData: Data? = nil,
186185
password: Data? = nil,
187186
saltLength: Int? = nil,
188-
iterationCount: Int? = nil,
189-
encryptionModule: JWEEncryptionModule = .default
187+
iterationCount: Int? = nil
190188
) throws -> [JWEParts<P, DefaultJWEHeaderImpl>] {
191189
try self.encrypt(
192190
payload: payload,
@@ -201,8 +199,7 @@ extension JWEMultiEncryptor {
201199
additionalAuthenticationData: additionalAuthenticationData,
202200
password: password,
203201
saltLength: saltLength,
204-
iterationCount: iterationCount,
205-
encryptionModule: encryptionModule
202+
iterationCount: iterationCount
206203
)
207204
}
208205
}

Sources/JSONWebEncryption/EncryptionModule/Encryptors/MultiEncryptor.swift

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ struct MultiEncryptor: JWEMultiEncryptor {
3434
additionalAuthenticationData: Data?,
3535
password: Data?,
3636
saltLength: Int?,
37-
iterationCount: Int?,
38-
encryptionModule: JWEEncryptionModule = .default
37+
iterationCount: Int?
3938
) throws -> [JWEParts<P, R>] {
4039
guard !recipients.isEmpty else {
4140
throw JWE.JWEError.noRecipients
@@ -60,48 +59,56 @@ struct MultiEncryptor: JWEMultiEncryptor {
6059
throw JWE.JWEError.missingKeyAlgorithm
6160
}
6261

63-
let firstEncryption = try encryptionModule.encryptor(alg: alg).encrypt(
64-
payload: payload,
65-
senderKey: senderKey,
66-
recipientKey: firstRecipient.key,
67-
protectedHeader: protectedHeader,
68-
unprotectedHeader: unprotectedHeader,
69-
recipientHeader: firstRecipient.header ?? R.init(from: firstRecipient.key),
70-
cek: cek,
71-
initializationVector: initializationVector,
72-
additionalAuthenticationData: additionalAuthenticationData,
73-
password: password,
74-
saltLength: saltLength,
75-
iterationCount: iterationCount,
76-
ephemeralKey: nil,
77-
hasMultiRecipients: true
78-
)
79-
80-
return try [firstEncryption] + recipients.map { recipientHeader, key in
81-
guard let alg = getKeyAlgorithm(
82-
protectedHeader: firstEncryption.protectedHeader,
83-
unprotectedHeader: unprotectedHeader,
84-
recipientHeader: recipientHeader
85-
) else {
86-
throw JWE.JWEError.missingKeyAlgorithm
87-
}
88-
89-
return try encryptionModule.encryptor(alg: alg).encrypt(
62+
let firstEncryption = try JWE
63+
.encryptionModuleContainer
64+
.encryptionModule
65+
.encryptor(alg: alg)
66+
.encrypt(
9067
payload: payload,
9168
senderKey: senderKey,
92-
recipientKey: key,
93-
protectedHeader: firstEncryption.protectedHeader,
69+
recipientKey: firstRecipient.key,
70+
protectedHeader: protectedHeader,
9471
unprotectedHeader: unprotectedHeader,
95-
recipientHeader: recipientHeader ?? R.init(from: key),
72+
recipientHeader: firstRecipient.header ?? R.init(from: firstRecipient.key),
9673
cek: cek,
9774
initializationVector: initializationVector,
9875
additionalAuthenticationData: additionalAuthenticationData,
9976
password: password,
10077
saltLength: saltLength,
10178
iterationCount: iterationCount,
102-
ephemeralKey: firstEncryption.ephemeralKey,
79+
ephemeralKey: nil,
10380
hasMultiRecipients: true
10481
)
82+
83+
return try [firstEncryption] + recipients.map { recipientHeader, key in
84+
guard let alg = getKeyAlgorithm(
85+
protectedHeader: firstEncryption.protectedHeader,
86+
unprotectedHeader: unprotectedHeader,
87+
recipientHeader: recipientHeader
88+
) else {
89+
throw JWE.JWEError.missingKeyAlgorithm
90+
}
91+
92+
return try JWE
93+
.encryptionModuleContainer
94+
.encryptionModule
95+
.encryptor(alg: alg)
96+
.encrypt(
97+
payload: payload,
98+
senderKey: senderKey,
99+
recipientKey: key,
100+
protectedHeader: firstEncryption.protectedHeader,
101+
unprotectedHeader: unprotectedHeader,
102+
recipientHeader: recipientHeader ?? R.init(from: key),
103+
cek: cek,
104+
initializationVector: initializationVector,
105+
additionalAuthenticationData: additionalAuthenticationData,
106+
password: password,
107+
saltLength: saltLength,
108+
iterationCount: iterationCount,
109+
ephemeralKey: firstEncryption.ephemeralKey,
110+
hasMultiRecipients: true
111+
)
105112
}
106113
}
107114
}
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
import Foundation
22

3+
public final class JWEEncryptionModuleContainer: @unchecked Sendable {
4+
var encryptionModule: JWEEncryptionModule
5+
6+
public init(encryptionModule: JWEEncryptionModule) {
7+
self.encryptionModule = encryptionModule
8+
}
9+
10+
public func setEncryptionModule(_ encryptionModule: JWEEncryptionModule) {
11+
self.encryptionModule = encryptionModule
12+
}
13+
}
14+
315
extension JWE {
4-
public static let encryptionModule: JWEEncryptionModule = .default
16+
public static let encryptionModuleContainer: JWEEncryptionModuleContainer = .init(encryptionModule: .default)
517
}

Sources/JSONWebEncryption/JWE+Decrypt.swift

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,21 @@ extension JWE {
7171
throw JWEError.missingKeyAlgorithm
7272
}
7373

74-
return try JWE.encryptionModule.decryptor(alg: alg).decrypt(
75-
encodedProtectedHeader: protectedHeaderData,
76-
encodedUnprotectedHeaderData: unprotectedHeaderData,
77-
cipher: cipher,
78-
encryptedKey: encryptedKey,
79-
initializationVector: initializationVector,
80-
authenticationTag: authenticationTag,
81-
additionalAuthenticationData: additionalAuthenticatedData,
82-
senderKey: senderKey.map { try prepareJWK(key: $0) },
83-
recipientKey: recipientKey.map { try prepareJWK(key: $0) },
84-
password: password
85-
)
74+
return try JWE
75+
.encryptionModuleContainer
76+
.encryptionModule
77+
.decryptor(alg: alg).decrypt(
78+
encodedProtectedHeader: protectedHeaderData,
79+
encodedUnprotectedHeaderData: unprotectedHeaderData,
80+
cipher: cipher,
81+
encryptedKey: encryptedKey,
82+
initializationVector: initializationVector,
83+
authenticationTag: authenticationTag,
84+
additionalAuthenticationData: additionalAuthenticatedData,
85+
senderKey: senderKey.map { try prepareJWK(key: $0) },
86+
recipientKey: recipientKey.map { try prepareJWK(key: $0) },
87+
password: password
88+
)
8689
}
8790

8891
/// Static method to decrypt a JWE from a compact serialization string.
@@ -179,7 +182,7 @@ extension JWE {
179182
aad: jweJson.addtionalAuthenticatedData
180183
)
181184

182-
return try encryptionModule.multiDecryptor.decrypt(
185+
return try encryptionModuleContainer.encryptionModule.multiDecryptor.decrypt(
183186
encodedProtectedHeader: jweJson.protectedData,
184187
encodedUnprotectedHeaderData: jweJson.sharedProtectedData,
185188
cipher: jweJson.cipherText,

Sources/JSONWebEncryption/JWE+Encrypt.swift

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,22 @@ extension JWE {
6262
compressionAlgorithm: compressionAlgorithm
6363
)
6464

65-
let parts = try JWE.encryptionModule.encryptor(alg: keyManagementAlg).encrypt(
66-
payload: payload,
67-
senderKey: senderKey.map { try prepareJWK(key: $0) },
68-
recipientKey: recipientKey.map { try prepareJWK(key: $0) },
69-
protectedHeader: protectedHeader,
70-
cek: cek,
71-
initializationVector: initializationVector,
72-
additionalAuthenticationData: additionalAuthenticationData,
73-
password: password,
74-
saltLength: saltLength,
75-
iterationCount: iterationCount
76-
)
65+
let parts = try JWE
66+
.encryptionModuleContainer
67+
.encryptionModule
68+
.encryptor(alg: keyManagementAlg)
69+
.encrypt(
70+
payload: payload,
71+
senderKey: senderKey.map { try prepareJWK(key: $0) },
72+
recipientKey: recipientKey.map { try prepareJWK(key: $0) },
73+
protectedHeader: protectedHeader,
74+
cek: cek,
75+
initializationVector: initializationVector,
76+
additionalAuthenticationData: additionalAuthenticationData,
77+
password: password,
78+
saltLength: saltLength,
79+
iterationCount: iterationCount
80+
)
7781
let finalProtectedHeader = parts.protectedHeader ?? protectedHeader
7882
self.protectedHeader = finalProtectedHeader
7983
self.protectedHeaderData = try JSONEncoder.jose.encode(finalProtectedHeader)
@@ -130,19 +134,23 @@ extension JWE {
130134
throw JWE.JWEError.missingKeyAlgorithm
131135
}
132136

133-
let parts = try JWE.encryptionModule.encryptor(alg: alg).encrypt(
134-
payload: payload,
135-
senderKey: senderKey.map { try prepareJWK(key: $0) },
136-
recipientKey: recipientKey.map { try prepareJWK(key: $0) },
137-
protectedHeader: protectedHeader,
138-
unprotectedHeader: unprotectedHeader,
139-
cek: cek,
140-
initializationVector: initializationVector,
141-
additionalAuthenticationData: additionalAuthenticationData,
142-
password: password,
143-
saltLength: saltLength,
144-
iterationCount: iterationCount
145-
)
137+
let parts = try JWE
138+
.encryptionModuleContainer
139+
.encryptionModule
140+
.encryptor(alg: alg)
141+
.encrypt(
142+
payload: payload,
143+
senderKey: senderKey.map { try prepareJWK(key: $0) },
144+
recipientKey: recipientKey.map { try prepareJWK(key: $0) },
145+
protectedHeader: protectedHeader,
146+
unprotectedHeader: unprotectedHeader,
147+
cek: cek,
148+
initializationVector: initializationVector,
149+
additionalAuthenticationData: additionalAuthenticationData,
150+
password: password,
151+
saltLength: saltLength,
152+
iterationCount: iterationCount
153+
)
146154

147155
let finalProtectedHeader = parts.protectedHeader.map { P.init(from: $0) }
148156
?? protectedHeader
@@ -255,7 +263,7 @@ extension JWE {
255263
saltLength: Int? = nil,
256264
iterationCount: Int? = nil
257265
) throws -> JWEJson<P, U, R> {
258-
let recipientParts = try encryptionModule.multiEncryptor.encrypt(
266+
let recipientParts = try encryptionModuleContainer.encryptionModule.multiEncryptor.encrypt(
259267
payload: payload,
260268
senderKey: senderKey.map { try prepareJWK(key: $0) },
261269
recipients: try recipients.map { ($0.header, try prepareJWK(key: $0.key)) },
@@ -266,8 +274,7 @@ extension JWE {
266274
additionalAuthenticationData: additionalAuthenticationData,
267275
password: password,
268276
saltLength: saltLength,
269-
iterationCount: iterationCount,
270-
encryptionModule: encryptionModule
277+
iterationCount: iterationCount
271278
)
272279

273280
guard let firstRecipient = recipientParts.first else {

Sources/JSONWebToken/Validators/X5CValidator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public struct X5CValidator<Policy: VerifierPolicy>: ClaimValidator, Sendable {
190190
private func verifyChain(
191191
trustedStore: CertificateStore,
192192
certificates: [Certificate],
193-
policy: () throws -> some VerifierPolicy
193+
policy: @escaping @Sendable () throws -> some VerifierPolicy
194194
) async throws -> VerificationResult {
195195
let untrustedChain = CertificateStore(certificates)
196196
var verifier = try Verifier(rootCertificates: trustedStore, policy: policy)

0 commit comments

Comments
 (0)