Use ProtonMail's GopenPGP library

This allows for a simpler setup and the usage of a recent version of Go. The library provides a build script which creates an XCFramework containing binaries for multiple target architectures. The gnu-dummy.patch is taken from mssun/gopenpgp. The forks are not needed anymore.
This commit is contained in:
Danny Moesch 2021-06-20 00:33:48 +02:00
parent 867931ab89
commit 93954f3bec
6 changed files with 158 additions and 49 deletions

View file

@ -46,9 +46,9 @@ For more, please read the [wiki page](https://github.com/mssun/passforios/wiki).
## Building Pass for iOS
1. Install libtool, automake, cmake, carthage, cocoapods, and go: `brew install libtool automake cmake carthage cocoapods go@1.14 swiftlint swiftformat`. At the moment, the project does not build with current version of go (1.15). Use 1.14
2. Install dependencies via Carthage in the project root directory: `./scripts/wcarthage update` then `./scripts/wcarthage bootstrap --platform iOS`. This may take some time.
3. Run `./scripts/gopenpgp_build.sh` to build go dependencies.
1. Install Libtool, Automake, CMake, Carthage, CocoaPods, Go, SwiftLint, and SwiftFormat: `brew install libtool automake cmake carthage cocoapods go swiftlint swiftformat`.
2. Install dependencies via Carthage. Therefore, execute `./scripts/wcarthage update` and `./scripts/wcarthage bootstrap --platform iOS` in the root directory of the project. This may take some time.
3. Run `./scripts/gopenpgp_build.sh` to build GopenPGP.
4. Install dependencies via CocoaPods in the project root directory: `pod install`.
5. Open the `pass.xcworkspace` file in Xcode.
6. Build & Run.

View file

@ -3,12 +3,12 @@
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
116F7CC922E134FA003B3BAC /* Crypto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 116F7CC822E134FA003B3BAC /* Crypto.framework */; };
116F7CCA22E134FA003B3BAC /* Crypto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 116F7CC822E134FA003B3BAC /* Crypto.framework */; };
30052851267E9138003E2003 /* Gopenpgp.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30052850267E9138003E2003 /* Gopenpgp.xcframework */; };
30052853267E914C003E2003 /* Gopenpgp.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30052850267E9138003E2003 /* Gopenpgp.xcframework */; };
300713C52219D54100F553AC /* AutoCellHeightUITableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 300713C42219D54100F553AC /* AutoCellHeightUITableViewController.swift */; };
301F6463216162550071A4CE /* AdditionField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 301F6462216162550071A4CE /* AdditionField.swift */; };
301F6468216165290071A4CE /* ConstantsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 301F6467216165290071A4CE /* ConstantsTest.swift */; };
@ -286,6 +286,8 @@
116F7CC822E134FA003B3BAC /* Crypto.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Crypto.framework; path = go/dist/Crypto.framework; sourceTree = "<group>"; };
134DA5B66070BA56678688CF /* Pods_passKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_passKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
14E955B67C88672AA3A40BA0 /* Pods_passExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_passExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3005284A267E5FCF003E2003 /* Gopenpgp.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Gopenpgp.xcframework; path = go/gopenpgp/dist/Gopenpgp.xcframework; sourceTree = "<group>"; };
30052850267E9138003E2003 /* Gopenpgp.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Gopenpgp.xcframework; path = go/dist/Gopenpgp.xcframework; sourceTree = "<group>"; };
300713C42219D54100F553AC /* AutoCellHeightUITableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCellHeightUITableViewController.swift; sourceTree = "<group>"; };
301F6462216162550071A4CE /* AdditionField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdditionField.swift; sourceTree = "<group>"; };
301F6467216165290071A4CE /* ConstantsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConstantsTest.swift; sourceTree = "<group>"; };
@ -506,7 +508,7 @@
buildActionMask = 2147483647;
files = (
E813E400BBF3E7E8975EBAEF /* Pods_passKit.framework in Frameworks */,
116F7CCA22E134FA003B3BAC /* Crypto.framework in Frameworks */,
30052853267E914C003E2003 /* Gopenpgp.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -545,10 +547,10 @@
buildActionMask = 2147483647;
files = (
A239F5902158C07D00576CBF /* AuthenticationServices.framework in Frameworks */,
116F7CC922E134FA003B3BAC /* Crypto.framework in Frameworks */,
A260758D1EEC6F34005DB03E /* passKit.framework in Frameworks */,
DCC408C71E307DBB00F29B0E /* SVProgressHUD.framework in Frameworks */,
3EA2386CD0E9CE2A702A0B3E /* Pods_pass.framework in Frameworks */,
30052851267E9138003E2003 /* Gopenpgp.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1023,6 +1025,8 @@
DC917BED1E2F38C4000FDF54 /* Frameworks */ = {
isa = PBXGroup;
children = (
3005284A267E5FCF003E2003 /* Gopenpgp.xcframework */,
30052850267E9138003E2003 /* Gopenpgp.xcframework */,
A239F58F2158C07D00576CBF /* AuthenticationServices.framework */,
DCA671DE1E7A73B100D3ABE1 /* OneTimePassword.framework */,
A262A58C1E68749C006B0890 /* Base32.framework */,
@ -1883,7 +1887,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = passShortcuts/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@ -1912,7 +1920,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = passShortcuts/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.12.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = me.mssun.passforios.shortcuts;
@ -1983,7 +1995,8 @@
PRODUCT_NAME = "Pass Beta";
SDKROOT = iphoneos;
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
VALIDATE_PRODUCT = YES;
WARNING_CFLAGS = "-Wno-incomplete-umbrella";
@ -2011,7 +2024,10 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = pass/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 0.12.0;
OTHER_CFLAGS = "$(inherited)";
@ -2037,7 +2053,11 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = passTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passTests";
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
@ -2063,7 +2083,11 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = passExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 0.12.0;
OTHER_CFLAGS = "$(inherited)";
@ -2135,7 +2159,11 @@
);
INFOPLIST_FILE = passKitTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passKitTests";
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
@ -2160,7 +2188,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = passAutoFillExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.12.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "me.mssun.passforiosbeta.auto-fill-credential-extension";
@ -2189,7 +2221,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = passShortcuts/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.12.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = me.mssun.passforiosbeta.shortcuts;
@ -2217,7 +2253,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = passAutoFillExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@ -2247,7 +2287,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = passAutoFillExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.12.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "me.mssun.passforios.auto-fill-credential-extension";
@ -2362,7 +2406,11 @@
);
INFOPLIST_FILE = passKitTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passKitTests";
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
@ -2384,7 +2432,11 @@
);
INFOPLIST_FILE = passKitTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passKitTests";
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
@ -2410,7 +2462,11 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = passExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 0.12.0;
OTHER_CFLAGS = "$(inherited)";
@ -2442,7 +2498,11 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = passExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 0.12.0;
OTHER_CFLAGS = "$(inherited)";
@ -2467,7 +2527,11 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = passTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passTests";
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
@ -2486,7 +2550,11 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = passTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passTests";
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
@ -2625,7 +2693,8 @@
PRODUCT_NAME = Pass;
SDKROOT = iphoneos;
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
VALIDATE_PRODUCT = YES;
WARNING_CFLAGS = "-Wno-incomplete-umbrella";
@ -2653,7 +2722,10 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = pass/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 0.12.0;
OTHER_CFLAGS = "$(inherited)";
@ -2690,7 +2762,10 @@
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = pass/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 0.12.0;
OTHER_CFLAGS = "$(inherited)";

View file

@ -6,12 +6,12 @@
// Copyright © 2019 Bob Sun. All rights reserved.
//
import Crypto
import Gopenpgp
struct GopenPGPInterface: PGPInterface {
private static let errorMapping: [String: Error] = [
"gopenpgp: error in unlocking key: openpgp: invalid data: private key checksum failure": AppError.wrongPassphrase,
"openpgp: incorrect key": AppError.keyExpiredOrIncompatible,
"gopenpgp: error in reading message: openpgp: incorrect key": AppError.keyExpiredOrIncompatible,
]
private var publicKeys: [String: CryptoKey] = [:]

View file

@ -10,7 +10,7 @@ import XCTest
// swiftformat:disable:next sortedImports
@testable import passKit
@testable import Crypto
@testable import Gopenpgp
class CryptoFrameworkTest: XCTestCase {
private typealias MessageConverter = (CryptoPGPMessage, NSErrorPointer) -> CryptoPGPMessage?

32
patch/gnu-dummy.patch Normal file
View file

@ -0,0 +1,32 @@
diff --git a/crypto/key.go b/crypto/key.go
index 49af11e..fd59ec4 100644
--- a/crypto/key.go
+++ b/crypto/key.go
@@ -150,10 +150,12 @@ func (key *Key) Unlock(passphrase []byte) (*Key, error) {
return nil, err
}
- err = unlockedKey.entity.PrivateKey.Decrypt(passphrase)
- if err != nil {
- return nil, errors.Wrap(err, "gopenpgp: error in unlocking key")
- }
+ if !unlockedKey.entity.PrivateKey.Dummy() {
+ err = unlockedKey.entity.PrivateKey.Decrypt(passphrase)
+ if err != nil {
+ return nil, errors.Wrap(err, "gopenpgp: error in unlocking key")
+ }
+ }
for _, sub := range unlockedKey.entity.Subkeys {
if sub.PrivateKey != nil {
@@ -286,6 +288,10 @@ func (key *Key) IsLocked() (bool, error) {
}
}
+ if key.entity.PrivateKey.Dummy() {
+ return true, nil
+ }
+
return key.entity.PrivateKey.Encrypted, nil
}

View file

@ -2,27 +2,29 @@
set -euox pipefail
GOPENPGP_VERSION="v2.1.10"
export GOPATH="$(pwd)/go"
export PATH="$PATH:$GOPATH/bin"
PACKAGE_PATH="github.com/mssun/gopenpgp"
GOPENPGP_REVISION="gnu-dummy"
OUTPUT_PATH="$GOPATH/dist"
mkdir -p "$GOPATH"
go get golang.org/x/mobile/cmd/gomobile || true
( cd "$GOPATH/src/golang.org/x/mobile/cmd/gomobile" && git checkout 0df4eb2385467a487d418c6358313e9e838256ae )
GO111MODULE=on go get golang.org/x/mobile/cmd/gomobile@0df4eb2385467a487d418c6358313e9e838256ae || true
GO111MODULE=on go get golang.org/x/mobile/cmd/gobind@0df4eb2385467a487d418c6358313e9e838256ae || true
go get -u "$PACKAGE_PATH" || true
mkdir -p "$GOPATH/src/github.com/ProtonMail"
ln -f -s "$GOPATH/src/$PACKAGE_PATH" "$GOPATH/src/github.com/ProtonMail/gopenpgp"
( cd "$GOPATH/src/$PACKAGE_PATH" && git checkout "$GOPENPGP_REVISION" && GO111MODULE=on go mod vendor )
OUTPUT_PATH="go/dist"
CHECKOUT_PATH="go/checkout"
GOPENPGP_PATH="$CHECKOUT_PATH/gopenpgp"
mkdir -p "$OUTPUT_PATH"
mkdir -p "$CHECKOUT_PATH"
go env -w GO111MODULE=auto
go get golang.org/x/mobile/cmd/gomobile
gomobile init
git clone --depth 1 --branch "$GOPENPGP_VERSION" git@github.com:ProtonMail/gopenpgp.git "$GOPENPGP_PATH"
git apply patch/gnu-dummy.patch --directory "$GOPENPGP_PATH"
sed -i '' 's/build android/echo "Skipping Android build."/g' "$GOPENPGP_PATH/build.sh"
(cd "$GOPENPGP_PATH" && ./build.sh)
cp -R "$GOPENPGP_PATH/dist/Gopenpgp.xcframework" "$OUTPUT_PATH"
"$GOPATH/bin/gomobile" bind -v -ldflags="-s -w" -target ios -o "${OUTPUT_PATH}/Crypto.framework" \
"$PACKAGE_PATH"/{crypto,armor,constants,models,subtle}