Skip to content

Commit 07f8a81

Browse files
Merge pull request #245 from pusher/remove-cryptoswift
Replace CryptoSwift with CommonCrypto HMAC functions
2 parents 516ff9b + 29d1eb9 commit 07f8a81

File tree

11 files changed

+67
-39
lines changed

11 files changed

+67
-39
lines changed

Cartfile

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,2 @@
1-
# CryptoSwift versions 0.9 - 0.10 inclusive have iOS deployment
2-
# target "9.0" set in the Xcode project (but not in the Podspec).
3-
# PusherSwift has target "8.0" therefore the version in this
4-
# file can't match PusherSwift's Podspec's minimum CryptoSwift
5-
# version currently.
6-
github "krzyzanowskim/CryptoSwift" ~> 0.15.0
71
github "ashleymills/Reachability.swift" == 4.3.0
82
github "daltoniam/Starscream" == 3.0.6

Cartfile.resolved

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
github "ashleymills/Reachability.swift" "v4.3.0"
22
github "daltoniam/Starscream" "3.0.6"
3-
github "krzyzanowskim/CryptoSwift" "0.15.0"

Package.resolved

Lines changed: 0 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@ let package = Package(
88
.library(name: "PusherSwift", targets: ["PusherSwift"])
99
],
1010
dependencies: [
11-
.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", .upToNextMajor(from: "0.9.0")),
1211
.package(url: "https://github.com/ashleymills/Reachability.swift.git", .exact("4.3.0")),
1312
.package(url: "https://github.com/daltoniam/Starscream.git", .exact("3.0.6")),
1413
],
1514
targets: [
1615
.target(
1716
name: "PusherSwift",
1817
dependencies: [
19-
"CryptoSwift",
2018
"Reachability",
2119
"Starscream",
2220
],

PusherSwift.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ Pod::Spec.new do |s|
1212
s.requires_arc = true
1313
s.source_files = 'Sources/*.swift'
1414

15-
s.dependency 'CryptoSwift', '~> 0.9'
1615
s.dependency 'ReachabilitySwift', '4.3.0'
1716
s.dependency 'Starscream', '~> 3.0.5'
1817

PusherSwift.xcodeproj/project.pbxproj

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
E24D0AA522D798C8009DE31B /* PusherEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E24D0AA422D798C8009DE31B /* PusherEvent.swift */; };
3737
E29A4CBC2301BA31000BC499 /* PusherEventTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E29A4CBB2301BA31000BC499 /* PusherEventTests.swift */; };
3838
E2CFE43122D79CA7004187C3 /* PusherParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CFE43022D79CA7004187C3 /* PusherParser.swift */; };
39+
E2F40FA523ED782B00985C40 /* PusherCrypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F40FA423ED782B00985C40 /* PusherCrypto.swift */; };
40+
E2F40FA723ED79BC00985C40 /* PusherCryptoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F40FA623ED79BC00985C40 /* PusherCryptoTest.swift */; };
3941
/* End PBXBuildFile section */
4042

4143
/* Begin PBXContainerItemProxy section */
@@ -82,6 +84,8 @@
8284
E24D0AA422D798C8009DE31B /* PusherEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PusherEvent.swift; sourceTree = "<group>"; };
8385
E29A4CBB2301BA31000BC499 /* PusherEventTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PusherEventTests.swift; sourceTree = "<group>"; };
8486
E2CFE43022D79CA7004187C3 /* PusherParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PusherParser.swift; sourceTree = "<group>"; };
87+
E2F40FA423ED782B00985C40 /* PusherCrypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PusherCrypto.swift; sourceTree = "<group>"; };
88+
E2F40FA623ED79BC00985C40 /* PusherCryptoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PusherCryptoTest.swift; sourceTree = "<group>"; };
8589
/* End PBXFileReference section */
8690

8791
/* Begin PBXFrameworksBuildPhase section */
@@ -141,6 +145,7 @@
141145
33831CD61A9CFFF200B124F1 /* PusherSwift.h */,
142146
E24D0AA422D798C8009DE31B /* PusherEvent.swift */,
143147
E2498292231E612700CFBBD6 /* PusherError.swift */,
148+
E2F40FA423ED782B00985C40 /* PusherCrypto.swift */,
144149
);
145150
path = Sources;
146151
sourceTree = "<group>";
@@ -170,6 +175,7 @@
170175
33BB99661D21226C00B25C2A /* PusherTopLevelAPITests.swift */,
171176
33BB99671D21226C00B25C2A /* Info.plist */,
172177
E29A4CBB2301BA31000BC499 /* PusherEventTests.swift */,
178+
E2F40FA623ED79BC00985C40 /* PusherCryptoTest.swift */,
173179
);
174180
path = Tests;
175181
sourceTree = "<group>";
@@ -304,7 +310,6 @@
304310
);
305311
inputPaths = (
306312
Starscream,
307-
CryptoSwift,
308313
Reachability,
309314
);
310315
name = "Copy Carthage Frameworks";
@@ -326,6 +331,7 @@
326331
E2498293231E612700CFBBD6 /* PusherError.swift in Sources */,
327332
E24D0AA522D798C8009DE31B /* PusherEvent.swift in Sources */,
328333
3389F56A1CAEDD9100563F49 /* PusherWebsocketDelegate.swift in Sources */,
334+
E2F40FA523ED782B00985C40 /* PusherCrypto.swift in Sources */,
329335
330D7A6D1CAEDA750032FF2C /* PusherChannel.swift in Sources */,
330336
3390D1E81F054D1E00E1944D /* Authorizer.swift in Sources */,
331337
3389F5721CAEDDF300563F49 /* PusherChannels.swift in Sources */,
@@ -344,6 +350,7 @@
344350
buildActionMask = 2147483647;
345351
files = (
346352
33BB997A1D21230100B25C2A /* PusherConnectionTests.swift in Sources */,
353+
E2F40FA723ED79BC00985C40 /* PusherCryptoTest.swift in Sources */,
347354
33BB99791D21230100B25C2A /* PusherClientInitializationTests.swift in Sources */,
348355
33BB99771D21230100B25C2A /* PresenceChannelTests.swift in Sources */,
349356
33BB997C1D21230100B25C2A /* PusherTopLevelAPITests.swift in Sources */,

Sources/PusherConnection.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import Foundation
22
import Reachability
33
import Starscream
4-
import CryptoSwift
54

65
@objcMembers
76
@objc open class PusherConnection: NSObject {
@@ -707,27 +706,22 @@ import CryptoSwift
707706

708707
return true
709708
case .inline(secret: let secret):
710-
var msg = ""
709+
var message = ""
711710
var channelData = ""
712711
if channel.type == .presence {
713712
channelData = getUserDataJSON()
714-
msg = "\(self.socketId!):\(channel.name):\(channelData)"
713+
message = "\(self.socketId!):\(channel.name):\(channelData)"
715714
} else {
716-
msg = "\(self.socketId!):\(channel.name)"
715+
message = "\(self.socketId!):\(channel.name)"
717716
}
718717

719-
let secretBuff: [UInt8] = Array(secret.utf8)
720-
let msgBuff: [UInt8] = Array(msg.utf8)
718+
let signature = PusherCrypto.generateSHA256HMAC(secret: secret, message: message)
719+
let auth = "\(self.key):\(signature)".lowercased()
721720

722-
if let hmac = try? HMAC(key: secretBuff, variant: .sha256).authenticate(msgBuff) {
723-
let signature = Data(bytes: hmac).toHexString()
724-
let auth = "\(self.key):\(signature)".lowercased()
725-
726-
if channel.type == .private {
727-
self.handlePrivateChannelAuth(authValue: auth, channel: channel)
728-
} else {
729-
self.handlePresenceChannelAuth(authValue: auth, channel: channel, channelData: channelData)
730-
}
721+
if channel.type == .private {
722+
self.handlePrivateChannelAuth(authValue: auth, channel: channel)
723+
} else {
724+
self.handlePresenceChannelAuth(authValue: auth, channel: channel, channelData: channelData)
731725
}
732726

733727
return true

Sources/PusherCrypto.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import Foundation
2+
import CommonCrypto
3+
4+
struct PusherCrypto {
5+
6+
/**
7+
Generates a SHA256 HMAC digest of the message using the secret
8+
9+
- returns: The hex encoded MAC string
10+
*/
11+
static func generateSHA256HMAC(secret: String, message: String) -> String {
12+
let secretData = Data(secret.utf8)
13+
let messageData = Data(message.utf8)
14+
15+
let algorithm = CCHmacAlgorithm(kCCHmacAlgSHA256)
16+
let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
17+
18+
var digest = Data(count: digestLength)
19+
20+
_ = digest.withUnsafeMutableBytes { digestBytes in
21+
_ = secretData.withUnsafeBytes { secretBytes in
22+
_ = messageData.withUnsafeBytes { messageBytes in
23+
CCHmac(algorithm, secretBytes, secretData.count, messageBytes, messageData.count, digestBytes)
24+
}
25+
}
26+
}
27+
28+
// Data to hex string
29+
let signature = digest
30+
.map { String(format: "%02x", $0) }
31+
.joined()
32+
33+
return signature
34+
}
35+
}

Tests/PusherCryptoTest.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@testable
2+
import PusherSwift
3+
import XCTest
4+
5+
class PusherCryptoTest: XCTestCase {
6+
func testHMACGeneratorGeneratesCorrectMAC() {
7+
let secret = "mysecret"
8+
let message = "{\"user\":\"my user data\"}"
9+
10+
let digest = PusherCrypto.generateSHA256HMAC(secret: secret, message: message)
11+
12+
let expectedDigest = "7705bb9a7934fe4ceee2325e23750f35752899448c2fe5b064d93326c98fd5b3"
13+
XCTAssertEqual(digest, expectedDigest)
14+
}
15+
}

iOS Example Obj-C/iOS Example Obj-C.xcodeproj/project.pbxproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@
192192
inputFileListPaths = (
193193
);
194194
inputPaths = (
195-
"$(SRCROOT)/../Carthage/Build/iOS/CryptoSwift.framework",
196195
"$(SRCROOT)/../Carthage/Build/iOS/Reachability.framework",
197196
"$(SRCROOT)/../Carthage/Build/iOS/Starscream.framework",
198197
);

0 commit comments

Comments
 (0)