// // 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, RSA2048_SUB, ED25519, ED25519_SUB, ].forEach { keyTriple in var error: NSError? guard let publicKey = CryptoBuildKeyRingArmored(keyTriple.publicKey, &error), let privateKey = CryptoBuildKeyRingArmored(keyTriple.privateKey, &error) else { XCTFail("Keys cannot be initialized.") return } XCTAssertNil(error) XCTAssert(publicKey.getFingerprint(&error).hasSuffix(keyTriple.fingerprint)) XCTAssertNil(error) try privateKey.unlock(withPassphrase: keyTriple.passphrase) let encryptedMessage = try publicKey.encrypt(plainMessage, privateKey: nil) let decryptedData = try privateKey.decrypt(messageConverter(encryptedMessage, &error), verifyKey: nil, verifyTime: 0) XCTAssertNil(error) XCTAssertEqual(testText, decryptedData.getString()) } } }