浏览代码

Fix CFB, OFB, CTR modes for Blowfish. Fixes #415

Marcin Krzyżanowski 8 年之前
父节点
当前提交
2e11d15e5d
共有 2 个文件被更改,包括 20 次插入2 次删除
  1. 6 1
      Sources/CryptoSwift/Blowfish.swift
  2. 14 1
      Tests/CryptoSwiftTests/BlowfishTests.swift

+ 6 - 1
Sources/CryptoSwift/Blowfish.swift

@@ -25,7 +25,12 @@ public final class Blowfish {
     fileprivate let blockMode: BlockMode
     fileprivate let padding: Padding
     fileprivate lazy var decryptWorker: BlockModeWorker = {
-        return self.blockMode.worker(self.iv, cipherOperation: self.decrypt)
+        switch (self.blockMode) {
+            case .CFB, .OFB, .CTR:
+                return self.blockMode.worker(self.iv, cipherOperation: self.encrypt)
+            default:
+                return self.blockMode.worker(self.iv, cipherOperation: self.decrypt)
+        }
     }()
     fileprivate lazy var encryptWorker: BlockModeWorker = {
         return self.blockMode.worker(self.iv, cipherOperation: self.encrypt)

+ 14 - 1
Tests/CryptoSwiftTests/BlowfishTests.swift

@@ -187,6 +187,18 @@ class BlowfishTests: XCTestCase {
             XCTFail(error.localizedDescription)
         }
     }
+
+    // https://github.com/krzyzanowskim/CryptoSwift/issues/415
+    func testDecryptCFB415() {
+        do {
+            let plaintext = Array("secret12".utf8)
+            let encrypted = try Blowfish(key: "passwordpassword", iv: "12345678", blockMode: .CFB, padding: NoPadding()).encrypt(plaintext)
+            let decrypted = try Blowfish(key: "passwordpassword", iv: "12345678", blockMode: .CFB, padding: NoPadding()).decrypt(encrypted)
+            XCTAssertEqual(plaintext, decrypted)
+        } catch {
+            XCTFail(error.localizedDescription)
+        }
+    }
 }
 
 extension BlowfishTests {
@@ -196,7 +208,8 @@ extension BlowfishTests {
             ("testEncrypt", testEncrypt),
             ("testDecrypt", testDecrypt),
             ("testCBCZeroPadding", testCBCZeroPadding),
-            ("testEncryptDecrypt", testEncryptDecrypt)
+            ("testEncryptDecrypt", testEncryptDecrypt),
+            ("testDecryptCFB415",testDecryptCFB415),
         ]
         return tests
     }