Quellcode durchsuchen

Added HMACSHA1.
Fixed BigNum operators priorites.

Damian Kołakowski vor 9 Jahren
Ursprung
Commit
90010cbe59

+ 11 - 11
Sources/Swifter/BigNum.swift

@@ -44,17 +44,17 @@ public struct BigNum: Equatable, Comparable {
     }
 }
 
-infix operator == { }
+infix operator == { precedence 130 }
 public func == (_ left: BigNum, right: BigNum) -> Bool {
     return (left.digits == right.digits) && (left.signum == right.signum)
 }
 
-infix operator != { }
+infix operator != { precedence 130 }
 public func != (_ left: BigNum, right: BigNum) -> Bool {
     return !(left.digits == right.digits)
 }
 
-infix operator + { }
+infix operator + { associativity left precedence 140 }
 public func + (_ left: BigNum, _ right: BigNum) -> BigNum {
     var result = [UInt8]()
     var carry: UInt8 = 0
@@ -75,7 +75,7 @@ public func + (_ left: BigNum, _ right: BigNum) -> BigNum {
     return BigNum(result, 1)
 }
 
-infix operator - { }
+infix operator - { associativity left precedence 140 }
 public func - (_ left: BigNum, _ right: BigNum) -> BigNum {
     var result = [UInt8]()
     var carry: Int = 0
@@ -94,7 +94,7 @@ public func - (_ left: BigNum, _ right: BigNum) -> BigNum {
     return BigNum(result, 1)
 }
 
-infix operator * { }
+infix operator * { associativity left precedence 150 }
 public func * (_ left: BigNum, _ right: BigNum) -> BigNum {
     if (left.signum == 0) || (right.signum == 0) {
         return BigNum([], 0)
@@ -124,7 +124,7 @@ public func * (_ left: BigNum, _ right: BigNum) -> BigNum {
     return sum
 }
 
-infix operator / { }
+infix operator / { associativity left precedence 150 }
 public func / (_ left: BigNum, _ right: BigNum) -> (quotient: BigNum, reminder: BigNum) {
     
     if left < right {
@@ -163,12 +163,12 @@ public func / (_ left: BigNum, _ right: BigNum) -> (quotient: BigNum, reminder:
     return (BigNum(quotient.reversed(), left.signum * right.signum), rest)
 }
 
-infix operator % { }
+infix operator % { associativity left precedence 150 }
 public func % (_ left: BigNum, _ right: BigNum) -> BigNum {
     return (left / right).reminder
 }
 
-infix operator > { }
+infix operator > { precedence 130 }
 public func > (_ left: BigNum, _ right: BigNum) -> Bool {
     if left.signum != right.signum {
         return left.signum > right.signum
@@ -192,7 +192,7 @@ public func > (_ left: BigNum, _ right: BigNum) -> Bool {
     return false
 }
 
-infix operator < { }
+infix operator < { precedence 130 }
 public func < (_ left: BigNum, _ right: BigNum) -> Bool {
     if left.signum != right.signum {
         return left.signum < right.signum
@@ -216,12 +216,12 @@ public func < (_ left: BigNum, _ right: BigNum) -> Bool {
     return false
 }
 
-infix operator >= { }
+infix operator >= { precedence 130 }
 public func >= (_ left: BigNum, _ right: BigNum) -> Bool {
     return (left == right) || (left > right)
 }
 
-infix operator <= { }
+infix operator <= { precedence 130 }
 public func <= (_ left: BigNum, _ right: BigNum) -> Bool {
     return (left == right) || (left < right)
 }

+ 45 - 0
Sources/Swifter/HMAC.swift

@@ -0,0 +1,45 @@
+//
+//  HMAC.swift
+//  Swifter
+//
+//  Copyright © 2016 Damian Kołakowski. All rights reserved.
+//
+
+import Foundation
+
+
+public struct HMAC {
+    
+    //
+    // HMAC: Keyed-Hashing for Message Authentication
+    //
+    // https://en.wikipedia.org/wiki/Hash-based_message_authentication_code
+    // https://tools.ietf.org/html/rfc2104
+    //
+    
+    public static func sha1(_ key: [UInt8], _ message: [UInt8]) -> [UInt8] {
+        return generate(key, message, (64, { block in
+            return SHA1.hash(block)
+        }))
+    }
+    
+    public static func sha1(_ key: [UInt8], _ message: [UInt8]) -> String {
+        return sha1(key, message).reduce("") { $0 + String(format: "%02x", $1) }
+    }
+    
+    public static func generate(_ key: [UInt8], _ message: [UInt8], _ setup: (blockSize: Int, hash: (([UInt8]) -> [UInt8]))) -> [UInt8] {
+        
+        var paddedKey = key
+        
+        if paddedKey.count > setup.blockSize {
+            paddedKey = setup.hash(paddedKey)
+        } else if paddedKey.count < setup.blockSize {
+            paddedKey = paddedKey + [UInt8](repeating: 0, count: setup.blockSize - paddedKey.count)
+        }
+        
+        let oKeyPad = paddedKey.map { $0 ^ UInt8(0x5c) }
+        let iKeyPad = paddedKey.map { $0 ^ UInt8(0x36) }
+        
+        return setup.hash(oKeyPad + setup.hash(iKeyPad + message))
+    }
+}

+ 34 - 27
Sources/Swifter/String+SHA1.swift → Sources/Swifter/SHA1.swift

@@ -1,8 +1,8 @@
 //
-//  String+SHA1.swift
+//  SHA1.swift
 //  Swifter
 //
-//  Copyright 2014-2016 Damian Kołakowski. All rights reserved.
+//  Copyright © 2016 Damian Kołakowski. All rights reserved.
 //
 
 #if os(Linux)
@@ -12,17 +12,13 @@
 #endif
 
 
-extension String {
-    
-    public func SHA1() -> String {
-        return SHA1().reduce("") { $0 + String(format: "%02x", $1) }
-    }
+public struct SHA1 {
     
-    public func SHA1() -> [UInt8] {
-        
+    public static func hash(_ input: [UInt8]) -> [UInt8] {
+            
         // Alghorithm from: https://en.wikipedia.org/wiki/SHA-1
         
-        var message = [UInt8](self.utf8)
+        var message = input
         
         var h0 = UInt32(littleEndian: 0x67452301)
         var h1 = UInt32(littleEndian: 0xEFCDAB89)
@@ -52,7 +48,7 @@ extension String {
         message.append(contentsOf: Array(bytePtr))
         
         // Process the message in successive 512-bit chunks ( 64 bytes chunks ):
-
+        
         for chunkStart in 0..<message.count/64 {
             var words = [UInt32]()
             let chunk = message[chunkStart*64..<chunkStart*64+64]
@@ -83,19 +79,19 @@ extension String {
                 var f = UInt32(0)
                 var k = UInt32(0)
                 switch i {
-                    case 0...19:
-                        f = (b & c) | ((~b) & d)
-                        k = 0x5A827999
-                    case 20...39:
-                        f = b ^ c ^ d
-                        k = 0x6ED9EBA1
-                    case 40...59:
-                        f = (b & c) | (b & d) | (c & d)
-                        k = 0x8F1BBCDC
-                    case 60...79:
-                        f = b ^ c ^ d
-                        k = 0xCA62C1D6
-                    default: break
+                case 0...19:
+                    f = (b & c) | ((~b) & d)
+                    k = 0x5A827999
+                case 20...39:
+                    f = b ^ c ^ d
+                    k = 0x6ED9EBA1
+                case 40...59:
+                    f = (b & c) | (b & d) | (c & d)
+                    k = 0x8F1BBCDC
+                case 60...79:
+                    f = b ^ c ^ d
+                    k = 0xCA62C1D6
+                default: break
                 }
                 let temp = (rotateLeft(a, 5) &+ f &+ e &+ k &+ words[i]) & 0xFFFFFFFF
                 e = d
@@ -129,11 +125,22 @@ extension String {
         result += ([UInt8(h2Big & 0xFF), UInt8((h2Big >> 8) & 0xFF), UInt8((h2Big >> 16) & 0xFF), UInt8((h2Big >> 24) & 0xFF)]);
         result += ([UInt8(h3Big & 0xFF), UInt8((h3Big >> 8) & 0xFF), UInt8((h3Big >> 16) & 0xFF), UInt8((h3Big >> 24) & 0xFF)]);
         result += ([UInt8(h4Big & 0xff), UInt8((h4Big >> 8) & 0xFF), UInt8((h4Big >> 16) & 0xFF), UInt8((h4Big >> 24) & 0xFF)]);
-
-        return result;
+        
+        return result
     }
     
-    func rotateLeft(_ v: UInt32, _ n: UInt32) -> UInt32 {
+    private static func rotateLeft(_ v: UInt32, _ n: UInt32) -> UInt32 {
         return ((v << n) & 0xFFFFFFFF) | (v >> (32 - n))
     }
 }
+
+extension String {
+    
+    public func sha1() -> String {
+        return self.sha1().reduce("") { $0 + String(format: "%02x", $1) }
+    }
+    
+    public func sha1() -> [UInt8] {
+        return SHA1.hash([UInt8](self.utf8))
+    }
+}

+ 1 - 1
Sources/Swifter/WebSockets.swift

@@ -37,7 +37,7 @@ public func websocket(
                 }
             }
         }
-        let secWebSocketAccept = String.toBase64((secWebSocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").SHA1())
+        let secWebSocketAccept = String.toBase64((secWebSocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").sha1())
         let headers = [ "Upgrade": "WebSocket", "Connection": "Upgrade", "Sec-WebSocket-Accept": secWebSocketAccept]
         return HttpResponse.switchProtocols(headers, protocolSessionClosure)
     }

+ 28 - 14
XCode/Swifter.xcodeproj/project.pbxproj

@@ -72,9 +72,6 @@
 		7C3196371CC2C68F00DF5406 /* String+Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3195F91CC2C68F00DF5406 /* String+Misc.swift */; };
 		7C3196381CC2C68F00DF5406 /* String+Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3195F91CC2C68F00DF5406 /* String+Misc.swift */; };
 		7C3196391CC2C68F00DF5406 /* String+Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3195F91CC2C68F00DF5406 /* String+Misc.swift */; };
-		7C31963A1CC2C68F00DF5406 /* String+SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3195FA1CC2C68F00DF5406 /* String+SHA1.swift */; };
-		7C31963B1CC2C68F00DF5406 /* String+SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3195FA1CC2C68F00DF5406 /* String+SHA1.swift */; };
-		7C31963C1CC2C68F00DF5406 /* String+SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3195FA1CC2C68F00DF5406 /* String+SHA1.swift */; };
 		7C3945641D256FDA003EEABA /* Scopes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3945631D256FDA003EEABA /* Scopes.swift */; };
 		7C3945651D256FDA003EEABA /* Scopes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3945631D256FDA003EEABA /* Scopes.swift */; };
 		7C4785E91C71D15600A9FE73 /* SwifterTestsWebSocketSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4785E81C71D15600A9FE73 /* SwifterTestsWebSocketSession.swift */; };
@@ -137,9 +134,17 @@
 		7CDAB8131BE2A1D400C8A977 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7CDAB80D1BE2A1D400C8A977 /* Main.storyboard */; };
 		7CDAB8141BE2A1D400C8A977 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7CDAB80F1BE2A1D400C8A977 /* Images.xcassets */; };
 		7CDAB8161BE2A1D400C8A977 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAB8111BE2A1D400C8A977 /* ViewController.swift */; };
-		7CE0B9E31D5AFF560070D292 /* BigNum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1CA77B1D589C2200FD38A0 /* BigNum.swift */; };
-		7CE0B9E41D5AFF570070D292 /* BigNum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1CA77B1D589C2200FD38A0 /* BigNum.swift */; };
-		7CE0B9E51D5AFF570070D292 /* BigNum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1CA77B1D589C2200FD38A0 /* BigNum.swift */; };
+		7CE0B9E71D5BAFF10070D292 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9E61D5BAFF10070D292 /* HMAC.swift */; };
+		7CE0B9E81D5BAFF10070D292 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9E61D5BAFF10070D292 /* HMAC.swift */; };
+		7CE0B9E91D5BAFF10070D292 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9E61D5BAFF10070D292 /* HMAC.swift */; };
+		7CE0B9EB1D5BB6850070D292 /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9EA1D5BB6850070D292 /* SHA1.swift */; };
+		7CE0B9EC1D5BB6850070D292 /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9EA1D5BB6850070D292 /* SHA1.swift */; };
+		7CE0B9ED1D5BB6850070D292 /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9EA1D5BB6850070D292 /* SHA1.swift */; };
+		7CE0B9EF1D5BBAAD0070D292 /* SwifterTestsHMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9EE1D5BBAAD0070D292 /* SwifterTestsHMAC.swift */; };
+		7CE0B9F01D5BBAAD0070D292 /* SwifterTestsHMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE0B9EE1D5BBAAD0070D292 /* SwifterTestsHMAC.swift */; };
+		7CE0B9F11D5BBC540070D292 /* BigNum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1CA77B1D589C2200FD38A0 /* BigNum.swift */; };
+		7CE0B9F21D5BBC550070D292 /* BigNum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1CA77B1D589C2200FD38A0 /* BigNum.swift */; };
+		7CE0B9F31D5BBC560070D292 /* BigNum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1CA77B1D589C2200FD38A0 /* BigNum.swift */; };
 		98630C071A1C9A9D00478D08 /* login.html in Resources */ = {isa = PBXBuildFile; fileRef = 98630C061A1C9A9D00478D08 /* login.html */; };
 /* End PBXBuildFile section */
 
@@ -229,7 +234,6 @@
 		7C3195F71CC2C68F00DF5406 /* SQLite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLite.swift; sourceTree = "<group>"; };
 		7C3195F81CC2C68F00DF5406 /* String+BASE64.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+BASE64.swift"; sourceTree = "<group>"; };
 		7C3195F91CC2C68F00DF5406 /* String+Misc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Misc.swift"; sourceTree = "<group>"; };
-		7C3195FA1CC2C68F00DF5406 /* String+SHA1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+SHA1.swift"; sourceTree = "<group>"; };
 		7C3945631D256FDA003EEABA /* Scopes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scopes.swift; sourceTree = "<group>"; };
 		7C4785E81C71D15600A9FE73 /* SwifterTestsWebSocketSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwifterTestsWebSocketSession.swift; sourceTree = "<group>"; };
 		7C5915211C92A99300D884BC /* SwifterTestsReflection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwifterTestsReflection.swift; sourceTree = "<group>"; };
@@ -270,6 +274,9 @@
 		7CDAB80F1BE2A1D400C8A977 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
 		7CDAB8101BE2A1D400C8A977 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		7CDAB8111BE2A1D400C8A977 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
+		7CE0B9E61D5BAFF10070D292 /* HMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMAC.swift; sourceTree = "<group>"; };
+		7CE0B9EA1D5BB6850070D292 /* SHA1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SHA1.swift; sourceTree = "<group>"; };
+		7CE0B9EE1D5BBAAD0070D292 /* SwifterTestsHMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwifterTestsHMAC.swift; sourceTree = "<group>"; };
 		98630C061A1C9A9D00478D08 /* login.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = login.html; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -404,13 +411,14 @@
 				7C3195F71CC2C68F00DF5406 /* SQLite.swift */,
 				7C3195F81CC2C68F00DF5406 /* String+BASE64.swift */,
 				7C3195F91CC2C68F00DF5406 /* String+Misc.swift */,
-				7C3195FA1CC2C68F00DF5406 /* String+SHA1.swift */,
 				7C2C85901D50D83D00B32145 /* JSON.swift */,
 				7C1145981D527545000DB965 /* AES128.swift */,
 				7C5F78F11D54C99200C514AA /* RC4.swift */,
 				7C5F78FB1D5520B000C514AA /* RSA.swift */,
 				7C5F790A1D56281200C514AA /* Errno.swift */,
 				7C1CA77B1D589C2200FD38A0 /* BigNum.swift */,
+				7CE0B9E61D5BAFF10070D292 /* HMAC.swift */,
+				7CE0B9EA1D5BB6850070D292 /* SHA1.swift */,
 			);
 			path = Swifter;
 			sourceTree = "<group>";
@@ -509,6 +517,7 @@
 				7CB923CF1D510D6400899E2A /* SwifterTestsJSON.swift */,
 				7C5F78F51D54D21600C514AA /* SwifterTestsRC4.swift */,
 				7C5F78EE1D54BB5600C514AA /* SwifterTestsAES128.swift */,
+				7CE0B9EE1D5BBAAD0070D292 /* SwifterTestsHMAC.swift */,
 				7C5F79031D55F44500C514AA /* SwifterTestsRSA.swift */,
 				7CCD875D1C66099B0068099B /* SwifteriOSTests */,
 			);
@@ -851,8 +860,9 @@
 				7C3196191CC2C68F00DF5406 /* HttpResponse.swift in Sources */,
 				7C5F790F1D56287000C514AA /* Socket+File.swift in Sources */,
 				7C3196131CC2C68F00DF5406 /* HttpParser.swift in Sources */,
-				7C31963A1CC2C68F00DF5406 /* String+SHA1.swift in Sources */,
+				7CE0B9F11D5BBC540070D292 /* BigNum.swift in Sources */,
 				7C31961F1CC2C68F00DF5406 /* HttpServer.swift in Sources */,
+				7CE0B9E71D5BAFF10070D292 /* HMAC.swift in Sources */,
 				7C31960D1CC2C68F00DF5406 /* WebSockets.swift in Sources */,
 				7C3195FE1CC2C68F00DF5406 /* sqlite.c in Sources */,
 				7C3196311CC2C68F00DF5406 /* SQLite.swift in Sources */,
@@ -864,9 +874,9 @@
 				7C3196281CC2C68F00DF5406 /* Reflection.swift in Sources */,
 				7C3945641D256FDA003EEABA /* Scopes.swift in Sources */,
 				7C3196161CC2C68F00DF5406 /* HttpRequest.swift in Sources */,
+				7CE0B9EB1D5BB6850070D292 /* SHA1.swift in Sources */,
 				7C5F79071D5627EE00C514AA /* Socket+Server.swift in Sources */,
 				7C3196221CC2C68F00DF5406 /* HttpServerIO.swift in Sources */,
-				7CE0B9E31D5AFF560070D292 /* BigNum.swift in Sources */,
 				7C31960A1CC2C68F00DF5406 /* Files.swift in Sources */,
 				7CB923CC1D50F11700899E2A /* JSON.swift in Sources */,
 				7C5F790B1D56281200C514AA /* Errno.swift in Sources */,
@@ -886,8 +896,9 @@
 				7C31961A1CC2C68F00DF5406 /* HttpResponse.swift in Sources */,
 				7C5F79101D56287000C514AA /* Socket+File.swift in Sources */,
 				7C3196141CC2C68F00DF5406 /* HttpParser.swift in Sources */,
-				7C31963B1CC2C68F00DF5406 /* String+SHA1.swift in Sources */,
+				7CE0B9F21D5BBC550070D292 /* BigNum.swift in Sources */,
 				7C3196201CC2C68F00DF5406 /* HttpServer.swift in Sources */,
+				7CE0B9E81D5BAFF10070D292 /* HMAC.swift in Sources */,
 				7C31960E1CC2C68F00DF5406 /* WebSockets.swift in Sources */,
 				7C3195FF1CC2C68F00DF5406 /* sqlite.c in Sources */,
 				7C3196321CC2C68F00DF5406 /* SQLite.swift in Sources */,
@@ -899,9 +910,9 @@
 				7C3196291CC2C68F00DF5406 /* Reflection.swift in Sources */,
 				7C3945651D256FDA003EEABA /* Scopes.swift in Sources */,
 				7C3196171CC2C68F00DF5406 /* HttpRequest.swift in Sources */,
+				7CE0B9EC1D5BB6850070D292 /* SHA1.swift in Sources */,
 				7C5F79081D5627EE00C514AA /* Socket+Server.swift in Sources */,
 				7C3196231CC2C68F00DF5406 /* HttpServerIO.swift in Sources */,
-				7CE0B9E41D5AFF570070D292 /* BigNum.swift in Sources */,
 				7C31960B1CC2C68F00DF5406 /* Files.swift in Sources */,
 				7CB923CD1D50F11800899E2A /* JSON.swift in Sources */,
 				7C5F790C1D56281200C514AA /* Errno.swift in Sources */,
@@ -947,8 +958,9 @@
 				7C31961B1CC2C68F00DF5406 /* HttpResponse.swift in Sources */,
 				7C5F79111D56287000C514AA /* Socket+File.swift in Sources */,
 				7C3196151CC2C68F00DF5406 /* HttpParser.swift in Sources */,
-				7C31963C1CC2C68F00DF5406 /* String+SHA1.swift in Sources */,
+				7CE0B9F31D5BBC560070D292 /* BigNum.swift in Sources */,
 				7C83177B1D2C5DF300630662 /* Scopes.swift in Sources */,
+				7CE0B9E91D5BAFF10070D292 /* HMAC.swift in Sources */,
 				7C3196211CC2C68F00DF5406 /* HttpServer.swift in Sources */,
 				7C31960F1CC2C68F00DF5406 /* WebSockets.swift in Sources */,
 				7C3196001CC2C68F00DF5406 /* sqlite.c in Sources */,
@@ -960,9 +972,9 @@
 				7C3196061CC2C68F00DF5406 /* DemoServer.swift in Sources */,
 				7C31962A1CC2C68F00DF5406 /* Reflection.swift in Sources */,
 				7C3196181CC2C68F00DF5406 /* HttpRequest.swift in Sources */,
+				7CE0B9ED1D5BB6850070D292 /* SHA1.swift in Sources */,
 				7C5F79091D5627EE00C514AA /* Socket+Server.swift in Sources */,
 				7C3196241CC2C68F00DF5406 /* HttpServerIO.swift in Sources */,
-				7CE0B9E51D5AFF570070D292 /* BigNum.swift in Sources */,
 				7C31960C1CC2C68F00DF5406 /* Files.swift in Sources */,
 				7CB923CE1D50F11800899E2A /* JSON.swift in Sources */,
 				7C5F790D1D56281200C514AA /* Errno.swift in Sources */,
@@ -985,6 +997,7 @@
 				7CB923D01D510D6400899E2A /* SwifterTestsJSON.swift in Sources */,
 				7C4785E91C71D15600A9FE73 /* SwifterTestsWebSocketSession.swift in Sources */,
 				7C5F78F91D54D24B00C514AA /* SwifterTestsRC4.swift in Sources */,
+				7CE0B9EF1D5BBAAD0070D292 /* SwifterTestsHMAC.swift in Sources */,
 				7CCD87721C660B250068099B /* SwifterTestsStringExtensions.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1002,6 +1015,7 @@
 				7CB923D11D510D6400899E2A /* SwifterTestsJSON.swift in Sources */,
 				7C4785EA1C71D15600A9FE73 /* SwifterTestsWebSocketSession.swift in Sources */,
 				7C5F78FA1D54D24B00C514AA /* SwifterTestsRC4.swift in Sources */,
+				7CE0B9F01D5BBAAD0070D292 /* SwifterTestsHMAC.swift in Sources */,
 				7CCD87851C660ED60068099B /* SwifterTestsStringExtensions.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 13 - 0
XCode/SwifterSampleOSX/main.swift

@@ -7,11 +7,24 @@
 import Foundation
 import Swifter
 
+let output: String = HMAC.sha1([UInt8]("key".utf8), [UInt8]("The quick brown fox jumps over the lazy dog".utf8))
+
+
 do {
     let server: HttpServer = demoServer(try File.currentWorkingDirectory())
     server["/testAfterBaseRoute"] = { request in
         return .ok(.html("ok !"))
     }
+    
+    server["/lightroom"] = { r in
+        
+        print(String.fromUInt8(r.body))
+        
+        // JSON().encode()
+        
+        return .ok(.json(["result": "success"]))
+    }
+    
     if #available(OSX 10.10, *) {
         try server.start(9080)
     } else {

+ 19 - 0
XCode/SwifterTestsCommon/SwifterTestsHMAC.swift

@@ -0,0 +1,19 @@
+//
+//  SwifterTestsHMAC.swift
+//  Swifter
+//
+//  Copyright © 2016 Damian Kołakowski. All rights reserved.
+//
+
+import XCTest
+import Swifter
+
+class SwifterTestsHMAC: XCTestCase {
+    
+    func testSHA1() {
+        
+        XCTAssertEqual(HMAC.sha1([UInt8]("".utf8), [UInt8]("".utf8)), "fbdb1d1b18aa6c08324b7d64b71fb76370690e1d")
+        XCTAssertEqual(HMAC.sha1([UInt8]("key".utf8), [UInt8]("The quick brown fox jumps over the lazy dog".utf8)),
+                       "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9")
+    }
+}

+ 5 - 5
XCode/SwifterTestsCommon/SwifterTestsStringExtensions.swift

@@ -11,14 +11,14 @@ import Swifter
 class SwifterTestsStringExtensions: XCTestCase {
     
     func testSHA1() {
-        XCTAssertEqual("".SHA1(), "da39a3ee5e6b4b0d3255bfef95601890afd80709")
-        XCTAssertEqual("test".SHA1(), "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3")
+        XCTAssertEqual("".sha1(), "da39a3ee5e6b4b0d3255bfef95601890afd80709")
+        XCTAssertEqual("test".sha1(), "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3")
         
         // Values copied from OpenSSL:
         // https://github.com/openssl/openssl/blob/master/test/sha1test.c
         
-        XCTAssertEqual("abc".SHA1(), "a9993e364706816aba3e25717850c26c9cd0d89d")
-        XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".SHA1(),
+        XCTAssertEqual("abc".sha1(), "a9993e364706816aba3e25717850c26c9cd0d89d")
+        XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha1(),
             "84983e441c3bd26ebaae4aa1f95129e5e54670f1")
         
         XCTAssertEqual(
@@ -34,7 +34,7 @@ class SwifterTestsStringExtensions: XCTestCase {
              "a9993e364706816aba3e25717850c26c9cd0d89d" +
              "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" +
              "a9993e364706816aba3e25717850c26c9cd0d89d" +
-             "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").SHA1(),
+             "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").sha1(),
             "a377b0c42d685fdc396e29a9eda7101d900947ca")
     }