-
Oliver Wiese authoredOliver Wiese authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AutocryptTest.swift 7.54 KiB
//
// Autocrypt.swift
// enzevalos_iphoneTests
//
// Created by Oliver Wiese on 01.11.18.
// Copyright © 2018 fu-berlin. All rights reserved.
//
import XCTest
/**
Test cases:
* parse Header
* parse examples and test cases (see: https://github.com/autocrypt/specs_data/tree/master/data)
* Gossip
* Secret key export
* Secret key import
*/
@testable import enzevalos_iphone
class AutocryptTest: XCTestCase {
let datahandler = DataHandler.handler
let mailHandler = AppDelegate.getAppDelegate().mailHandler
let pgp = SwiftPGP()
let userAdr = "bob@enzevalos.de"
let userName = "bob"
var user: MCOAddress = MCOAddress.init(mailbox: "bob@enzevalos.de")
var userKeyID: String = ""
var simpleAutocryptExample: String{
get{
return """
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
"""
}
}
override func setUp() {
super.setUp()
datahandler.reset()
pgp.resetKeychains()
(user, userKeyID) = owner()
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testMultiID() {
let key = importKey(file: "AliceMultiIDs (439EE43C) – Public")
do {
let x = try pgp.importKeys(key: key, pw: nil, isSecretKey: false, autocrypt: false)
XCTAssertEqual(x.count, 1)
if let newKey = x.first, let pgpKey = pgp.loadKey(id: newKey)?.publicKey {
XCTAssertEqual(pgpKey.users.count, 3)
XCTAssertTrue(pgpKey.users[0].userID.contains("alice@letterbox-app.org"))
XCTAssertTrue(pgpKey.users[1].userID.contains("alice2@letterbox-app.org"))
XCTAssertTrue(pgpKey.users[2].userID.contains("alice3@letterbox-app.org"))
}
else {
XCTFail("Key is missing.")
}
} catch {
XCTFail("No errors should arise when handling ecdsa keys!")
print(error)
}
}
func testAutocryptHeader(){
let outmail = OutgoingMail(toEntrys: ["alice@example.com"], ccEntrys: [], bccEntrys: [], subject: "subject", textContent: "Body", htmlContent: nil)
if let parser = MCOMessageParser(data: outmail.plainData), let _ = pgp.exportKey(id: userKeyID, isSecretkey: false, autocrypt: false) {
let autocrypt = Autocrypt.init(header: parser.header)
XCTAssertEqual(autocrypt.addr, userAdr)
XCTAssertEqual(autocrypt.prefer_encryption, EncState.MUTUAL)
do {
let autoKeyIds = try pgp.importKeys(key: autocrypt.key, pw: nil, isSecretKey: false, autocrypt: true)
if autoKeyIds.count > 0, let autoKeyId = autoKeyIds.first {
XCTAssertEqual(autoKeyId, userKeyID)
}
else {
XCTFail()
}
}
catch {
XCTFail()
}
}
else {
XCTFail()
}
}
func testSpecExample(){
let mailData = MailTest.loadMail(name: "autocryptSimpleExample1")
if let parser = MCOMessageParser(data: mailData) {
let autocrypt = Autocrypt.init(header: parser.header)
XCTAssertEqual(autocrypt.addr, "alice@autocrypt.example")
XCTAssertEqual(autocrypt.prefer_encryption, EncState.MUTUAL)
do {
let autoKeyIds = try pgp.importKeys(key: autocrypt.key, pw: nil, isSecretKey: false, autocrypt: true)
XCTAssertEqual(autoKeyIds.first, "71DBC5657FDE65A7")
}
catch {
XCTFail()
}
}
}
func createUser(adr: String = String.random().lowercased(), name: String = String.random()) -> MCOAddress {
return MCOAddress.init(displayName: name, mailbox: adr.lowercased())
}
func createPGPUser(adr: String = String.random().lowercased(), name: String = String.random()) -> (MCOAddress, String) {
let user = createUser(adr: adr, name: name)
let id = pgp.generateKey(adr: user.mailbox)
return (user, id)
}
func owner() -> (MCOAddress, String) {
Logger.logging = false
let (user, userid) = createPGPUser(adr: userAdr, name: userName)
UserManager.storeUserValue(userAdr as AnyObject, attribute: Attribute.userAddr)
UserManager.storeUserValue(userid as AnyObject, attribute: Attribute.prefSecretKeyID)
return (user, userid)
}
func importKey(file: String, isSecretKey: Bool = false) -> String{
let bundle = Bundle(for: type(of: self))
do {
let plainKey = try String(contentsOf: bundle.url(forResource: file, withExtension: "asc")!)
return plainKey
} catch {
XCTFail()
}
XCTFail()
return ""
}
}