import CommonCrypto import Foundation func pbkdf2(hash: CCPBKDFAlgorithm, password: String, salt: Data, keyByteCount: Int, rounds: Int) -> Data? { let passwordData = password.data(using: String.Encoding.utf8)! var derivedKeyData = Data(repeating: 0, count: keyByteCount) let derivedKeyDataCount = derivedKeyData.count let derivationStatus = derivedKeyData.withUnsafeMutableBytes { derivedKeyBytes in salt.withUnsafeBytes { saltBytes in CCKeyDerivationPBKDF( CCPBKDFAlgorithm(kCCPBKDF2), password, passwordData.count, saltBytes, salt.count, hash, UInt32(rounds), derivedKeyBytes, derivedKeyDataCount ) } } if derivationStatus != 0 { print("Error: \(derivationStatus)") return nil } return derivedKeyData }