Marcin Krzyżanowski 8 rokov pred
rodič
commit
74648b3d82

+ 1 - 1
CHANGELOG

@@ -1,6 +1,6 @@
 0.7.2
 - Adds typealias PKCS5.Padding()
-- Rename PKCS7() to PKCS7.Padding()
+- Adds Padding enum (.pkcs5, .pkcs7, .noPadding, .zeroPadding)
 - Remove Generics from the public API
 - Improve SHA1, SHA2, SHA3 performance by using unmanaged buffers.
 

+ 1 - 1
CryptoSwift.playground/Contents.swift

@@ -67,7 +67,7 @@ do {
 /*:
  # Padding
  */
-PKCS7().add(to: bytes, blockSize: AES.blockSize)
+Padding.pkcs7.add(to: bytes, blockSize: AES.blockSize)
 
 /*:
  # ChaCha20

+ 10 - 9
README.md

@@ -66,9 +66,10 @@ Good mood
 - [PBKDF2](http://tools.ietf.org/html/rfc2898#section-5.2) (Password-Based Key Derivation Function 2)
 
 #### Data padding
+- PKCS#5
 - [PKCS#7](http://tools.ietf.org/html/rfc5652#section-6.3)
 - [Zero padding](https://en.wikipedia.org/wiki/Padding_(cryptography)#Zero_padding)
-- NoPadding
+- No padding
 
 ## Why
 [Why?](https://github.com/krzyzanowskim/CryptoSwift/issues/5) [Because I can](https://github.com/krzyzanowskim/CryptoSwift/issues/5#issuecomment-53379391).
@@ -277,10 +278,10 @@ try PKCS5.PBKDF2(password: password, salt: salt, iterations: 4096, variant: .sha
 
 ##### Data Padding
     
-Some content-encryption algorithms assume the input length is a multiple of k octets, where k is greater than one. For such algorithms, the input shall be padded.
+Some content-encryption algorithms assume the input length is a multiple of `k` octets, where `k` is greater than one. For such algorithms, the input shall be padded.
 
 ```swift
-PKCS7.Padding().add(to: bytes, blockSize: AES.blockSize)
+Padding.pkcs7.add(to: bytes, blockSize: AES.blockSize)
 ```
 
 #### Working with Ciphers
@@ -300,8 +301,8 @@ let decrypted = try Rabbit(key: key, iv: iv).decrypt(encrypted)
 ##### Blowfish
 
 ```swift
-let encrypted = try Blowfish(key: key, iv: iv, blockMode: .CBC, padding: PKCS7.Padding()).encrypt(message)
-let decrypted = try Blowfish(key: key, iv: iv, blockMode: .CBC, padding: PKCS7.Padding()).decrypt(encrypted)
+let encrypted = try Blowfish(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).encrypt(message)
+let decrypted = try Blowfish(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).decrypt(encrypted)
 ```
 
 ##### AES
@@ -316,7 +317,7 @@ Variant of AES encryption (AES-128, AES-192, AES-256) depends on given key lengt
 
 AES-256 example
 ```swift
-try AES(key: [1,2,3,...,32], iv: [1,2,3,...,16], blockMode: .CBC, padding: PKCS7.Padding())
+try AES(key: [1,2,3,...,32], iv: [1,2,3,...,16], blockMode: .CBC, padding: .pkcs7)
 ```
  
 ###### All at once
@@ -359,8 +360,8 @@ let key: Array<UInt8> = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 let iv: Array<UInt8> = AES.randomIV(AES.blockSize)
 
 do {
-    let encrypted = try AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7.Padding()).encrypt(input)
-    let decrypted = try AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7.Padding()).decrypt(encrypted)
+    let encrypted = try AES(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).encrypt(input)
+    let decrypted = try AES(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).decrypt(encrypted)
 } catch {
     print(error)
 }    
@@ -370,7 +371,7 @@ AES without data padding
 
 ```swift
 let input: Array<UInt8> = [0,1,2,3,4,5,6,7,8,9]
-let encrypted: Array<UInt8> = try! AES(key: "secret0key000000", iv:"0123456789012345", blockMode: .CBC, padding: NoPadding()).encrypt(input)
+let encrypted: Array<UInt8> = try! AES(key: "secret0key000000", iv:"0123456789012345", blockMode: .CBC, padding: .noPadding).encrypt(input)
 ```
 
 Using convenience extensions

+ 1 - 1
Sources/CryptoSwift/AES.swift

@@ -121,7 +121,7 @@ public final class AES: BlockCipher {
     /// - throws: AES.Error
     ///
     /// - returns: Instance
-    public init(key: Array<UInt8>, iv: Array<UInt8>? = nil, blockMode: BlockMode = .CBC, padding: Padding = PKCS7.Padding()) throws {
+    public init(key: Array<UInt8>, iv: Array<UInt8>? = nil, blockMode: BlockMode = .CBC, padding: Padding = .pkcs7) throws {
         self.key = Key(bytes: key)
         self.blockMode = blockMode
         self.padding = padding

+ 1 - 1
Sources/CryptoSwift/Foundation/AES+Foundation.swift

@@ -18,7 +18,7 @@ import Foundation
 
 extension AES {
 
-    public convenience init(key: String, iv: String, blockMode: BlockMode = .CBC, padding: Padding = PKCS7.Padding()) throws {
+    public convenience init(key: String, iv: String, blockMode: BlockMode = .CBC, padding: Padding = .pkcs7) throws {
         guard let kkey = key.data(using: String.Encoding.utf8, allowLossyConversion: false)?.bytes, let iiv = iv.data(using: String.Encoding.utf8, allowLossyConversion: false)?.bytes else {
             throw Error.invalidKeyOrInitializationVector
         }

+ 1 - 1
Sources/CryptoSwift/Foundation/Blowfish+Foundation.swift

@@ -18,7 +18,7 @@ import Foundation
 
 extension Blowfish {
 
-    public convenience init(key: String, iv: String, blockMode: BlockMode = .CBC, padding: Padding = PKCS7.Padding()) throws {
+    public convenience init(key: String, iv: String, blockMode: BlockMode = .CBC, padding: Padding = .pkcs7) throws {
         guard let kkey = key.data(using: String.Encoding.utf8, allowLossyConversion: false)?.bytes, let iiv = iv.data(using: String.Encoding.utf8, allowLossyConversion: false)?.bytes else {
             throw Error.invalidKeyOrInitializationVector
         }

+ 1 - 1
Sources/CryptoSwift/NoPadding.swift

@@ -14,7 +14,7 @@
 //  - This notice may not be removed or altered from any source or binary distribution.
 //
 
-public struct NoPadding: Padding {
+public struct NoPadding: PaddingProtocol {
 
     public init() {
     }

+ 1 - 1
Sources/CryptoSwift/PKCS/PKCS7Padding.swift

@@ -18,7 +18,7 @@
 //  and published by RSA Security Inc, starting in the early 1990s.
 //
 
-public struct PKCS7Padding: Padding {
+public struct PKCS7Padding: PaddingProtocol {
 
     public enum Error: Swift.Error {
         case invalidPaddingValue

+ 31 - 1
Sources/CryptoSwift/Padding.swift

@@ -14,7 +14,37 @@
 //  - This notice may not be removed or altered from any source or binary distribution.
 //
 
-public protocol Padding {
+public protocol PaddingProtocol {
     func add(to: Array<UInt8>, blockSize: Int) -> Array<UInt8>
     func remove(from: Array<UInt8>, blockSize: Int?) -> Array<UInt8>
 }
+
+public enum Padding: PaddingProtocol {
+    case noPadding, zeroPadding, pkcs7, pkcs5
+
+    public func add(to: Array<UInt8>, blockSize: Int) -> Array<UInt8> {
+        switch self {
+        case .noPadding:
+            return NoPadding().add(to: to, blockSize: blockSize)
+        case .zeroPadding:
+            return ZeroPadding().add(to: to, blockSize: blockSize)
+        case .pkcs7:
+            return PKCS7.Padding().add(to: to, blockSize: blockSize)
+        case .pkcs5:
+            return PKCS5.Padding().add(to: to, blockSize: blockSize)
+        }
+    }
+
+    public func remove(from: Array<UInt8>, blockSize: Int?) -> Array<UInt8> {
+        switch self {
+        case .noPadding:
+            return NoPadding().remove(from: from, blockSize: blockSize)
+        case .zeroPadding:
+            return ZeroPadding().remove(from: from, blockSize: blockSize)
+        case .pkcs7:
+            return PKCS7.Padding().remove(from: from, blockSize: blockSize)
+        case .pkcs5:
+            return PKCS5.Padding().remove(from: from, blockSize: blockSize)
+        }
+    }
+}

+ 1 - 1
Sources/CryptoSwift/ZeroPadding.swift

@@ -16,7 +16,7 @@
 
 /// All the bytes that are required to be padded are padded with zero.
 /// Zero padding may not be reversible if the original file ends with one or more zero bytes.
-public struct ZeroPadding: Padding {
+public struct ZeroPadding: PaddingProtocol {
 
     public init() {
     }