Browse Source

Throw appropriate error for case with missing data padding #350

Marcin Krzyżanowski 9 years ago
parent
commit
cd18d11a8b
1 changed files with 16 additions and 6 deletions
  1. 16 6
      Sources/CryptoSwift/AES.swift

+ 16 - 6
Sources/CryptoSwift/AES.swift

@@ -128,7 +128,12 @@ final public class AES: BlockCipher {
 
 // MARK: Private
 fileprivate extension AES {
-    func encryptBlock(_ block:Array<UInt8>) -> Array<UInt8>? {
+    func encrypt(block: Array<UInt8>) -> Array<UInt8>? {
+
+        if blockMode.options.contains(.PaddingRequired) && block.count != AES.blockSize {
+            return block
+        }
+
         let rounds = self.variant.Nr
         let rk = self.expandedKey
         var b = block[block.indices].toUInt32Array()
@@ -192,9 +197,14 @@ fileprivate extension AES {
         return out
     }
 
-    func decryptBlock(_ block:Array<UInt8>) -> Array<UInt8>? {
+    func decrypt(block: Array<UInt8>) -> Array<UInt8>? {
+
+        if blockMode.options.contains(.PaddingRequired) && block.count != AES.blockSize {
+            return block
+        }
+
         let rounds = self.variant.Nr
-        let rk = expandedKeyInv
+        let rk = self.expandedKeyInv
         var b = block[block.indices].toUInt32Array()
 
         var t = Array<UInt32>(repeating: 0, count: 4)
@@ -416,7 +426,7 @@ extension AES {
 
         init(aes: AES) {
             self.padding = aes.padding;
-            self.worker = aes.blockMode.worker(aes.iv, cipherOperation: aes.encryptBlock)
+            self.worker = aes.blockMode.worker(aes.iv, cipherOperation: aes.encrypt)
             self.paddingRequired = aes.blockMode.options.contains(.PaddingRequired)
         }
 
@@ -457,9 +467,9 @@ extension AES {
             switch (aes.blockMode) {
             case .CFB, .OFB, .CTR:
                 // CFB, OFB, CTR uses encryptBlock to decrypt
-                self.worker = aes.blockMode.worker(aes.iv, cipherOperation: aes.encryptBlock)
+                self.worker = aes.blockMode.worker(aes.iv, cipherOperation: aes.encrypt)
             default:
-                self.worker = aes.blockMode.worker(aes.iv, cipherOperation: aes.decryptBlock)
+                self.worker = aes.blockMode.worker(aes.iv, cipherOperation: aes.decrypt)
             }
 
             self.paddingRequired = aes.blockMode.options.contains(.PaddingRequired);