Ver Fonte

Make numBlocks Int and avoid unnecessary conversion

Marcin Krzyżanowski há 9 anos atrás
pai
commit
e2b0528dae
1 ficheiros alterados com 8 adições e 5 exclusões
  1. 8 5
      Sources/CryptoSwift/PKCS5/PBKDF2.swift

+ 8 - 5
Sources/CryptoSwift/PKCS5/PBKDF2.swift

@@ -5,6 +5,8 @@
 //  Created by Marcin Krzyzanowski on 05/04/16.
 //  Copyright © 2016 Marcin Krzyzanowski. All rights reserved.
 //
+//  https://www.ietf.org/rfc/rfc2898.txt
+//
 
 #if os(Linux)
     import Glibc
@@ -26,7 +28,7 @@ public extension PKCS5 {
 
         private let salt: Array<UInt8>   // S
         fileprivate let iterations: Int // c
-        private let numBlocks: UInt // l
+        private let numBlocks: Int // l
         private let dkLen: Int;
         fileprivate let prf: HMAC
 
@@ -55,11 +57,12 @@ public extension PKCS5 {
             self.iterations = iterations
             self.prf = prf
 
-            self.numBlocks = UInt(ceil(Double(keyLengthFinal) / hLen))  // l = ceil(keyLength / hLen)
+            self.numBlocks = Int(ceil(Double(keyLengthFinal) / hLen))  // l = ceil(keyLength / hLen)
         }
 
         public func calculate() -> Array<UInt8> {
             var ret = Array<UInt8>()
+            ret.reserveCapacity(self.numBlocks * self.prf.variant.digestLength)
             for i in 1...self.numBlocks {
                 // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter
                 if let value = calculateBlock(self.salt, blockNum: i) {
@@ -72,7 +75,7 @@ public extension PKCS5 {
 }
 
 fileprivate extension PKCS5.PBKDF2 {
-    func INT(_ i: UInt) -> Array<UInt8> {
+    func ARR(_ i: Int) -> Array<UInt8> {
         var inti = Array<UInt8>(repeating: 0, count: 4)
         inti[0] = UInt8((i >> 24) & 0xFF)
         inti[1] = UInt8((i >> 16) & 0xFF)
@@ -83,8 +86,8 @@ fileprivate extension PKCS5.PBKDF2 {
 
     // F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
     // U_1 = PRF (P, S || INT (i))
-    func calculateBlock(_ salt: Array<UInt8>, blockNum: UInt) -> Array<UInt8>? {
-        guard let u1 = try? prf.authenticate(salt + INT(blockNum)) else {
+    func calculateBlock(_ salt: Array<UInt8>, blockNum: Int) -> Array<UInt8>? {
+        guard let u1 = try? prf.authenticate(salt + ARR(blockNum)) else { // blockNum.bytes() is slower
             return nil
         }