Răsfoiți Sursa

refactor public api

Marcin Krzyżanowski 11 ani în urmă
părinte
comite
67bf827fa5

+ 21 - 12
CryptoSwift/ChaCha20.swift

@@ -8,15 +8,29 @@
 
 import Foundation
 
-public class ChaCha20 {
-    let stateSize = 16
-    let blockSize = 16 * 4
+internal class ChaCha20 {
+    private let stateSize = 16
+    private let blockSize = 16 * 4
+    private var context:Context = Context()
     
-    public class Context {
+    private class Context {
         var input:[UInt32] = [UInt32](count: 16, repeatedValue: 0)
     }
     
-    public init() {
+    internal init(key:NSData, iv:NSData) {
+        context = keySetup(iv: iv, key: key)
+    }
+
+    deinit
+    {
+        for (var i = 0; i < context.input.count; i++) {
+            context.input[i] = 0x00;
+        }
+    }
+    
+    internal func encrypt(message:NSData) -> NSData {
+        let output = encryptBytes(message.arrayOfBytes())
+        return NSData(bytes: output, length: output.count)
     }
     
     private func wordToByte(input:[UInt32] /* 64 */) -> [Byte]? /* 16 */ {
@@ -49,7 +63,7 @@ public class ChaCha20 {
         return output;
     }
     
-    public func keySetup(# iv:NSData, key:NSData, kbits:UInt32 = 256) -> Context {
+    private func keySetup(# iv:NSData, key:NSData, kbits:UInt32 = 256) -> Context {
         return keySetup(iv: iv.arrayOfBytes(), key: key.arrayOfBytes(), kbits: kbits)
     }
     
@@ -95,12 +109,7 @@ public class ChaCha20 {
         return context
     }
     
-    public func encrypt(context:Context, message:NSData) -> NSData {
-        let output = encryptBytes(context, message: message.arrayOfBytes())
-        return NSData(bytes: output, length: output.count)
-    }
-    
-    private func encryptBytes(context:Context, message:[Byte]) -> [Byte] {
+    private func encryptBytes(message:[Byte]) -> [Byte] {
         var cPos:Int = 0
         var mPos:Int = 0
         var bytes = message.count

+ 9 - 1
CryptoSwift/Cipher.swift

@@ -9,5 +9,13 @@
 import Foundation
 
 public enum Cipher {
-    case ChaCha20
+    case ChaCha20(key: NSData, iv: NSData)
+    
+    public func encrypt(message: NSData) -> NSData {
+        switch (self) {
+            case .ChaCha20(let key, let iv):
+                var chacha = CryptoSwift.ChaCha20(key: key, iv: iv);
+                return chacha.encrypt(message)
+        }
+    }
 }

+ 1 - 1
CryptoSwift/CryptoHashBase.swift

@@ -8,7 +8,7 @@
 
 import Foundation
 
-class CryptoHashBase {
+class HashBase {
     
     var message: NSData
     

+ 7 - 8
CryptoSwift/Hash.swift

@@ -11,22 +11,21 @@ import Foundation
 public enum Hash {
     case md5
     case sha1, sha224, sha256, sha384, sha512
-    case ripemd160
     
-    public func hash(data: NSData) -> NSData! {
+    public func calculate(data: NSData) -> NSData! {
         switch self {
         case md5:
-            return data.md5()
+            return MD5(data).calculate()
         case sha1:
-            return data.sha1()
+            return SHA1(data).calculate()
         case sha224:
-            return data.sha224()
+            return SHA2(data).calculate32(.sha224)
         case sha256:
-            return data.sha256()
+            return SHA2(data).calculate32(.sha256)
         case sha384:
-            return data.sha384()
+            return SHA2(data).calculate64(.sha384)
         case sha512:
-            return data.sha512()
+            return SHA2(data).calculate64(.sha512)
         default:
             return nil
         }

+ 1 - 1
CryptoSwift/MD5.swift

@@ -8,7 +8,7 @@
 
 import Foundation
 
-class MD5 : CryptoHashBase {
+class MD5 : CryptoSwift.HashBase {
 
     /** specifies the per-round shift amounts */
     private let s: [UInt32] = [7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,

+ 3 - 3
CryptoSwift/NSDataExtension.swift

@@ -37,15 +37,15 @@ extension NSData {
     }
     
     public func md5() -> NSData {
-        return MD5(self).calculate()
+        return Hash.md5.calculate(self)
     }
 
     public func sha1() -> NSData {
-        return SHA1(self).calculate()
+        return Hash.sha1.calculate(self)
     }
 
     public func sha224() -> NSData {
-        return SHA2(self).calculate32(.sha224)
+        return Hash.sha224.calculate(self)
     }
 
     public func sha256() -> NSData {

+ 1 - 1
CryptoSwift/SHA1.swift

@@ -8,7 +8,7 @@
 
 import Foundation
 
-class SHA1 : CryptoHashBase {
+class SHA1 : CryptoSwift.HashBase {
     
     private let h:[UInt32] = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]
         

+ 1 - 1
CryptoSwift/SHA2.swift

@@ -8,7 +8,7 @@
 
 import Foundation
 
-class SHA2 : CryptoHashBase {
+class SHA2 : CryptoSwift.HashBase {
     
     enum variant {
         case sha224, sha256, sha384, sha512

+ 7 - 9
CryptoSwiftTests/CipherTests.swift

@@ -21,8 +21,6 @@ class CipherTests: XCTestCase {
     }
 
     func testChaCha20() {
-        let ch = ChaCha20()
-        
         let keys:[[Byte]] = [
             [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
             [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01],
@@ -39,7 +37,7 @@ class CipherTests: XCTestCase {
             [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07]
         ]
         
-        let expectedHex = [
+        let expectedHexes = [
             "76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669",
             "4540F05A9F1FB296D7736E7B208E3C96EB4FE1834688D2604F450952ED432D41BBE2A0B6EA7566D2A5D1E7E20D42AF2C53D792B1C43FEA817E9AD275",
             "DE9CBA7BF3D69EF5E786DC63973F653A0B49E015ADBFF7134FCB7DF137821031E85A050278A7084527214F73EFC7FA5B5277062EB7A0433E445F41E3",
@@ -51,14 +49,14 @@ class CipherTests: XCTestCase {
             let keyData = NSData(bytes: keys[idx], length: keys[idx].count)
             let ivData = NSData(bytes: ivs[idx], length: ivs[idx].count)
             
-            let context = ch.keySetup(iv: ivData, key: keyData)
-            
-            let expected = expectedHex[idx]
-            let message = [Byte](count: (countElements(expected) / 2), repeatedValue: 0)
+            let expectedHex = expectedHexes[idx]
+            let message = [Byte](count: (countElements(expectedHex) / 2), repeatedValue: 0)
             let messageData = NSData(bytes: message, length: message.count);
-            let encrypted = ch.encrypt(context, message: messageData)
             
-            XCTAssertEqual(encrypted.hexString, expected, "ChaCha20 failed");
+            let ch = Cipher.ChaCha20(key: keyData, iv: ivData)
+            let encrypted = ch.encrypt(messageData)
+            
+            XCTAssertEqual(encrypted.hexString, expectedHex, "ChaCha20 failed");
         }
     }
 }

+ 9 - 4
README.md

@@ -9,14 +9,19 @@ Good mood
 - Easy to use
 - Convenience extensions
 
-#####what implemented?
+####what implemented?
+
+#### Hash
 - MD5
 - SHA1
 - SHA224
 - SHA256
 - SHA384
 - SHA512
-- CRC32
+- CRC32 (well, kind of hash)
+
+#####Cipher
+- ChaCha20
 
 ####[Why?](https://github.com/krzyzanowskim/CryptoSwift/issues/5)
 
@@ -30,9 +35,9 @@ CryptoHash enum usage
 
     import CryptoSwift
     
-    /* CryptoHash enum usage */
+    /* Hash enum usage */
     var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
-    if let data = CryptoSwift.Hash.md5.hash(data) {
+    if let data = CryptoSwift.Hash.md5.calculate(data) {
         println(data.hexString)
     }