So the system can have multiple private keys, and the caller doesn't need to specify a specific one regardless. Ideally: If there are several matches we could also take into account which keys have already been unlocked (or passthrases saved in keychain). Right now it only grabs the first match.
78 lines
2.3 KiB
Swift
78 lines
2.3 KiB
Swift
//
|
|
// MockPGPInterface.swift
|
|
// passKitTests
|
|
//
|
|
|
|
import Foundation
|
|
@testable import passKit
|
|
|
|
class MockPGPInterface: PGPInterface {
|
|
// MARK: - Configuration
|
|
|
|
var keyIDs: [String] = []
|
|
var shortKeyIDs: [String] = []
|
|
var publicKeyIDs: Set<String> = []
|
|
var privateKeyIDs: Set<String> = []
|
|
|
|
var decryptResult: Data?
|
|
var decryptError: Error?
|
|
var encryptResult = Data()
|
|
var encryptError: Error?
|
|
|
|
/// When set, the mock calls `passPhraseForKey` with this key ID during `decrypt`,
|
|
/// simulating the PGP backend selecting a key and requesting its passphrase.
|
|
var selectedKeyForPassphrase: String?
|
|
|
|
// MARK: - Call tracking
|
|
|
|
struct DecryptCall {
|
|
let encryptedData: Data
|
|
let keyID: String?
|
|
let passPhraseForKey: (String) -> String
|
|
}
|
|
|
|
struct EncryptCall {
|
|
let plainData: Data
|
|
let keyID: String?
|
|
}
|
|
|
|
var decryptCalls: [DecryptCall] = []
|
|
var resolvedPassphrases: [String] = []
|
|
var encryptCalls: [EncryptCall] = []
|
|
var containsPublicKeyCalls: [String] = []
|
|
var containsPrivateKeyCalls: [String] = []
|
|
|
|
// MARK: - PGPInterface
|
|
|
|
func decrypt(encryptedData: Data, keyIDHint keyID: String?, passPhraseForKey: @escaping (String) -> String) throws -> Data? {
|
|
decryptCalls.append(DecryptCall(encryptedData: encryptedData, keyID: keyID, passPhraseForKey: passPhraseForKey))
|
|
if let selectedKey = selectedKeyForPassphrase {
|
|
resolvedPassphrases.append(passPhraseForKey(selectedKey))
|
|
}
|
|
if let error = decryptError {
|
|
throw error
|
|
}
|
|
return decryptResult
|
|
}
|
|
|
|
func encrypt(plainData: Data, keyID: String?) throws -> Data {
|
|
encryptCalls.append(EncryptCall(plainData: plainData, keyID: keyID))
|
|
if let error = encryptError {
|
|
throw error
|
|
}
|
|
return encryptResult
|
|
}
|
|
|
|
func containsPublicKey(with keyID: String) -> Bool {
|
|
containsPublicKeyCalls.append(keyID)
|
|
return publicKeyIDs.contains { $0.hasSuffix(keyID.lowercased()) }
|
|
}
|
|
|
|
func containsPrivateKey(with keyID: String) -> Bool {
|
|
containsPrivateKeyCalls.append(keyID)
|
|
return privateKeyIDs.contains { $0.hasSuffix(keyID.lowercased()) }
|
|
}
|
|
|
|
var keyID: [String] { keyIDs }
|
|
var shortKeyID: [String] { shortKeyIDs }
|
|
}
|