From 71927745a8f013cb2cded24b32c746d874cbc786 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 9 Mar 2023 22:52:40 +0800 Subject: [PATCH] from: github.com/remko/age-plugin-se --- Documentation/Design.md | 19 + Documentation/img/coverage.svg | 34 + .../img/screenshot-biometry-or-passcode.png | Bin 0 -> 159487 bytes Documentation/img/screenshot-biometry.png | Bin 0 -> 137807 bytes LICENSE.txt | 21 + Makefile | 118 +++ Package.swift | 36 + README.md | 99 ++- Sources/Base64.swift | 36 + Sources/Bech32.swift | 235 +++++ Sources/CLI.swift | 173 ++++ Sources/Crypto.swift | 78 ++ Sources/Plugin.swift | 414 +++++++++ Sources/Stream.swift | 19 + Tests/Base64Tests.swift | 79 ++ Tests/Bech32Tests.swift | 103 +++ Tests/CLITests.swift | 49 ++ Tests/CryptoTests.swift | 71 ++ Tests/DummyCrypto.swift | 75 ++ Tests/MemoryStream.swift | 27 + Tests/PluginTests.swift | 828 ++++++++++++++++++ Tests/StanzaTests.swift | 208 +++++ 22 files changed, 2720 insertions(+), 2 deletions(-) create mode 100644 Documentation/Design.md create mode 100644 Documentation/img/coverage.svg create mode 100644 Documentation/img/screenshot-biometry-or-passcode.png create mode 100644 Documentation/img/screenshot-biometry.png create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 Package.swift create mode 100644 Sources/Base64.swift create mode 100644 Sources/Bech32.swift create mode 100644 Sources/CLI.swift create mode 100644 Sources/Crypto.swift create mode 100644 Sources/Plugin.swift create mode 100644 Sources/Stream.swift create mode 100644 Tests/Base64Tests.swift create mode 100644 Tests/Bech32Tests.swift create mode 100644 Tests/CLITests.swift create mode 100644 Tests/CryptoTests.swift create mode 100644 Tests/DummyCrypto.swift create mode 100644 Tests/MemoryStream.swift create mode 100644 Tests/PluginTests.swift create mode 100644 Tests/StanzaTests.swift diff --git a/Documentation/Design.md b/Documentation/Design.md new file mode 100644 index 0000000..7f07330 --- /dev/null +++ b/Documentation/Design.md @@ -0,0 +1,19 @@ +# Design Notes + +This document contains notes about design choices made in the plugin. + + +## SecureEnclave APIs: Security vs CryptoKit + +Apple provides 2 APIs for communicating with the Secure Enclave: [through the Security Framework](https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/protecting_keys_with_the_secure_enclave), and [through CryptoKit](https://developer.apple.com/documentation/cryptokit/secureenclave). + +The advantage of the Security framework is that it has been around for a long time, and is accessible from within Objective-C, which means you could write the entire plugin in e.g. Go, and use cgo out of the box for the few functions that need to talk to the Secure Enclave. However, using this API comes with disadvantages: + +- The Security API requires your app to have special entitlements. This means you need to have an Apple Developer Certificate to build and run the app locally, and it could not be distributed through Homebrew core. +- Because the app needs entitlements, it cannot be distributed as a single binary, but has to be wrapped in a macOS App structure. You can still link from somewhere in the executable path to the binary inside the app structure, but the app would need to live somewhere else (possibly hidden, since the plugin is useless as a runnable standalone UI application) +- All keys are created through the Keychain. This means creating a key has a side effect of putting something in your keychain. You could probably export the private data from the keychain into an age identity file, and delete the key immediately after creating it, but something may go wrong, and you would be leaking data. Alternatively, you could choose to leave the keys in the Keychain, but then the plugin would need to manage looking up keys by tag, and push the complexity of keeping multiple keys via a plugin-specific CLI to the user. It's also not clear what happens during backup restore of the keychain, as there have been reports of confusing behavior there. +- Even for the few lines of Objective-C that are necessary, it would require a good understanding of how memory management works in the Objective-C API in order to not run memory corruption or leaks. I'm not that confident I can get this 100% right. + +The CryptoKit framework does not have any of these disadvantages: it accesses the Secure Enclave directly, using a very simple API that does not require special entitlements. However, CryptoKit is only accessible through Swift, which means you can't directly write your plugin in a language such as Go and use cgo out of the box. You could probably still create a small library in Swift that does the necessary calls, and wrap that in an Objective-C or C API, and use Cgo on that, but that's a lot of moving parts and complexity for a simple plugin such as this one. Besides, the only potential part that could be reused in the plugin would be the Age stanza parsing, which not only just 50 lines of code, but isn't exposed by age anyway. CryptoKit comes with all the necessary cryptographic primitives that are necessary for the rest of the plugin. + +For these reasons, I have chosen to keep the plugin as simple as possible for both me and the user, so it is implemented entirely in Swift using the CryptoKit API. diff --git a/Documentation/img/coverage.svg b/Documentation/img/coverage.svg new file mode 100644 index 0000000..a71fac8 --- /dev/null +++ b/Documentation/img/coverage.svg @@ -0,0 +1,34 @@ + + Build - passing + + + + + + + + + + + + + + + + + + Coverage + + + + + + + {COVERAGE} + + + + + diff --git a/Documentation/img/screenshot-biometry-or-passcode.png b/Documentation/img/screenshot-biometry-or-passcode.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe0c441114df102c433d790343f9d6c0ddb98e3 GIT binary patch literal 159487 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 +03cvR-I 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 Ms2AvygB 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

w8Hq7)m>-q6X=+!_t)Rn_mpgdb~;p-Xo%zN** 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∧4mRW^5KnDwZx-gDZ8Svl!d^7 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 literal 0 HcmV?d00001 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8811f23 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Remko Tronçon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0f420ae --- /dev/null +++ b/Makefile @@ -0,0 +1,118 @@ +PREFIX ?= /usr/local +AGE ?= age + +ifeq ($(RELEASE),1) +SWIFT_BUILD_FLAGS=-c release --disable-sandbox +endif + +ifeq ($(COVERAGE),1) +SWIFT_TEST_FLAGS=--enable-code-coverage +endif +# E.g. Tests.RecipientV1Tests/testRecipient +ifneq ($(TEST_FILTER),) +SWIFT_TEST_FLAGS := $(SWIFT_TEST_FLAGS) --filter $(TEST_FILTER) +endif + +ifeq ($(OS),Windows_NT) +UNAME_S=Windows +else +UNAME_S=$(shell uname -s) +endif + +VERSION ?= $(shell cat Sources/CLI.swift | grep '^let version' | sed -e "s/.*\"v\\(.*\\)\".*/\\1/") +BUILD_DIR = $(shell swift build $(SWIFT_BUILD_FLAGS) --show-bin-path) +PACKAGE_ARCHS = arm64-apple-macosx x86_64-apple-macosx + +ECHO = echo +ifneq ($(UNAME_S),Darwin) +ECHO = /usr/bin/echo -e +endif + +.PHONY: all +all: + swift build $(SWIFT_BUILD_FLAGS) + +.PHONY: package +ifeq ($(UNAME_S),Darwin) +package: + for arch in $(PACKAGE_ARCHS); do swift build -c release --triple $$arch; done + lipo -create -output .build/age-plugin-se $(foreach arch, $(PACKAGE_ARCHS), \ + $(shell swift build -c release --triple $(arch) --show-bin-path)/age-plugin-se) + cd .build && ditto -c -k age-plugin-se age-plugin-se-v$(VERSION)-macos.zip +else +package: + swift build -c release --static-swift-stdlib + tar czf .build/age-plugin-se-v$(VERSION)-$(shell uname -m)-linux.tgz -C $(shell swift build -c release --show-bin-path) age-plugin-se +endif + +.PHONY: test +test: + swift test $(SWIFT_TEST_FLAGS) +ifeq ($(COVERAGE),1) + coverage_total=`cat $$(swift test --show-codecov-path) | jq '.data[0].totals.lines.percent' | xargs printf "%.0f%%"` && (cat Documentation/img/coverage.svg | sed -e "s/{COVERAGE}/$$coverage_total/" > .build/coverage.svg) + (command -v llvm-coverage-viewer > /dev/null) && llvm-coverage-viewer --json $$(swift test --show-codecov-path) --output .build/coverage.html + @cat $$(swift test --show-codecov-path) | jq '.data[0].totals.lines.percent' | xargs printf "Test coverage (lines): %.2f%%\\n" + @cat $$(swift test --show-codecov-path) | jq -r '.data[0].files[] | "\(.filename)\t\(.summary.lines.percent)\t\(.summary.lines.covered)\t\(.summary.lines.count)"' | grep -v "Tests.swift" | sed -r -e 's/.*\/(Sources\/|Tests\/)/\1/' | xargs printf " %s: %.2f %% (%d/%d)\\n" +endif + +.PHONY: lint +lint: + swift-format lint --recursive --strict . + +.PHONY: install +install: + install -d $(PREFIX)/bin + install $(BUILD_DIR)/age-plugin-se $(PREFIX)/bin + +.PHONY: smoke-test +smoke-test: + PATH="$(BUILD_DIR):$$PATH" && \ + $(ECHO) '\xf0\x9f\x94\x91 Generating key...' && \ + recipient=`age-plugin-se keygen --access-control=any-biometry -o key.txt | sed -e "s/Public key: //"` && \ + $(ECHO) '\xf0\x9f\x94\x92 Encrypting...' && \ + ($(ECHO) '\xe2\x9c\x85 \x53\x75\x63\x63\x65\x73\x73' | $(AGE) --encrypt --recipient $$recipient -o secret.txt.age) && \ + $(ECHO) '\xf0\x9f\x94\x93 Decrypting...' && \ + $(AGE) --decrypt -i key.txt secret.txt.age && \ + rm -f key.txt secret.txt.age + +.PHONY: smoke-test-noninteractive +smoke-test-noninteractive: + PATH="$(BUILD_DIR):$$PATH" && \ + $(ECHO) '\xf0\x9f\x94\x91 Generating key...' && \ + recipient=`age-plugin-se keygen --access-control=none -o key.txt | sed -e "s/Public key: //"` && \ + $(ECHO) '\xf0\x9f\x94\x92 Encrypting...' && \ + ($(ECHO) '\xe2\x9c\x85 \x53\x75\x63\x63\x65\x73\x73' | $(AGE) --encrypt --recipient $$recipient -o secret.txt.age) && \ + $(ECHO) '\xf0\x9f\x94\x93 Decrypting...' && \ + $(AGE) --decrypt -i key.txt secret.txt.age && \ + rm -f key.txt secret.txt.age + +.PHONY: smoke-test-encrypt +smoke-test-encrypt: + PATH="$(BUILD_DIR):$$PATH" && \ + $(ECHO) '\xf0\x9f\x94\x92 Encrypting...' && \ + ($(ECHO) "test" | $(AGE) --encrypt --recipient age1se1qgg72x2qfk9wg3wh0qg9u0v7l5dkq4jx69fv80p6wdus3ftg6flwg5dz2dp -o secret.txt.age) && \ + $(ECHO) '\xe2\x9c\x85 \x53\x75\x63\x63\x65\x73\x73' && \ + rm -f secret.txt.age + +.PHONY: gen-manual-tests +gen-manual-tests: + -rm -rf gen-manual-tests + mkdir -p manual-tests + PATH="$(BUILD_DIR):$$PATH" && set -e && \ + for control in none passcode current-biometry any-biometry current-biometry-and-passcode any-biometry-and-passcode any-biometry-or-passcode; do \ + recipient=`age-plugin-se keygen --access-control=$$control -o manual-tests/key.$$control.txt | sed -e "s/Public key: //"`;\ + ($(ECHO) '\xe2\x9c\x85 \x53\x75\x63\x63\x65\x73\x73' | $(AGE) --encrypt --recipient $$recipient -o manual-tests/secret.txt.$$control.age); \ + done + +.PHONY: run-manual-tests +run-manual-tests: + PATH="$(BUILD_DIR):$$PATH" && set -e && \ + for control in none passcode any-biometry current-biometry-and-passcode any-biometry-and-passcode any-biometry-or-passcode; do \ + $(ECHO) "\\xf0\\x9f\\x94\\x93 Decrypting '$$control'..." && \ + $(AGE) --decrypt -i manual-tests/key.$$control.txt manual-tests/secret.txt.$$control.age; \ + $(ECHO) "\n-----\n"; \ + done + +.PHONY: clean +clean: + -rm -rf .build manual-tests diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..f02f1ae --- /dev/null +++ b/Package.swift @@ -0,0 +1,36 @@ +// swift-tools-version: 5.7 + +import PackageDescription + +// Technically, the dependencies don't need the platform conditional. +// However, I like to keep the dependencies out of the build entirely on macOS. +// Unfortunately, this also means Package.resolved isn't stable. + +var packageDependencies: [Package.Dependency] { + #if os(Linux) || os(Windows) + return [.package(url: "https://github.com/apple/swift-crypto.git", "2.0.0"..<"3.0.0")] + #else + return [] + #endif +} + +var targetDependencies: [Target.Dependency] { + #if os(Linux) || os(Windows) + return [ + .product( + name: "Crypto", package: "swift-crypto", condition: .when(platforms: [.linux, .windows])) + ] + #else + return [] + #endif +} + +let package = Package( + name: "AgeSecureEnclavePlugin", + platforms: [.macOS(.v13)], + dependencies: packageDependencies, + targets: [ + .executableTarget(name: "age-plugin-se", dependencies: targetDependencies, path: "Sources"), + .testTarget(name: "Tests", dependencies: ["age-plugin-se"], path: "Tests"), + ] +) diff --git a/README.md b/README.md index 170f149..8c48798 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,98 @@ -# age-plugin-se +> ⚠️ **This plugin is still under review. Feedback welcome!** -From: https://github.com/remko/age-plugin-se \ No newline at end of file +# Age plugin for Apple's Secure Enclave + +[![Build](https://github.com/remko/age-plugin-se/actions/workflows/build.yml/badge.svg)](https://github.com/remko/age-plugin-se/actions/workflows/build.yml) + +`age-plugin-se` is a plugin for [age](https://age-encryption.org), enabling encryption using [Apple's Secure Enclave](https://support.apple.com/en-gb/guide/security/sec59b0b31ff/web). + + $ age-plugin-se keygen --access-control=any-biometry -o key.txt + Public key: age1se1qgg72x2qfk9wg3wh0qg9u0v7l5dkq4jx69fv80p6wdus3ftg6flwg5dz2dp + $ tar cvz ~/data | age -r age1se1qgg72x2qfk9wg3wh0qg9u0v7l5dkq4jx69fv80p6wdus3ftg6flwg5dz2dp > data.tar.gz.age + $ age --decrypt -i key.txt data.tar.gz.age > data.tar.gz + +

+Biometry prompt +
+ + +## Requirements + +To generate identity files and decrypt encrypted files, you need a Mac running macOS 13 (Ventura) with a +Secure Enclave processor. + +For encrypting files, you need macOS 13 (Ventura), Linux, or Windows. A Secure Enclave processor is not necessary. + + +## Installation + +### Homebrew + +> Coming when v1.0 is released + +### Pre-built binary + +1. Download a binary from [the releases page](https://github.com/remko/age-plugin-se/releases) +2. Extract the package +3. (Windows only) Download and install [Swift](https://www.swift.org/download/) +4. (macOS only) Trust `age-plugin-se` once by Control-clicking the file in Finder, choosing *Open*, + and confirming trust +5. Move `age-plugin-se` to somewhere on your executable path (e.g. `/usr/local/bin`) + +### Building from source + +1. (non-macOS only) Download and install [Swift](https://www.swift.org/download/) + +2. Clone [the source code repository](https://github.com/remko/age-plugin-se) or + get a source package from [the releases page](https://github.com/remko/age-plugin-se/releases) + +3. Build the plugin + + make + +4. Install the plugin + + sudo make install PREFIX=/usr/local + + +## Usage + + age-plugin-se keygen [-o OUTPUT] [--access-control ACCESS_CONTROL] + + Options: + -o, --output OUTPUT Write the result to the file at path OUTPUT + + --access-control ACCESS_CONTROL Access control for using the generated key. + + Supported values: none, passcode, + any-biometry, any-biometry-and-passcode, any-biometry-or-passcode, + current-biometry, current-biometry-and-passcode + Default: any-biometry-or-passcode. + + When using current biometry, adding or removing a fingerprint stops the + key from working. Removing an added fingerprint enables the key again. + + +## Development + +Build the plugin + + make + +Make sure `.build/debug/age-plugin-se` is in your execution path (or softlinked from a folder in your path), so `age` can find the plugin. + +### Tests + +To run the unit tests: + + make test + +To get a coverage report of the unit test: + + make test COVERAGE=1 + +If you want an HTML version of the coverage report, make sure [llvm-coverage-viewer](https://www.npmjs.com/package/llvm-coverage-viewer) is installed. + +To run a smoke test: + + make smoke-test diff --git a/Sources/Base64.swift b/Sources/Base64.swift new file mode 100644 index 0000000..57e9b0e --- /dev/null +++ b/Sources/Base64.swift @@ -0,0 +1,36 @@ +import Foundation + +extension Data { + init?(base64RawEncoded: String) { + if base64RawEncoded.hasSuffix("=") { + return nil + } + var str = base64RawEncoded + switch base64RawEncoded.count % 4 { + case 2: + str += "==" + case 3: + str += "=" + default: + () + } + guard let data = Data(base64Encoded: str) else { + return nil + } + self = data + } + + var base64RawEncodedData: Data { + var s = base64EncodedData(options: [ + Base64EncodingOptions.lineLength64Characters, Base64EncodingOptions.endLineWithLineFeed, + ]) + if let pi = s.firstIndex(of: Character("=").asciiValue!) { + s = Data(s[s.startIndex.. Data { + var acc: Int = 0 + var bits: Int = 0 + let maxv: Int = (1 << to) - 1 + let maxAcc: Int = (1 << (from + to - 1)) - 1 + var odata = Data() + for ibyte in idata { + acc = ((acc << from) | Int(ibyte)) & maxAcc + bits += from + while bits >= to { + bits -= to + odata.append(UInt8((acc >> bits) & maxv)) + } + } + if pad { + if bits != 0 { + odata.append(UInt8((acc << (to - bits)) & maxv)) + } + } else if bits >= from || ((acc << (to - bits)) & maxv) != 0 { + throw DecodingError.bitsConversionFailed + } + return odata + } + + /// Find the polynomial with value coefficients mod the generator as 30-bit. + private func polymod(_ values: Data) -> UInt32 { + var chk: UInt32 = 1 + for v in values { + let top = (chk >> 25) + chk = (chk & 0x1ffffff) << 5 ^ UInt32(v) + for i: UInt8 in 0..<5 { + chk ^= ((top >> i) & 1) == 0 ? 0 : gen[Int(i)] + } + } + return chk + } + + /// Expand a HRP for use in checksum computation. + private func expandHrp(_ hrp: String) -> Data { + guard let hrpBytes = hrp.data(using: .utf8) else { return Data() } + var result = Data(repeating: 0x00, count: hrpBytes.count * 2 + 1) + for (i, c) in hrpBytes.enumerated() { + result[i] = c >> 5 + result[i + hrpBytes.count + 1] = c & 0x1f + } + result[hrp.count] = 0 + return result + } + + /// Verify checksum + private func verifyChecksum(hrp: String, checksum: Data) -> Bool { + var data = expandHrp(hrp) + data.append(checksum) + return polymod(data) == 1 + } + + /// Create checksum + private func createChecksum(hrp: String, values: Data) -> Data { + var enc = expandHrp(hrp) + enc.append(values) + enc.append(Data(repeating: 0x00, count: 6)) + let mod: UInt32 = polymod(enc) ^ 1 + var ret: Data = Data(repeating: 0x00, count: 6) + for i in 0..<6 { + ret[i] = UInt8((mod >> (5 * (5 - i))) & 31) + } + return ret + } + + /// Encode Bech32 string + private func encodeBech32(_ hrp: String, values: Data) -> String { + let checksum = createChecksum(hrp: hrp, values: values) + var combined = values + combined.append(checksum) + + guard let hrpBytes = hrp.data(using: .utf8) else { return "" } + var ret = hrpBytes + ret.append("1".data(using: .utf8)!) + for i in combined { + ret.append(encCharset[Int(i)]) + } + return String(data: ret, encoding: .utf8) ?? "" + } + + /// Decode Bech32 string + public func decodeBech32(_ str: String) throws -> (hrp: String, checksum: Data) { + guard let strBytes = str.data(using: .utf8) else { + throw DecodingError.nonUTF8String + } + var lower: Bool = false + var upper: Bool = false + for c in strBytes { + // printable range + if c < 33 || c > 126 { + throw DecodingError.nonPrintableCharacter + } + // 'a' to 'z' + if c >= 97 && c <= 122 { + lower = true + } + // 'A' to 'Z' + if c >= 65 && c <= 90 { + upper = true + } + } + if lower && upper { + throw DecodingError.invalidCase + } + guard let pos = str.range(of: checksumMarker, options: .backwards)?.lowerBound else { + throw DecodingError.noChecksumMarker + } + let intPos: Int = str.distance(from: str.startIndex, to: pos) + guard intPos >= 1 else { + throw DecodingError.incorrectHrpSize + } + guard intPos + 7 <= str.count else { + throw DecodingError.incorrectChecksumSize + } + let vSize: Int = str.count - 1 - intPos + var values: Data = Data(repeating: 0x00, count: vSize) + for i in 0.. String { + let isUpper = hrp[hrp.startIndex].isUppercase + let result = encodeBech32( + isUpper ? hrp.lowercased() : hrp, + values: try! self.convertBits(from: 8, to: 5, pad: true, idata: data)) + return isUpper ? result.uppercased() : result + } + + public func decode(_ str: String) throws -> (hrp: String, data: Data) { + let isUpper = str[str.startIndex].isUppercase + let result = try decodeBech32(isUpper ? str.lowercased() : str) + return ( + isUpper ? result.hrp.uppercased() : result.hrp, + try convertBits(from: 5, to: 8, pad: false, idata: result.checksum) + ) + } +} + +extension Bech32 { + public enum DecodingError: LocalizedError { + case nonUTF8String + case nonPrintableCharacter + case invalidCase + case noChecksumMarker + case incorrectHrpSize + case incorrectChecksumSize + + case invalidCharacter + case checksumMismatch + + case bitsConversionFailed + + public var errorDescription: String? { + switch self { + case .bitsConversionFailed: + return "Failed to perform bits conversion" + case .checksumMismatch: + return "Checksum doesn't match" + case .incorrectChecksumSize: + return "Checksum size too low" + case .incorrectHrpSize: + return "Human-readable-part is too small or empty" + case .invalidCase: + return "String contains mixed case characters" + case .invalidCharacter: + return "Invalid character met on decoding" + case .noChecksumMarker: + return "Checksum delimiter not found" + case .nonPrintableCharacter: + return "Non printable character in input string" + case .nonUTF8String: + return "String cannot be decoded by utf8 decoder" + } + } + } +} diff --git a/Sources/CLI.swift b/Sources/CLI.swift new file mode 100644 index 0000000..5976798 --- /dev/null +++ b/Sources/CLI.swift @@ -0,0 +1,173 @@ +import Foundation + +let version = "v0.0.3" + +@main +struct CLI { + static func main() { + do { + let plugin = Plugin(crypto: CryptoKitCrypto(), stream: StandardIOStream()) + let options = try Options.parse(CommandLine.arguments) + switch options.command { + case .help: + print(Options.help) + case .version: + print(version) + case .keygen: + let result = try plugin.generateKey( + accessControl: options.accessControl.keyAccessControl, now: Date()) + if let outputFile = options.output { + FileManager.default.createFile( + atPath: FileManager.default.currentDirectoryPath + "/" + outputFile, + contents: result.0.data(using: .utf8), + attributes: [.posixPermissions: 0o600] + ) + print("Public key: \(result.1)") + } else { + print(result.0) + } + case .plugin(let sm): + switch sm { + case .recipientV1: + plugin.runRecipientV1() + case .identityV1: + plugin.runIdentityV1() + } + } + } catch { + print("\(CommandLine.arguments[0]): error: \(error.localizedDescription)") + exit(-1) + } + } +} + +/// Command-line options parser +struct Options { + enum Error: LocalizedError, Equatable { + case unknownOption(String) + case missingValue(String) + case invalidValue(String, String) + + public var errorDescription: String? { + switch self { + case .unknownOption(let option): return "unknown option: `\(option)`" + case .missingValue(let option): return "missing value for option `\(option)`" + case .invalidValue(let option, let value): + return "invalid value for option `\(option)`: `\(value)`" + } + } + } + + enum StateMachine: String { + case recipientV1 = "recipient-v1" + case identityV1 = "identity-v1" + } + + enum Command: Equatable { + case help + case version + case keygen + case plugin(StateMachine) + } + var command: Command + + var output: String? + + enum AccessControl: String { + case none = "none" + case passcode = "passcode" + case anyBiometry = "any-biometry" + case anyBiometryOrPasscode = "any-biometry-or-passcode" + case anyBiometryAndPasscode = "any-biometry-and-passcode" + case currentBiometry = "current-biometry" + case currentBiometryAndPasscode = "current-biometry-and-passcode" + + var keyAccessControl: KeyAccessControl { + switch self { + case .none: return KeyAccessControl.none + case .passcode: return KeyAccessControl.passcode + case .anyBiometry: return KeyAccessControl.anyBiometry + case .anyBiometryOrPasscode: return KeyAccessControl.anyBiometryOrPasscode + case .anyBiometryAndPasscode: return KeyAccessControl.anyBiometryAndPasscode + case .currentBiometry: return KeyAccessControl.currentBiometry + case .currentBiometryAndPasscode: return KeyAccessControl.currentBiometryAndPasscode + } + } + } + var accessControl = AccessControl.anyBiometryOrPasscode + + static var help = + """ + Usage: + age-plugin-se keygen [-o OUTPUT] [--access-control ACCESS_CONTROL] + + Options: + -o, --output OUTPUT Write the result to the file at path OUTPUT + + --access-control ACCESS_CONTROL Access control for using the generated key. + + When using current biometry, adding or removing a fingerprint stops the + key from working. Removing an added fingerprint enables the key again. + + Supported values: none, passcode, + any-biometry, any-biometry-and-passcode, any-biometry-or-passcode, + current-biometry, current-biometry-and-passcode + Default: any-biometry-or-passcode. + + Example: + $ age-plugin-se keygen -o key.txt + Public key: age1se1qg8vwwqhztnh3vpt2nf2xwn7famktxlmp0nmkfltp8lkvzp8nafkqleh258 + $ tar cvz ~/data | age -r age1se1qgg72x2qfk9wg3wh0qg9u0v7l5dkq4jx69fv80p6wdus3ftg6flwg5dz2dp > data.tar.gz.age + $ age --decrypt -i key.txt data.tar.gz.age > data.tar.gz + """ + + static func parse(_ args: [String]) throws -> Options { + var opts = Options(command: .help) + var i = 1 + while i < args.count { + let arg = args[i] + if arg == "keygen" { + opts.command = .keygen + } else if ["--help", "-h"].contains(arg) { + opts.command = .help + break + } else if ["--version"].contains(arg) { + opts.command = .version + break + } else if [ + "--age-plugin", "-o", "--output", "--access-control", + ].contains(where: { + arg == $0 || arg.hasPrefix($0 + "=") + }) { + let argps = arg.split(separator: "=", maxSplits: 1) + let value: String + if argps.count == 1 { + i += 1 + if i >= args.count { + throw Error.missingValue(arg) + } + value = args[i] + } else { + value = String(argps[1]) + } + let arg = String(argps[0]) + switch arg { + case "--age-plugin": + opts.command = try .plugin( + StateMachine(rawValue: value) ?? { throw Error.invalidValue(arg, value) }()) + case "-o", "--output": + opts.output = value + case "--access-control": + opts.accessControl = + try AccessControl(rawValue: value) ?? { throw Error.invalidValue(arg, value) }() + default: + assert(false) + } + } else { + throw Error.unknownOption(arg) + } + i += 1 + } + return opts + } +} diff --git a/Sources/Crypto.swift b/Sources/Crypto.swift new file mode 100644 index 0000000..c669816 --- /dev/null +++ b/Sources/Crypto.swift @@ -0,0 +1,78 @@ +import Foundation + +#if !os(Linux) && !os(Windows) + import CryptoKit + import LocalAuthentication +#else + import Crypto + struct SecAccessControl {} +#endif + +/// Abstraction for random/unpredictable/system-specific crypto operations +protocol Crypto { + var isSecureEnclaveAvailable: Bool { get } + + func newSecureEnclavePrivateKey(dataRepresentation: Data) throws -> SecureEnclavePrivateKey + func newSecureEnclavePrivateKey(accessControl: SecAccessControl) throws -> SecureEnclavePrivateKey + func newEphemeralPrivateKey() -> P256.KeyAgreement.PrivateKey +} + +protocol SecureEnclavePrivateKey { + var publicKey: P256.KeyAgreement.PublicKey { get } + var dataRepresentation: Data { get } + + func sharedSecretFromKeyAgreement(with publicKeyShare: P256.KeyAgreement.PublicKey) throws + -> SharedSecret +} + +#if !os(Linux) && !os(Windows) + class CryptoKitCrypto: Crypto { + let context = LAContext() + + var isSecureEnclaveAvailable: Bool { + return SecureEnclave.isAvailable + } + + func newSecureEnclavePrivateKey(dataRepresentation: Data) throws -> SecureEnclavePrivateKey { + return try SecureEnclave.P256.KeyAgreement.PrivateKey( + dataRepresentation: dataRepresentation, authenticationContext: context) + } + + func newSecureEnclavePrivateKey(accessControl: SecAccessControl) throws + -> SecureEnclavePrivateKey + { + return try SecureEnclave.P256.KeyAgreement.PrivateKey( + accessControl: accessControl, authenticationContext: context) + } + + func newEphemeralPrivateKey() -> P256.KeyAgreement.PrivateKey { + return P256.KeyAgreement.PrivateKey() + } + } + + extension SecureEnclave.P256.KeyAgreement.PrivateKey: SecureEnclavePrivateKey { + } + +#else + + class CryptoKitCrypto: Crypto { + var isSecureEnclaveAvailable: Bool { + return false + } + + func newSecureEnclavePrivateKey(dataRepresentation: Data) throws -> SecureEnclavePrivateKey { + throw Plugin.Error.seUnsupported + } + + func newSecureEnclavePrivateKey(accessControl: SecAccessControl) throws + -> SecureEnclavePrivateKey + { + throw Plugin.Error.seUnsupported + } + + func newEphemeralPrivateKey() -> P256.KeyAgreement.PrivateKey { + return P256.KeyAgreement.PrivateKey() + } + } + +#endif diff --git a/Sources/Plugin.swift b/Sources/Plugin.swift new file mode 100644 index 0000000..f5cdfcc --- /dev/null +++ b/Sources/Plugin.swift @@ -0,0 +1,414 @@ +import Foundation + +#if !os(Linux) && !os(Windows) + import CryptoKit +#else + import Crypto +#endif + +class Plugin { + var crypto: Crypto + var stream: Stream + + init(crypto: Crypto, stream: Stream) { + self.crypto = crypto + self.stream = stream + } + + func generateKey(accessControl: KeyAccessControl, now: Date) throws -> (String, String) { + if !crypto.isSecureEnclaveAvailable { + throw Error.seUnsupported + } + #if !os(Linux) && !os(Windows) + let createdAt = now.ISO8601Format() + var accessControlFlags: SecAccessControlCreateFlags = [.privateKeyUsage] + if accessControl == .anyBiometry || accessControl == .anyBiometryAndPasscode { + accessControlFlags.insert(.biometryAny) + } + if accessControl == .currentBiometry || accessControl == .currentBiometryAndPasscode { + accessControlFlags.insert(.biometryCurrentSet) + } + if accessControl == .passcode || accessControl == .anyBiometryAndPasscode + || accessControl == .currentBiometryAndPasscode + { + accessControlFlags.insert(.devicePasscode) + } + if accessControl == .anyBiometryOrPasscode { + accessControlFlags.insert(.userPresence) + } + var error: Unmanaged? + guard + let secAccessControl = SecAccessControlCreateWithFlags( + kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, + accessControlFlags, + &error) + else { + throw error!.takeRetainedValue() as Swift.Error + } + #else + // FIXME: ISO8601Format currently not supported on Linux: + // https://github.com/apple/swift-corelibs-foundation/issues/4618 + // This code is only reached in unit tests on Linux anyway + let createdAt = "1997-02-02T02:26:51Z" + let secAccessControl = SecAccessControl() + #endif + + let privateKey = try crypto.newSecureEnclavePrivateKey(accessControl: secAccessControl) + let recipient = privateKey.publicKey.ageRecipient + let identity = privateKey.ageIdentity + let accessControlStr: String + switch accessControl { + case .none: accessControlStr = "none" + case .passcode: accessControlStr = "passcode" + case .anyBiometry: accessControlStr = "any biometry" + case .anyBiometryOrPasscode: accessControlStr = "any biometry or passcode" + case .anyBiometryAndPasscode: accessControlStr = "any biometry and passcode" + case .currentBiometry: accessControlStr = "current biometry" + case .currentBiometryAndPasscode: accessControlStr = "current biometry and passcode" + } + + let contents = """ + # created: \(createdAt) + # access control: \(accessControlStr) + # public key: \(recipient) + \(identity) + """ + + return (contents, recipient) + } + + func runRecipientV1() { + var recipients: [String] = [] + var identities: [String] = [] + var fileKeys: [Data] = [] + + // Phase 1 + loop: while true { + let stanza = try! Stanza.readFrom(stream: stream) + switch stanza.type { + case "add-recipient": + recipients.append(stanza.args[0]) + case "add-identity": + identities.append(stanza.args[0]) + case "wrap-file-key": + fileKeys.append(stanza.body) + case "done": + break loop + default: + continue + } + } + + // Phase 2 + var stanzas: [Stanza] = [] + var errors: [Stanza] = [] + var recipientKeys: [P256.KeyAgreement.PublicKey] = [] + recipients.enumerated().forEach { (index, recipient) in + do { + recipientKeys.append(try P256.KeyAgreement.PublicKey(ageRecipient: recipient)) + } catch { + errors.append( + Stanza(error: "recipient", args: [String(index)], message: error.localizedDescription)) + } + } + identities.enumerated().forEach { (index, identity) in + do { + recipientKeys.append( + (try newSecureEnclavePrivateKey(ageIdentity: identity, crypto: crypto)).publicKey) + } catch { + errors.append( + Stanza(error: "identity", args: [String(index)], message: error.localizedDescription)) + } + } + fileKeys.enumerated().forEach { (index, fileKey) in + for recipientKey in recipientKeys { + do { + let ephemeralSecretKey = self.crypto.newEphemeralPrivateKey() + let ephemeralPublicKeyBytes = ephemeralSecretKey.publicKey.compressedRepresentation + // CryptoKit PublicKeys can be the identity point by construction (see CryptoTests), but + // these keys can't be used in any operation. This is undocumented, but a documentation request + // has been filed as FB11989432. + // Swift Crypto PublicKeys cannot be the identity point by construction. + // Compresed representation cannot be the identity point anyway (?) + // Therefore, the shared secret cannot be all 0x00 bytes, so we don't need + // to explicitly check this here. + let sharedSecret = try ephemeralSecretKey.sharedSecretFromKeyAgreement(with: recipientKey) + let salt = ephemeralPublicKeyBytes + recipientKey.compressedRepresentation + let wrapKey = sharedSecret.hkdfDerivedSymmetricKey( + using: SHA256.self, salt: salt, + sharedInfo: "piv-p256".data(using: .utf8)!, + outputByteCount: 32 + ) + let sealedBox = try ChaChaPoly.seal( + fileKey, using: wrapKey, nonce: try! ChaChaPoly.Nonce(data: Data(count: 12))) + stanzas.append( + Stanza( + type: "recipient-stanza", + args: [ + String(index), + "piv-p256", + recipientKey.tag.base64RawEncodedString, + ephemeralPublicKeyBytes.base64RawEncodedString, + ], body: sealedBox.ciphertext + sealedBox.tag + )) + } catch { + errors.append( + Stanza(error: "internal", args: [], message: error.localizedDescription)) + } + } + } + for stanza in (errors.isEmpty ? stanzas : errors) { + stanza.writeTo(stream: stream) + let resp = try! Stanza.readFrom(stream: stream) + assert(resp.type == "ok") + } + Stanza(type: "done").writeTo(stream: stream) + } + + func runIdentityV1() { + // Phase 1 + var identities: [String] = [] + var recipientStanzas: [Stanza] = [] + loop: while true { + let stanza = try! Stanza.readFrom(stream: stream) + switch stanza.type { + case "add-identity": + identities.append(stanza.args[0]) + case "recipient-stanza": + recipientStanzas.append(stanza) + case "done": + break loop + default: + continue + } + } + + // Phase 2 + var identityKeys: [SecureEnclavePrivateKey] = [] + var errors: [Stanza] = [] + + // Construct identities + identities.enumerated().forEach { (index, identity) in + do { + identityKeys.append( + (try newSecureEnclavePrivateKey(ageIdentity: identity, crypto: crypto))) + } catch { + errors.append( + Stanza(error: "identity", args: [String(index)], message: error.localizedDescription)) + } + } + + var fileResponses: [Int: Stanza] = [:] + if errors.isEmpty { + // Check structural validity + recipientStanzas.enumerated().forEach { (index, recipientStanza) in + let fileIndex = Int(recipientStanza.args[0])! + switch recipientStanza.args[1] { + case "piv-p256": + if recipientStanza.args.count != 4 { + fileResponses[fileIndex] = Stanza( + error: "stanza", args: [String(fileIndex)], message: "incorrect argument count") + return + } + let tag = Data(base64RawEncoded: recipientStanza.args[2]) + if tag == nil || tag!.count != 4 { + fileResponses[fileIndex] = Stanza( + error: "stanza", args: [String(fileIndex)], message: "invalid tag") + return + } + let share = Data(base64RawEncoded: recipientStanza.args[3]) + if share == nil || share!.count != 33 { + fileResponses[fileIndex] = Stanza( + error: "stanza", args: [String(fileIndex)], message: "invalid share") + return + } + if recipientStanza.body.count != 32 { + fileResponses[fileIndex] = Stanza( + error: "stanza", args: [String(fileIndex)], + message: "invalid body") + return + } + + default: + return + } + } + + // Unwrap keys + recipientStanzas.enumerated().forEach { (index, recipientStanza) in + let fileIndex = Int(recipientStanza.args[0])! + if fileResponses[fileIndex] != nil { + return + } + let type = recipientStanza.args[1] + if type != "piv-p256" { + return + } + let tag = recipientStanza.args[2] + let share = recipientStanza.args[3] + for identity in identityKeys { + if identity.publicKey.tag.base64RawEncodedString != tag { + continue + } + do { + let shareKeyData = Data(base64RawEncoded: share)! + let shareKey: P256.KeyAgreement.PublicKey = try P256.KeyAgreement.PublicKey( + compressedRepresentation: shareKeyData) + // CryptoKit PublicKeys can be the identity point by construction (see CryptoTests), but + // these keys can't be used in any operation. This is undocumented, but a documentation request + // has been filed as FB11989432. + // Swift Crypto PublicKeys cannot be the identity point by construction. + // Compresed representation cannot be the identity point anyway (?) + // Therefore, the shared secret cannot be all 0x00 bytes, so we don't need + // to explicitly check this here. + let sharedSecret: SharedSecret = try identity.sharedSecretFromKeyAgreement( + with: shareKey) + let salt = + shareKey.compressedRepresentation + identity.publicKey.compressedRepresentation + let wrapKey = sharedSecret.hkdfDerivedSymmetricKey( + using: SHA256.self, salt: salt, + sharedInfo: "piv-p256".data(using: .utf8)!, + outputByteCount: 32 + ) + let unwrappedKey = try ChaChaPoly.open( + ChaChaPoly.SealedBox( + combined: try! ChaChaPoly.Nonce(data: Data(count: 12)) + recipientStanza.body), + using: wrapKey) + fileResponses[fileIndex] = Stanza( + type: "file-key", + args: [String(fileIndex)], + body: unwrappedKey + ) + } catch { + Stanza(type: "msg", body: error.localizedDescription.data(using: .utf8)!).writeTo( + stream: stream) + let resp = try! Stanza.readFrom(stream: self.stream) + assert(resp.type == "ok") + // continue + } + } + } + } + + let responses = fileResponses.keys.sorted().map({ k in fileResponses[k]! }) + for stanza in (errors.isEmpty ? responses : errors) { + stanza.writeTo(stream: stream) + let resp = try! Stanza.readFrom(stream: stream) + assert(resp.type == "ok") + } + Stanza(type: "done").writeTo(stream: stream) + } + + enum Error: LocalizedError, Equatable { + case seUnsupported + case incompleteStanza + case invalidStanza + case unknownHRP(String) + + public var errorDescription: String? { + switch self { + case .seUnsupported: return "Secure Enclave not supported on this device" + case .incompleteStanza: return "incomplete stanza" + case .invalidStanza: return "invalid stanza" + case .unknownHRP(let hrp): return "unknown HRP: \(hrp)" + } + } + } +} + +////////////////////////////////////////////////////////////////////////////////////////// + +struct Stanza: Equatable { + var type: String + var args: [String] = [] + var body = Data() + + static func readFrom(stream: Stream) throws -> Stanza { + guard let header = stream.readLine() else { + throw Plugin.Error.incompleteStanza + } + let headerParts = header.components(separatedBy: " ") + if headerParts.count < 2 { + throw Plugin.Error.invalidStanza + } + if headerParts[0] != "->" { + throw Plugin.Error.invalidStanza + } + var body = Data() + while true { + guard let line = stream.readLine() else { + throw Plugin.Error.incompleteStanza + } + guard let lineData = Data(base64RawEncoded: line) else { + throw Plugin.Error.invalidStanza + } + if lineData.count > 48 { + throw Plugin.Error.invalidStanza + } + body.append(lineData) + if lineData.count < 48 { + break + } + } + return Stanza(type: headerParts[1], args: Array(headerParts[2...]), body: body) + } + + func writeTo(stream: Stream) { + let parts = ([type] + args).joined(separator: " ") + stream.writeLine("-> \(parts)\n\(body.base64RawEncodedString)") + } +} + +extension Stanza { + init(error type: String, args: [String] = [], message: String) { + self.type = "error" + self.args = [type] + args + self.body = message.data(using: .utf8)! + } +} + +enum KeyAccessControl { + case none + case passcode + case anyBiometry + case anyBiometryOrPasscode + case anyBiometryAndPasscode + case currentBiometry + case currentBiometryAndPasscode +} + +extension P256.KeyAgreement.PublicKey { + init(ageRecipient: String) throws { + let id = try Bech32().decode(ageRecipient) + if id.hrp != "age1se" { + throw Plugin.Error.unknownHRP(id.hrp) + } + self = try P256.KeyAgreement.PublicKey(compressedRepresentation: id.data) + } + + var tag: Data { + return Data(SHA256.hash(data: compressedRepresentation).prefix(4)) + } + + var ageRecipient: String { + return Bech32().encode(hrp: "age1se", data: self.compressedRepresentation) + } +} + +extension SecureEnclavePrivateKey { + var ageIdentity: String { + return Bech32().encode( + hrp: "AGE-PLUGIN-SE-", + data: self.dataRepresentation) + } +} + +func newSecureEnclavePrivateKey(ageIdentity: String, crypto: Crypto) throws + -> SecureEnclavePrivateKey +{ + let id = try Bech32().decode(ageIdentity) + if id.hrp != "AGE-PLUGIN-SE-" { + throw Plugin.Error.unknownHRP(id.hrp) + } + return try crypto.newSecureEnclavePrivateKey(dataRepresentation: id.data) +} diff --git a/Sources/Stream.swift b/Sources/Stream.swift new file mode 100644 index 0000000..69ca337 --- /dev/null +++ b/Sources/Stream.swift @@ -0,0 +1,19 @@ +import Foundation + +/// Abstraction of a line-based communication stream +protocol Stream { + func readLine() -> String? + func writeLine(_: String) +} + +class StandardIOStream: Stream { + func readLine() -> String? { + return Swift.readLine(strippingNewline: true) + } + + func writeLine(_ line: String) { + FileHandle.standardOutput.write(line.data(using: .utf8)!) + FileHandle.standardOutput.write(Data([0xa])) + fflush(stdout) + } +} diff --git a/Tests/Base64Tests.swift b/Tests/Base64Tests.swift new file mode 100644 index 0000000..5ef0b28 --- /dev/null +++ b/Tests/Base64Tests.swift @@ -0,0 +1,79 @@ +import XCTest + +@testable import age_plugin_se + +final class Base64Tests: XCTestCase { + func testDataInitBase64RawEncoded_NeedsNoPad() throws { + XCTAssertEqual( + Data([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]), + Data(base64RawEncoded: "AQIDBAUG")) + } + + func testDataInitBase64RawEncoded_Needs1Pad() throws { + XCTAssertEqual( + Data([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]), + Data(base64RawEncoded: "AQIDBAUGBwg")) + } + + func testDataInitBase64RawEncoded_Needs2Pads() throws { + XCTAssertEqual( + Data([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]), + Data(base64RawEncoded: "AQIDBAUGBw")) + } + + func testDataInitBase64RawEncoded_HasPad() throws { + XCTAssertEqual( + nil, + Data(base64RawEncoded: "AQIDBAUGBwg=")) + } + + func testDataInit_InvalidBase64() throws { + XCTAssertEqual( + nil, + Data(base64RawEncoded: "A_QIDBAUG")) + } + + func testDataBase64RawEncodedData() throws { + XCTAssertEqual( + "AQIDBAUGBw".data(using: .utf8), + Data([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]).base64RawEncodedData) + } + + func testDataBase64RawEncodedData_Long() throws { + XCTAssertEqual( + """ + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np + bmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFi + b3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVu + aWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBu + aXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0 + ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxp + dCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBF + eGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBz + dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlk + IGVzdCBsYWJvcnVtLg + """.data(using: .utf8), + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + .data(using: .utf8)! + .base64RawEncodedData) + } + + func testDataBase64RawEncodedString_Long() throws { + XCTAssertEqual( + """ + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np + bmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFi + b3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVu + aWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBu + aXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0 + ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxp + dCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBF + eGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBz + dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlk + IGVzdCBsYWJvcnVtLg + """, + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + .data(using: .utf8)! + .base64RawEncodedString) + } +} diff --git a/Tests/Bech32Tests.swift b/Tests/Bech32Tests.swift new file mode 100644 index 0000000..b96fb6a --- /dev/null +++ b/Tests/Bech32Tests.swift @@ -0,0 +1,103 @@ +import XCTest + +@testable import age_plugin_se + +final class Bech32Tests: XCTestCase { + func testEncode() throws { + XCTAssertEqual( + "age1se1qv9p3zge0tmqxczme5pn3p7g3x80t0uxvlk30s9vevjq0lxuy8rzss09jyq", + Bech32().encode( + hrp: "age1se", + data: Data([ + 0x03, 0x0a, 0x18, 0x89, 0x19, 0x7a, 0xf6, 0x03, 0x60, 0x5b, 0xcd, 0x03, 0x38, 0x87, 0xc8, + 0x89, 0x8e, 0xf5, 0xbf, 0x86, 0x67, 0xed, 0x17, 0xc0, 0xac, 0xcb, 0x24, 0x07, 0xfc, 0xdc, + 0x21, 0xc6, 0x28, + ]))) + } + + func testEncode_LongUppercase() throws { + XCTAssertEqual( + "AGE-PLUGIN-SE-1QJPQZ7P3SGQHGVYP75XQYUNTXXQ7UVQTPSPKY6TYQSZDNVLMZYCYSRQRWP6KYPZPQNV20QEQRP3CLMWQALZ8V6TFESK6VDUL30F0D7TC2EXE2RV3Z2TQ5L0ZQFLHJMLY64XS8ESX6KFTL43MN86QVA0W982DTFWL4XMRT7CGXQYQCQMJDDHSYQGQXQRSCQNTWSPQZPPS9CXQYAMTQS5W4LASFLR432Z3658D86JEL8MKGE9XTJLHK4P3ASKWWZ8W6G7RWVLQYSWECSL8XF4RQPCVQF3XXQSPPYCQWRQZDDMQYQGZXQTSCQMTD9JQGYRALY9FHQYLGFET999CZUFGPGLJXQNSCQMJDDKSGGXE56G2EH3Y5V0QPUM8VHADV3FS2TKDR4F2M8266Y444ZFF3FW0VCC85RQZV4JRZAPSWGXQXCTRDSCKKVPFPSPK7CMTXY3RQGQVQD3HQMCVR9ZX2ANFVDJ57AMWV4EYZAT5DPJKUARFVDSHG6T0DCCQJRQYDAJX2MQPQYQNQ2SVQ3HHXEMWXY3RQGQVQD3HQMCVR9ZX2ANFVDJ57AMWV4EYZAT5DPJKUARFVDSHG6T0DCCQWRQZDASSZQGPK9FKDS", + Bech32().encode( + hrp: "AGE-PLUGIN-SE-", + data: Data([ + 0x04, 0x82, 0x01, 0x78, 0x31, 0x82, 0x01, 0x74, 0x30, 0x81, 0xf5, 0x0c, 0x02, 0x72, 0x6b, + 0x31, 0x81, 0xee, 0x30, 0x0b, 0x0c, 0x03, 0x62, 0x69, 0x64, 0x04, 0x04, 0xd9, 0xb3, 0xfb, + 0x11, 0x30, 0x48, 0x0c, 0x03, 0x70, 0x75, 0x62, 0x04, 0x41, 0x04, 0xd8, 0xa7, 0x83, 0x20, + 0x18, 0x63, 0x8f, 0xed, 0xc0, 0xef, 0xc4, 0x76, 0x69, 0x69, 0xcc, 0x2d, 0xa6, 0x37, 0x9f, + 0x8b, 0xd2, 0xf6, 0xf9, 0x78, 0x56, 0x4d, 0x95, 0x0d, 0x91, 0x12, 0x96, 0x0a, 0x7d, 0xe2, + 0x02, 0x7f, 0x79, 0x6f, 0xe4, 0xd5, 0x4d, 0x03, 0xe6, 0x06, 0xd5, 0x92, 0xbf, 0xd6, 0x3b, + 0x99, 0xf4, 0x06, 0x75, 0xee, 0x29, 0xd4, 0xd5, 0xa5, 0xdf, 0xa9, 0xb6, 0x35, 0xfb, 0x08, + 0x30, 0x08, 0x0c, 0x03, 0x72, 0x6b, 0x6f, 0x02, 0x01, 0x00, 0x30, 0x07, 0x0c, 0x02, 0x6b, + 0x74, 0x02, 0x01, 0x04, 0x30, 0x2e, 0x0c, 0x02, 0x77, 0x6b, 0x04, 0x28, 0xea, 0xff, 0xb0, + 0x4f, 0xc7, 0x58, 0xa8, 0x51, 0xd5, 0x0e, 0xd3, 0xea, 0x59, 0xf9, 0xf7, 0x64, 0x64, 0xa6, + 0x5c, 0xbf, 0x7b, 0x54, 0x31, 0xec, 0x2c, 0xe7, 0x08, 0xee, 0xd2, 0x3c, 0x37, 0x33, 0xe0, + 0x24, 0x1d, 0x9c, 0x43, 0xe7, 0x32, 0x6a, 0x30, 0x07, 0x0c, 0x02, 0x62, 0x63, 0x02, 0x01, + 0x09, 0x30, 0x07, 0x0c, 0x02, 0x6b, 0x76, 0x02, 0x01, 0x02, 0x30, 0x17, 0x0c, 0x03, 0x6b, + 0x69, 0x64, 0x04, 0x10, 0x7d, 0xf9, 0x0a, 0x9b, 0x80, 0x9f, 0x42, 0x72, 0xb2, 0x94, 0xb8, + 0x17, 0x12, 0x80, 0xa3, 0xf2, 0x30, 0x27, 0x0c, 0x03, 0x72, 0x6b, 0x6d, 0x04, 0x20, 0xd9, + 0xa6, 0x90, 0xac, 0xde, 0x24, 0xa3, 0x1e, 0x00, 0xf3, 0x67, 0x65, 0xfa, 0xd6, 0x45, 0x30, + 0x52, 0xec, 0xd1, 0xd5, 0x2a, 0xd9, 0xd5, 0xad, 0x12, 0xb5, 0xa8, 0x92, 0x98, 0xa5, 0xcf, + 0x66, 0x30, 0x7a, 0x0c, 0x02, 0x65, 0x64, 0x31, 0x74, 0x30, 0x72, 0x0c, 0x03, 0x61, 0x63, + 0x6c, 0x31, 0x6b, 0x30, 0x29, 0x0c, 0x03, 0x6f, 0x63, 0x6b, 0x31, 0x22, 0x30, 0x20, 0x0c, + 0x03, 0x63, 0x70, 0x6f, 0x0c, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x30, 0x09, 0x0c, 0x04, 0x6f, 0x64, 0x65, 0x6c, 0x01, 0x01, 0x01, 0x30, 0x2a, 0x0c, + 0x04, 0x6f, 0x73, 0x67, 0x6e, 0x31, 0x22, 0x30, 0x20, 0x0c, 0x03, 0x63, 0x70, 0x6f, 0x0c, + 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x30, 0x07, 0x0c, 0x02, + 0x6f, 0x61, 0x01, 0x01, 0x01, + ]))) + } + + func testDecode() throws { + let result = try Bech32().decode( + "age1se1qv9p3zge0tmqxczme5pn3p7g3x80t0uxvlk30s9vevjq0lxuy8rzss09jyq") + XCTAssertEqual( + "age1se", result.hrp) + XCTAssertEqual( + Data([ + 0x03, 0x0a, 0x18, 0x89, 0x19, 0x7a, 0xf6, 0x03, 0x60, 0x5b, 0xcd, 0x03, 0x38, 0x87, 0xc8, + 0x89, 0x8e, 0xf5, 0xbf, 0x86, 0x67, 0xed, 0x17, 0xc0, 0xac, 0xcb, 0x24, 0x07, 0xfc, 0xdc, + 0x21, 0xc6, 0x28, + ]), result.data) + } + + func testDecode_LongUppercase() throws { + let result = try Bech32().decode( + "AGE-PLUGIN-SE-1QJPQZ7P3SGQHGVYP75XQYUNTXXQ7UVQTPSPKY6TYQSZDNVLMZYCYSRQRWP6KYPZPQNV20QEQRP3CLMWQALZ8V6TFESK6VDUL30F0D7TC2EXE2RV3Z2TQ5L0ZQFLHJMLY64XS8ESX6KFTL43MN86QVA0W982DTFWL4XMRT7CGXQYQCQMJDDHSYQGQXQRSCQNTWSPQZPPS9CXQYAMTQS5W4LASFLR432Z3658D86JEL8MKGE9XTJLHK4P3ASKWWZ8W6G7RWVLQYSWECSL8XF4RQPCVQF3XXQSPPYCQWRQZDDMQYQGZXQTSCQMTD9JQGYRALY9FHQYLGFET999CZUFGPGLJXQNSCQMJDDKSGGXE56G2EH3Y5V0QPUM8VHADV3FS2TKDR4F2M8266Y444ZFF3FW0VCC85RQZV4JRZAPSWGXQXCTRDSCKKVPFPSPK7CMTXY3RQGQVQD3HQMCVR9ZX2ANFVDJ57AMWV4EYZAT5DPJKUARFVDSHG6T0DCCQJRQYDAJX2MQPQYQNQ2SVQ3HHXEMWXY3RQGQVQD3HQMCVR9ZX2ANFVDJ57AMWV4EYZAT5DPJKUARFVDSHG6T0DCCQWRQZDASSZQGPK9FKDS" + ) + XCTAssertEqual( + "AGE-PLUGIN-SE-", result.hrp) + // print(result.data.map { String(format: "0x%02x", $0) }.joined(separator: ", ")) + XCTAssertEqual( + Data([ + 0x04, 0x82, 0x01, 0x78, 0x31, 0x82, 0x01, 0x74, 0x30, 0x81, 0xf5, 0x0c, 0x02, 0x72, 0x6b, + 0x31, 0x81, 0xee, 0x30, 0x0b, 0x0c, 0x03, 0x62, 0x69, 0x64, 0x04, 0x04, 0xd9, 0xb3, 0xfb, + 0x11, 0x30, 0x48, 0x0c, 0x03, 0x70, 0x75, 0x62, 0x04, 0x41, 0x04, 0xd8, 0xa7, 0x83, 0x20, + 0x18, 0x63, 0x8f, 0xed, 0xc0, 0xef, 0xc4, 0x76, 0x69, 0x69, 0xcc, 0x2d, 0xa6, 0x37, 0x9f, + 0x8b, 0xd2, 0xf6, 0xf9, 0x78, 0x56, 0x4d, 0x95, 0x0d, 0x91, 0x12, 0x96, 0x0a, 0x7d, 0xe2, + 0x02, 0x7f, 0x79, 0x6f, 0xe4, 0xd5, 0x4d, 0x03, 0xe6, 0x06, 0xd5, 0x92, 0xbf, 0xd6, 0x3b, + 0x99, 0xf4, 0x06, 0x75, 0xee, 0x29, 0xd4, 0xd5, 0xa5, 0xdf, 0xa9, 0xb6, 0x35, 0xfb, 0x08, + 0x30, 0x08, 0x0c, 0x03, 0x72, 0x6b, 0x6f, 0x02, 0x01, 0x00, 0x30, 0x07, 0x0c, 0x02, 0x6b, + 0x74, 0x02, 0x01, 0x04, 0x30, 0x2e, 0x0c, 0x02, 0x77, 0x6b, 0x04, 0x28, 0xea, 0xff, 0xb0, + 0x4f, 0xc7, 0x58, 0xa8, 0x51, 0xd5, 0x0e, 0xd3, 0xea, 0x59, 0xf9, 0xf7, 0x64, 0x64, 0xa6, + 0x5c, 0xbf, 0x7b, 0x54, 0x31, 0xec, 0x2c, 0xe7, 0x08, 0xee, 0xd2, 0x3c, 0x37, 0x33, 0xe0, + 0x24, 0x1d, 0x9c, 0x43, 0xe7, 0x32, 0x6a, 0x30, 0x07, 0x0c, 0x02, 0x62, 0x63, 0x02, 0x01, + 0x09, 0x30, 0x07, 0x0c, 0x02, 0x6b, 0x76, 0x02, 0x01, 0x02, 0x30, 0x17, 0x0c, 0x03, 0x6b, + 0x69, 0x64, 0x04, 0x10, 0x7d, 0xf9, 0x0a, 0x9b, 0x80, 0x9f, 0x42, 0x72, 0xb2, 0x94, 0xb8, + 0x17, 0x12, 0x80, 0xa3, 0xf2, 0x30, 0x27, 0x0c, 0x03, 0x72, 0x6b, 0x6d, 0x04, 0x20, 0xd9, + 0xa6, 0x90, 0xac, 0xde, 0x24, 0xa3, 0x1e, 0x00, 0xf3, 0x67, 0x65, 0xfa, 0xd6, 0x45, 0x30, + 0x52, 0xec, 0xd1, 0xd5, 0x2a, 0xd9, 0xd5, 0xad, 0x12, 0xb5, 0xa8, 0x92, 0x98, 0xa5, 0xcf, + 0x66, 0x30, 0x7a, 0x0c, 0x02, 0x65, 0x64, 0x31, 0x74, 0x30, 0x72, 0x0c, 0x03, 0x61, 0x63, + 0x6c, 0x31, 0x6b, 0x30, 0x29, 0x0c, 0x03, 0x6f, 0x63, 0x6b, 0x31, 0x22, 0x30, 0x20, 0x0c, + 0x03, 0x63, 0x70, 0x6f, 0x0c, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x30, 0x09, 0x0c, 0x04, 0x6f, 0x64, 0x65, 0x6c, 0x01, 0x01, 0x01, 0x30, 0x2a, 0x0c, + 0x04, 0x6f, 0x73, 0x67, 0x6e, 0x31, 0x22, 0x30, 0x20, 0x0c, 0x03, 0x63, 0x70, 0x6f, 0x0c, + 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x30, 0x07, 0x0c, 0x02, + 0x6f, 0x61, 0x01, 0x01, 0x01, + ]), result.data) + } +} diff --git a/Tests/CLITests.swift b/Tests/CLITests.swift new file mode 100644 index 0000000..9d91a9d --- /dev/null +++ b/Tests/CLITests.swift @@ -0,0 +1,49 @@ +import XCTest + +@testable import age_plugin_se + +final class OptionsTests: XCTestCase { + func testParse_NoArguments() throws { + let options = try Options.parse(["_"]) + XCTAssertEqual(.help, options.command) + } + + func testParse_CommandWithHelp() throws { + let options = try Options.parse(["_", "keygen", "--help"]) + XCTAssertEqual(.help, options.command) + } + + func testParse_CommandWithVersion() throws { + let options = try Options.parse(["_", "keygen", "--version"]) + XCTAssertEqual(.version, options.command) + } + + func testParse_Keygen() throws { + let options = try Options.parse(["_", "keygen", "--access-control=any-biometry"]) + XCTAssertEqual(.keygen, options.command) + XCTAssertEqual(.anyBiometry, options.accessControl) + } + + func testParse_AgePlugin() throws { + let options = try Options.parse(["_", "keygen", "--age-plugin=identity-v1"]) + XCTAssertEqual(.plugin(.identityV1), options.command) + } + + func testParse_LongOptionWithEqual() throws { + let options = try Options.parse(["_", "keygen", "--output=foo.txt"]) + XCTAssertEqual(.keygen, options.command) + XCTAssertEqual("foo.txt", options.output) + } + + func testParse_LongOptionWithoutEqual() throws { + let options = try Options.parse(["_", "keygen", "--output", "foo.txt"]) + XCTAssertEqual(.keygen, options.command) + XCTAssertEqual("foo.txt", options.output) + } + + func testParse_LongOptionWithoutValue() throws { + XCTAssertThrowsError(try Options.parse(["_", "keygen", "--output"])) { error in + XCTAssertEqual(Options.Error.missingValue("--output"), error as! Options.Error) + } + } +} diff --git a/Tests/CryptoTests.swift b/Tests/CryptoTests.swift new file mode 100644 index 0000000..f9b6e32 --- /dev/null +++ b/Tests/CryptoTests.swift @@ -0,0 +1,71 @@ +import XCTest + +@testable import age_plugin_se + +#if !os(Linux) && !os(Windows) + import CryptoKit +#else + import Crypto +#endif + +final class CryptoKitCryptoTests: XCTestCase { + var crypto = CryptoKitCrypto() + + func testNewEphemeralPrivateKey() throws { + let k1 = crypto.newEphemeralPrivateKey() + let k2 = crypto.newEphemeralPrivateKey() + + XCTAssertNotEqual(k1.rawRepresentation, k2.rawRepresentation) + XCTAssertNotEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation) + } + + func testNewEphemeralPrivateKey_DifferentCrypto() throws { + let k1 = CryptoKitCrypto().newEphemeralPrivateKey() + let k2 = CryptoKitCrypto().newEphemeralPrivateKey() + + XCTAssertNotEqual(k1.rawRepresentation, k2.rawRepresentation) + XCTAssertNotEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation) + } + + // A test to validate that CryptoKit / Swift Crypto cannot do any operations with points at infinity + func testPointAtInfinity() throws { + let sk = P256.KeyAgreement.PrivateKey() + + // base64.b64encode(ECC.generate(curve="p256").export_key(format="DER")) + let pk = try P256.KeyAgreement.PublicKey(derRepresentation: Data(base64Encoded: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0Zl262mVCr+1pi9396tEdXC0HIQnENUkWal3nOzLWvX+TYja1xVE++6WzRvunrkBT91380BIJZvB7ZiiEN+Y1A==")!) + + // Test that operations work from a regular DER constructed key + let _ = try sk.sharedSecretFromKeyAgreement(with: pk) + + func run() throws { + // base64.b64encode(ECC.EccKey(curve = "p256", point = ECC.generate(curve="p256").pointQ.point_at_infinity()).export_key(format="DER")) + // Swift Crypto throws at construction time + let identityPK = try P256.KeyAgreement.PublicKey(derRepresentation: Data(base64Encoded: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")!) + + // CryptoKit throws at operation time + let _ = try sk.sharedSecretFromKeyAgreement(with: identityPK) + } + + XCTAssertThrowsError(try run()) + } +} + +final class DummyCryptoTests: XCTestCase { + var crypto = DummyCrypto() + + func testNewEphemeralPrivateKey() throws { + let k1 = crypto.newEphemeralPrivateKey() + let k2 = crypto.newEphemeralPrivateKey() + + XCTAssertNotEqual(k1.rawRepresentation, k2.rawRepresentation) + XCTAssertNotEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation) + } + + func testNewEphemeralPrivateKey_DifferentCrypto() throws { + let k1 = DummyCrypto().newEphemeralPrivateKey() + let k2 = DummyCrypto().newEphemeralPrivateKey() + + XCTAssertEqual(k1.rawRepresentation, k2.rawRepresentation) + XCTAssertEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation) + } +} diff --git a/Tests/DummyCrypto.swift b/Tests/DummyCrypto.swift new file mode 100644 index 0000000..a1dafac --- /dev/null +++ b/Tests/DummyCrypto.swift @@ -0,0 +1,75 @@ +import Foundation + +@testable import age_plugin_se + +#if !os(Linux) && !os(Windows) + import CryptoKit +#else + import Crypto +#endif + +class DummyCrypto: Crypto { + // If more keys are needed, add them to the front + var dummyKeys = [ + "t8Y0uUHLtBvCtuUz0Hdw2lqbwZf6TgYzYKFWMEEFSs8", + "HxEmObcQ6bcAUC8w6kPWrnlUIwBQoi66ZNpQZ0cAXww", + "dCDteyAKpkwYd8jCunOz0mvWmy+24zvWV41YBD+Pkeg", + "NkkLXSZ+yhx9imKKw9cOsbey4C1XZAPuSDMCgTLENrY", + "bQrp04tXb+diJ6x28Kd8EDt9sCmI5diS36Zy3n49DHg", + "m8/qMMkYDelvL+ihdUFYyKXBn+7We21fZ5zH/I61y3M", + "lQq/Pq0GA2QFGTEiNMQIxZHzBnt+nPRXK5gL3X6nnJY", + "VoUn+n/vzkuDzWgMV9n3e1L+tTSIl0Sg7lXSNDR5XqY", + "3naom0zZxBZcSZCfoNzyjLVmG6hyRKX8bCU3wukusFI", + "N2WRutxd1Ed0l4piqArI2gKYSTG7peE8BYBrLLV7YjQ", + ].map { Data(base64RawEncoded: $0)! } + + var isSecureEnclaveAvailable = true + var failingOperations = false + + func newSecureEnclavePrivateKey(dataRepresentation: Data) throws -> SecureEnclavePrivateKey { + return DummySecureEnclavePrivateKey( + key: try P256.KeyAgreement.PrivateKey(rawRepresentation: dataRepresentation), crypto: self) + } + + func newSecureEnclavePrivateKey(accessControl: SecAccessControl) throws -> SecureEnclavePrivateKey + { + return DummySecureEnclavePrivateKey( + key: try P256.KeyAgreement.PrivateKey(rawRepresentation: dummyKeys.popLast()!), crypto: self) + } + + func newEphemeralPrivateKey() -> P256.KeyAgreement.PrivateKey { + return try! P256.KeyAgreement.PrivateKey(rawRepresentation: dummyKeys.popLast()!) + } +} + +struct DummySecureEnclavePrivateKey: SecureEnclavePrivateKey { + var key: P256.KeyAgreement.PrivateKey + var crypto: DummyCrypto + + var publicKey: P256.KeyAgreement.PublicKey { + return key.publicKey + } + + var dataRepresentation: Data { + return key.rawRepresentation + } + + func sharedSecretFromKeyAgreement(with publicKeyShare: P256.KeyAgreement.PublicKey) throws + -> SharedSecret + { + if crypto.failingOperations { + throw DummyCryptoError.dummyError + } + return try key.sharedSecretFromKeyAgreement(with: publicKeyShare) + } +} + +enum DummyCryptoError: LocalizedError { + case dummyError + + public var errorDescription: String? { + switch self { + case .dummyError: return "dummy error" + } + } +} diff --git a/Tests/MemoryStream.swift b/Tests/MemoryStream.swift new file mode 100644 index 0000000..fe1a885 --- /dev/null +++ b/Tests/MemoryStream.swift @@ -0,0 +1,27 @@ +@testable import age_plugin_se + +class MemoryStream: Stream { + var inputLines: [String] = [] + var outputLines: [String] = [] + + var output: String { + return outputLines.joined(separator: "\n") + } + + func add(input: String) { + inputLines.append(contentsOf: input.components(separatedBy: "\n")) + } + + func readLine() -> String? { + if inputLines.isEmpty { + return nil + } + let result = inputLines[0] + inputLines.removeFirst() + return result + } + + func writeLine(_ line: String) { + outputLines.append(contentsOf: line.components(separatedBy: "\n")) + } +} diff --git a/Tests/PluginTests.swift b/Tests/PluginTests.swift new file mode 100644 index 0000000..82ed04a --- /dev/null +++ b/Tests/PluginTests.swift @@ -0,0 +1,828 @@ +import XCTest + +@testable import age_plugin_se + +#if !os(Linux) && !os(Windows) + import CryptoKit +#else + import Crypto +#endif + +final class PluginTests: XCTestCase { + func testCertificateTag() throws { + let key = try P256.KeyAgreement.PublicKey(compactRepresentation: Data(count: 32)) + XCTAssertEqual("Ujulpw", key.tag.base64RawEncodedString) + } + + // Test to ensure that age-plugin-yubikey has the same output tag + // These values were extracted from a yubikey recipient + func testCertificateTag_YubiKeyPlugin() throws { + let key = try P256.KeyAgreement.PublicKey( + compactRepresentation: Data([ + 182, 32, 36, 98, 119, 204, 123, 231, 20, 203, 102, 119, 81, 232, 194, 196, 140, 194, 55, + 12, 222, 162, 205, 252, 47, 114, 187, 157, 117, 151, 57, 158, + ])) + XCTAssertEqual(Data([128, 103, 102, 255]), key.tag) + XCTAssertEqual("gGdm/w", key.tag.base64RawEncodedString) + } +} + +final class GenerateTests: XCTestCase { + var stream = MemoryStream() + var crypto = DummyCrypto() + + override func setUp() { + stream = MemoryStream() + crypto = DummyCrypto() + } + + func testGenerate() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + let result = try plugin.generateKey( + accessControl: .anyBiometryOrPasscode, now: Date(timeIntervalSinceReferenceDate: -123456789.0) + ) + XCTAssertEqual( + """ + # created: 1997-02-02T02:26:51Z + # access control: any biometry or passcode + # public key: age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4 + AGE-PLUGIN-SE-1XAJERWKUTH2YWAYH3F32SZKGMGPFSJF3HWJ7Z0Q9SP4JEDTMVG6Q6JD2VG + """, result.0) + XCTAssertEqual( + "age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4", result.1) + } + + func testGenerate_AnyBiometryAndPasscode() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + let result = try plugin.generateKey( + accessControl: .anyBiometryAndPasscode, + now: Date(timeIntervalSinceReferenceDate: -123456789.0)) + XCTAssertEqual( + """ + # created: 1997-02-02T02:26:51Z + # access control: any biometry and passcode + # public key: age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4 + AGE-PLUGIN-SE-1XAJERWKUTH2YWAYH3F32SZKGMGPFSJF3HWJ7Z0Q9SP4JEDTMVG6Q6JD2VG + """, result.0) + XCTAssertEqual( + "age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4", result.1) + } + + func testGenerate_CurrentBiometry() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + let result = try plugin.generateKey( + accessControl: .currentBiometry, now: Date(timeIntervalSinceReferenceDate: -123456789.0)) + XCTAssertEqual( + """ + # created: 1997-02-02T02:26:51Z + # access control: current biometry + # public key: age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4 + AGE-PLUGIN-SE-1XAJERWKUTH2YWAYH3F32SZKGMGPFSJF3HWJ7Z0Q9SP4JEDTMVG6Q6JD2VG + """, result.0) + XCTAssertEqual( + "age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4", result.1) + } + + func testGenerate_NoSecureEnclaveSupport() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + crypto.isSecureEnclaveAvailable = false + XCTAssertThrowsError( + try plugin.generateKey( + accessControl: .anyBiometryOrPasscode, + now: Date(timeIntervalSinceReferenceDate: -123456789.0)) + ) { error in + XCTAssertEqual(Plugin.Error.seUnsupported, error as! Plugin.Error) + } + } +} + +final class RecipientV1Tests: XCTestCase { + var stream = MemoryStream() + var crypto = DummyCrypto() + + override func setUp() { + stream = MemoryStream() + crypto = DummyCrypto() + } + + // Just a test to get the identities of the test keys used in this test + func testKeys() throws { + let key1 = try! crypto.newSecureEnclavePrivateKey( + dataRepresentation: Data(base64RawEncoded: "OSe+zDK18qF0UrjxYVkmwvxyEdxZHp9F69rElj8bKS8")!) + XCTAssertEqual( + "AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG", + key1.ageIdentity) + XCTAssertEqual( + "age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l", + key1.publicKey.ageRecipient) + + let key2 = try! crypto.newSecureEnclavePrivateKey( + dataRepresentation: Data(base64RawEncoded: "kBuQrPyfvCqBXJ5G4YBkqNER201niIeOmlXsRS2gxN0")!) + XCTAssertEqual( + "AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7", + key2.ageIdentity) + XCTAssertEqual( + "age1se1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj752upj6l", + key2.publicKey.ageRecipient) + } + + func testNothing() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add(input: "-> done\n") + plugin.runRecipientV1() + XCTAssertEqual("-> done\n", stream.output) + } + + func testRecipient() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + """, stream.output) + } + + func testIdentity() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + """, stream.output) + } + + func testMultipleRecipients() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> add-recipient age1se1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj752upj6l + + -> done + + -> ok + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> done + + """, stream.output) + } + + func testMultipleRecipientsMultipleKeys() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAg + -> add-recipient age1se1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj752upj6l + + -> done + + -> ok + + -> ok + + -> ok + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs + L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g + -> recipient-stanza 1 piv-p256 1mgwOA AoIMpSYaKzGl5IBFaM9AFJXmrseGzTzcQjS9R4kRcjRi + vm8flaP+4W08S6LwFENwnEKLlpzZ5YqZ3NdpKFo7Vg8 + -> done + + """, stream.output) + } + + func testRecipientError() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> add-recipient age1invalid1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj75hkckfk + + -> done + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> error recipient 1 + Q2hlY2tzdW0gZG9lc24ndCBtYXRjaA + -> done + + """, stream.output) + } + + func testIdentityError() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> add-identity AGE-PLUGIN-INVALID-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHS2FM3SW + + -> done + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> error identity 1 + Q2hlY2tzdW0gZG9lc24ndCBtYXRjaA + -> done + + """, stream.output) + } + + func testInvalidRecipientHRP() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-recipient age1vld7p2khw44ds8t00vcfmjdf35zxqvn2trjccd35h4s22faj94vsjhn620 + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> error recipient 0 + dW5rbm93biBIUlA6IGFnZQ + -> done + + """, stream.output) + } + + // func testFailingCryptoOperations() throws { + // let plugin = Plugin(crypto: crypto, stream: stream) + + // stream.add( + // input: + // """ + // -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l + + // -> wrap-file-key + // AAAAAAAAAAAAAAAAAAAAAQ + // -> done + + // -> ok + + // """) + // crypto.failingOperations = true + // plugin.runRecipientV1() + + // XCTAssertEqual( + // """ + // -> error internal + // ZHVtbXkgZXJyb3I + // -> done + + // """, stream.output) + // } + + func testUnknownStanzaTypes() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l + + -> unknown-stanza 1 2 3 + + -> wrap-file-key + AAAAAAAAAAAAAAAAAAAAAQ + -> anotherunknownstanza + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + -> ok + + """) + plugin.runRecipientV1() + + XCTAssertEqual( + """ + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + """, stream.output) + } +} + +final class IdentityV1Tests: XCTestCase { + var stream = MemoryStream() + var crypto = DummyCrypto() + + override func setUp() { + stream = MemoryStream() + crypto = DummyCrypto() + } + + func testNothing() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add(input: "-> done\n") + plugin.runIdentityV1() + XCTAssertEqual("-> done\n", stream.output) + } + + func testRecipientStanza() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> file-key 0 + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + """, stream.output) + } + + func testRecipientStanzaMultipleFiles() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs + L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g + -> done + + -> ok + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> file-key 0 + AAAAAAAAAAAAAAAAAAAAAQ + -> file-key 1 + AAAAAAAAAAAAAAAAAAAAAg + -> done + + """, stream.output) + } + + func testRecipientStanzaMultipleFilesMultipleIdentities() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7 + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs + L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g + -> recipient-stanza 1 piv-p256 1mgwOA AoIMpSYaKzGl5IBFaM9AFJXmrseGzTzcQjS9R4kRcjRi + vm8flaP+4W08S6LwFENwnEKLlpzZ5YqZ3NdpKFo7Vg8 + -> done + + -> ok + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> file-key 0 + AAAAAAAAAAAAAAAAAAAAAQ + -> file-key 1 + AAAAAAAAAAAAAAAAAAAAAg + -> done + + """, stream.output) + } + + func testRecipientStanzaMultipleStanzasMissingIdentity() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7 + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> done + + -> ok + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> file-key 0 + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + """, stream.output) + } + + func testRecipientStanza_UnknownType() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 X25519 A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> file-key 0 + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + """, stream.output) + } + + func testIdentityError() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> add-identity AGE-PLUGIN-INVALID-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHS2FM3SW + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error identity 1 + Q2hlY2tzdW0gZG9lc24ndCBtYXRjaA + -> done + + """, stream.output) + } + + func testUnknownIdentityHRP() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> add-identity AGE-SECRET-KEY-1MCFVWZK6PK625PWMWVYPZDQM4N7AS3VA754JHCC60ZT7WJ79TQQSQDYVGF + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error identity 1 + dW5rbm93biBIUlA6IEFHRS1TRUNSRVQtS0VZLQ + -> done + + """, stream.output) + } + + func testRecipientStanzaMultipleFilesStructurallyInvalidFile() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7 + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 0 piv-p256 1mgwOA + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs + L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g + -> recipient-stanza 1 piv-p256 1mgwOA AoIMpSYaKzGl5IBFaM9AFJXmrseGzTzcQjS9R4kRcjRi + vm8flaP+4W08S6LwFENwnEKLlpzZ5YqZ3NdpKFo7Vg8 + -> done + + -> ok + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error stanza 0 + aW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50 + -> file-key 1 + AAAAAAAAAAAAAAAAAAAAAg + -> done + + """, stream.output) + } + + func testRecipientStanzaInvalidStructure_ArgumentCount() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 piv-p256 1mgwOA + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error stanza 0 + aW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50 + -> done + + """, stream.output) + } + + func testRecipientStanzaInvalidTag() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 piv-p256 14yi Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error stanza 0 + aW52YWxpZCB0YWc + -> done + + """, stream.output) + } + + func testRecipientStanzaInvalidShare() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5Q + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error stanza 0 + aW52YWxpZCBzaGFyZQ + -> done + + """, stream.output) + } + + func testRecipientStanzaInvalidBody() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + AAAAAAAAAAAAAAAAAAAAARIiJq2e9+1E+xK92Pvdtw + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> error stanza 0 + aW52YWxpZCBib2R5 + -> done + + """, stream.output) + } + + func testFailingCryptoOperations() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + + stream.add( + input: + """ + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7 + + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> done + + -> ok + + -> ok + + -> ok + + """) + crypto.failingOperations = true + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> msg + ZHVtbXkgZXJyb3I + -> msg + ZHVtbXkgZXJyb3I + -> done + + """, stream.output) + } + + func testUnknownStanzas() throws { + let plugin = Plugin(crypto: crypto, stream: stream) + stream.add( + input: + """ + -> unknown-stanza-1 a bbb c + + -> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG + + -> unknown-stanza-2 + 9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y + -> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7 + SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4 + -> done + + -> ok + + """) + plugin.runIdentityV1() + + XCTAssertEqual( + """ + -> file-key 0 + AAAAAAAAAAAAAAAAAAAAAQ + -> done + + """, stream.output) + } + +} diff --git a/Tests/StanzaTests.swift b/Tests/StanzaTests.swift new file mode 100644 index 0000000..b8fc521 --- /dev/null +++ b/Tests/StanzaTests.swift @@ -0,0 +1,208 @@ +import XCTest + +@testable import age_plugin_se + +final class StanzaTests: XCTestCase { + var stream = MemoryStream() + + override func setUp() { + stream = MemoryStream() + } + + func testReadFrom() throws { + stream.add( + input: + """ + -> mytype MyArgument1 MyArgument2 + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np + bmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFi + b3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVu + aWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBu + aXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0 + ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxp + dCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBF + eGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBz + dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlk + IGVzdCBsYWJvcnVtLg + """) + XCTAssertEqual( + Stanza( + type: "mytype", + args: ["MyArgument1", "MyArgument2"], + body: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + .data(using: .utf8)! + ), try Stanza.readFrom(stream: stream)) + } + + func testReadFrom_EmptyBody() throws { + stream.add( + input: + """ + -> mytype + + """) + XCTAssertEqual( + Stanza( + type: "mytype", + args: [], + body: Data() + ), try Stanza.readFrom(stream: stream)) + } + + func testReadFrom_EmptyLastLine() throws { + stream.add( + input: + """ + -> mystanza + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np + + """) + XCTAssertEqual( + Stanza( + type: "mystanza", + args: [], + body: + "Lorem ipsum dolor sit amet, consectetur adipisci" + .data(using: .utf8)! + ), try Stanza.readFrom(stream: stream)) + } + + func testReadFrom_MissingType() throws { + stream.add( + input: + """ + -> + IGVzdCBsYWJvcnVtLg + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.invalidStanza) + } + } + + func testReadFrom_InvalidPrefix() throws { + stream.add( + input: + """ + => mystanza + IGVzdCBsYWJvcnVtLg + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.invalidStanza) + } + } + + func testReadFrom_BodyTooLong() throws { + stream.add( + input: + """ + -> mystanza + dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.invalidStanza) + } + } + + func testReadFrom_BodyInvalid() throws { + stream.add( + input: + """ + -> mystanza + _dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.invalidStanza) + } + } + + func testReadFrom_BodyIncomplete() throws { + stream.add( + input: + """ + -> mystanza + dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlk + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.incompleteStanza) + } + } + + func testReadFrom_BodyMissing() throws { + stream.add( + input: + """ + -> mystanza + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.incompleteStanza) + } + } + + func testReadFrom_BodyHasPadding() throws { + stream.add( + input: + """ + => mystanza + IGVzdCBsYWJvcnVtLg== + """) + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.invalidStanza) + } + } + + func testReadFrom_NoInput() throws { + XCTAssertThrowsError(try Stanza.readFrom(stream: stream)) { error in + XCTAssertEqual(error as! Plugin.Error, Plugin.Error.incompleteStanza) + } + } + + func testWriteTo() throws { + Stanza( + type: "mytype", + args: ["MyArgument1", "MyArgument2"], + body: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + .data(using: .utf8)! + ).writeTo(stream: stream) + XCTAssertEqual( + """ + -> mytype MyArgument1 MyArgument2 + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np + bmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFi + b3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVu + aWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBu + aXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0 + ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxp + dCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBF + eGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBz + dW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlk + IGVzdCBsYWJvcnVtLg + """, stream.output) + } + + func testWriteTo_NoArguments() throws { + Stanza( + type: "mytype", + body: "Lorem ipsum".data(using: .utf8)! + ).writeTo(stream: stream) + XCTAssertEqual( + """ + -> mytype + TG9yZW0gaXBzdW0 + """, stream.output) + } + + func testWriteTo_EmptyBody() throws { + Stanza( + type: "mytype", + args: [], + body: Data() + ).writeTo(stream: stream) + XCTAssertEqual( + """ + -> mytype + + """, stream.output) + } +}