浏览代码

Authenticator extensions. NSData.withBytes helper

Marcin Krzyżanowski 11 年之前
父节点
当前提交
063e953346

+ 4 - 4
CryptoSwift/Authenticator.swift

@@ -11,22 +11,22 @@ import Foundation
 /**
 *  Message Authentication
 */
-public enum Authentication {
+public enum Authenticator {
     /**
     Poly1305
     
     :param: key 256-bit key
     */
-    case Poly1305(key: [Byte], message: [Byte])
+    case Poly1305(key: NSData)
     
     /**
     Generates an authenticator for message using a one-time key and returns the 16-byte result
     
     :returns: 16-byte message authentication code
     */
-    public func calculate() -> [Byte]? {
+    public func calculate(message: NSData) -> NSData? {
         switch (self) {
-        case .Poly1305(let key, let message):
+        case .Poly1305(let key):
             return CryptoSwift.Poly1305.authenticate(key: key, message: message)
         }
     }

+ 1 - 1
CryptoSwift/ChaCha20.swift

@@ -34,7 +34,7 @@ class ChaCha20 {
         }
         
         if let output = encryptBytes(message.bytes()) {
-            return NSData(bytes: output, length: output.count)
+            return NSData.withBytes(output)
         }
         
         return nil

+ 18 - 7
CryptoSwift/NSDataExtension.swift

@@ -18,11 +18,7 @@ extension NSMutableData {
 }
 
 extension NSData {
-    
-    public var hexString: String {
-        return self.toHexString()
-    }
-    
+
     public func checksum() -> UInt16 {
         var s:UInt32 = 0;
         
@@ -71,8 +67,19 @@ extension NSData {
     public func decrypt(cipher: Cipher) -> NSData? {
         return cipher.decrypt(self)
     }
+    
+    public func authenticate(authenticator: Authenticator) -> NSData? {
+        return authenticator.calculate(self)
+    }
+}
 
-    internal func toHexString() -> String {
+extension NSData {
+    
+    public var hexString: String {
+        return self.toHexString()
+    }
+
+    func toHexString() -> String {
         let count = self.length / sizeof(Byte)
         var bytesArray = [Byte](count: count, repeatedValue: 0)
         self.getBytes(&bytesArray, length:count * sizeof(Byte))
@@ -85,11 +92,15 @@ extension NSData {
         return s;
     }
     
-    internal func bytes() -> [Byte] {
+    func bytes() -> [Byte] {
         let count = self.length / sizeof(Byte)
         var bytesArray = [Byte](count: count, repeatedValue: 0)
         self.getBytes(&bytesArray, length:count * sizeof(Byte))
         return bytesArray
     }
+    
+    class public func withBytes(bytes: [Byte]) -> NSData {
+        return NSData(bytes: bytes, length: bytes.count)
+    }
 }
 

+ 10 - 3
CryptoSwift/Poly1305.swift

@@ -78,7 +78,7 @@ public class Poly1305 {
     }
     
     // MARK: - Internal
-
+    
     /**
     Calculate Message Authentication Code (MAC) for message.
     Calculation context is discarder on instance deallocation.
@@ -88,9 +88,16 @@ public class Poly1305 {
     
     :returns: Message Authentication Code
     */
+    
+    class internal func authenticate(# key: NSData, message: NSData) -> NSData? {
+        if let mac = Poly1305.authenticate(key: key.bytes(), message: message.bytes()) {
+            return NSData(bytes: mac, length: mac.count)
+        }
+        return nil
+    }
+
     class internal func authenticate(# key: [Byte], message: [Byte]) -> [Byte]? {
-        var poly = Poly1305(key)
-        return poly.authenticate(message: message)
+        return Poly1305(key).authenticate(message: message)
     }
     
     // MARK: - Private

+ 4 - 0
CryptoSwift/StringExtension.swift

@@ -47,5 +47,9 @@ extension String {
     public func decrypt(cipher: Cipher) -> String? {
         return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.decrypt(cipher)?.toHexString()
     }
+    
+    public func authenticate(authenticator: Authenticator) -> String? {
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.authenticate(authenticator)?.toHexString()
+    }
 
 }

+ 8 - 2
CryptoSwiftTests/CipherTests.swift

@@ -25,8 +25,14 @@ class CipherTests: XCTestCase {
         let msg:[Byte] = [0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0xc0,0xc1]
         let expectedMac:[Byte] = [0xdd,0xb9,0xda,0x7d,0xdd,0x5e,0x52,0x79,0x27,0x30,0xed,0x5c,0xda,0x5f,0x90,0xa4]
         
-        let mac = Authentication.Poly1305(key: key, message: msg).calculate()
-        XCTAssertEqual(mac!, expectedMac, "Invalid authentication result")
+        let mac = Authenticator.Poly1305(key: NSData.withBytes(key)).calculate(NSData.withBytes(msg))
+        XCTAssertEqual(mac!, NSData.withBytes(expectedMac), "Invalid authentication result")
+        
+        // extensions
+        let msgData = NSData.withBytes(msg)
+        let mac2 = msgData.authenticate(Authenticator.Poly1305(key: NSData.withBytes(key)))
+        XCTAssertNotNil(mac2, "")
+        XCTAssertEqual(mac2!, NSData.withBytes(expectedMac), "Invalid authentication result")
     }
 
     func testChaCha20() {

+ 1 - 1
README.md

@@ -99,7 +99,7 @@ with extensions
 	
 Message authenticators
 
-	let mac = Authentication.Poly1305(key: key, message: msg).calculate()
+	let mac = Authenticator.Poly1305(key: key, message: msg).calculate()
     
 ##Contact
 Marcin Krzyżanowski [@krzyzanowskim](http://twitter.com/krzyzanowskim)