diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 826a893..960b76c 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 30A1D2A821B2D53200E2D1F7 /* PasswordChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A1D2A721B2D53200E2D1F7 /* PasswordChange.swift */; }; 30A1D2AA21B32A0100E2D1F7 /* OtpTypeTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A1D2A921B32A0100E2D1F7 /* OtpTypeTest.swift */; }; 30A1D2AC21B32C2A00E2D1F7 /* TokenBuilderTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A1D2AB21B32C2A00E2D1F7 /* TokenBuilderTest.swift */; }; + 30A86F95230F237000F821A4 /* CryptoFrameworkTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A86F94230F237000F821A4 /* CryptoFrameworkTest.swift */; }; 30B04860209A5141001013CA /* PasswordTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B0485F209A5141001013CA /* PasswordTest.swift */; }; 30BAC8C622E3BAAF00438475 /* TestBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30BAC8C422E3BAAF00438475 /* TestBase.swift */; }; 30BAC8C722E3BAAF00438475 /* TestPGPKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30BAC8C522E3BAAF00438475 /* TestPGPKeys.swift */; }; @@ -262,6 +263,7 @@ 30A1D2A721B2D53200E2D1F7 /* PasswordChange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordChange.swift; sourceTree = ""; }; 30A1D2A921B32A0100E2D1F7 /* OtpTypeTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OtpTypeTest.swift; sourceTree = ""; }; 30A1D2AB21B32C2A00E2D1F7 /* TokenBuilderTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenBuilderTest.swift; sourceTree = ""; }; + 30A86F94230F237000F821A4 /* CryptoFrameworkTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoFrameworkTest.swift; sourceTree = ""; }; 30B0485F209A5141001013CA /* PasswordTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordTest.swift; sourceTree = ""; }; 30BAC8C422E3BAAF00438475 /* TestBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestBase.swift; sourceTree = ""; }; 30BAC8C522E3BAAF00438475 /* TestPGPKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestPGPKeys.swift; sourceTree = ""; }; @@ -463,6 +465,14 @@ path = Extensions; sourceTree = ""; }; + 30A86F93230F235800F821A4 /* Crypto */ = { + isa = PBXGroup; + children = ( + 30A86F94230F237000F821A4 /* CryptoFrameworkTest.swift */, + ); + path = Crypto; + sourceTree = ""; + }; 30B6AABA21F49095006B352D /* Extensions */ = { isa = PBXGroup; children = ( @@ -585,6 +595,7 @@ A26075861EEC6F34005DB03E /* passKitTests */ = { isa = PBXGroup; children = ( + 30A86F93230F235800F821A4 /* Crypto */, 30BAC8C322E3BA4300438475 /* Testbase */, 30697C5521F63F870064FCAC /* Extensions */, 301F6464216164670071A4CE /* Helpers */, @@ -1303,6 +1314,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 30A86F95230F237000F821A4 /* CryptoFrameworkTest.swift in Sources */, 30A1D2AC21B32C2A00E2D1F7 /* TokenBuilderTest.swift in Sources */, 301F646D216166AA0071A4CE /* AdditionFieldTest.swift in Sources */, 30BAC8CB22E3BB6C00438475 /* DictBasedKeychain.swift in Sources */, diff --git a/passKitTests/Crypto/CryptoFrameworkTest.swift b/passKitTests/Crypto/CryptoFrameworkTest.swift new file mode 100644 index 0000000..3199958 --- /dev/null +++ b/passKitTests/Crypto/CryptoFrameworkTest.swift @@ -0,0 +1,60 @@ +// +// 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 + let pgp = CryptoGetGopenPGP()! + let publicKey = try pgp.buildKeyRingArmored(keyTriple.publicKey) + let privateKey = try pgp.buildKeyRingArmored(keyTriple.privateKey) + var error: NSError? + + 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()) + } + } +} diff --git a/passKitTests/Testbase/TestPGPKeys.swift b/passKitTests/Testbase/TestPGPKeys.swift index 13a0003..aa53c79 100644 --- a/passKitTests/Testbase/TestPGPKeys.swift +++ b/passKitTests/Testbase/TestPGPKeys.swift @@ -10,6 +10,38 @@ import XCTest @testable import passKit +struct PGPKeyTestTriple { + let publicKey: String + let privateKey: String + let fingerprint: String + + let passphrase = "passforios" +} + +let RSA2048 = PGPKeyTestTriple( + publicKey: PGP_RSA2048_PUBLIC_KEY, + privateKey: PGP_RSA2048_PRIVATE_KEY, + fingerprint: "a1024dae" +) + +let RSA2048_SUB = PGPKeyTestTriple( + publicKey: PGP_RSA2048_PUBLIC_KEY, + privateKey: PGP_RSA2048_PRIVATE_SUBKEY, + fingerprint: "a1024dae" +) + +let ED25519 = PGPKeyTestTriple( + publicKey: PGP_ED25519_PUBLIC_KEY, + privateKey: PGP_ED25519_PRIVATE_KEY, + fingerprint: "e9444483" +) + +let ED25519_SUB = PGPKeyTestTriple( + publicKey: PGP_ED25519_PUBLIC_KEY, + privateKey: PGP_ED25519_PRIVATE_SUBKEY, + fingerprint: "e9444483" +) + func requestPGPKeyPassphrase() -> String { return "passforios" }