diff --git a/enzevalos_iphone/SwiftPGP.swift b/enzevalos_iphone/SwiftPGP.swift index b1893833fdd2350516907da649e4de5ba89103bd..3d64c20a3f46cbb48b1d118a90c7fcda00e3266e 100644 --- a/enzevalos_iphone/SwiftPGP.swift +++ b/enzevalos_iphone/SwiftPGP.swift @@ -592,37 +592,35 @@ class SwiftPGP: Encryption { return CryptoObject(chiphertext: data, plaintext: plaintext, decryptedData: plaindata, sigState: sigState, encState: encState, signKey: sigKeyID, encType: CryptoScheme.PGP, signedAdrs: signedAdr) } - //jus a help function for findMailForKey + // A help function for findMailForSecrectKey and findNotSignedMailForPublicKey func keyAsKeyList(keyID: String) -> [Key] { var keyList = [Key]() - let key: Key = loadKey(id: keyID)! - keyList.append(key) + if let key: Key = loadKey(id: keyID) { + keyList.append(key) + } return keyList } - // finds undecrypted mails in persistent mails and and tries to decrypt with the incoming secret key + // Finds undecrypted mails in persistent mails and and tries to decrypt with the incoming secret key func findMailForSecretKey(keyID: String) { - //var data: Data? = nil var encState = EncryptionState.UnableToDecrypt var plaindata: Data? = nil let key: [Key] = keyAsKeyList(keyID: keyID) let datahandler = DataHandler.handler let mailList = datahandler.getAllNotDecryptedPersistentMail() for mail in mailList { - // change data - guard let data = mail.body?.data(using: .utf8) else{ - return + // Change data + guard let data = mail.body?.data(using: .utf8) else { + return } - // try to decrypt mail + // Try to decrypt mail (plaindata, encState) = decryptMessage(data: data, keys: key, encForCurrentSK: true) - if encState == EncryptionState.ValidedEncryptedWithCurrentKey { - // update database + if let plaindata = plaindata, encState == EncryptionState.ValidedEncryptedWithCurrentKey || encState == EncryptionState.ValidEncryptedWithOldKey { + // Update database mail.isEncrypted = true mail.unableToDecrypt = false - let plaintext = String(data: plaindata!, encoding: .utf8) - mail.body = plaintext - datahandler.save(during: "") - + mail.body = String.init(data: plaindata, encoding: .utf8) + datahandler.save(during: "decryption of older mails") } } } @@ -653,6 +651,28 @@ class SwiftPGP: Encryption { return (nil, EncryptionState.NoEncryption) } + // Finds unsigned mails in persistent mails and and tries to verify them with the incoming public key + func findNotSignedMailForPublicKey(keyID: String) { + var sigState = SignatureState.NoPublicKey + let key: [Key] = keyAsKeyList(keyID: keyID) + let datahandler = DataHandler.handler + let mailList = datahandler.getAllNotSignedPersistentMail() + for mail in mailList { + // Change data + guard let data = mail.body?.data(using: .utf8) else { + return + } + // Try to verify mail signature + sigState = verifySignature(data: data, attachedSignature: nil, keys: key) + if sigState == SignatureState.ValidSignature { + // Update database + mail.isSigned = true + mail.isCorrectlySigned = true + datahandler.save(during: "verifying of older mails") + } + } + } + private func verifySignature(sigString: String, attachedSignature: Data?, keys: [Key]) -> SignatureState { if let unarmored = try? Armor.readArmored(sigString){ return verifySignature(data: unarmored, attachedSignature: attachedSignature, keys: keys) diff --git a/enzevalos_iphoneTests/CoreDataTests.swift b/enzevalos_iphoneTests/CoreDataTests.swift index 68cbb78f224b3c18010b2ea0aa8b43525db492dd..1386de55de99d70db3269cc90691135afb542dc4 100644 --- a/enzevalos_iphoneTests/CoreDataTests.swift +++ b/enzevalos_iphoneTests/CoreDataTests.swift @@ -68,7 +68,7 @@ class CoraDataTests: XCTestCase { super.tearDown() } - //test for generating list of mails with missing secret key (unable to decrypt) + // Test for generating list of mails with missing secret key (unable to decrypt) func testGetAllFilteredMails() { guard let from = MCOAddress(mailbox: "sender@example.com") else { @@ -104,45 +104,42 @@ class CoraDataTests: XCTestCase { } } - - // generate a test secret key - func testkey()->(String){ + // Generate a test secret key + func testkey() -> (String){ let testsender = createUser() let testkeyID = pgp.generateKey(adr: testsender.mailbox, new: true) return testkeyID } - // test decryption of all undecrypted mails with new secret key - func testfindMailForSecretKey(){ + // Test decryption of all undecrypted mails with new secret key + func testfindMailForSecretKey() { let testkeyID = testkey() let swiftpgp = SwiftPGP() // E-Mail generieren - - guard let from = MCOAddress(mailbox: "sender@example.com") - else { + guard let from = MCOAddress(mailbox: "sender@example.com") else { return } - // create test mail + // Create test Mail guard let m1 = testMail(from: from, to: [user], cc: [], bcc: []) else { XCTFail("No test mail") return } - // create ciphertext + // Create Ciphertext let body = "encrypted text" let senderPGP = SwiftPGP() let encryptedObject = senderPGP.encrypt(plaintext: body, ids: [testkeyID], myId: "") XCTAssert(encryptedObject.encryptionState == .ValidedEncryptedWithCurrentKey && encryptedObject.signatureState == .NoSignature) guard let cipher = encryptedObject.chiperString else { - XCTFail("No chipher data") - return + XCTFail("No chipher data") + return } - // change mail + // Change Mail m1.unableToDecrypt = true m1.body = cipher @@ -151,10 +148,7 @@ class CoraDataTests: XCTestCase { swiftpgp.findMailForSecretKey(keyID: testkeyID) XCTAssertEqual(m1.body, "encrypted text") XCTAssertFalse(m1.unableToDecrypt) - } - - func createUser(adr: String = String.random().lowercased(), name: String = String.random()) -> MCOAddress { return MCOAddress.init(displayName: name, mailbox: adr.lowercased())