diff --git a/enzevalos_iphone/Cryptography.swift b/enzevalos_iphone/Cryptography.swift index 248d2aaedd234cd8faf794f7b14e91a6d4808da5..ee9153c65d75c1e62e6e98197a1f9459accceb54 100644 --- a/enzevalos_iphone/Cryptography.swift +++ b/enzevalos_iphone/Cryptography.swift @@ -11,7 +11,7 @@ import Foundation public protocol Encryption{ // Key handling - func generateKey(adr: String) -> String + func generateKey(adr: String, new: Bool) -> String func importKeys(key: String, pw: String?, isSecretKey: Bool, autocrypt: Bool) throws -> [String] func importKeys(data: Data, pw: String?, secret: Bool) throws-> [String] func importKeysFromFile(file: String, pw: String?) throws -> [String] diff --git a/enzevalos_iphone/DataHandler.swift b/enzevalos_iphone/DataHandler.swift index 1d8a01f2c6f0e596da8bc63b76e8a92c0c7d50be..82be1c3e91584434c74570207d9eabac8d138ecf 100644 --- a/enzevalos_iphone/DataHandler.swift +++ b/enzevalos_iphone/DataHandler.swift @@ -218,7 +218,7 @@ class DataHandler { // Save, load, search - func newSecretKey(keyID: String) -> SecretKey { + func newSecretKey(keyID: String, addPk: Bool) -> SecretKey { let sk: SecretKey if let key = findSecretKey(keyID: keyID) { sk = key @@ -226,20 +226,23 @@ class DataHandler { sk = NSEntityDescription.insertNewObject(forEntityName: "SecretKey", into: managedObjectContext) as! SecretKey sk.keyID = keyID sk.obsolete = false - sk.importedDate = Date() //as NSDate + sk.importedDate = Date() UserManager.storeUserValue(keyID as AnyObject, attribute: Attribute.prefSecretKeyID) let adr = UserManager.loadUserValue(Attribute.userAddr) as! String let name = UserManager.loadUserValue(Attribute.accountname) as? String ?? adr _ = getContact(name: name, address: adr, key: keyID, prefer_enc: true) + if addPk { + newPublicKey(keyID: keyID, cryptoType: CryptoScheme.PGP, adr: adr, autocrypt: false) + } } save(during: "new sk") return sk } - func newSecretKeys(keyIds:[String])-> [SecretKey]{ + func newSecretKeys(keyIds:[String], addPKs: Bool)-> [SecretKey]{ var sks = [SecretKey]() for id in keyIds{ - sks.append(newSecretKey(keyID: id)) + sks.append(newSecretKey(keyID: id, addPk: addPKs)) } return sks } @@ -251,7 +254,7 @@ class DataHandler { } let pgp = SwiftPGP() let key = pgp.generateKey(adr: adr) - let sk = DataHandler.handler.newSecretKey(keyID: key) + let sk = DataHandler.handler.newSecretKey(keyID: key, addPk: false) let pk = DataHandler.handler.newPublicKey(keyID: key, cryptoType: CryptoScheme.PGP, adr: adr, autocrypt: false, newGenerated: true) pk.sentOwnPublicKey = true return sk @@ -715,7 +718,13 @@ class DataHandler { mail.unableToDecrypt = true mail.isEncrypted = true mail.trouble = false - case EncryptionState.ValidEncryptedWithOldKey, EncryptionState.ValidedEncryptedWithCurrentKey: + case EncryptionState.ValidEncryptedWithOldKey: + mail.isEncrypted = true + mail.trouble = false + mail.unableToDecrypt = false + mail.decryptedBody = body + mail.decryptedWithOldPrivateKey = true + case EncryptionState.ValidedEncryptedWithCurrentKey: mail.isEncrypted = true mail.trouble = false mail.unableToDecrypt = false diff --git a/enzevalos_iphone/DebugSettings.swift b/enzevalos_iphone/DebugSettings.swift index 81bfe68d18345d2d7dacd6eb77c2a2934cdd5fbd..10cdfc65d2c2bb4c43014cf56b44e9088eab3995 100644 --- a/enzevalos_iphone/DebugSettings.swift +++ b/enzevalos_iphone/DebugSettings.swift @@ -101,7 +101,7 @@ func importSecretKey(file: String, type: String){ if let path = Bundle.main.path(forResource: file, ofType: type){ let ids = try! pgp.importKeysFromFile(file: path, pw: nil) for id in ids{ - _ = datahandler.newSecretKey(keyID: id) + _ = datahandler.newSecretKey(keyID: id, addPk: true) } } } diff --git a/enzevalos_iphone/PersistentMail +CoreDataProperties.swift b/enzevalos_iphone/PersistentMail +CoreDataProperties.swift index 48336cc5db7b087696ecf6c091933bb4b3531e7b..4636ab69d4e577c95223f408025e0cb6dcfcbc1e 100644 --- a/enzevalos_iphone/PersistentMail +CoreDataProperties.swift +++ b/enzevalos_iphone/PersistentMail +CoreDataProperties.swift @@ -190,7 +190,7 @@ extension PersistentMail { if let sk = secretKey{ let pgp = SwiftPGP() let keyIDs = try pgp.importKeys(key: sk, pw: pw, isSecretKey: true, autocrypt: false) - let sks = DataHandler.handler.newSecretKeys(keyIds: keyIDs) + let sks = DataHandler.handler.newSecretKeys(keyIds: keyIDs, addPKs: true) return sks.count > 0 } return false diff --git a/enzevalos_iphone/SwiftPGP.swift b/enzevalos_iphone/SwiftPGP.swift index aa4e160161687ac0d38073993ae0c7ce5771273a..2e98e1d1f48cb86b570520ba2286622232d0d74c 100644 --- a/enzevalos_iphone/SwiftPGP.swift +++ b/enzevalos_iphone/SwiftPGP.swift @@ -186,8 +186,8 @@ class SwiftPGP: Encryption{ return nil } - func generateKey(adr: String) -> String{ - if oldSecretKeys.count > 0{ + func generateKey(adr: String, new: Bool = false) -> String{ + if oldSecretKeys.count > 0 && !new{ var primkey: Key? for key in oldSecretKeys{ if vaildAddress(key: key).contains(adr){ diff --git a/enzevalos_iphoneTests/CoreDataTests.swift b/enzevalos_iphoneTests/CoreDataTests.swift index d16695a32bbaf37b507968771cf95fe7338bd6ca..b69e4038e5c6f7b944f6658be34fd838a89facc7 100644 --- a/enzevalos_iphoneTests/CoreDataTests.swift +++ b/enzevalos_iphoneTests/CoreDataTests.swift @@ -74,15 +74,21 @@ class CoraDataTests: XCTestCase { func testArrivingMail(){ let sender = createUser() let folder = "INBOX" - XCTAssertNil(datahandler.findMailAddress(adr: sender.mailbox)) + XCTAssertNil( datahandler.findMailAddress(adr: sender.mailbox)) - if let mail = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folder){ + if let mail = testMail(from: sender, to: [user], cc: [user], bcc: [], folder: folder){ XCTAssertFalse(mail.isSecure) XCTAssertFalse(mail.isEncrypted) XCTAssertFalse(mail.isSigned) XCTAssertFalse(mail.trouble) XCTAssertFalse(mail.isCorrectlySigned) + XCTAssert(mail.getCCs().count == 1) + XCTAssert(mail.getCCs()[0].mailAddress == user.mailbox) + XCTAssert(mail.getReceivers().count == 1) + XCTAssert(mail.getReceivers()[0].mailAddress == user.mailbox) + + XCTAssertNotNil(datahandler.findMailAddress(adr: sender.mailbox)) let f = datahandler.findFolder(with: folder) XCTAssertEqual(f.mailsOfFolder.count, 1) @@ -107,7 +113,6 @@ class CoraDataTests: XCTestCase { else { XCTFail("No mail") } - //TODO: May test cc, bbcc fields } func testMultiplePlainMailsFromOne() { @@ -193,11 +198,12 @@ class CoraDataTests: XCTestCase { let cryptoObject1 = senderPGP.encrypt(plaintext: body , ids: [userKeyID], myId: keyID1) _ = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: cryptoObject1) - let keyID2 = pgp.generateKey(adr: sender.mailbox) + let keyID2 = pgp.generateKey(adr: sender.mailbox, new: true) let cryptoObject2 = senderPGP.encrypt(plaintext: body , ids: [userKeyID], myId: keyID2) _ = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: cryptoObject2) let folder = datahandler.findFolder(with: folderName) + XCTAssertEqual(folder.records.count, 2) for record in folder.records { XCTAssertTrue(record.isSecure) @@ -214,22 +220,24 @@ class CoraDataTests: XCTestCase { let (sender, keyID) = createPGPUser() let body = "enc with old key" let folderName = "INBOX" + let oldID = userKeyID var myrecord = datahandler.getKeyRecord(addr: userAdr, keyID: datahandler.prefSecretKey().keyID) XCTAssertEqual(myrecord.keyID, userKeyID) XCTAssertEqual(myrecord.ezContact.records.count, 1) - let cryptoObject1 = pgp.encrypt(plaintext: body , ids: [userKeyID], myId: keyID) + let cryptoObject1 = pgp.encrypt(plaintext: body , ids: [oldID], myId: keyID) _ = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: cryptoObject1) let myContact = datahandler.getContactByAddress(userAdr) if let newKeyIDs = try? pgp.importKeys(key: CryptoTests.importKey, pw: CryptoTests.importPW, isSecretKey: true, autocrypt: false), let newKeyId = newKeyIDs.first { - _ = datahandler.newSecretKey(keyID: newKeyId) + _ = datahandler.newSecretKey(keyID: newKeyId, addPk: true) XCTAssertTrue(newKeyId == datahandler.prefSecretKey().keyID) XCTAssertTrue(userKeyID != newKeyId) - let key = datahandler.findKey(keyID: datahandler.prefSecretKey().keyID!) + let key = datahandler.findSecretKey(keyID: datahandler.prefSecretKey().keyID!) + XCTAssertNotNil(key) XCTAssertTrue(key?.keyID == newKeyId) myrecord = datahandler.getKeyRecord(addr: userAdr, keyID: datahandler.prefSecretKey().keyID) @@ -240,10 +248,13 @@ class CoraDataTests: XCTestCase { XCTAssertTrue(myrecord.isSecure) XCTAssertEqual(myContact.publicKeys.count, 2) let cryptoObject2 = pgp.encrypt(plaintext: body , ids: [newKeyId], myId: keyID ) - _ = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: cryptoObject2) + let decryptObject2 = pgp.decrypt(data: cryptoObject2.chiphertext!, decryptionIDs: [newKeyId], verifyIds: [keyID], fromAdr: sender.mailbox) + + _ = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: decryptObject2) - let cryptoObject3 = pgp.encrypt(plaintext: body , ids: [userKeyID], myId: keyID) - let oldMail = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: cryptoObject3) + let cryptoObject3 = pgp.encrypt(plaintext: body , ids: [oldID], myId: keyID) + let decryptObject3 = pgp.decrypt(data: cryptoObject3.chiphertext!, decryptionIDs: [oldID], verifyIds: [keyID], fromAdr: sender.mailbox) + let oldMail = testMail(from: sender, to: [user], cc: [], bcc: [], folder: folderName, cryptoObject: decryptObject3) XCTAssertTrue((oldMail?.decryptedWithOldPrivateKey)!) @@ -252,14 +263,8 @@ class CoraDataTests: XCTestCase { XCTFail("No new key") return } - // teste, ob alle eigenen Keys da sind - - // teste, ob das hin und herspringen klappt. } - func testInbox() { - // Test notificationcenter! - } func checkOrderingOfRecord(record: KeyRecord) -> Bool{ var prev: PersistentMail? diff --git a/enzevalos_iphoneTests/CryptoTests.swift b/enzevalos_iphoneTests/CryptoTests.swift index ab0eb18597791ea5d7da9d6ceb70c270b72167b3..c5cb6fad349b8f03d9022a77becbf0c965c52e7e 100644 --- a/enzevalos_iphoneTests/CryptoTests.swift +++ b/enzevalos_iphoneTests/CryptoTests.swift @@ -461,7 +461,7 @@ class CryptoTests: XCTestCase { XCTAssert(key == "008933003B986364") // Test storing a key - _ = datahandler.newSecretKey(keyID: key) + _ = datahandler.newSecretKey(keyID: key, addPk: true) XCTAssert(datahandler.prefSecretKey().keyID == key) XCTAssertNotNil(datahandler.findSecretKey(keyID: key)) XCTAssertEqual(datahandler.findSecretKeys().count, 2) @@ -559,7 +559,7 @@ class CryptoTests: XCTestCase { return } XCTAssertEqual(keys.count, 1) - _ = datahandler.newSecretKeys(keyIds: keys) + _ = datahandler.newSecretKeys(keyIds: keys, addPKs: true) XCTAssertEqual(keys.first, datahandler.prefSecretKey().keyID) cryptoObject = pgp.decrypt(data: data, decryptionId: userKeyID, verifyIds: [senderID], fromAdr: nil) XCTAssertEqual(keys.first, datahandler.prefSecretKey().keyID) diff --git a/enzevalos_iphoneTests/InvitationTests.swift b/enzevalos_iphoneTests/InvitationTests.swift index 5caaba2f95af43271ca2311e102a16b32a21c086..abbf3e3bc351b2cd693e7be49998a19ac2716501 100644 --- a/enzevalos_iphoneTests/InvitationTests.swift +++ b/enzevalos_iphoneTests/InvitationTests.swift @@ -21,11 +21,9 @@ class InvitationTests: XCTestCase { let firstResult = string.words(inRange: firstStringRange) let secondResult = string.words(inRange: secondStringRange) - print(firstResult) XCTAssertEqual(firstResult?.words, "Diese") XCTAssertEqual(firstResult?.extendedRange, firstStringRange) - print(secondResult) XCTAssertEqual(secondResult?.words, "App hat viele") XCTAssertEqual(secondResult?.extendedRange, NSRange(location: 6, length: 13)) }