Skip to content
Snippets Groups Projects
Commit cc5bbf8e authored by blauren95's avatar blauren95
Browse files

Issue #137:

SwiftPGP.swif:
findNotSignedMailForPublicKey(): new function that tries to verify not signed mails with a *given* public key
„re-added“ the changes from oliver’s last commit to function findMailForSecretKey()
Deleted some spaces between code lines „beauty reparation“
parent d035d38f
Branches
Tags
2 merge requests!58Onboarding screens swift ui merge dev,!55WIP: Resolve "UI for gamifcation & stats"
...@@ -592,37 +592,35 @@ class SwiftPGP: Encryption { ...@@ -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) 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] { func keyAsKeyList(keyID: String) -> [Key] {
var keyList = [Key]() var keyList = [Key]()
let key: Key = loadKey(id: keyID)! if let key: Key = loadKey(id: keyID) {
keyList.append(key) keyList.append(key)
}
return keyList 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) { func findMailForSecretKey(keyID: String) {
//var data: Data? = nil
var encState = EncryptionState.UnableToDecrypt var encState = EncryptionState.UnableToDecrypt
var plaindata: Data? = nil var plaindata: Data? = nil
let key: [Key] = keyAsKeyList(keyID: keyID) let key: [Key] = keyAsKeyList(keyID: keyID)
let datahandler = DataHandler.handler let datahandler = DataHandler.handler
let mailList = datahandler.getAllNotDecryptedPersistentMail() let mailList = datahandler.getAllNotDecryptedPersistentMail()
for mail in mailList { for mail in mailList {
// change data // Change data
guard let data = mail.body?.data(using: .utf8) else{ guard let data = mail.body?.data(using: .utf8) else {
return return
} }
// try to decrypt mail // Try to decrypt mail
(plaindata, encState) = decryptMessage(data: data, keys: key, encForCurrentSK: true) (plaindata, encState) = decryptMessage(data: data, keys: key, encForCurrentSK: true)
if encState == EncryptionState.ValidedEncryptedWithCurrentKey { if let plaindata = plaindata, encState == EncryptionState.ValidedEncryptedWithCurrentKey || encState == EncryptionState.ValidEncryptedWithOldKey {
// update database // Update database
mail.isEncrypted = true mail.isEncrypted = true
mail.unableToDecrypt = false mail.unableToDecrypt = false
let plaintext = String(data: plaindata!, encoding: .utf8) mail.body = String.init(data: plaindata, encoding: .utf8)
mail.body = plaintext datahandler.save(during: "decryption of older mails")
datahandler.save(during: "")
} }
} }
} }
...@@ -653,6 +651,28 @@ class SwiftPGP: Encryption { ...@@ -653,6 +651,28 @@ class SwiftPGP: Encryption {
return (nil, EncryptionState.NoEncryption) 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 { private func verifySignature(sigString: String, attachedSignature: Data?, keys: [Key]) -> SignatureState {
if let unarmored = try? Armor.readArmored(sigString){ if let unarmored = try? Armor.readArmored(sigString){
return verifySignature(data: unarmored, attachedSignature: attachedSignature, keys: keys) return verifySignature(data: unarmored, attachedSignature: attachedSignature, keys: keys)
......
...@@ -68,7 +68,7 @@ class CoraDataTests: XCTestCase { ...@@ -68,7 +68,7 @@ class CoraDataTests: XCTestCase {
super.tearDown() 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() { func testGetAllFilteredMails() {
guard let from = MCOAddress(mailbox: "sender@example.com") guard let from = MCOAddress(mailbox: "sender@example.com")
else { else {
...@@ -104,45 +104,42 @@ class CoraDataTests: XCTestCase { ...@@ -104,45 +104,42 @@ class CoraDataTests: XCTestCase {
} }
} }
// Generate a test secret key
// generate a test secret key func testkey() -> (String){
func testkey()->(String){
let testsender = createUser() let testsender = createUser()
let testkeyID = pgp.generateKey(adr: testsender.mailbox, new: true) let testkeyID = pgp.generateKey(adr: testsender.mailbox, new: true)
return testkeyID return testkeyID
} }
// test decryption of all undecrypted mails with new secret key // Test decryption of all undecrypted mails with new secret key
func testfindMailForSecretKey(){ func testfindMailForSecretKey() {
let testkeyID = testkey() let testkeyID = testkey()
let swiftpgp = SwiftPGP() let swiftpgp = SwiftPGP()
// E-Mail generieren // E-Mail generieren
guard let from = MCOAddress(mailbox: "sender@example.com") else {
guard let from = MCOAddress(mailbox: "sender@example.com")
else {
return return
} }
// create test mail // Create test Mail
guard let m1 = testMail(from: from, to: [user], cc: [], bcc: []) else { guard let m1 = testMail(from: from, to: [user], cc: [], bcc: []) else {
XCTFail("No test mail") XCTFail("No test mail")
return return
} }
// create ciphertext // Create Ciphertext
let body = "encrypted text" let body = "encrypted text"
let senderPGP = SwiftPGP() let senderPGP = SwiftPGP()
let encryptedObject = senderPGP.encrypt(plaintext: body, ids: [testkeyID], myId: "") let encryptedObject = senderPGP.encrypt(plaintext: body, ids: [testkeyID], myId: "")
XCTAssert(encryptedObject.encryptionState == .ValidedEncryptedWithCurrentKey && encryptedObject.signatureState == .NoSignature) XCTAssert(encryptedObject.encryptionState == .ValidedEncryptedWithCurrentKey && encryptedObject.signatureState == .NoSignature)
guard let cipher = encryptedObject.chiperString else { guard let cipher = encryptedObject.chiperString else {
XCTFail("No chipher data") XCTFail("No chipher data")
return return
} }
// change mail // Change Mail
m1.unableToDecrypt = true m1.unableToDecrypt = true
m1.body = cipher m1.body = cipher
...@@ -151,10 +148,7 @@ class CoraDataTests: XCTestCase { ...@@ -151,10 +148,7 @@ class CoraDataTests: XCTestCase {
swiftpgp.findMailForSecretKey(keyID: testkeyID) swiftpgp.findMailForSecretKey(keyID: testkeyID)
XCTAssertEqual(m1.body, "encrypted text") XCTAssertEqual(m1.body, "encrypted text")
XCTAssertFalse(m1.unableToDecrypt) XCTAssertFalse(m1.unableToDecrypt)
} }
func createUser(adr: String = String.random().lowercased(), name: String = String.random()) -> MCOAddress { func createUser(adr: String = String.random().lowercased(), name: String = String.random()) -> MCOAddress {
return MCOAddress.init(displayName: name, mailbox: adr.lowercased()) return MCOAddress.init(displayName: name, mailbox: adr.lowercased())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment