2019-08-22 22:59:07 +02:00
|
|
|
//
|
|
|
|
|
// CryptoFrameworkTest.swift
|
|
|
|
|
// passKitTests
|
|
|
|
|
//
|
|
|
|
|
// Created by Danny Moesch on 22.08.19.
|
|
|
|
|
// Copyright © 2019 Bob Sun. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import XCTest
|
|
|
|
|
|
|
|
|
|
@testable import passKit
|
|
|
|
|
@testable import Crypto
|
|
|
|
|
|
|
|
|
|
class CryptoFrameworkTest: XCTestCase {
|
|
|
|
|
|
|
|
|
|
typealias MessageConverter = (CryptoPGPMessage, NSErrorPointer) -> CryptoPGPMessage?
|
|
|
|
|
|
|
|
|
|
private let testText = "Hello World!"
|
|
|
|
|
|
|
|
|
|
func testArmoredEncryptDecrypt() throws {
|
|
|
|
|
let plainMessage = CryptoNewPlainMessageFromString(testText)
|
|
|
|
|
let messageConverter: MessageConverter = { encryptedMessage, error in
|
|
|
|
|
CryptoNewPGPMessageFromArmored(encryptedMessage.getArmored(error), error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try testInternal(plainMessage: plainMessage, messageConverter: messageConverter)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func testDataBasedEncryptDecrypt() throws {
|
|
|
|
|
let plainMessage = CryptoNewPlainMessage(testText.data(using: .utf8)!.mutable as Data)
|
|
|
|
|
let messageConverter: MessageConverter = { encryptedMessage, _ in
|
|
|
|
|
CryptoNewPGPMessage(encryptedMessage.getBinary()!.mutable as Data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try testInternal(plainMessage: plainMessage, messageConverter: messageConverter)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private func testInternal(plainMessage: CryptoPlainMessage?, messageConverter: MessageConverter) throws {
|
|
|
|
|
try [
|
|
|
|
|
RSA2048,
|
2020-04-12 18:24:03 -07:00
|
|
|
RSA2048_SUB,
|
2020-04-12 19:32:58 -07:00
|
|
|
RSA4096,
|
|
|
|
|
RSA4096_SUB,
|
2019-08-22 22:59:07 +02:00
|
|
|
ED25519,
|
2020-04-12 18:24:03 -07:00
|
|
|
ED25519_SUB,
|
2019-08-22 22:59:07 +02:00
|
|
|
].forEach { keyTriple in
|
|
|
|
|
var error: NSError?
|
2020-04-11 23:23:38 -07:00
|
|
|
guard let publicKey = CryptoNewKeyFromArmored(keyTriple.publicKey, &error),
|
|
|
|
|
let privateKey = CryptoNewKeyFromArmored(keyTriple.privateKey, &error) else {
|
2019-11-08 21:13:28 +01:00
|
|
|
XCTFail("Keys cannot be initialized.")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
XCTAssertNil(error)
|
2019-08-22 22:59:07 +02:00
|
|
|
|
2020-04-11 23:23:38 -07:00
|
|
|
XCTAssert(publicKey.getHexKeyID().hasSuffix(keyTriple.fingerprint))
|
2019-08-22 22:59:07 +02:00
|
|
|
XCTAssertNil(error)
|
|
|
|
|
|
2020-04-11 23:23:38 -07:00
|
|
|
let unlockedKey = try privateKey.unlock(keyTriple.passphrase.data(using: .utf8))
|
|
|
|
|
let encryptedMessage = try CryptoNewKeyRing(publicKey, &error)?.encrypt(plainMessage, privateKey: nil)
|
|
|
|
|
let decryptedData = try CryptoNewKeyRing(unlockedKey, &error)?.decrypt(messageConverter(encryptedMessage!, &error), verifyKey: nil, verifyTime: 0)
|
2019-08-22 22:59:07 +02:00
|
|
|
XCTAssertNil(error)
|
2020-04-11 23:23:38 -07:00
|
|
|
XCTAssertEqual(testText, decryptedData!.getString())
|
2019-08-22 22:59:07 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|