Эх сурвалжийг харах

Take dkLen parameter into account for returned value #270 (cherry-pick)

Marcin Krzyżanowski 9 жил өмнө
parent
commit
e740fc4e82

+ 8 - 1
CryptoSwiftTests/PBKDF.swift

@@ -33,4 +33,11 @@ class PBKDF: XCTestCase {
         XCTAssert(value.toHexString() == "a53cf3df485e5cd91c17c4978048e3ca86e03cced5f748fb55eff9c1edfce7f9f490c0beee768b85c1ba14ec5750cf059fea52565ffd9e4f9dba01c5c953955e7f1012b6a9eb40629ce767982e598df9081048e22781b35187c16d61ac43f69b88630a9e80233b4c58bdc74ea5c06b5bb1b2c2a86e3ddc2775b852c4508ac85a6a47c0e23a3d8dc6e4dca583", "PBKDF2 fail")
         XCTAssert(value.toHexString() == "a53cf3df485e5cd91c17c4978048e3ca86e03cced5f748fb55eff9c1edfce7f9f490c0beee768b85c1ba14ec5750cf059fea52565ffd9e4f9dba01c5c953955e7f1012b6a9eb40629ce767982e598df9081048e22781b35187c16d61ac43f69b88630a9e80233b4c58bdc74ea5c06b5bb1b2c2a86e3ddc2775b852c4508ac85a6a47c0e23a3d8dc6e4dca583", "PBKDF2 fail")
     }
     }
 
 
-}
+    func test_pbkdf2_length() {
+        let password: Array<UInt8> = "s33krit".utf8.map {$0}
+        let salt: Array<UInt8> = "nacl".utf8.map {$0}
+        let value = try! PKCS5.PBKDF2(password: password, salt: salt, iterations: 2, keyLength: 8, variant: .sha1).calculate()
+        XCTAssert(value.toHexString() == "a53cf3df485e5cd9", "PBKDF2 fail")
+    }
+
+}

+ 4 - 3
Sources/CryptoSwift/PKCS5/PBKDF2.swift

@@ -27,6 +27,7 @@ public extension PKCS5 {
         private let salt: Array<UInt8>   // S
         private let salt: Array<UInt8>   // S
         private let iterations: Int // c
         private let iterations: Int // c
         private let numBlocks: UInt // l
         private let numBlocks: UInt // l
+        private let dkLen: Int;
         private let prf: HMAC
         private let prf: HMAC
 
 
         /// - parameters:
         /// - parameters:
@@ -41,7 +42,8 @@ public extension PKCS5 {
                 throw Error.InvalidInput
                 throw Error.InvalidInput
             }
             }
 
 
-            let keyLengthFinal = Double(keyLength ?? variant.size)
+            self.dkLen = keyLength ?? variant.size
+            let keyLengthFinal = Double(self.dkLen)
             let hLen = Double(prf.variant.size)
             let hLen = Double(prf.variant.size)
             if keyLengthFinal > (pow(2,32) - 1) * hLen {
             if keyLengthFinal > (pow(2,32) - 1) * hLen {
                 throw Error.DerivedKeyTooLong
                 throw Error.DerivedKeyTooLong
@@ -51,7 +53,6 @@ public extension PKCS5 {
             self.iterations = iterations
             self.iterations = iterations
             self.prf = prf
             self.prf = prf
 
 
-
             self.numBlocks = UInt(ceil(Double(keyLengthFinal) / hLen))  // l = ceil(keyLength / hLen)
             self.numBlocks = UInt(ceil(Double(keyLengthFinal) / hLen))  // l = ceil(keyLength / hLen)
         }
         }
 
 
@@ -63,7 +64,7 @@ public extension PKCS5 {
                     ret.appendContentsOf(value)
                     ret.appendContentsOf(value)
                 }
                 }
             }
             }
-            return ret
+            return Array(ret.prefix(self.dkLen))
         }
         }
     }
     }
 }
 }