Browse Source

Padding protocol, first step to generalize Paddings

Marcin Krzyżanowski 10 years ago
parent
commit
2ceae1f186

+ 4 - 4
CryptoSwift.xcodeproj/project.pbxproj

@@ -24,7 +24,6 @@
 		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 */; };
 		757DA2511A4E5E95002BA3EF /* PaddingMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA2501A4E5E95002BA3EF /* PaddingMode.swift */; };
 		757DA2531A4ED0A4002BA3EF /* PaddingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA2521A4ED0A4002BA3EF /* PaddingTests.swift */; };
 		757DA2551A4ED408002BA3EF /* AESTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA2541A4ED408002BA3EF /* AESTests.swift */; };
@@ -40,6 +39,7 @@
 		758F3F781992F6CE0014BBDA /* UInt8Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758F3F771992F6CE0014BBDA /* UInt8Extension.swift */; };
 		7599C9C6199EA28700A3988B /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7599C9C5199EA28700A3988B /* StringExtension.swift */; };
 		759D481119B517BC005FF7FC /* BitExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 759D481019B517BC005FF7FC /* BitExtension.swift */; };
+		75A663A61AA0CAD00052110B /* Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A663A51AA0CAD00052110B /* Padding.swift */; };
 		75A74B271A1FF6B2004419F1 /* AES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A74B261A1FF6B2004419F1 /* AES.swift */; };
 		75B601EB197D6A6C0009B53D /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; };
 		75BC3AE31A4E412000ADF343 /* CipherBlockMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BC3AE21A4E412000ADF343 /* CipherBlockMode.swift */; };
@@ -136,7 +136,6 @@
 		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>"; };
 		756BFDCA1A82B87300B9D9A4 /* Bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bridging.h; sourceTree = "<group>"; };
-		757DA24E1A4E59F2002BA3EF /* PKCS7.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PKCS7.swift; sourceTree = "<group>"; };
 		757DA2501A4E5E95002BA3EF /* PaddingMode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaddingMode.swift; sourceTree = "<group>"; };
 		757DA2521A4ED0A4002BA3EF /* PaddingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaddingTests.swift; sourceTree = "<group>"; };
 		757DA2541A4ED408002BA3EF /* AESTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AESTests.swift; sourceTree = "<group>"; };
@@ -151,6 +150,7 @@
 		758F3F771992F6CE0014BBDA /* UInt8Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UInt8Extension.swift; sourceTree = "<group>"; };
 		7599C9C5199EA28700A3988B /* StringExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = "<group>"; };
 		759D481019B517BC005FF7FC /* BitExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BitExtension.swift; sourceTree = "<group>"; };
+		75A663A51AA0CAD00052110B /* Padding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Padding.swift; sourceTree = "<group>"; };
 		75A74B261A1FF6B2004419F1 /* AES.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AES.swift; sourceTree = "<group>"; };
 		75BC3AE21A4E412000ADF343 /* CipherBlockMode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CipherBlockMode.swift; sourceTree = "<group>"; };
 		75D94E2319B60C08007CB2A4 /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = "<group>"; };
@@ -225,7 +225,7 @@
 				751C5C3C19B26B000094C75D /* Poly1305.swift */,
 				758A94251A65AEB100E46135 /* HMAC.swift */,
 				75A74B261A1FF6B2004419F1 /* AES.swift */,
-				757DA24E1A4E59F2002BA3EF /* PKCS7.swift */,
+				75A663A51AA0CAD00052110B /* Padding.swift */,
 				759D481019B517BC005FF7FC /* BitExtension.swift */,
 				758F3F771992F6CE0014BBDA /* UInt8Extension.swift */,
 				7547195019931802002FA5F1 /* IntExtension.swift */,
@@ -402,6 +402,7 @@
 				7563B2E819B14D4300B152CD /* Cipher.swift in Sources */,
 				752E087B199FF27C005B0EA0 /* SHA1.swift in Sources */,
 				75EB380119ABDD710002375A /* ChaCha20.swift in Sources */,
+				75A663A61AA0CAD00052110B /* Padding.swift in Sources */,
 				750A54601992D2680017DA75 /* MD5.swift in Sources */,
 				75164E4919AD30AC00737F30 /* Utils.swift in Sources */,
 				758A94261A65AEB100E46135 /* HMAC.swift in Sources */,
@@ -415,7 +416,6 @@
 				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 /* UInt8Extension.swift in Sources */,

+ 2 - 2
CryptoSwift/AES.swift

@@ -144,7 +144,7 @@ public class AES {
         var finalMessage = message;
 
         if (addPadding) {
-            finalMessage = PKCS7(data: message).addPadding(AES.blockSizeBytes())
+            finalMessage = PKCS7.add(message, blockSize: AES.blockSizeBytes())
         } else if (message.length % AES.blockSizeBytes() != 0) {
             // 128 bit block exceeded, need padding
             assertionFailure("AES 128-bit block exceeded!")
@@ -206,7 +206,7 @@ public class AES {
         }
         
         if (out != nil && removePadding) {
-            return PKCS7(data: NSData.withBytes(out!)).removePadding()
+            return PKCS7.remove(NSData.withBytes(out!))
         }
         
         return out == nil ? nil : NSData.withBytes(out!)

+ 16 - 15
CryptoSwift/PKCS7.swift → CryptoSwift/Padding.swift

@@ -1,27 +1,27 @@
 //
-//  PKCS7.swift
+//  Padding.swift
 //  CryptoSwift
 //
-//  Created by Marcin Krzyzanowski on 27/12/14.
-//  Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
+//  Created by Marcin Krzyzanowski on 27/02/15.
+//  Copyright (c) 2015 Marcin Krzyzanowski. All rights reserved.
 //
 
 import Foundation
 
-public struct PKCS7 {
-    let data:NSData
-    
-    public init(data:NSData) {
-        self.data = data;
-    }
+public protocol Padding {
+    static func add(data: NSData, blockSize:Int) -> NSData;
+    static func remove(data: NSData, blockSize:Int?) -> NSData;
+}
+
+public struct PKCS7: Padding {
     
-    public func addPadding(blockSizeBytes:UInt8) -> NSData {
-        var padding = UInt8(blockSizeBytes) - (UInt8(data.length) % UInt8(blockSizeBytes))
+    public static func add(data: NSData , blockSize:Int) -> NSData {
+        var padding = UInt8(blockSize) - (UInt8(data.length) % UInt8(blockSize))
         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])
+            for i in 0..<blockSize {
+                withPadding.appendBytes([UInt8(blockSize)])
             }
         } else {
             // The value of each added byte is the number of bytes that are added
@@ -32,7 +32,8 @@ public struct PKCS7 {
         return withPadding
     }
     
-    public func removePadding() -> NSData {
+    public static func remove(data: NSData, blockSize:Int? = nil) -> NSData
+    {
         var padding:UInt8 = 0
         data.subdataWithRange(NSRange(location: data.length - 1, length: 1)).getBytes(&padding, length: 1)
         
@@ -41,4 +42,4 @@ public struct PKCS7 {
         }
         return data
     }
-}
+}

+ 22 - 22
CryptoSwift/PaddingMode.swift

@@ -8,25 +8,25 @@
 
 import Foundation
 
-public enum PaddingMode:Int {
-    case None, PKCS_7
-    
-    public func addPadding(data:NSData, blockSizeBytes:Int) -> NSData {
-        switch (self) {
-        case PKCS_7:
-            return PKCS7(data: data).addPadding(UInt8(blockSizeBytes))
-        case None:
-            return data
-        }
-    }
-    
-    public func removePadding(data:NSData) -> NSData {
-        switch (self) {
-        case PKCS_7:
-            return PKCS7(data: data).removePadding()
-        case None:
-            return data
-        }
-    }
-
-}
+//public enum PaddingMode:Int {
+//    case None, PKCS_7
+//    
+//    public func addPadding(data:NSData, blockSizeBytes:Int) -> NSData {
+//        switch (self) {
+//        case PKCS_7:
+//            return PKCS7.add(data, blockSize: blockSizeBytes)
+//        case None:
+//            return data
+//        }
+//    }
+//    
+//    public func removePadding(data:NSData) -> NSData {
+//        switch (self) {
+//        case PKCS_7:
+//            return PKCS7.remove(data)
+//        case None:
+//            return data
+//        }
+//    }
+//
+//}

+ 7 - 1
CryptoSwift/Playground/CryptoPlayground.playground/section-1.swift

@@ -4,4 +4,10 @@ import Foundation
 import CryptoSwift
 
 let plaintext = "Lorem ipsum"
-let MD5 = plaintext.md5()
+let MD5 = plaintext.md5()
+
+
+func foo(param:String) -> Bool {
+    assertionFailure("Don't")
+    return false
+}

+ 6 - 6
CryptoSwiftTests/PaddingTests.swift

@@ -14,27 +14,27 @@ class PaddingTests: XCTestCase {
     func testPKCS7_0() {
         let input:[UInt8]    = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]
         let expected:[UInt8] = [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)
+        let padded = PKCS7.add(NSData.withBytes(input), blockSize: 16)
         XCTAssertEqual(padded, NSData.withBytes(expected), "PKCS7 failed")
-        let clean = PKCS7(data: padded).removePadding()
+        let clean = PKCS7.remove(padded)
         XCTAssertEqual(clean, NSData.withBytes(input), "PKCS7 failed")
     }
     
     func testPKCS7_1() {
         let input:[UInt8]    = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]
         let expected:[UInt8] = [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)
+        let padded = PKCS7.add(NSData.withBytes(input), blockSize: 16)
         XCTAssertEqual(padded, NSData.withBytes(expected), "PKCS7 failed")
-        let clean = PKCS7(data: padded).removePadding()
+        let clean = PKCS7.remove(padded)
         XCTAssertEqual(clean, NSData.withBytes(input), "PKCS7 failed")
     }
     
     func testPKCS7_2() {
         let input:[UInt8]    = [1,2,3,4,5,6,7,8,9,0,1,2,3,4]
         let expected:[UInt8] = [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)
+        let padded = PKCS7.add(NSData.withBytes(input), blockSize: 16)
         XCTAssertEqual(padded, NSData.withBytes(expected), "PKCS7 failed")
-        let clean = PKCS7(data: padded).removePadding()
+        let clean = PKCS7.remove(padded)
         XCTAssertEqual(clean, NSData.withBytes(input), "PKCS7 failed")
     }
 }