diff --git a/passKit/Crypto/GopenPgp.swift b/passKit/Crypto/GopenPgp.swift index af35526..24e5684 100644 --- a/passKit/Crypto/GopenPgp.swift +++ b/passKit/Crypto/GopenPgp.swift @@ -47,10 +47,12 @@ struct GopenPgp: PgpInterface { } private func createPgpMessage(from encryptedData: Data) -> CryptoPGPMessage? { - if SharedDefaults[.encryptInArmored] { - var error: NSError? - let message = CryptoNewPGPMessageFromArmored(String(data: encryptedData, encoding: .ascii), &error) - return error == nil ? message : nil + // Important note: + // Even if SharedDefaults[.encryptInArmored] is true now, it could be different during the encryption. + var error: NSError? + let message = CryptoNewPGPMessageFromArmored(String(data: encryptedData, encoding: .ascii), &error) + if error == nil { + return message } return CryptoNewPGPMessage(encryptedData.mutable as Data) } diff --git a/passKitTests/Crypto/PGPAgentTest.swift b/passKitTests/Crypto/PGPAgentTest.swift index 6649a62..f60247b 100644 --- a/passKitTests/Crypto/PGPAgentTest.swift +++ b/passKitTests/Crypto/PGPAgentTest.swift @@ -7,11 +7,14 @@ // import XCTest +import SwiftyUserDefaults @testable import passKit class PGPAgentTest: XCTestCase { - + enum ValidationError: Error { + case emptyName + } private var keychain: KeyStore! private var pgpAgent: PGPAgent! @@ -21,15 +24,20 @@ class PGPAgentTest: XCTestCase { super.setUp() keychain = DictBasedKeychain() pgpAgent = PGPAgent(keyStore: keychain) + UserDefaults().removePersistentDomain(forName: "SharedDefaultsForPGPAgentTest") + SharedDefaults = UserDefaults(suiteName: "SharedDefaultsForPGPAgentTest")! } override func tearDown() { keychain.removeAllContent() + UserDefaults().removePersistentDomain(forName: "SharedDefaultsForPGPAgentTest") super.tearDown() } - func basicEncryptDecrypt(using pgpAgent: PGPAgent, requestPassphrase: () -> String = requestPGPKeyPassphrase) throws -> Data? { + func basicEncryptDecrypt(using pgpAgent: PGPAgent, requestPassphrase: () -> String = requestPGPKeyPassphrase, encryptInArmored: Bool = true, encryptInArmoredNow: Bool = true) throws -> Data? { + SharedDefaults[.encryptInArmored] = encryptInArmored let encryptedData = try pgpAgent.encrypt(plainData: testData) + SharedDefaults[.encryptInArmored] = encryptInArmoredNow return try pgpAgent.decrypt(encryptedData: encryptedData, requestPGPKeyPassphrase: requestPassphrase) } @@ -47,7 +55,11 @@ class PGPAgentTest: XCTestCase { XCTAssert(pgpAgent.isPrepared) try pgpAgent.initKeys() XCTAssert(pgpAgent.keyId!.lowercased().hasSuffix(keyTriple.fingerprint)) - XCTAssertEqual(try basicEncryptDecrypt(using: pgpAgent), testData) + try [ + (true, true), (true, false), (false, true), (false, false) + ].forEach{ a, b in + XCTAssertEqual(try basicEncryptDecrypt(using: pgpAgent, encryptInArmored: a, encryptInArmoredNow: b), testData) + } } }