Skip to content

Commit ec727f1

Browse files
committed
feat: Support conditional CommonCrypto
1 parent 7478571 commit ec727f1

File tree

7 files changed

+111
-14
lines changed

7 files changed

+111
-14
lines changed

JSONWebToken.podspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ Pod::Spec.new do |spec|
1414
spec.requires_arc = true
1515
spec.dependency 'CryptoSwift', '~> 0.6.1'
1616
spec.module_name = 'JWT'
17+
spec.exclude_files = ['Sources/HMACCommonCrypto.swift']
1718
end

JWT.xcodeproj/project.pbxproj

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
273010FF1F33EABA00219C35 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273010FE1F33EABA00219C35 /* HMAC.swift */; };
11+
273011001F33EABA00219C35 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273010FE1F33EABA00219C35 /* HMAC.swift */; };
12+
273011011F33EABA00219C35 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273010FE1F33EABA00219C35 /* HMAC.swift */; };
13+
273011021F33EABA00219C35 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273010FE1F33EABA00219C35 /* HMAC.swift */; };
14+
2730110A1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273011091F33FC9100219C35 /* HMACCryptoSwift.swift */; };
15+
2730110B1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273011091F33FC9100219C35 /* HMACCryptoSwift.swift */; };
16+
2730110C1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273011091F33FC9100219C35 /* HMACCryptoSwift.swift */; };
17+
2730110D1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273011091F33FC9100219C35 /* HMACCryptoSwift.swift */; };
1018
2734C6A81D88001F00BFF9F1 /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66725DAB1C59202E00FC32F4 /* CryptoSwift.framework */; };
1119
2734C6A91D88002900BFF9F1 /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66725DAB1C59202E00FC32F4 /* CryptoSwift.framework */; };
1220
2734C6AA1D88003000BFF9F1 /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66725DAB1C59202E00FC32F4 /* CryptoSwift.framework */; };
@@ -79,6 +87,9 @@
7987
/* End PBXContainerItemProxy section */
8088

8189
/* Begin PBXFileReference section */
90+
273010FE1F33EABA00219C35 /* HMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMAC.swift; sourceTree = "<group>"; };
91+
273011041F33FC5F00219C35 /* HMACCommonCrypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMACCommonCrypto.swift; sourceTree = "<group>"; };
92+
273011091F33FC9100219C35 /* HMACCryptoSwift.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMACCryptoSwift.swift; sourceTree = "<group>"; };
8293
277794041DF221F800573F3E /* ClaimSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClaimSet.swift; sourceTree = "<group>"; };
8394
2777940A1DF22BE400573F3E /* JOSEHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JOSEHeader.swift; sourceTree = "<group>"; };
8495
2777940F1DF22D0D00573F3E /* Encode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Encode.swift; sourceTree = "<group>"; };
@@ -218,6 +229,9 @@
218229
520A71151C469F010005C709 /* Decode.swift */,
219230
2777940F1DF22D0D00573F3E /* Encode.swift */,
220231
520A71161C469F010005C709 /* JWT.swift */,
232+
273010FE1F33EABA00219C35 /* HMAC.swift */,
233+
273011041F33FC5F00219C35 /* HMACCommonCrypto.swift */,
234+
273011091F33FC9100219C35 /* HMACCryptoSwift.swift */,
221235
);
222236
path = Sources;
223237
sourceTree = "<group>";
@@ -481,7 +495,9 @@
481495
277794101DF22D0D00573F3E /* Encode.swift in Sources */,
482496
2777940B1DF22BE400573F3E /* JOSEHeader.swift in Sources */,
483497
277794051DF221F800573F3E /* ClaimSet.swift in Sources */,
498+
273010FF1F33EABA00219C35 /* HMAC.swift in Sources */,
484499
520A71171C469F010005C709 /* Base64.swift in Sources */,
500+
2730110A1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */,
485501
);
486502
runOnlyForDeploymentPostprocessing = 0;
487503
};
@@ -503,7 +519,9 @@
503519
277794111DF22D0D00573F3E /* Encode.swift in Sources */,
504520
2777940C1DF22BE400573F3E /* JOSEHeader.swift in Sources */,
505521
277794061DF221F800573F3E /* ClaimSet.swift in Sources */,
522+
273011001F33EABA00219C35 /* HMAC.swift in Sources */,
506523
CD9B621A1C7753D8005D4844 /* Base64.swift in Sources */,
524+
2730110B1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */,
507525
);
508526
runOnlyForDeploymentPostprocessing = 0;
509527
};
@@ -517,7 +535,9 @@
517535
277794121DF22D0D00573F3E /* Encode.swift in Sources */,
518536
2777940D1DF22BE400573F3E /* JOSEHeader.swift in Sources */,
519537
277794071DF221F800573F3E /* ClaimSet.swift in Sources */,
538+
273011011F33EABA00219C35 /* HMAC.swift in Sources */,
520539
CD9B622C1C7753EC005D4844 /* Base64.swift in Sources */,
540+
2730110C1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */,
521541
);
522542
runOnlyForDeploymentPostprocessing = 0;
523543
};
@@ -531,7 +551,9 @@
531551
277794131DF22D0D00573F3E /* Encode.swift in Sources */,
532552
2777940E1DF22BE400573F3E /* JOSEHeader.swift in Sources */,
533553
277794081DF221F800573F3E /* ClaimSet.swift in Sources */,
554+
273011021F33EABA00219C35 /* HMAC.swift in Sources */,
534555
CD9B623E1C7753FB005D4844 /* Base64.swift in Sources */,
556+
2730110D1F33FC9100219C35 /* HMACCryptoSwift.swift in Sources */,
535557
);
536558
runOnlyForDeploymentPostprocessing = 0;
537559
};

Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ let package = Package(
44
name: "JWT",
55
dependencies: [
66
.Package(url: "https://github.com/krzyzanowskim/CryptoSwift", versions: Version(0, 6, 1) ..< Version(0, 7, 0)),
7-
]
7+
],
8+
exclude: ["Sources/HMACCommonCrypto.swift"]
89
)

Sources/HMAC.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Foundation
2+
3+
enum HMACAlgorithm {
4+
case sha256
5+
case sha384
6+
case sha512
7+
}

Sources/HMACCommonCrypto.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import Foundation
2+
import CommonCrypto
3+
4+
5+
extension HMACAlgorithm {
6+
var commonCryptoAlgorithm: CCHmacAlgorithm {
7+
switch self {
8+
case .sha256:
9+
return CCHmacAlgorithm(kCCHmacAlgSHA256)
10+
case .sha384:
11+
return CCHmacAlgorithm(kCCHmacAlgSHA384)
12+
case .sha512:
13+
return CCHmacAlgorithm(kCCHmacAlgSHA512)
14+
}
15+
}
16+
17+
var commonCryptoDigestLength: Int32 {
18+
switch self {
19+
case .sha256:
20+
return CC_SHA256_DIGEST_LENGTH
21+
case .sha384:
22+
return CC_SHA384_DIGEST_LENGTH
23+
case .sha512:
24+
return CC_SHA512_DIGEST_LENGTH
25+
}
26+
}
27+
}
28+
29+
30+
func hmac(algorithm: HMACAlgorithm, key: Data, message: Data) -> Data {
31+
let context = UnsafeMutablePointer<CCHmacContext>.allocate(capacity: 1)
32+
defer { context.deallocate(capacity: 1) }
33+
34+
key.withUnsafeBytes() { (buffer: UnsafePointer<UInt8>) in
35+
CCHmacInit(context, algorithm.commonCryptoAlgorithm, buffer, size_t(key.count))
36+
}
37+
38+
message.withUnsafeBytes { (buffer: UnsafePointer<UInt8>) in
39+
CCHmacUpdate(context, buffer, size_t(message.count))
40+
}
41+
42+
var hmac = Array<UInt8>(repeating: 0, count: Int(algorithm.commonCryptoDigestLength))
43+
CCHmacFinal(context, &hmac)
44+
45+
return Data(hmac)
46+
}

Sources/HMACCryptoSwift.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Foundation
2+
import CryptoSwift
3+
4+
5+
extension HMACAlgorithm {
6+
var cryptoSwiftVariant: HMAC.Variant {
7+
switch self {
8+
case .sha256:
9+
return .sha256
10+
case .sha384:
11+
return .sha384
12+
case .sha512:
13+
return .sha512
14+
}
15+
}
16+
}
17+
18+
19+
func hmac(algorithm: HMACAlgorithm, key: Data, message: Data) -> Data {
20+
let mac = HMAC(key: key.bytes, variant: algorithm.cryptoSwiftVariant)
21+
let result: [UInt8]
22+
do {
23+
result = try mac.authenticate(message.bytes)
24+
} catch {
25+
result = []
26+
}
27+
return Data(bytes: result)
28+
}

Sources/JWT.swift

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import Foundation
2-
import CryptoSwift
32

43
public typealias Payload = [String: Any]
54

@@ -32,30 +31,23 @@ public enum Algorithm: CustomStringConvertible {
3231

3332
/// Sign a message using the algorithm
3433
func sign(_ message: String) -> String {
35-
func signHS(_ key: Data, variant: CryptoSwift.HMAC.Variant) -> String {
34+
func signHS(_ key: Data, algorithm: HMACAlgorithm) -> String {
3635
let messageData = message.data(using: String.Encoding.utf8, allowLossyConversion: false)!
37-
let mac = HMAC(key: key.bytes, variant: variant)
38-
let result: [UInt8]
39-
do {
40-
result = try mac.authenticate(messageData.bytes)
41-
} catch {
42-
result = []
43-
}
44-
return base64encode(Data(bytes: result))
36+
return base64encode(hmac(algorithm: algorithm, key: key, message: messageData))
4537
}
4638

4739
switch self {
4840
case .none:
4941
return ""
5042

5143
case .hs256(let key):
52-
return signHS(key, variant: .sha256)
44+
return signHS(key, algorithm: .sha256)
5345

5446
case .hs384(let key):
55-
return signHS(key, variant: .sha384)
47+
return signHS(key, algorithm: .sha384)
5648

5749
case .hs512(let key):
58-
return signHS(key, variant: .sha512)
50+
return signHS(key, algorithm: .sha512)
5951
}
6052
}
6153

0 commit comments

Comments
 (0)