You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by ms...@apache.org on 2021/02/04 18:45:43 UTC
[incubator-teaclave] 04/07: Add iOS framework
This is an automated email from the ASF dual-hosted git repository.
mssun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git
commit 6d71fd50433281cb42e1ffeb6d25c5ee25228536
Author: Mingshen Sun <bo...@mssun.me>
AuthorDate: Wed Feb 3 14:49:09 2021 -0800
Add iOS framework
---
.../TeaclaveClientSDK.xcodeproj/project.pbxproj | 533 +++++++++++++++++++++
.../project.xcworkspace/contents.xcworkspacedata | 7 +
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
.../xcshareddata/swiftpm/Package.resolved | 16 +
.../UserInterfaceState.xcuserstate | Bin 0 -> 54147 bytes
.../xcdebugger/Breakpoints_v2.xcbkptlist | 6 +
.../xcschemes/xcschememanagement.plist | 19 +
.../TeaclaveClientSDK/TeaclaveClientSDK/Info.plist | 22 +
.../TeaclaveClientSDK/TeaclaveClientSDK.h | 26 +
.../TeaclaveClientSDK/TeaclaveClientSDK.modulemap | 9 +
.../TeaclaveClientSDK/TeaclaveClientSDK.swift | 327 +++++++++++++
.../TeaclaveClientSDKTests/Info.plist | 22 +
.../TeaclaveClientSDKTests.swift | 174 +++++++
13 files changed, 1169 insertions(+)
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.pbxproj b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..826b9a5
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.pbxproj
@@ -0,0 +1,533 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 52;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 9AA3BE6925C9D33B00A2BA83 /* TeaclaveClientSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AA3BE5F25C9D33B00A2BA83 /* TeaclaveClientSDK.framework */; };
+ 9AA3BE6E25C9D33B00A2BA83 /* TeaclaveClientSDKTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AA3BE6D25C9D33B00A2BA83 /* TeaclaveClientSDKTests.swift */; };
+ 9AA3BE7025C9D33B00A2BA83 /* TeaclaveClientSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AA3BE6225C9D33B00A2BA83 /* TeaclaveClientSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 9ABF3E5625C9EBFB003D7DDC /* TeaclaveClientSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ABF3E5525C9EBFB003D7DDC /* TeaclaveClientSDK.swift */; };
+ 9AD06D1225C9FBB500651504 /* teaclave_client_sdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AD06D1125C9FBB500651504 /* teaclave_client_sdk.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 9AD06D2825CA042D00651504 /* libteaclave_client_sdk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AD06D2725CA042D00651504 /* libteaclave_client_sdk.a */; };
+ 9AD06D4325CA061100651504 /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 9AD06D4225CA061100651504 /* OpenSSL */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 9AA3BE6A25C9D33B00A2BA83 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 9AA3BE5625C9D33B00A2BA83 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9AA3BE5E25C9D33B00A2BA83;
+ remoteInfo = TeaclaveClientSDK;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 9AA3BE5F25C9D33B00A2BA83 /* TeaclaveClientSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TeaclaveClientSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9AA3BE6225C9D33B00A2BA83 /* TeaclaveClientSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TeaclaveClientSDK.h; sourceTree = "<group>"; };
+ 9AA3BE6325C9D33B00A2BA83 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 9AA3BE6825C9D33B00A2BA83 /* TeaclaveClientSDKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TeaclaveClientSDKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9AA3BE6D25C9D33B00A2BA83 /* TeaclaveClientSDKTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeaclaveClientSDKTests.swift; sourceTree = "<group>"; };
+ 9AA3BE6F25C9D33B00A2BA83 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 9ABF3E5525C9EBFB003D7DDC /* TeaclaveClientSDK.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeaclaveClientSDK.swift; sourceTree = "<group>"; };
+ 9AD06D1125C9FBB500651504 /* teaclave_client_sdk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = teaclave_client_sdk.h; path = ../../c/teaclave_client_sdk.h; sourceTree = "<group>"; };
+ 9AD06D2725CA042D00651504 /* libteaclave_client_sdk.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libteaclave_client_sdk.a; path = ../../rust/target/universal/debug/libteaclave_client_sdk.a; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 9AA3BE5C25C9D33B00A2BA83 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9AD06D2825CA042D00651504 /* libteaclave_client_sdk.a in Frameworks */,
+ 9AD06D4325CA061100651504 /* OpenSSL in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9AA3BE6525C9D33B00A2BA83 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9AA3BE6925C9D33B00A2BA83 /* TeaclaveClientSDK.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9AA3BE5525C9D33A00A2BA83 = {
+ isa = PBXGroup;
+ children = (
+ 9AD06D1125C9FBB500651504 /* teaclave_client_sdk.h */,
+ 9AA3BE6125C9D33B00A2BA83 /* TeaclaveClientSDK */,
+ 9AA3BE6C25C9D33B00A2BA83 /* TeaclaveClientSDKTests */,
+ 9AA3BE6025C9D33B00A2BA83 /* Products */,
+ 9AA3BE8825C9D71200A2BA83 /* Frameworks */,
+ );
+ sourceTree = "<group>";
+ };
+ 9AA3BE6025C9D33B00A2BA83 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 9AA3BE5F25C9D33B00A2BA83 /* TeaclaveClientSDK.framework */,
+ 9AA3BE6825C9D33B00A2BA83 /* TeaclaveClientSDKTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 9AA3BE6125C9D33B00A2BA83 /* TeaclaveClientSDK */ = {
+ isa = PBXGroup;
+ children = (
+ 9AA3BE6225C9D33B00A2BA83 /* TeaclaveClientSDK.h */,
+ 9AA3BE6325C9D33B00A2BA83 /* Info.plist */,
+ 9ABF3E5525C9EBFB003D7DDC /* TeaclaveClientSDK.swift */,
+ );
+ path = TeaclaveClientSDK;
+ sourceTree = "<group>";
+ };
+ 9AA3BE6C25C9D33B00A2BA83 /* TeaclaveClientSDKTests */ = {
+ isa = PBXGroup;
+ children = (
+ 9AA3BE6D25C9D33B00A2BA83 /* TeaclaveClientSDKTests.swift */,
+ 9AA3BE6F25C9D33B00A2BA83 /* Info.plist */,
+ );
+ path = TeaclaveClientSDKTests;
+ sourceTree = "<group>";
+ };
+ 9AA3BE8825C9D71200A2BA83 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 9AD06D2725CA042D00651504 /* libteaclave_client_sdk.a */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 9AA3BE5A25C9D33B00A2BA83 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9AA3BE7025C9D33B00A2BA83 /* TeaclaveClientSDK.h in Headers */,
+ 9AD06D1225C9FBB500651504 /* teaclave_client_sdk.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 9AA3BE5E25C9D33B00A2BA83 /* TeaclaveClientSDK */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9AA3BE7325C9D33B00A2BA83 /* Build configuration list for PBXNativeTarget "TeaclaveClientSDK" */;
+ buildPhases = (
+ 9AA3BE5A25C9D33B00A2BA83 /* Headers */,
+ 9AA3BE5B25C9D33B00A2BA83 /* Sources */,
+ 9AA3BE5C25C9D33B00A2BA83 /* Frameworks */,
+ 9AA3BE5D25C9D33B00A2BA83 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = TeaclaveClientSDK;
+ packageProductDependencies = (
+ 9AD06D4225CA061100651504 /* OpenSSL */,
+ );
+ productName = TeaclaveClientSDK;
+ productReference = 9AA3BE5F25C9D33B00A2BA83 /* TeaclaveClientSDK.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ 9AA3BE6725C9D33B00A2BA83 /* TeaclaveClientSDKTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9AA3BE7625C9D33B00A2BA83 /* Build configuration list for PBXNativeTarget "TeaclaveClientSDKTests" */;
+ buildPhases = (
+ 9AA3BE6425C9D33B00A2BA83 /* Sources */,
+ 9AA3BE6525C9D33B00A2BA83 /* Frameworks */,
+ 9AA3BE6625C9D33B00A2BA83 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9AA3BE6B25C9D33B00A2BA83 /* PBXTargetDependency */,
+ );
+ name = TeaclaveClientSDKTests;
+ productName = TeaclaveClientSDKTests;
+ productReference = 9AA3BE6825C9D33B00A2BA83 /* TeaclaveClientSDKTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 9AA3BE5625C9D33B00A2BA83 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1230;
+ LastUpgradeCheck = 1230;
+ TargetAttributes = {
+ 9AA3BE5E25C9D33B00A2BA83 = {
+ CreatedOnToolsVersion = 12.3;
+ LastSwiftMigration = 1230;
+ };
+ 9AA3BE6725C9D33B00A2BA83 = {
+ CreatedOnToolsVersion = 12.3;
+ };
+ };
+ };
+ buildConfigurationList = 9AA3BE5925C9D33B00A2BA83 /* Build configuration list for PBXProject "TeaclaveClientSDK" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 9AA3BE5525C9D33A00A2BA83;
+ packageReferences = (
+ 9AD06D4125CA061100651504 /* XCRemoteSwiftPackageReference "OpenSSL" */,
+ );
+ productRefGroup = 9AA3BE6025C9D33B00A2BA83 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 9AA3BE5E25C9D33B00A2BA83 /* TeaclaveClientSDK */,
+ 9AA3BE6725C9D33B00A2BA83 /* TeaclaveClientSDKTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 9AA3BE5D25C9D33B00A2BA83 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9AA3BE6625C9D33B00A2BA83 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 9AA3BE5B25C9D33B00A2BA83 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9ABF3E5625C9EBFB003D7DDC /* TeaclaveClientSDK.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9AA3BE6425C9D33B00A2BA83 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9AA3BE6E25C9D33B00A2BA83 /* TeaclaveClientSDKTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 9AA3BE6B25C9D33B00A2BA83 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9AA3BE5E25C9D33B00A2BA83 /* TeaclaveClientSDK */;
+ targetProxy = 9AA3BE6A25C9D33B00A2BA83 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 9AA3BE7125C9D33B00A2BA83 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.3;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = "-lc++";
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 9AA3BE7225C9D33B00A2BA83 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.3;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ OTHER_LDFLAGS = "-lc++";
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 9AA3BE7425C9D33B00A2BA83 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = TeaclaveClientSDK/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)",
+ "$(PROJECT_DIR)/../../rust/target/universal/debug",
+ );
+ MODULEMAP_FILE = "$(SRCROOT)/TeaclaveClientSDK/TeaclaveClientSDK.modulemap";
+ PRODUCT_BUNDLE_IDENTIFIER = org.apache.teaclave.TeaclaveClientSDK;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTS_MACCATALYST = NO;
+ SWIFT_INCLUDE_PATHS = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 9AA3BE7525C9D33B00A2BA83 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = TeaclaveClientSDK/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)",
+ "$(PROJECT_DIR)/../../rust/target/universal/debug",
+ );
+ MODULEMAP_FILE = "$(SRCROOT)/TeaclaveClientSDK/TeaclaveClientSDK.modulemap";
+ PRODUCT_BUNDLE_IDENTIFIER = org.apache.teaclave.TeaclaveClientSDK;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTS_MACCATALYST = NO;
+ SWIFT_INCLUDE_PATHS = "";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 9AA3BE7725C9D33B00A2BA83 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ DEVELOPMENT_TEAM = "";
+ INFOPLIST_FILE = TeaclaveClientSDKTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = org.apache.teaclave.TeaclaveClientSDKTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 9AA3BE7825C9D33B00A2BA83 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ DEVELOPMENT_TEAM = "";
+ INFOPLIST_FILE = TeaclaveClientSDKTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = org.apache.teaclave.TeaclaveClientSDKTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 9AA3BE5925C9D33B00A2BA83 /* Build configuration list for PBXProject "TeaclaveClientSDK" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9AA3BE7125C9D33B00A2BA83 /* Debug */,
+ 9AA3BE7225C9D33B00A2BA83 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9AA3BE7325C9D33B00A2BA83 /* Build configuration list for PBXNativeTarget "TeaclaveClientSDK" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9AA3BE7425C9D33B00A2BA83 /* Debug */,
+ 9AA3BE7525C9D33B00A2BA83 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9AA3BE7625C9D33B00A2BA83 /* Build configuration list for PBXNativeTarget "TeaclaveClientSDKTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9AA3BE7725C9D33B00A2BA83 /* Debug */,
+ 9AA3BE7825C9D33B00A2BA83 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ 9AD06D4125CA061100651504 /* XCRemoteSwiftPackageReference "OpenSSL" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/krzyzanowskim/OpenSSL.git";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 1.1.180;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 9AD06D4225CA061100651504 /* OpenSSL */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 9AD06D4125CA061100651504 /* XCRemoteSwiftPackageReference "OpenSSL" */;
+ productName = OpenSSL;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 9AA3BE5625C9D33B00A2BA83 /* Project object */;
+}
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:">
+ </FileRef>
+</Workspace>
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IDEDidComputeMac32BitWarning</key>
+ <true/>
+</dict>
+</plist>
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..a88f90b
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,16 @@
+{
+ "object": {
+ "pins": [
+ {
+ "package": "OpenSSL",
+ "repositoryURL": "https://github.com/krzyzanowskim/OpenSSL.git",
+ "state": {
+ "branch": null,
+ "revision": "389296819a8d025ac10ddc9f22135a5518991fdc",
+ "version": "1.1.180"
+ }
+ }
+ ]
+ },
+ "version": 1
+}
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcuserdata/sunmingshen.xcuserdatad/UserInterfaceState.xcuserstate b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcuserdata/sunmingshen.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..1440b25
Binary files /dev/null and b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/project.xcworkspace/xcuserdata/sunmingshen.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/xcuserdata/sunmingshen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/xcuserdata/sunmingshen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 0000000..f817af0
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/xcuserdata/sunmingshen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ uuid = "A068DDE8-7E4D-40A0-BB82-859627A7910B"
+ type = "1"
+ version = "2.0">
+</Bucket>
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/xcuserdata/sunmingshen.xcuserdatad/xcschemes/xcschememanagement.plist b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/xcuserdata/sunmingshen.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..75840d5
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK.xcodeproj/xcuserdata/sunmingshen.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SchemeUserState</key>
+ <dict>
+ <key>TeaclaveClientSDK-macOS.xcscheme_^#shared#^_</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>1</integer>
+ </dict>
+ <key>TeaclaveClientSDK.xcscheme_^#shared#^_</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+</dict>
+</plist>
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/Info.plist b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/Info.plist
new file mode 100644
index 0000000..9bcb244
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/Info.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>$(CURRENT_PROJECT_VERSION)</string>
+</dict>
+</plist>
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.h b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.h
new file mode 100644
index 0000000..a3398a0
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.h
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+//! Project version number for TeaclaveClientSDK.
+FOUNDATION_EXPORT double TeaclaveClientSDKVersionNumber;
+
+//! Project version string for TeaclaveClientSDK.
+FOUNDATION_EXPORT const unsigned char TeaclaveClientSDKVersionString[];
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.modulemap b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.modulemap
new file mode 100644
index 0000000..f3d51f5
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.modulemap
@@ -0,0 +1,9 @@
+framework module TeaclaveClientSDK {
+ umbrella header "TeaclaveClientSDK.h"
+
+ explicit module CTeaclaveClientSDK {
+ private header "teaclave_client_sdk.h"
+ }
+
+ export *
+}
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.swift b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.swift
new file mode 100644
index 0000000..e24d696
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDK/TeaclaveClientSDK.swift
@@ -0,0 +1,327 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+import Foundation
+import TeaclaveClientSDK.CTeaclaveClientSDK
+
+enum TeaclaveClientError: Error {
+ case userLoginError
+ case userRegisterError
+ case setCredentialError
+ case registerFunctionError
+ case createTaskError
+ case invokeTaskError
+ case getTaskResultError
+ case registerInputFileError
+ case registerOutputFileError
+ case assignDataError
+ case approveTaskError
+}
+
+struct RegisterFunctionRequest: Encodable {
+ let request: String = "register_function_request"
+ let name: String
+ let description: String
+ let executor_type: String
+ let `public`: Bool = true
+ let payload: Array<Int>
+ let arguments: Set<String>
+ let inputs: Array<Dictionary<String, String>>
+ let outputs: Array<Dictionary<String, String>>
+}
+
+struct RegisterFunctionResponse: Codable {
+ let function_id: String
+}
+
+struct OwnerList: Encodable {
+ let data_name: String
+ let uids: Array<String>
+}
+
+struct CreateTaskRequest: Encodable {
+ let request: String = "register_create_task"
+ let function_id: String
+ let function_arguments: String
+ let executor: String
+ let inputs_ownership: Array<OwnerList>
+ let outputs_ownership: Array<OwnerList>
+}
+
+struct CreateTaskResponse: Codable {
+ let task_id: String
+}
+
+struct CryptoInfo: Codable {
+ let schema: String
+ let key: Array<Int>
+ let iv: Array<Int>
+}
+
+struct RegisterInputFileRequest: Encodable {
+ let request: String = "register_input_file"
+ let url: String
+ let cmac: String
+ let crypto_info: CryptoInfo
+}
+
+struct RegisterInputFileResponse: Codable {
+ let data_id: String
+}
+
+struct RegisterOutputFileRequest: Encodable {
+ let request: String = "register_output_file"
+ let url: String
+ let cmac: String
+ let crypto_info: CryptoInfo
+}
+
+struct RegisterOutputFileResponse: Codable {
+ let data_id: String
+}
+
+struct DataMap: Codable {
+ let data_name: String
+ let data_id: String
+}
+
+struct AssignDataRequest: Encodable {
+ let request: String = "assign_data"
+ let task_id: String
+ let inputs: Array<DataMap>
+ let outputs: Array<DataMap>
+}
+
+struct ApproveTaskRequest: Encodable {
+ let request: String = "approve_task"
+ let task_id: String
+}
+
+class AuthenticationClient {
+ internal let cClient: OpaquePointer
+
+ init?(address: String, enclave_info_path: String, as_root_ca_cert_path: String) {
+ let address_c_string = address.cString(using: .ascii)
+ let enclave_info_path_address_c_string = enclave_info_path.cString(using: .ascii)
+ let as_root_ca_cert_c_string = as_root_ca_cert_path.cString(using: .ascii)
+ let cClient = teaclave_connect_authentication_service(address_c_string, enclave_info_path_address_c_string, as_root_ca_cert_c_string)
+ guard let client = cClient else {
+ return nil
+ }
+ self.cClient = client
+ }
+
+ func register(id: String, password: String) -> Result<(), TeaclaveClientError> {
+ let id_c_string = id.cString(using: .ascii)
+ let password_c_string = password.cString(using: .ascii)
+
+ let ret = teaclave_user_register(cClient, id_c_string, password_c_string)
+ guard ret == 0 else {
+ return Result.failure(.userRegisterError)
+ }
+ return Result.success(())
+ }
+
+ func login(id: String, password: String) -> Result<String, TeaclaveClientError> {
+ let id_c_string = id.cString(using: .ascii)
+ let password_c_string = password.cString(using: .ascii)
+ let token_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 1024)
+ let token_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ token_len.pointee = 1024
+ let ret = teaclave_user_login(cClient, id_c_string, password_c_string, token_c_string, token_len)
+ guard ret == 0 else {
+ token_c_string.deallocate()
+ token_len.deallocate()
+ return Result.failure(.userLoginError)
+ }
+ let token = String(cString: token_c_string)
+ token_c_string.deallocate()
+ token_len.deallocate()
+
+ return Result.success(token)
+ }
+
+ deinit {
+ teaclave_close_authentication_service(cClient)
+ }
+}
+
+class FrontendClient {
+ internal let cClient: OpaquePointer
+
+ init?(address: String, enclave_info_path: String, as_root_ca_cert_path: String) {
+ let address_c_string = address.cString(using: .ascii)
+ let enclave_info_path_address_c_string = enclave_info_path.cString(using: .ascii)
+ let as_root_ca_cert_c_string = as_root_ca_cert_path.cString(using: .ascii)
+ let cClient = teaclave_connect_frontend_service(address_c_string, enclave_info_path_address_c_string, as_root_ca_cert_c_string)
+ guard let client = cClient else {
+ return nil
+ }
+ self.cClient = client
+ }
+
+ deinit {
+ teaclave_close_frontend_service(cClient)
+ }
+
+ func set_credential(id: String, token: String) -> Result<(), TeaclaveClientError> {
+ let id_c_string = id.cString(using: .ascii)
+ let token_c_string = token.cString(using: .ascii)
+
+ let ret = teaclave_set_credential(cClient, id_c_string, token_c_string)
+ guard ret == 0 else {
+ return Result.failure(.setCredentialError)
+ }
+ return Result.success(())
+ }
+
+ func register_function(with request: RegisterFunctionRequest) -> Result<RegisterFunctionResponse, TeaclaveClientError> {
+ let data = try! JSONEncoder().encode(request)
+ let json_string = String(data: data, encoding: .ascii)!
+
+ let request_c_string = json_string.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 1024)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 1024
+ let ret = teaclave_register_function_serialized(cClient, request_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.registerFunctionError)
+ }
+
+ let response_string = String(cString: response_c_string)
+ let response = try! JSONDecoder().decode(RegisterFunctionResponse.self, from: response_string.data(using: .ascii)!)
+
+ return Result.success(response)
+ }
+
+ func create_task(with request: CreateTaskRequest) -> Result<CreateTaskResponse, TeaclaveClientError> {
+ let data = try! JSONEncoder().encode(request)
+ let json_string = String(data: data, encoding: .ascii)!
+
+ let request_c_string = json_string.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 10240)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 10240
+ let ret = teaclave_create_task_serialized(cClient, request_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.createTaskError)
+ }
+
+ let response_string = String(cString: response_c_string)
+
+ let response = try! JSONDecoder().decode(CreateTaskResponse.self, from: response_string.data(using: .ascii)!)
+
+ return Result.success(response)
+ }
+
+ func register_input_file(with request: RegisterInputFileRequest) -> Result<RegisterInputFileResponse, TeaclaveClientError> {
+ let data = try! JSONEncoder().encode(request)
+ let json_string = String(data: data, encoding: .ascii)!
+
+ let request_c_string = json_string.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 10240)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 10240
+ let ret = teaclave_register_input_file_serialized(cClient, request_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.registerInputFileError)
+ }
+
+ let response_string = String(cString: response_c_string)
+
+ let response = try! JSONDecoder().decode(RegisterInputFileResponse.self, from: response_string.data(using: .ascii)!)
+
+ return Result.success(response)
+ }
+
+ func register_output_file(with request: RegisterOutputFileRequest) -> Result<RegisterOutputFileResponse, TeaclaveClientError> {
+ let data = try! JSONEncoder().encode(request)
+ let json_string = String(data: data, encoding: .ascii)!
+
+ let request_c_string = json_string.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 10240)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 10240
+ let ret = teaclave_register_output_file_serialized(cClient, request_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.registerOutputFileError)
+ }
+
+ let response_string = String(cString: response_c_string)
+
+ let response = try! JSONDecoder().decode(RegisterOutputFileResponse.self, from: response_string.data(using: .ascii)!)
+
+ return Result.success(response)
+ }
+
+ func assign_data(with request: AssignDataRequest) -> Result<(), TeaclaveClientError> {
+ let data = try! JSONEncoder().encode(request)
+ let json_string = String(data: data, encoding: .ascii)!
+
+ let request_c_string = json_string.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 10240)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 10240
+ let ret = teaclave_assign_data_serialized(cClient, request_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.assignDataError)
+ }
+
+ return Result.success(())
+ }
+
+ func invoke_task(task_id: String) -> Result<(), TeaclaveClientError> {
+ let task_id_c_string = task_id.cString(using: .ascii)
+ let ret = teaclave_invoke_task(cClient, task_id_c_string)
+ guard ret == 0 else {
+ return Result.failure(.invokeTaskError)
+ }
+
+ return Result.success(())
+ }
+
+ func approve_task(task_id: String) -> Result<(), TeaclaveClientError> {
+ let request = ApproveTaskRequest(task_id: task_id)
+ let data = try! JSONEncoder().encode(request)
+ let json_string = String(data: data, encoding: .ascii)!
+
+ let request_c_string = json_string.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 10240)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 10240
+ let ret = teaclave_approve_task_serialized(cClient, request_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.approveTaskError)
+ }
+ return Result.success(())
+ }
+
+ func get_task_result(task_id: String) -> Result<String, TeaclaveClientError> {
+ let task_id_c_string = task_id.cString(using: .ascii)
+ let response_c_string = UnsafeMutablePointer<CChar>.allocate(capacity: 10240)
+ let response_len = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+ response_len.pointee = 10240
+ let ret = teaclave_get_task_result(cClient, task_id_c_string, response_c_string, response_len)
+ guard ret == 0 else {
+ return Result.failure(.getTaskResultError)
+ }
+
+ return Result.success(String(cString: response_c_string))
+ }
+}
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDKTests/Info.plist b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDKTests/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDKTests/Info.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+</dict>
+</plist>
diff --git a/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDKTests/TeaclaveClientSDKTests.swift b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDKTests/TeaclaveClientSDKTests.swift
new file mode 100644
index 0000000..574e3db
--- /dev/null
+++ b/sdk/swift/TeaclaveClientSDK/TeaclaveClientSDKTests/TeaclaveClientSDKTests.swift
@@ -0,0 +1,174 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+import XCTest
+@testable import TeaclaveClientSDK
+
+class TeaclaveClientSDKTests: XCTestCase {
+ let authentication_service_address = "teaclave-9900:7776"
+ let frontend_service_address = "teaclave-9900:7777"
+
+ // Setup enclave info path e.g., /incubator-teaclave/enclave_info.toml
+ let enclave_info_path = ""
+ // Setup AS CA certificate path e.g., /incubator-teaclave/keys/ias_root_ca_cert.pem
+ let as_root_ca_cert_path = ""
+
+ func testBuiltinEcho() throws {
+ let client = AuthenticationClient(
+ address: authentication_service_address,
+ enclave_info_path: enclave_info_path,
+ as_root_ca_cert_path: as_root_ca_cert_path
+ )
+ let _ = client.register(id: "test_id", password: "test_password")
+ let token = try client.login(id: "test_id", password: "test_password").get()
+
+ let register_function_request = RegisterFunctionRequest(
+ name: "builtin-echo",
+ description: "Native Echo Function",
+ executor_type: "builtin",
+ payload: [],
+ arguments: ["message"],
+ inputs: [],
+ outputs: []
+ )
+
+ let frontend_client = FrontendClient(
+ address: frontend_service_address,
+ enclave_info_path: enclave_info_path,
+ as_root_ca_cert_path: as_root_ca_cert_path
+ )
+ try frontend_client.set_credential(id: "test_id", token: token).get()
+ let response = try frontend_client.register_function(with: register_function_request).get()
+ let function_id = response.function_id
+
+ let create_task_request = CreateTaskRequest(
+ function_id: function_id,
+ function_arguments: "{\"message\": \"Hello, Teaclave!\"}",
+ executor: "builtin",
+ inputs_ownership: [],
+ outputs_ownership: []
+ )
+
+ let task_id = try frontend_client.create_task(with: create_task_request).get().task_id
+
+ try frontend_client.invoke_task(task_id: task_id).get()
+ let task_result = try frontend_client.get_task_result(task_id: task_id).get()
+ XCTAssert(task_result == "Hello, Teaclave!")
+ }
+
+ func testBuiltinPasswordCheck() throws {
+ let user0_client = AuthenticationClient(
+ address: authentication_service_address,
+ enclave_info_path: enclave_info_path,
+ as_root_ca_cert_path: as_root_ca_cert_path
+ )
+ let _ = user0_client.register(id: "user0", password: "password")
+ let user0_token = try user0_client.login(id: "user0", password: "password").get()
+
+ let user0_frontend_client = FrontendClient(
+ address: frontend_service_address,
+ enclave_info_path: enclave_info_path,
+ as_root_ca_cert_path: as_root_ca_cert_path
+ )
+ try user0_frontend_client.set_credential(id: "user0", token: user0_token).get()
+
+ let register_function_request = RegisterFunctionRequest(
+ name: "builtin-password-check",
+ description: "Check whether a password is exposed.",
+ executor_type: "builtin",
+ payload: [],
+ arguments: [],
+ inputs: [
+ ["name": "password", "description": "Client 0's data."],
+ ["name": "exposed_passwords", "description": "Client 1's data."]
+ ],
+ outputs: []
+ )
+ let response = try user0_frontend_client.register_function(with: register_function_request).get()
+ let function_id = response.function_id
+
+ let create_task_request = CreateTaskRequest(
+ function_id: function_id,
+ function_arguments: "{}",
+ executor: "builtin",
+ inputs_ownership: [
+ OwnerList(data_name: "password", uids: ["user0"]),
+ OwnerList(data_name: "exposed_passwords", uids: ["user1"]),
+ ],
+ outputs_ownership: []
+ )
+ let task_id = try user0_frontend_client.create_task(with: create_task_request).get().task_id
+
+ let iv = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ let key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ let register_input_file_request = RegisterInputFileRequest(
+ url: "data:text/plain;base64,c+mpvRfZ0fboR0j3rTgOGDBiubSzlCt9",
+ cmac: "e84748f7ad380e183062b9b4b3942b7d",
+ crypto_info: CryptoInfo(schema: "aes-gcm-128", key: key, iv: iv)
+ )
+ let user0_data_id = try user0_frontend_client.register_input_file(with: register_input_file_request).get().data_id
+
+
+ let user0_assign_data_request = AssignDataRequest(
+ task_id: task_id,
+ inputs: [DataMap(data_name: "password", data_id: user0_data_id)],
+ outputs: []
+ )
+ try user0_frontend_client.assign_data(with: user0_assign_data_request).get()
+
+ let user1_client = AuthenticationClient(
+ address: authentication_service_address,
+ enclave_info_path: enclave_info_path,
+ as_root_ca_cert_path: as_root_ca_cert_path
+ )
+
+ let _ = user1_client.register(id: "user1", password: "password")
+ let user1_token = try user1_client.login(id: "user1", password: "password").get()
+ let user1_frontend_client = FrontendClient(
+ address: frontend_service_address,
+ enclave_info_path: enclave_info_path,
+ as_root_ca_cert_path: as_root_ca_cert_path
+ )
+ try user1_frontend_client.set_credential(id: "user1", token: user1_token).get()
+
+ let user1_register_input_file_request = RegisterInputFileRequest(
+ url: "http://teaclave-file-service:6789/fixtures/functions/password_check/exposed_passwords.txt.enc",
+ cmac: "42b16c29edeb9ee0e4d219f3b5395946",
+ crypto_info: CryptoInfo(schema: "teaclave-file-128", key: key, iv: [])
+ )
+ let user1_data_id = try user1_frontend_client.register_input_file(with: user1_register_input_file_request).get().data_id
+ let user1_assign_data_request = AssignDataRequest(
+ task_id: task_id,
+ inputs: [DataMap(data_name: "exposed_passwords", data_id: user1_data_id)],
+ outputs: []
+ )
+ try user1_frontend_client.assign_data(with: user1_assign_data_request).get()
+
+
+
+ try user0_frontend_client.approve_task(task_id: task_id).get()
+ try user1_frontend_client.approve_task(task_id: task_id).get()
+
+ try user0_frontend_client.invoke_task(task_id: task_id).get()
+
+ let result = try user0_frontend_client.get_task_result(task_id: task_id).get()
+ XCTAssert(result == "true")
+
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org