Fix a decryption bug

This commit is contained in:
Yishi Lin 2019-09-30 00:12:54 +08:00
parent 3de2dbf8dc
commit 6b00d4911b
2 changed files with 21 additions and 7 deletions

View file

@ -47,10 +47,12 @@ struct GopenPgp: PgpInterface {
} }
private func createPgpMessage(from encryptedData: Data) -> CryptoPGPMessage? { private func createPgpMessage(from encryptedData: Data) -> CryptoPGPMessage? {
if SharedDefaults[.encryptInArmored] { // Important note:
var error: NSError? // Even if SharedDefaults[.encryptInArmored] is true now, it could be different during the encryption.
let message = CryptoNewPGPMessageFromArmored(String(data: encryptedData, encoding: .ascii), &error) var error: NSError?
return error == nil ? message : nil let message = CryptoNewPGPMessageFromArmored(String(data: encryptedData, encoding: .ascii), &error)
if error == nil {
return message
} }
return CryptoNewPGPMessage(encryptedData.mutable as Data) return CryptoNewPGPMessage(encryptedData.mutable as Data)
} }

View file

@ -7,11 +7,14 @@
// //
import XCTest import XCTest
import SwiftyUserDefaults
@testable import passKit @testable import passKit
class PGPAgentTest: XCTestCase { class PGPAgentTest: XCTestCase {
enum ValidationError: Error {
case emptyName
}
private var keychain: KeyStore! private var keychain: KeyStore!
private var pgpAgent: PGPAgent! private var pgpAgent: PGPAgent!
@ -21,15 +24,20 @@ class PGPAgentTest: XCTestCase {
super.setUp() super.setUp()
keychain = DictBasedKeychain() keychain = DictBasedKeychain()
pgpAgent = PGPAgent(keyStore: keychain) pgpAgent = PGPAgent(keyStore: keychain)
UserDefaults().removePersistentDomain(forName: "SharedDefaultsForPGPAgentTest")
SharedDefaults = UserDefaults(suiteName: "SharedDefaultsForPGPAgentTest")!
} }
override func tearDown() { override func tearDown() {
keychain.removeAllContent() keychain.removeAllContent()
UserDefaults().removePersistentDomain(forName: "SharedDefaultsForPGPAgentTest")
super.tearDown() 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) let encryptedData = try pgpAgent.encrypt(plainData: testData)
SharedDefaults[.encryptInArmored] = encryptInArmoredNow
return try pgpAgent.decrypt(encryptedData: encryptedData, requestPGPKeyPassphrase: requestPassphrase) return try pgpAgent.decrypt(encryptedData: encryptedData, requestPGPKeyPassphrase: requestPassphrase)
} }
@ -47,7 +55,11 @@ class PGPAgentTest: XCTestCase {
XCTAssert(pgpAgent.isPrepared) XCTAssert(pgpAgent.isPrepared)
try pgpAgent.initKeys() try pgpAgent.initKeys()
XCTAssert(pgpAgent.keyId!.lowercased().hasSuffix(keyTriple.fingerprint)) 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)
}
} }
} }