Marcin Krzyżanowski 10 年之前
父节点
当前提交
129b8329c5

+ 4 - 0
CryptoSwift.xcodeproj/project.pbxproj

@@ -24,6 +24,7 @@
 		7552614E1993051E000D2B20 /* Hash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7552614D1993051E000D2B20 /* Hash.swift */; };
 		755FB1DA199E347D00475437 /* ExtensionsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755FB1D9199E347D00475437 /* ExtensionsTest.swift */; };
 		7563B2E819B14D4300B152CD /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7563B2E719B14D4300B152CD /* Cipher.swift */; };
+		757DA24F1A4E59F2002BA3EF /* PKCS7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA24E1A4E59F2002BA3EF /* PKCS7.swift */; };
 		757EF7F519AAA82400586276 /* CRC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757EF7F419AAA82400586276 /* CRC.swift */; };
 		758C764119B61AE500653BC6 /* Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758C764019B61AE500653BC6 /* Generics.swift */; };
 		758C764319B61DE900653BC6 /* UInt16Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758C764219B61DE900653BC6 /* UInt16Extension.swift */; };
@@ -126,6 +127,7 @@
 		7552614D1993051E000D2B20 /* Hash.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hash.swift; sourceTree = "<group>"; };
 		755FB1D9199E347D00475437 /* ExtensionsTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionsTest.swift; sourceTree = "<group>"; };
 		7563B2E719B14D4300B152CD /* Cipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cipher.swift; sourceTree = "<group>"; };
+		757DA24E1A4E59F2002BA3EF /* PKCS7.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PKCS7.swift; sourceTree = "<group>"; };
 		757EF7F419AAA82400586276 /* CRC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CRC.swift; sourceTree = "<group>"; };
 		758C764019B61AE500653BC6 /* Generics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Generics.swift; sourceTree = "<group>"; };
 		758C764219B61DE900653BC6 /* UInt16Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UInt16Extension.swift; sourceTree = "<group>"; };
@@ -205,6 +207,7 @@
 				75EB380019ABDD710002375A /* ChaCha20.swift */,
 				751C5C3C19B26B000094C75D /* Poly1305.swift */,
 				75A74B261A1FF6B2004419F1 /* AES.swift */,
+				757DA24E1A4E59F2002BA3EF /* PKCS7.swift */,
 				759D481019B517BC005FF7FC /* BitExtension.swift */,
 				758F3F771992F6CE0014BBDA /* ByteExtension.swift */,
 				7547195019931802002FA5F1 /* IntExtension.swift */,
@@ -385,6 +388,7 @@
 				75D94E2619B60C4F007CB2A4 /* UInt32Extension.swift in Sources */,
 				75A74B271A1FF6B2004419F1 /* AES.swift in Sources */,
 				755111E819B7B7DF00C2AD86 /* Authenticator.swift in Sources */,
+				757DA24F1A4E59F2002BA3EF /* PKCS7.swift in Sources */,
 				754DD76E19A149AF00E52288 /* CryptoHashBase.swift in Sources */,
 				758C764119B61AE500653BC6 /* Generics.swift in Sources */,
 				758F3F781992F6CE0014BBDA /* ByteExtension.swift in Sources */,

+ 2 - 5
CryptoSwift/AES.swift

@@ -94,11 +94,7 @@ public class AES {
                                0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
                                0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]
     
-    public convenience init?(key:NSData) {
-        self.init(key:key, iv:nil)
-    }
-    
-    public init?(key:NSData, iv:NSData?, blockMode:CipherBlockMode = .CBC) {
+    public init?(key:NSData, iv:NSData? = nil, blockMode:CipherBlockMode = .CBC) {
         self.key = key
         self.iv = iv
         self.blockMode = blockMode
@@ -167,6 +163,7 @@ public class AES {
     
     func decrypt(message:NSData) -> NSData? {
         //TODO: to do
+        assertionFailure("Not implemented")
         return nil
     }
     

+ 7 - 6
CryptoSwift/ChaCha20.swift

@@ -9,6 +9,8 @@
 import Foundation
 
 class ChaCha20 {
+    
+    private let blockSizeBytes = 512 / 8
     private let stateSize = 16
     private var context:Context?
     
@@ -132,7 +134,6 @@ class ChaCha20 {
         if let ctx = context {
             var c:[Byte] = [Byte](count: message.count, repeatedValue: 0)
             
-            let blockSize = 64
             var cPos:Int = 0
             var mPos:Int = 0
             var bytes = message.count
@@ -144,18 +145,18 @@ class ChaCha20 {
                         ctx.input[13] = ctx.input[13] &+ 1
                         /* stopping at 2^70 bytes per nonce is user's responsibility */
                     }
-                    if (bytes <= blockSize) {
+                    if (bytes <= blockSizeBytes) {
                         for (var i = 0; i < bytes; i++) {
                             c[i + cPos] = message[i + mPos] ^ output[i]
                         }
                         return c
                     }
-                    for (var i = 0; i < blockSize; i++) {
+                    for (var i = 0; i < blockSizeBytes; i++) {
                         c[i + cPos] = message[i + mPos] ^ output[i]
                     }
-                    bytes -= blockSize
-                    cPos += blockSize
-                    mPos += blockSize
+                    bytes -= blockSizeBytes
+                    cPos += blockSizeBytes
+                    mPos += blockSizeBytes
                 }
             }
         }

+ 37 - 0
CryptoSwift/PKCS7.swift

@@ -0,0 +1,37 @@
+//
+//  PKCS7.swift
+//  CryptoSwift
+//
+//  Created by Marcin Krzyzanowski on 27/12/14.
+//  Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
+//
+
+import Foundation
+
+public struct PKCS7 {
+    let data:NSData
+    
+    public init(data:NSData) {
+        self.data = data;
+    }
+    
+    public func addPadding(blockSizeBytes:UInt8) -> NSData {
+        var padding:UInt8 = 0
+        while ((data.length + UInt(padding)) % UInt(blockSizeBytes) != 0) {
+            padding++
+        }
+        var withPadding = NSMutableData(data: data)
+        if (padding == 0) {
+            // If the original data is a multiple of N bytes, then an extra block of bytes with value N is added.
+            for i in 0..<blockSizeBytes {
+                withPadding.appendBytes([blockSizeBytes])
+            }
+        } else {
+            // The value of each added byte is the number of bytes that are added
+            for i in 0..<padding {
+                withPadding.appendBytes([padding])
+            }
+        }
+        return withPadding
+    }
+}

+ 22 - 0
CryptoSwiftTests/CipherTests.swift

@@ -227,4 +227,26 @@ class CipherTests: XCTestCase {
             }
         }
     }
+    
+    func testPKCS7_1() {
+        let input:[Byte]    = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]
+        let expected:[Byte] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
+        let padded = PKCS7(data: NSData.withBytes(input)).addPadding(16)
+        XCTAssertEqual(padded, NSData.withBytes(expected), "PKCS7 failed")
+    }
+    
+    func testPKCS7_2() {
+        let input:[Byte]    = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]
+        let expected:[Byte] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,1]
+        let padded = PKCS7(data: NSData.withBytes(input)).addPadding(16)
+        XCTAssertEqual(padded, NSData.withBytes(expected), "PKCS7 failed")
+    }
+
+    func testPKCS7_3() {
+        let input:[Byte]    = [1,2,3,4,5,6,7,8,9,0,1,2,3,4]
+        let expected:[Byte] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,2,2]
+        let padded = PKCS7(data: NSData.withBytes(input)).addPadding(16)
+        XCTAssertEqual(padded, NSData.withBytes(expected), "PKCS7 failed")
+    }
+
 }