You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by sh...@apache.org on 2022/11/11 05:17:53 UTC
[incubator-teaclave-java-tee-sdk] 13/48: [sdk] Support MOCK_IN_SVM enclave mode
This is an automated email from the ASF dual-hosted git repository.
shaojunwang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave-java-tee-sdk.git
commit 7345a96010e71819df328d7e4c55a6c67cf9d696
Author: jeffery.wsj <je...@alibaba-inc.com>
AuthorDate: Fri May 6 14:22:49 2022 +0800
[sdk] Support MOCK_IN_SVM enclave mode
Summary:
1. Fix interface mismatch between JavaEnclave host and enclave module
2. Add mock_in_svm jni file
3. Add test maven project for JavaEnclave
Test Plan: all tests pass
Reviewers: lei.yul, cengfeng.lzy, sanhong.lsh
Issue: https://aone.alibaba-inc.com/task/41457548
CR: https://code.aone.alibaba-inc.com/java-tee/JavaEnclave/codereview/8686166
---
build.sh | 3 +-
.../enclave/InvocationWrapper.java | 1 -
.../enclave/c/EnclaveEnvironment.java | 4 +-
.../native-image/serialization-config.json | 9 ++
.../src/main/resources/native/enc_environment.h | 4 +-
.../test/resources/native/enc_invoke_entry_test.c | 8 +-
sdk/host/pom.xml | 22 +++
.../host/AbstractEnclave.java | 11 +-
.../host/MockInSvmEnclave.java | 111 +++----------
sdk/host/src/main/native/Makefile | 11 ++
.../native/bin/platform/mock_in_svm/jni/.gitkeep | 0
sdk/host/src/main/native/config/config.mk | 13 ++
.../config/platform/mock_in_svm/jni/config.mk | 5 +
.../native/cpp/platform/mock_in_svm/jni/Makefile | 15 ++
.../cpp/platform/mock_in_svm/jni/jni_mock_in_svm.c | 172 +++++++++++++++++++++
.../cpp/platform/mock_in_svm/jni/jni_mock_in_svm.h | 66 ++++++++
.../src/main/native/include}/enc_environment.h | 18 ++-
.../src/main/native/include/enc_exported_symbol.h | 19 +++
sdk/host/src/main/native/make.sh | 49 ++++++
.../host/MockTestEnclave.java | 10 +-
sdk/pom.xml | 1 +
test/common/pom.xml | 60 +++++++
.../test/common/EnclaveException.java | 8 +
.../test/common/JavaEnclaveException.java | 7 +
.../test/common/ReflectionCallService.java | 10 ++
.../test/common/SayHelloService.java | 8 +
test/enclave/pom.xml | 146 +++++++++++++++++
.../test/enclave/Calculate.java | 11 ++
.../test/enclave/EnclaveExceptionImpl.java | 13 ++
.../test/enclave/ReflectionCallServiceImpl.java | 47 ++++++
.../test/enclave/SayHelloServiceImpl.java | 13 ++
.../test/enclave/TestEnclaveException.java | 14 ++
.../test/enclave/TestReflectionCallService.java | 15 ++
.../test/enclave/TestSayHelloServiceImpl.java | 14 ++
{sdk => test}/host/pom.xml | 76 +++------
.../test/host/TestJavaEnclaveService.java | 72 +++++++++
{sdk => test}/pom.xml | 31 +++-
37 files changed, 924 insertions(+), 173 deletions(-)
diff --git a/build.sh b/build.sh
index b4dbae1..c4bf999 100644
--- a/build.sh
+++ b/build.sh
@@ -25,4 +25,5 @@ mvn install:install-file -Dfile=$GRAALVM_HOME/lib/svm/builder/native-image-base.
popd > /dev/null
rm -rf jartmp
-cd "${WORKDIR}"/sdk && mvn clean package
+cd "${WORKDIR}"/sdk && mvn clean install
+cd "${WORKDIR}"/test && mvn -Pnative -e clean package
diff --git a/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/InvocationWrapper.java b/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/InvocationWrapper.java
index c732f7c..98b5eb6 100644
--- a/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/InvocationWrapper.java
+++ b/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/InvocationWrapper.java
@@ -46,7 +46,6 @@ public class InvocationWrapper {
CCharPointer returned;
if (callBacks.isNonNull() && callBacks.getMemCpyCCharPointerFunctionPointer().isNonNull()) {
returned = callBacks.getMemCpyCCharPointerFunctionPointer().invoke(byteHolder.get(), returnedValLen);
-
} else {
returned = byteHolder.get();
System.out.println("Warning: Not calling call backs in native, there is memory leak risk.");
diff --git a/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/c/EnclaveEnvironment.java b/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/c/EnclaveEnvironment.java
index 922ab29..21a9505 100644
--- a/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/c/EnclaveEnvironment.java
+++ b/sdk/enclave/src/main/java/com/alibaba/confidentialcomputing/enclave/c/EnclaveEnvironment.java
@@ -84,7 +84,7 @@ public class EnclaveEnvironment {
}
}
- @CStruct("enc_data")
+ @CStruct("enc_data_t")
public interface EncData extends PointerBase {
@CField("data_len")
int getLen();
@@ -99,7 +99,7 @@ public class EnclaveEnvironment {
void setData(CCharPointer data);
}
- @CStruct("callbacks")
+ @CStruct("callbacks_t")
public interface CallBacks extends PointerBase {
@CField("exception_handler")
ExceptionHandleFunctionPointer getExceptionHandler();
diff --git a/sdk/enclave/src/main/resources/META-INF/native-image/serialization-config.json b/sdk/enclave/src/main/resources/META-INF/native-image/serialization-config.json
index 45dfb55..197813b 100644
--- a/sdk/enclave/src/main/resources/META-INF/native-image/serialization-config.json
+++ b/sdk/enclave/src/main/resources/META-INF/native-image/serialization-config.json
@@ -29,6 +29,15 @@
{
"name":"java.io.IOException"
},
+ {
+ "name":"java.lang.ClassCastException"
+ },
+ {
+ "name":"java.lang.reflect.InvocationTargetException"
+ },
+ {
+ "name":"java.lang.NullPointerException"
+ },
{
"name":"java.io.ObjectStreamException"
},
diff --git a/sdk/enclave/src/main/resources/native/enc_environment.h b/sdk/enclave/src/main/resources/native/enc_environment.h
index dc6f683..e6f1e0c 100644
--- a/sdk/enclave/src/main/resources/native/enc_environment.h
+++ b/sdk/enclave/src/main/resources/native/enc_environment.h
@@ -2,7 +2,7 @@
//char array is used as byte array to store serialized data
char* data;
int data_len;
- }enc_data;
+ }enc_data_t;
typedef struct callback_functions_struct{
/*
@@ -14,4 +14,4 @@ typedef struct callback_functions_struct{
void (*exception_handler)(char* err_msg, char* stack_trace, char* exception_name);
char* (*memcpy_char_pointer)(char* src, int len);
-}callbacks;
+}callbacks_t;
diff --git a/sdk/enclave/src/test/resources/native/enc_invoke_entry_test.c b/sdk/enclave/src/test/resources/native/enc_invoke_entry_test.c
index 8faa6f1..b564181 100644
--- a/sdk/enclave/src/test/resources/native/enc_invoke_entry_test.c
+++ b/sdk/enclave/src/test/resources/native/enc_invoke_entry_test.c
@@ -8,7 +8,7 @@
#include "libsvm_enclave_sdk.h"
#endif
-typedef int (*enclave_invoke)(graal_isolate_t* isolate, enc_data* input, enc_data* result, callbacks* callBacks);
+typedef int (*enclave_invoke)(graal_isolate_t* isolate, enc_data_t* input, enc_data_t* result, callbacks_t* callBacks);
char* memcpy_char_pointer(char* src, int len){
int size = sizeof(char);
@@ -23,15 +23,15 @@ static graal_isolate_t *isolate = NULL;
jbyteArray enclave_call(JNIEnv* env, jclass clazz, jbyteArray data, enclave_invoke invoke){
jboolean isCopy;
jbyte* a = (*env)->GetByteArrayElements(env, data, &isCopy);
- enc_data invoke_data;
+ enc_data_t invoke_data;
invoke_data.data=(char*)a;
invoke_data.data_len=(*env)->GetArrayLength(env, data);
- callbacks callback_methods;
+ callbacks_t callback_methods;
callback_methods.memcpy_char_pointer=&memcpy_char_pointer;
callback_methods.exception_handler=NULL; // Must explicitly set
- enc_data ret;
+ enc_data_t ret;
int exit_code = invoke(isolate, &invoke_data, &ret, &callback_methods);
jbyteArray retVal;
if(exit_code == 0 ){
diff --git a/sdk/host/pom.xml b/sdk/host/pom.xml
index dbaf6ce..05b0c51 100644
--- a/sdk/host/pom.xml
+++ b/sdk/host/pom.xml
@@ -14,6 +14,28 @@
<url></url>
<build>
<plugins>
+ <plugin>
+ <artifactId>exec-maven-plugin</artifactId>
+ <groupId>org.codehaus.mojo</groupId>
+ <executions>
+ <execution>
+ <id>JavaEnclaveNativeCompile</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>bash</executable>
+ <arguments>
+ <argument>${project.basedir}/src/main/native/make.sh</argument>
+ <argument>${project.basedir}</argument>
+ <argument>${com.alibaba.enclave.platform}</argument>
+ <argument>build</argument>
+ </arguments>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
diff --git a/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/AbstractEnclave.java b/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/AbstractEnclave.java
index c290e6f..a5eea7d 100644
--- a/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/AbstractEnclave.java
+++ b/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/AbstractEnclave.java
@@ -58,13 +58,11 @@ abstract class AbstractEnclave implements Enclave {
try {
// Only need to provide service's interface name is enough to load service
// in enclave.
- EnclaveInvocationContext parasWrapper = new EnclaveInvocationContext(
- new ServiceHandler(service.getName()));
byte[] payload;
try {
- payload = SerializationHelper.serialize(parasWrapper);
+ payload = SerializationHelper.serialize(service.getName());
} catch (IOException e) {
- throw new ServicesLoadingException("EnclaveInvokeMetaWrapper serialization failed.", e);
+ throw new ServicesLoadingException("service name serialization failed.", e);
}
InnerNativeInvocationResult resultNativeWrapper = loadServiceNative(payload);
// If loadServiceNative native call return value is error, an ServicesLoadingException exception
@@ -104,12 +102,11 @@ abstract class AbstractEnclave implements Enclave {
throw new ServicesUnloadingException("enclave was destroyed.");
}
try {
- EnclaveInvocationContext parasWrapper = new EnclaveInvocationContext(service);
byte[] payload;
try {
- payload = SerializationHelper.serialize(parasWrapper);
+ payload = SerializationHelper.serialize(service);
} catch (IOException e) {
- throw new ServicesUnloadingException("EnclaveInvokeMetaWrapper serialization failed.", e);
+ throw new ServicesUnloadingException("unload service serialization failed.", e);
}
InnerNativeInvocationResult resultNativeWrapper = unloadServiceNative(payload);
if (resultNativeWrapper.getRet() != 0) {
diff --git a/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/MockInSvmEnclave.java b/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/MockInSvmEnclave.java
index 3b676ea..45575e8 100644
--- a/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/MockInSvmEnclave.java
+++ b/sdk/host/src/main/java/com/alibaba/confidentialcomputing/host/MockInSvmEnclave.java
@@ -15,11 +15,16 @@ import java.io.IOException;
*/
class MockInSvmEnclave extends AbstractEnclave {
private final static String JNI_EXTRACTED_PACKAGE_PATH = "jni/lib_jni_mock_svm.so";
- private final static String ENCLAVE_SVM_WRAPPER_PACKAGE_PATH = "libs/lib_enclave_mock_svm_wrapper.so";
- private final static String ENCLAVE_SVM_PACKAGE_PATH = "libs/lib_svm_sdk.so";
+ private final static String ENCLAVE_SVM_PACKAGE_PATH = "lib_mock_svm_load.so";
private static volatile MockInSvmExtractTempPath extractTempPath;
- private final EnclaveNativeContextCache nativeHandlerContext = new EnclaveNativeContextCache(
- 0, 0, 0, 0);
+
+ // enclaveHandle stores created enclave svm sdk .so file handler.
+ private long enclaveSvmSdkHandle;
+ // isolate stores svm created isolate instance.
+ // In JavaEnclave only one isolateHandle instance will be created.
+ private long isolateHandle;
+ // isolateThreadHandle stores the first attached isolateThread Handle.
+ private long isolateThreadHandle;
MockInSvmEnclave() throws EnclaveCreatingException {
// Set EnclaveContext for this enclave instance.
@@ -33,17 +38,14 @@ class MockInSvmEnclave extends AbstractEnclave {
String jniTempFilePath = ExtractLibrary.extractLibrary(
MockInSvmEnclave.class.getClassLoader(),
JNI_EXTRACTED_PACKAGE_PATH);
- String enclaveWrapperFilePath = ExtractLibrary.extractLibrary(
- MockInSvmEnclave.class.getClassLoader(),
- ENCLAVE_SVM_WRAPPER_PACKAGE_PATH);
String enclaveSvmFilePath = ExtractLibrary.extractLibrary(
MockInSvmEnclave.class.getClassLoader(),
ENCLAVE_SVM_PACKAGE_PATH);
extractTempPath = new MockInSvmEnclave.MockInSvmExtractTempPath(
jniTempFilePath,
- enclaveWrapperFilePath,
enclaveSvmFilePath);
- System.load(jniTempFilePath);
+ System.load(extractTempPath.getJniTempFilePath());
+ registerNatives();
} catch (IOException e) {
throw new EnclaveCreatingException("extracting tee sdk jni .so or signed .so failed.", e);
}
@@ -51,14 +53,13 @@ class MockInSvmEnclave extends AbstractEnclave {
}
}
- // Create svm sdk enclave by native call, enclaveWrapperHandle and enclaveSvmSdkHandle are set in jni in nativeHandlerContext.
- int ret = nativeCreateEnclave(extractTempPath.getJniTempFilePath());
+ // Create svm sdk enclave by native call, enclaveSvmSdkHandle are set in jni in nativeHandlerContext.
+ int ret = nativeCreateEnclave(extractTempPath.getEnclaveSvmFilePath());
if (ret != 0) {
throw new EnclaveCreatingException("create svm sdk enclave by native calling failed.");
}
// Create svm attach isolate and isolateThread, and they are set in jni in nativeHandlerContext.
- ret = nativeSvmAttachIsolate(nativeHandlerContext.getEnclaveWrapperHandle(),
- nativeHandlerContext.getEnclaveSvmSdkHandle());
+ ret = nativeSvmAttachIsolate(enclaveSvmSdkHandle);
if (ret != 0) {
throw new EnclaveCreatingException("create svm isolate by native calling failed.");
}
@@ -75,29 +76,17 @@ class MockInSvmEnclave extends AbstractEnclave {
@Override
InnerNativeInvocationResult loadServiceNative(byte[] payload) {
- return nativeLoadService(
- nativeHandlerContext.getEnclaveWrapperHandle(),
- nativeHandlerContext.getEnclaveSvmSdkHandle(),
- nativeHandlerContext.getIsolateHandle(),
- payload);
+ return nativeLoadService(enclaveSvmSdkHandle, isolateHandle, payload);
}
@Override
InnerNativeInvocationResult unloadServiceNative(byte[] payload) {
- return nativeUnloadService(
- nativeHandlerContext.getEnclaveWrapperHandle(),
- nativeHandlerContext.getEnclaveSvmSdkHandle(),
- nativeHandlerContext.getIsolateHandle(),
- payload);
+ return nativeUnloadService(enclaveSvmSdkHandle, isolateHandle, payload);
}
@Override
InnerNativeInvocationResult invokeMethodNative(byte[] payload) {
- return nativeInvokeMethod(
- nativeHandlerContext.getEnclaveWrapperHandle(),
- nativeHandlerContext.getEnclaveSvmSdkHandle(),
- nativeHandlerContext.getIsolateHandle(),
- payload);
+ return nativeInvokeMethod(enclaveSvmSdkHandle, isolateHandle, payload);
}
@Override
@@ -108,104 +97,54 @@ class MockInSvmEnclave extends AbstractEnclave {
this.getEnclaveContext().getEnclaveServicesRecycler().interruptServiceRecycler();
// destroy svm isolate.
int ret = nativeSvmDetachIsolate(
- nativeHandlerContext.getEnclaveWrapperHandle(),
- nativeHandlerContext.getEnclaveSvmSdkHandle(),
- nativeHandlerContext.getIsolateThreadHandle());
+ enclaveSvmSdkHandle,
+ isolateThreadHandle);
if (ret != 0) {
throw new EnclaveDestroyingException("isolate destroy native call failed.");
}
ret = nativeDestroyEnclave(
- nativeHandlerContext.getEnclaveWrapperHandle(),
- nativeHandlerContext.getEnclaveSvmSdkHandle());
+ enclaveSvmSdkHandle);
if (ret != 0) {
throw new EnclaveDestroyingException("enclave destroy native call failed.");
}
}
-
}
+ private static native void registerNatives();
+
private native int nativeCreateEnclave(String path);
private native int nativeSvmAttachIsolate(
- long enclaveWrapperHandle,
long enclaveSvmSdkHandle);
private native InnerNativeInvocationResult nativeLoadService(
- long enclaveWrapperHandle,
long enclaveSvmSdkHandle,
long isolateHandler,
byte[] serviceHandler);
private native InnerNativeInvocationResult nativeInvokeMethod(
- long enclaveWrapperHandle,
long enclaveSvmSdkHandle,
long isolateHandler,
byte[] enclaveInvokeMetaWrapper);
private native InnerNativeInvocationResult nativeUnloadService(
- long enclaveWrapperHandle,
long enclaveSvmSdkHandle,
long isolateHandler,
byte[] serviceHandler);
private native int nativeSvmDetachIsolate(
- long enclaveWrapperHandle,
long enclaveSvmSdkHandle,
long isolateThreadHandler);
private native int nativeDestroyEnclave(
- long enclaveWrapperHandle,
long enclaveSvmSdkHandle);
- /**
- * JavaEnclave will create svm isolate handle and isolateThread handle by native call,
- * so EnclaveNativeContextCache will cache them for usage.
- */
- class EnclaveNativeContextCache {
- // enclaveHandle stores created enclave wrap .so file handler.
- private final long enclaveWrapperHandle;
- // enclaveHandle stores created enclave svm sdk .so file handler.
- private final long enclaveSvmSdkHandle;
- // isolate stores svm created isolate instance.
- // In JavaEnclave only one isolateHandle instance will be created.
- private final long isolateHandle;
- // isolateThreadHandle stores the first attached isolateThread Handle.
- private final long isolateThreadHandle;
-
- EnclaveNativeContextCache(
- long enclaveWrapperHandle, long enclaveSvmSdkHandle,
- long isolateHandle, long isolateThreadHandle) {
- this.enclaveWrapperHandle = enclaveWrapperHandle;
- this.enclaveSvmSdkHandle = enclaveSvmSdkHandle;
- this.isolateHandle = isolateHandle;
- this.isolateThreadHandle = isolateThreadHandle;
- }
-
- long getEnclaveWrapperHandle() {
- return enclaveWrapperHandle;
- }
-
- long getEnclaveSvmSdkHandle() {
- return enclaveSvmSdkHandle;
- }
-
- long getIsolateHandle() {
- return isolateHandle;
- }
-
- long getIsolateThreadHandle() {
- return isolateThreadHandle;
- }
- }
-
class MockInSvmExtractTempPath {
private final String jniTempFilePath;
- private final String enclaveWrapperFilePath;
private final String enclaveSvmFilePath;
- MockInSvmExtractTempPath(String jniTempFilePath, String enclaveWrapperFilePath, String enclaveSvmFilePath) {
+ MockInSvmExtractTempPath(String jniTempFilePath, String enclaveSvmFilePath) {
this.jniTempFilePath = jniTempFilePath;
- this.enclaveWrapperFilePath = enclaveWrapperFilePath;
this.enclaveSvmFilePath = enclaveSvmFilePath;
}
@@ -213,10 +152,6 @@ class MockInSvmEnclave extends AbstractEnclave {
return jniTempFilePath;
}
- String getEnclaveWrapperFilePath() {
- return enclaveWrapperFilePath;
- }
-
String getEnclaveSvmFilePath() {
return enclaveSvmFilePath;
}
diff --git a/sdk/host/src/main/native/Makefile b/sdk/host/src/main/native/Makefile
new file mode 100644
index 0000000..b498a00
--- /dev/null
+++ b/sdk/host/src/main/native/Makefile
@@ -0,0 +1,11 @@
+# Copyright (c)
+
+.PHONY: all build clean
+
+all: build
+
+build:
+ $(MAKE) -C cpp/platform/mock_in_svm/jni
+
+clean:
+ $(MAKE) -C cpp/platform/mock_in_svm/jni clean
\ No newline at end of file
diff --git a/sdk/host/src/main/native/bin/platform/mock_in_svm/jni/.gitkeep b/sdk/host/src/main/native/bin/platform/mock_in_svm/jni/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/sdk/host/src/main/native/config/config.mk b/sdk/host/src/main/native/config/config.mk
new file mode 100644
index 0000000..a34d544
--- /dev/null
+++ b/sdk/host/src/main/native/config/config.mk
@@ -0,0 +1,13 @@
+# parse enable MOCK_IN_SVM platform, ${MOCK_IN_SVM} is from make.sh script.
+BUILD_MOCK_IN_SVM ?= $(shell echo ${MOCK_IN_SVM})
+# parse JavaEnclave SDK base dir path, ${base_dir} is from make.sh script.
+BASE_DIR_PATH = $(shell echo ${base_dir})
+
+# parse BIN path.
+BIN = $(BASE_DIR_PATH)/src/main/native/bin
+# parse CONFIG path.
+CONFIG = $(BASE_DIR_PATH)/src/main/native/config
+# parse CPP path.
+CPP = $(BASE_DIR_PATH)/src/main/native/cpp
+# parse INCLUDE path.
+INCLUDE = $(BASE_DIR_PATH)/src/main/native/include
\ No newline at end of file
diff --git a/sdk/host/src/main/native/config/platform/mock_in_svm/jni/config.mk b/sdk/host/src/main/native/config/platform/mock_in_svm/jni/config.mk
new file mode 100644
index 0000000..ae3dcf2
--- /dev/null
+++ b/sdk/host/src/main/native/config/platform/mock_in_svm/jni/config.mk
@@ -0,0 +1,5 @@
+CC = gcc
+CXX = g++
+
+# define mock_in_svm jni.cpp compile option.
+DB_LDFLAGS = -Wl,-z,noexecstack -lc -ldl -lpthread -std=c99
\ No newline at end of file
diff --git a/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/Makefile b/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/Makefile
new file mode 100644
index 0000000..2e8074e
--- /dev/null
+++ b/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/Makefile
@@ -0,0 +1,15 @@
+include ./../../../../config/config.mk
+include ./../../../../config/platform/mock_in_svm/jni/config.mk
+
+.PHONY: all build clean
+
+all: build
+
+# compile jni_mock_in_svm.c to $(BIN)/platform/mock_in_svm/jni/lib_jni_mock_svm.so
+build:
+ $(CC) jni_mock_in_svm.c -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(shell uname -s | tr A-Z a-z) \
+ -I$(JAVA_HOME)/lib $(DB_LDFLAGS) -I$(INCLUDE) -fPIC -shared -o $(BIN)/platform/mock_in_svm/jni/lib_jni_mock_svm.so
+
+# clean lib_jni_mock_svm.so
+clean:
+ rm -rf *.o $(BIN)/platform/mock_in_svm/jni/lib_jni_mock_svm.so
\ No newline at end of file
diff --git a/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.c b/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.c
new file mode 100644
index 0000000..1a8d6d8
--- /dev/null
+++ b/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.c
@@ -0,0 +1,172 @@
+#include <assert.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dlfcn.h>
+
+#include <graal_isolate.h>
+#include <enc_environment.h>
+#include <enc_exported_symbol.h>
+
+#include "jni_mock_in_svm.h"
+
+typedef int (*java_enclave_stub)(graal_isolate_t*, enc_data_t*, enc_data_t*, callbacks_t*);
+
+static JNINativeMethod mock_in_svm_methods[] = {
+ {"nativeCreateEnclave", "(Ljava/lang/String;)I", (void *)&JavaEnclave_MockSVMNativeCreateEnclave},
+ {"nativeSvmAttachIsolate", "(J)I", (void *)&JavaEnclave_MockSVMNativeSvmAttachIsolate},
+ {"nativeLoadService", MOCK_IN_SVM_NATIVE_CALL_SIGNATURE, (void *)&JavaEnclave_MockSVMNativeLoadService},
+ {"nativeInvokeMethod", MOCK_IN_SVM_NATIVE_CALL_SIGNATURE, (void *)&JavaEnclave_MockSVMNativeInvokeMethod},
+ {"nativeUnloadService", MOCK_IN_SVM_NATIVE_CALL_SIGNATURE, (void *)&JavaEnclave_MockSVMNativeUnloadService},
+ {"nativeSvmDetachIsolate", "(JJ)I", (void *)&JavaEnclave_MockSVMNativeSvmDetachIsolate},
+ {"nativeDestroyEnclave", "(J)I", (void *)&JavaEnclave_MockSVMNativeDestroyEnclave},
+};
+
+static void *mock_in_svm_load_service_symbol = NULL;
+static void *mock_in_svm_invoke_service_symbol = NULL;
+static void *mock_in_svm_unload_service_symbol = NULL;
+
+JNIEXPORT void JNICALL
+Java_com_alibaba_confidentialcomputing_host_MockInSvmEnclave_registerNatives(JNIEnv *env, jclass cls) {
+ (*env)->RegisterNatives(env, cls, mock_in_svm_methods, sizeof(mock_in_svm_methods)/sizeof(mock_in_svm_methods[0]));
+}
+
+void set_long_field_value(JNIEnv *env, jclass class_mirror, jobject obj, const char *field_name, jlong value) {
+ jfieldID field_id = (*env)->GetFieldID(env, class_mirror, field_name, "J");
+ (*env)->SetLongField(env, obj, field_id, value);
+}
+
+char* memcpy_char_pointer(char* src, int len) {
+ char *ptr = malloc(len);
+ memcpy(ptr, src, len);
+ return (char*)ptr;
+}
+
+jobject build_invocation_result(JNIEnv *env, jint ret, jbyteArray array) {
+ // build jni return object InnerNativeInvocationResult.
+ jclass invocation_result_clazz = (*env)->FindClass(env, MOCK_IN_SVM_RETURN_OBJECT_SIGNATURE);
+ jmethodID id = (*env)->GetMethodID(env, invocation_result_clazz, "<init>", "(I[B)V");
+ return (*env)->NewObject(env, invocation_result_clazz, id, (jint)ret, array);
+}
+
+jobject service_operate_common(JNIEnv *env, jlong isolate_handler, jbyteArray payload, java_enclave_stub p_function) {
+ jbyte *service_payload_copy = (*env)->GetByteArrayElements(env, payload, NULL);
+ int service_payload_copy_length = (*env)->GetArrayLength(env, payload);
+ enc_data_t invoke_data;
+ invoke_data.data = (char*)service_payload_copy;
+ invoke_data.data_len = service_payload_copy_length;
+ enc_data_t result;
+ result.data = NULL;
+ result.data_len = 0x0;
+ callbacks_t callback_methods;
+ callback_methods.memcpy_char_pointer = &memcpy_char_pointer;
+ callback_methods.exception_handler = NULL;
+ int ret = p_function((graal_isolate_t*)isolate_handler, &invoke_data, &result, &callback_methods);
+ (*env)->ReleaseByteArrayElements(env, payload, service_payload_copy, 0);
+
+ // create a byte array.
+ jbyteArray invocation_result_arr = (*env)->NewByteArray(env, result.data_len);
+ jbyte *invocation_result_arr_point = (*env)->GetByteArrayElements(env, invocation_result_arr, NULL);
+ memcpy(invocation_result_arr_point, result.data, result.data_len);
+
+ // free buffer malloc in jni.
+ (*env)->ReleaseByteArrayElements(env, invocation_result_arr, invocation_result_arr_point, 0);
+ // free buffer malloc in native image by callback mechanism.
+ free(result.data);
+
+ return build_invocation_result(env, ret, invocation_result_arr);
+}
+
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeCreateEnclave(JNIEnv *env, jobject obj, jstring path) {
+ const char *path_str = (path == 0) ? 0 : (*env)->GetStringUTFChars(env, path, 0);
+ void *enclave_handler = dlopen(path_str , RTLD_LOCAL | RTLD_LAZY);
+ if (enclave_handler == 0x0) {
+ fprintf(stderr, "mock in svm dlopen error:%s\n", dlerror());
+ return -1;
+ }
+ // find load service symbol.
+ mock_in_svm_load_service_symbol = dlsym((void *)enclave_handler, "java_loadservice_invoke");
+ if (!mock_in_svm_load_service_symbol) {
+ fprintf(stderr, "java_loadservice_invoke error:%s\n", dlerror());
+ dlclose(enclave_handler);
+ return -1;
+ }
+ // find invoke service symbol.
+ mock_in_svm_invoke_service_symbol = dlsym((void *)enclave_handler, "java_enclave_invoke");
+ if (!mock_in_svm_invoke_service_symbol) {
+ fprintf(stderr, "mock_in_svm_invoke_service_symbol error:%s\n", dlerror());
+ dlclose(enclave_handler);
+ return -1;
+ }
+ // find unload service symbol.
+ mock_in_svm_unload_service_symbol = dlsym((void *)enclave_handler, "java_unloadservice_invoke");
+ if (!mock_in_svm_unload_service_symbol) {
+ fprintf(stderr, "mock_in_svm_unload_service_symbol error:%s\n", dlerror());
+ dlclose(enclave_handler);
+ return -1;
+ }
+ // set enclave_handler back to MockInSvmEnclave.enclaveSvmSdkHandle field.
+ jclass class_enclave = (*env)->GetObjectClass(env, obj);
+ set_long_field_value(env, class_enclave, obj, "enclaveSvmSdkHandle", (jlong)enclave_handler);
+ return 0;
+}
+
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeSvmAttachIsolate(JNIEnv *env, jobject obj, jlong enclave_handler) {
+ graal_isolate_t* isolate_t;
+ graal_create_isolate_params_t p;
+ graal_isolatethread_t* isolate_thread_t;
+
+ int (*graal_create_isolate)(graal_create_isolate_params_t* params, graal_isolate_t** isolate, graal_isolatethread_t** thread);
+ graal_create_isolate = (int (*)(graal_create_isolate_params_t*, graal_isolate_t**, graal_isolatethread_t**))
+ dlsym((void *)enclave_handler, "graal_create_isolate");
+ if (!graal_create_isolate) {
+ fprintf(stderr, "dlsym error:%s\n", dlerror());
+ return -1;
+ }
+
+ int ret = graal_create_isolate(NULL, &isolate_t, &isolate_thread_t);
+ if (ret != 0) {
+ fprintf(stderr, "graal_create_isolate create error:%s\n", dlerror());
+ return ret;
+ }
+
+ // set isolate_t and isolate_thread_t back to MockInSvmEnclave.isolateHandle and MockInSvmEnclave.isolateThreadHandle
+ jclass class_enclave = (*env)->GetObjectClass(env, obj);
+ set_long_field_value(env, class_enclave, obj, "isolateHandle", (jlong)isolate_t);
+ set_long_field_value(env, class_enclave, obj, "isolateThreadHandle", (jlong)isolate_thread_t);
+ return ret;
+}
+
+JNIEXPORT jobject JNICALL JavaEnclave_MockSVMNativeLoadService(JNIEnv *env, jobject obj, jlong enclave_handler,
+jlong isolate_handler, jbyteArray service_payload) {
+ return service_operate_common(env, isolate_handler, service_payload, (java_enclave_stub) mock_in_svm_load_service_symbol);
+}
+
+JNIEXPORT jobject JNICALL JavaEnclave_MockSVMNativeInvokeMethod(JNIEnv *env, jobject obj, jlong enclave_handler,
+jlong isolate_handler, jbyteArray invoke_wrapper_payload) {
+ return service_operate_common(env, isolate_handler, invoke_wrapper_payload, (java_enclave_stub) mock_in_svm_invoke_service_symbol);
+}
+
+JNIEXPORT jobject JNICALL JavaEnclave_MockSVMNativeUnloadService(JNIEnv *env, jobject obj, jlong enclave_handler,
+jlong isolate_handler, jbyteArray service_payload) {
+ return service_operate_common(env, isolate_handler, service_payload, (java_enclave_stub) mock_in_svm_unload_service_symbol);
+}
+
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeSvmDetachIsolate(JNIEnv *env, jobject obj, jlong enclave_handler,
+jlong isolate_thread_handler) {
+ int (*graal_detach_all_threads_and_tear_down_isolate)(graal_isolatethread_t* isolateThread);
+ graal_detach_all_threads_and_tear_down_isolate =
+ (int (*)(graal_isolatethread_t*)) dlsym((void *)enclave_handler, "graal_detach_all_threads_and_tear_down_isolate");
+ if (!graal_detach_all_threads_and_tear_down_isolate) {
+ fprintf(stderr, "graal_detach_all_threads_and_tear_down_isolate error:%s\n", dlerror());
+ return -1;
+ }
+ return (jint)graal_detach_all_threads_and_tear_down_isolate((graal_isolatethread_t*)isolate_thread_handler);
+}
+
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeDestroyEnclave(JNIEnv *env, jobject obj, jlong enclave_handler) {
+ return dlclose((void *)enclave_handler);
+}
diff --git a/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.h b/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.h
new file mode 100644
index 0000000..bbcedf1
--- /dev/null
+++ b/sdk/host/src/main/native/cpp/platform/mock_in_svm/jni/jni_mock_in_svm.h
@@ -0,0 +1,66 @@
+#include <jni.h>
+
+#ifndef _Included_jni_mock_in_svm
+#define _Included_jni_mock_in_svm
+
+#define MOCK_IN_SVM_NATIVE_CALL_SIGNATURE "(JJ[B)Lcom/alibaba/confidentialcomputing/host/InnerNativeInvocationResult;"
+#define MOCK_IN_SVM_RETURN_OBJECT_SIGNATURE "com/alibaba/confidentialcomputing/host/InnerNativeInvocationResult"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+JNIEXPORT void JNICALL Java_com_alibaba_confidentialcomputing_host_MockInSvmEnclave_registerNatives(JNIEnv *env, jclass cls);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeCreateEnclave
+ * Method: nativeCreateEnclave
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeCreateEnclave(JNIEnv *, jobject, jstring);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeSvmAttachIsolate
+ * Method: nativeSvmAttachIsolate
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeSvmAttachIsolate(JNIEnv *, jobject, jlong);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeLoadService
+ * Method: nativeLoadService
+ * Signature: (JJ[B)Lcom/alibaba/confidentialcomputing/host/InnerNativeInvocationResult;
+ */
+JNIEXPORT jobject JNICALL JavaEnclave_MockSVMNativeLoadService(JNIEnv *, jobject, jlong, jlong, jbyteArray);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeInvokeMethod
+ * Method: nativeInvokeMethod
+ * Signature: (JJ[B)Lcom/alibaba/confidentialcomputing/host/InnerNativeInvocationResult;
+ */
+JNIEXPORT jobject JNICALL JavaEnclave_MockSVMNativeInvokeMethod(JNIEnv *, jobject, jlong, jlong, jbyteArray);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeUnloadService
+ * Method: nativeUnloadService
+ * Signature: (JJ[B)Lcom/alibaba/confidentialcomputing/host/InnerNativeInvocationResult;
+ */
+JNIEXPORT jobject JNICALL JavaEnclave_MockSVMNativeUnloadService(JNIEnv *, jobject, jlong, jlong, jbyteArray);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeSvmDetachIsolate
+ * Method: nativeSvmDetachIsolate
+ * Signature: (JJ)I
+ */
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeSvmDetachIsolate(JNIEnv *, jobject, jlong, jlong);
+
+/*
+ * Class: JavaEnclave_MockSVMNativeDestroyEnclave
+ * Method: nativeDestroyEnclave
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL JavaEnclave_MockSVMNativeDestroyEnclave(JNIEnv *, jobject, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/sdk/enclave/src/main/resources/native/enc_environment.h b/sdk/host/src/main/native/include/enc_environment.h
similarity index 73%
copy from sdk/enclave/src/main/resources/native/enc_environment.h
copy to sdk/host/src/main/native/include/enc_environment.h
index dc6f683..6de8c9f 100644
--- a/sdk/enclave/src/main/resources/native/enc_environment.h
+++ b/sdk/host/src/main/native/include/enc_environment.h
@@ -1,8 +1,15 @@
- typedef struct enc_data_struct{
+#ifndef __ENC_ENVIRONMENT_H
+#define __ENC_ENVIRONMENT_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct enc_data_struct{
//char array is used as byte array to store serialized data
char* data;
int data_len;
- }enc_data;
+}enc_data_t;
typedef struct callback_functions_struct{
/*
@@ -14,4 +21,9 @@ typedef struct callback_functions_struct{
void (*exception_handler)(char* err_msg, char* stack_trace, char* exception_name);
char* (*memcpy_char_pointer)(char* src, int len);
-}callbacks;
+}callbacks_t;
+
+#if defined(__cplusplus)
+}
+#endif
+#endif
diff --git a/sdk/host/src/main/native/include/enc_exported_symbol.h b/sdk/host/src/main/native/include/enc_exported_symbol.h
new file mode 100644
index 0000000..0e77dd9
--- /dev/null
+++ b/sdk/host/src/main/native/include/enc_exported_symbol.h
@@ -0,0 +1,19 @@
+#ifndef __ENC_EXPORTED_SYMBOL_H
+#define __ENC_EXPORTED_SYMBOL_H
+
+#include "graal_isolate.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+int java_loadservice_invoke(graal_isolate_t* thread, enc_data_t* input, enc_data_t* result, callbacks_t* callBacks);
+
+int java_enclave_invoke(graal_isolate_t* thread, enc_data_t* input, enc_data_t* result, callbacks_t* callBacks);
+
+int java_unloadservice_invoke(graal_isolate_t* thread, enc_data_t* input, enc_data_t* result, callbacks_t* callBacks);
+
+#if defined(__cplusplus)
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/sdk/host/src/main/native/make.sh b/sdk/host/src/main/native/make.sh
new file mode 100644
index 0000000..0340bb6
--- /dev/null
+++ b/sdk/host/src/main/native/make.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# this script will build multi enclave platform's jni.so,
+# also compile enclave's edge routine files which was
+# generated by enclave sdk toolchain.
+
+# step one: cd make.sh script's path location.
+
+# shellcheck disable=SC2006
+this_script_dir=`dirname "$0"`
+# shellcheck disable=SC2164
+cd "$this_script_dir"
+
+# step two: parse parameters from pom.xml
+# parse and store base dir path
+export base_dir=$1
+# parse and store supported enclave platform set
+enclave_platform_config=$2
+# process supported enclave platform set
+OLD_IFS="$IFS"
+IFS=":"
+enclave_platform_array=($enclave_platform_config)
+IFS="$OLD_IFS"
+
+# shellcheck disable=SC2068
+for enclave_platform in ${enclave_platform_array[@]}
+do
+ echo "$enclave_platform"
+ # set "enclave_platform" as TRUE to indicate how
+ # to compile jni.so and edge routine
+ export "$enclave_platform"=TRUE
+done
+
+if [ "$3" == clean ];
+then
+ # make clean.
+ make -f ./Makefile clean
+ rm
+elif [ "$3" == build ];
+then
+ # make build.
+ make -f ./Makefile build
+ # copy jni.so to target/classes, which will be packed into a jar file.
+ if [[ $MOCK_IN_SVM == TRUE ]]; then
+ cp -r "$base_dir"/src/main/native/bin/platform/mock_in_svm/jni "$base_dir"/target/classes
+ fi
+else
+ echo "unsupported make command!!!"
+fi
diff --git a/sdk/host/src/test/java/com/alibaba/confidentialcomputing/host/MockTestEnclave.java b/sdk/host/src/test/java/com/alibaba/confidentialcomputing/host/MockTestEnclave.java
index e1b8a3c..e655e46 100644
--- a/sdk/host/src/test/java/com/alibaba/confidentialcomputing/host/MockTestEnclave.java
+++ b/sdk/host/src/test/java/com/alibaba/confidentialcomputing/host/MockTestEnclave.java
@@ -75,13 +75,11 @@ class MockTestEnclave extends AbstractEnclave {
@Override
InnerNativeInvocationResult loadServiceNative(byte[] payload) {
- EnclaveInvocationContext invocationContext;
List<ServiceHandler> handlers = new ArrayList<>();
Throwable exception = null;
EnclaveInvocationResult result;
try {
- invocationContext = (EnclaveInvocationContext) SerializationHelper.deserialize(payload);
- String interfaceName = invocationContext.getServiceHandler().getServiceInterfaceName();
+ String interfaceName = (String) SerializationHelper.deserialize(payload);
Class<?> service = Class.forName(interfaceName);
Iterator<?> services = ServiceLoader.load(service).iterator();
while (services.hasNext()) {
@@ -107,12 +105,12 @@ class MockTestEnclave extends AbstractEnclave {
@Override
InnerNativeInvocationResult unloadServiceNative(byte[] payload) {
- EnclaveInvocationContext invocationContext;
+ ServiceHandler serviceHandler;
Throwable exception = null;
EnclaveInvocationResult result;
try {
- invocationContext = (EnclaveInvocationContext) SerializationHelper.deserialize(payload);
- instancesRegisterCenter.remove(invocationContext.getServiceHandler().getInstanceIdentity());
+ serviceHandler = (ServiceHandler) SerializationHelper.deserialize(payload);
+ instancesRegisterCenter.remove(serviceHandler.getInstanceIdentity());
} catch (IOException | ClassNotFoundException e) {
exception = e;
} finally {
diff --git a/sdk/pom.xml b/sdk/pom.xml
index 464f84b..c5401b1 100644
--- a/sdk/pom.xml
+++ b/sdk/pom.xml
@@ -11,6 +11,7 @@
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <com.alibaba.enclave.platform>MOCK_IN_SVM</com.alibaba.enclave.platform>
</properties>
<dependencyManagement>
<dependencies>
diff --git a/test/common/pom.xml b/test/common/pom.xml
new file mode 100644
index 0000000..66e5588
--- /dev/null
+++ b/test/common/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <parent>
+ <groupId>com.alibaba.confidentialcomputing</groupId>
+ <artifactId>test</artifactId>
+ <version>0.1.0</version>
+ </parent>
+ <artifactId>common</artifactId>
+ <packaging>jar</packaging>
+ <name>Test-Common</name>
+ <url></url>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>3.0.0</version>
+ <configuration>
+ <attach>true</attach>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>3.0.0-M5</version>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing</groupId>
+ <artifactId>common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.auto.service</groupId>
+ <artifactId>auto-service-annotations</artifactId>
+ <version>1.0-rc6</version>
+ <optional>true</optional>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.auto.service</groupId>
+ <artifactId>auto-service</artifactId>
+ <version>1.0-rc6</version>
+ <optional>true</optional>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
diff --git a/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/EnclaveException.java b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/EnclaveException.java
new file mode 100644
index 0000000..193b896
--- /dev/null
+++ b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/EnclaveException.java
@@ -0,0 +1,8 @@
+package com.alibaba.confidentialcomputing.test.common;
+
+import com.alibaba.confidentialcomputing.common.annotations.EnclaveService;
+
+@EnclaveService
+public interface EnclaveException {
+ void enclaveException(String info) throws JavaEnclaveException;
+}
diff --git a/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/JavaEnclaveException.java b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/JavaEnclaveException.java
new file mode 100644
index 0000000..9ed7f21
--- /dev/null
+++ b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/JavaEnclaveException.java
@@ -0,0 +1,7 @@
+package com.alibaba.confidentialcomputing.test.common;
+
+public class JavaEnclaveException extends Exception {
+ public JavaEnclaveException(String info) {
+ super(info);
+ }
+}
diff --git a/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/ReflectionCallService.java b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/ReflectionCallService.java
new file mode 100644
index 0000000..f4dbf44
--- /dev/null
+++ b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/ReflectionCallService.java
@@ -0,0 +1,10 @@
+package com.alibaba.confidentialcomputing.test.common;
+
+import com.alibaba.confidentialcomputing.common.annotations.EnclaveService;
+
+@EnclaveService
+public interface ReflectionCallService {
+ int add(int a, int b);
+
+ int sub(int a, int b);
+}
diff --git a/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/SayHelloService.java b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/SayHelloService.java
new file mode 100644
index 0000000..c3016b0
--- /dev/null
+++ b/test/common/src/main/java/com/alibaba/confidentialcomputing/test/common/SayHelloService.java
@@ -0,0 +1,8 @@
+package com.alibaba.confidentialcomputing.test.common;
+
+import com.alibaba.confidentialcomputing.common.annotations.EnclaveService;
+
+@EnclaveService
+public interface SayHelloService {
+ String sayHelloService(String plainText);
+}
\ No newline at end of file
diff --git a/test/enclave/pom.xml b/test/enclave/pom.xml
new file mode 100644
index 0000000..63114bc
--- /dev/null
+++ b/test/enclave/pom.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <parent>
+ <groupId>com.alibaba.confidentialcomputing</groupId>
+ <artifactId>test</artifactId>
+ <version>0.1.0</version>
+ </parent>
+ <artifactId>enclave</artifactId>
+ <packaging>jar</packaging>
+ <name>Test-Enclave</name>
+ <url></url>
+ <properties>
+ <svm.maven.version>0.9.10</svm.maven.version>
+ </properties>
+ <profiles>
+ <profile>
+ <id>native</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.graalvm.buildtools</groupId>
+ <artifactId>native-maven-plugin</artifactId>
+ <version>${svm.maven.version}</version>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>test-native</id>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <buildArgs>
+ <buildArg>--no-fallback</buildArg>
+ <buildArg>-H:+RunInEnclave</buildArg>
+ </buildArgs>
+ </configuration>
+ <phase>test</phase>
+ </execution>
+ <execution>
+ <id>build-native</id>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ <configuration>
+ <imageName>lib_mock_svm_load</imageName>
+ <buildArgs>
+ <buildArg>--shared</buildArg>
+ <buildArg>--no-fallback</buildArg>
+ <buildArg>--allow-incomplete-classpath</buildArg>
+ <buildArg>-H:OutputRelocatableImage=.</buildArg>
+ <buildArg>-H:+RunInEnclave</buildArg>
+ <buildArg>-H:Path=svm-output</buildArg>
+ <buildArg>-H:ReflectionConfigurationFiles=${project.basedir}/target/native/agent-output/test/reflect-config.json</buildArg>
+ </buildArgs>
+ </configuration>
+ <phase>package</phase>
+ </execution>
+ </executions>
+ <configuration>
+ <agent>
+ <enabled>true</enabled>
+ </agent>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>3.0.0</version>
+ <configuration>
+ <attach>true</attach>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>3.0.0-M5</version>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <artifactId>common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing</groupId>
+ <artifactId>enclave</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.auto.service</groupId>
+ <artifactId>auto-service-annotations</artifactId>
+ <version>1.0-rc6</version>
+ <optional>true</optional>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.auto.service</groupId>
+ <artifactId>auto-service</artifactId>
+ <version>1.0-rc6</version>
+ <optional>true</optional>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-api</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-launcher</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit-pioneer</groupId>
+ <artifactId>junit-pioneer</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
diff --git a/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/Calculate.java b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/Calculate.java
new file mode 100644
index 0000000..3e4ca61
--- /dev/null
+++ b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/Calculate.java
@@ -0,0 +1,11 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+public class Calculate {
+ public static int add(int a, int b) {
+ return a + b;
+ }
+
+ public static int sub(int a, int b) {
+ return a - b;
+ }
+}
diff --git a/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/EnclaveExceptionImpl.java b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/EnclaveExceptionImpl.java
new file mode 100644
index 0000000..7c5d18b
--- /dev/null
+++ b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/EnclaveExceptionImpl.java
@@ -0,0 +1,13 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+import com.alibaba.confidentialcomputing.test.common.EnclaveException;
+import com.alibaba.confidentialcomputing.test.common.JavaEnclaveException;
+import com.google.auto.service.AutoService;
+
+@AutoService(EnclaveException.class)
+public class EnclaveExceptionImpl implements EnclaveException {
+ @Override
+ public void enclaveException(String info) throws JavaEnclaveException {
+ throw new JavaEnclaveException(info);
+ }
+}
diff --git a/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/ReflectionCallServiceImpl.java b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/ReflectionCallServiceImpl.java
new file mode 100644
index 0000000..3aaf6f1
--- /dev/null
+++ b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/ReflectionCallServiceImpl.java
@@ -0,0 +1,47 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+import com.alibaba.confidentialcomputing.test.common.ReflectionCallService;
+
+import com.google.auto.service.AutoService;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+@AutoService(ReflectionCallService.class)
+public class ReflectionCallServiceImpl implements ReflectionCallService {
+ private static Method addMethod;
+ private static Method subMethod;
+
+ static {
+ try {
+ addMethod = Class.forName(Calculate.class.getName()).getMethod("add", int.class, int.class);
+ subMethod = Class.forName(Calculate.class.getName()).getMethod("sub", int.class, int.class);
+ } catch (ClassNotFoundException | NoSuchMethodException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public int add(int a, int b) {
+ try {
+ return (int) addMethod.invoke(null, a, b);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return -1;
+ }
+
+ @Override
+ public int sub(int a, int b) {
+ try {
+ return (int) subMethod.invoke(null, a, b);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return -1;
+ }
+}
\ No newline at end of file
diff --git a/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/SayHelloServiceImpl.java b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/SayHelloServiceImpl.java
new file mode 100644
index 0000000..2dfd70c
--- /dev/null
+++ b/test/enclave/src/main/java/com/alibaba/confidentialcomputing/test/enclave/SayHelloServiceImpl.java
@@ -0,0 +1,13 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+import com.alibaba.confidentialcomputing.test.common.SayHelloService;
+
+import com.google.auto.service.AutoService;
+
+@AutoService(SayHelloService.class)
+public class SayHelloServiceImpl implements SayHelloService {
+ @Override
+ public String sayHelloService(String plainText) {
+ return plainText;
+ }
+}
\ No newline at end of file
diff --git a/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestEnclaveException.java b/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestEnclaveException.java
new file mode 100644
index 0000000..85d6f5c
--- /dev/null
+++ b/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestEnclaveException.java
@@ -0,0 +1,14 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+import com.alibaba.confidentialcomputing.test.common.JavaEnclaveException;
+
+import org.junit.jupiter.api.*;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestEnclaveException {
+ @Test
+ public void testEnclaveException() {
+ assertThrows(JavaEnclaveException.class, () -> new EnclaveExceptionImpl().enclaveException("JavaEnclave Exception"));
+ }
+}
diff --git a/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestReflectionCallService.java b/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestReflectionCallService.java
new file mode 100644
index 0000000..6288764
--- /dev/null
+++ b/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestReflectionCallService.java
@@ -0,0 +1,15 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestReflectionCallService {
+
+ @Test
+ public void testReflectionCallService() {
+ ReflectionCallServiceImpl service = new ReflectionCallServiceImpl();
+ assertEquals(20, service.add(2, 18));
+ assertEquals(-20, service.sub(2, 22));
+ }
+}
diff --git a/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestSayHelloServiceImpl.java b/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestSayHelloServiceImpl.java
new file mode 100644
index 0000000..4c41d8e
--- /dev/null
+++ b/test/enclave/src/test/java/com/alibaba/confidentialcomputing/test/enclave/TestSayHelloServiceImpl.java
@@ -0,0 +1,14 @@
+package com.alibaba.confidentialcomputing.test.enclave;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestSayHelloServiceImpl {
+
+ @Test
+ public void testSayHelloServiceImpl() {
+ SayHelloServiceImpl service = new SayHelloServiceImpl();
+ assertEquals("Hello World", service.sayHelloService("Hello World"));
+ }
+}
\ No newline at end of file
diff --git a/sdk/host/pom.xml b/test/host/pom.xml
similarity index 58%
copy from sdk/host/pom.xml
copy to test/host/pom.xml
index dbaf6ce..6565a58 100644
--- a/sdk/host/pom.xml
+++ b/test/host/pom.xml
@@ -2,17 +2,25 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
- <groupId>com.alibaba.confidentialcomputing</groupId>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
<parent>
<groupId>com.alibaba.confidentialcomputing</groupId>
- <artifactId>JavaEnclave</artifactId>
+ <artifactId>test</artifactId>
<version>0.1.0</version>
</parent>
<artifactId>host</artifactId>
<packaging>jar</packaging>
- <name>JavaEnclave-Host</name>
+ <name>Test-Host</name>
<url></url>
<build>
+ <resources>
+ <resource>
+ <directory>${project.basedir}/../enclave/target/svm-output</directory>
+ <includes>
+ <include>**/*.so</include>
+ </includes>
+ </resource>
+ </resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@@ -30,49 +38,6 @@
</execution>
</executions>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <configuration>
- <javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
- <doclint>none</doclint>
- </configuration>
- <version>3.2.0</version>
- <executions>
- <execution>
- <id>attach-javadoc</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>0.8.3</version>
- <configuration>
- <includes>
- <include>com/alibaba/confidentialcomputing/host/*</include>
- <include>com/alibaba/confidentialcomputing/host/**/*</include>
- </includes>
- </configuration>
- <executions>
- <execution>
- <id>pre-test</id>
- <goals>
- <goal>prepare-agent</goal>
- </goals>
- </execution>
- <execution>
- <id>post-test</id>
- <phase>test</phase>
- <goals>
- <goal>report</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
@@ -81,10 +46,22 @@
</plugins>
</build>
<dependencies>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing</groupId>
+ <artifactId>host</artifactId>
+ </dependency>
<dependency>
<groupId>com.alibaba.confidentialcomputing</groupId>
<artifactId>common</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <artifactId>enclave</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <artifactId>common</artifactId>
+ </dependency>
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service-annotations</artifactId>
@@ -99,11 +76,6 @@
<optional>true</optional>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
@@ -125,4 +97,4 @@
<scope>test</scope>
</dependency>
</dependencies>
-</project>
+</project>
\ No newline at end of file
diff --git a/test/host/src/test/java/com/alibaba/confidentialcomputing/test/host/TestJavaEnclaveService.java b/test/host/src/test/java/com/alibaba/confidentialcomputing/test/host/TestJavaEnclaveService.java
new file mode 100644
index 0000000..3640a12
--- /dev/null
+++ b/test/host/src/test/java/com/alibaba/confidentialcomputing/test/host/TestJavaEnclaveService.java
@@ -0,0 +1,72 @@
+package com.alibaba.confidentialcomputing.test.host;
+
+import java.util.Iterator;
+
+import com.alibaba.confidentialcomputing.host.exception.EnclaveCreatingException;
+import com.alibaba.confidentialcomputing.host.exception.EnclaveDestroyingException;
+import com.alibaba.confidentialcomputing.host.exception.ServicesLoadingException;
+import com.alibaba.confidentialcomputing.test.common.EnclaveException;
+import com.alibaba.confidentialcomputing.test.common.JavaEnclaveException;
+import com.alibaba.confidentialcomputing.test.common.ReflectionCallService;
+import com.alibaba.confidentialcomputing.test.common.SayHelloService;
+import com.alibaba.confidentialcomputing.host.Enclave;
+import com.alibaba.confidentialcomputing.host.EnclaveFactory;
+import com.alibaba.confidentialcomputing.host.EnclaveType;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestJavaEnclaveService {
+ private String sayHelloService(EnclaveType type, String plain) throws
+ EnclaveCreatingException, ServicesLoadingException, EnclaveDestroyingException {
+ Enclave enclave = EnclaveFactory.create(type);
+ Iterator<SayHelloService> userServices = enclave.load(SayHelloService.class);
+ assertNotNull(userServices);
+ assertTrue(userServices.hasNext());
+ SayHelloService service = userServices.next();
+ String result = service.sayHelloService(plain);
+ enclave.destroy();
+ return result;
+ }
+
+ private void reflectionCallService(EnclaveType type) throws EnclaveCreatingException, ServicesLoadingException, EnclaveDestroyingException {
+ Enclave enclave = EnclaveFactory.create(type);
+ Iterator<ReflectionCallService> userServices = enclave.load(ReflectionCallService.class);
+ assertNotNull(userServices);
+ assertTrue(userServices.hasNext());
+ ReflectionCallService service = userServices.next();
+ assertEquals(20, service.add(2, 18));
+ assertEquals(-20, service.sub(2, 22));
+ enclave.destroy();
+ }
+
+ private void javaEnclaveException(EnclaveType type) throws EnclaveCreatingException, ServicesLoadingException, EnclaveDestroyingException {
+ Enclave enclave = EnclaveFactory.create(type);
+ Iterator<EnclaveException> userServices = enclave.load(EnclaveException.class);
+ assertNotNull(userServices);
+ assertTrue(userServices.hasNext());
+ EnclaveException service = userServices.next();
+ assertThrows(JavaEnclaveException.class, () -> service.enclaveException("JavaEnclave Exception"));
+ enclave.destroy();
+ }
+
+ @Test
+ public void testSayHelloService() throws
+ EnclaveCreatingException, EnclaveDestroyingException, ServicesLoadingException {
+ assertEquals("Hello World", sayHelloService(EnclaveType.MOCK_IN_JVM, "Hello World"));
+ assertEquals("Hello World", sayHelloService(EnclaveType.MOCK_IN_SVM, "Hello World"));
+ }
+
+ @Test
+ public void testReflectionCallService() throws ServicesLoadingException, EnclaveCreatingException, EnclaveDestroyingException {
+ reflectionCallService(EnclaveType.MOCK_IN_JVM);
+ reflectionCallService(EnclaveType.MOCK_IN_SVM);
+ }
+
+ @Test
+ public void testJavaEnclaveException() throws ServicesLoadingException, EnclaveCreatingException, EnclaveDestroyingException {
+ javaEnclaveException(EnclaveType.MOCK_IN_JVM);
+ javaEnclaveException(EnclaveType.MOCK_IN_SVM);
+ }
+}
diff --git a/sdk/pom.xml b/test/pom.xml
similarity index 69%
copy from sdk/pom.xml
copy to test/pom.xml
index 464f84b..8e8df10 100644
--- a/sdk/pom.xml
+++ b/test/pom.xml
@@ -1,16 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba.confidentialcomputing</groupId>
- <artifactId>JavaEnclave</artifactId>
+ <artifactId>test</artifactId>
<packaging>pom</packaging>
<version>0.1.0</version>
- <name>JavaEnclave</name>
+ <name>test</name>
<url></url>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <com.alibaba.enclave.platform>MOCK_IN_SVM</com.alibaba.enclave.platform>
</properties>
<dependencyManagement>
<dependencies>
@@ -30,10 +32,19 @@
<version>0.1.0</version>
</dependency>
<dependency>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>0.8.3</version>
- <scope>test</scope>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <artifactId>common</artifactId>
+ <version>0.1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <artifactId>enclave</artifactId>
+ <version>0.1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba.confidentialcomputing.test</groupId>
+ <artifactId>host</artifactId>
+ <version>0.1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
@@ -47,6 +58,12 @@
<version>1.8.2</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-launcher</artifactId>
+ <version>1.8.2</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org