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
The following commit(s) were added to refs/heads/master by this push:
new 8847d03 Add C builtin example (#483)
8847d03 is described below
commit 8847d03553e6967ab7a2e8082e2f69c69b01e5e4
Author: Mengyuan-L <[email protected]>
AuthorDate: Thu Feb 11 22:17:23 2021 -0500
Add C builtin example (#483)
---
examples/c/Makefile | 8 +-
examples/c/builtin_ordered_set_intersect.c | 421 +++++++++++++++++++++++++++++
2 files changed, 427 insertions(+), 2 deletions(-)
diff --git a/examples/c/Makefile b/examples/c/Makefile
index 2cc0b68..734e3e4 100644
--- a/examples/c/Makefile
+++ b/examples/c/Makefile
@@ -16,7 +16,7 @@
# under the License.
-all: builtin_echo
+all: builtin_echo builtin_ordered_set_intersect
CFLAGS := -I../../sdk/c -Ltarget/debug/ -lteaclave_client_sdk
@@ -30,8 +30,12 @@ target/debug/libteaclave_client_sdk.so:
builtin_echo: builtin_echo.c target/debug/libteaclave_client_sdk.so
gcc -o $@ builtin_echo.c $(CFLAGS)
-run: builtin_echo
+builtin_ordered_set_intersect: builtin_ordered_set_intersect.c
target/debug/libteaclave_client_sdk.so
+ gcc -o $@ builtin_ordered_set_intersect.c $(CFLAGS)
+
+run: builtin_echo builtin_ordered_set_intersect
LD_LIBRARY_PATH=target/debug ./builtin_echo
+ LD_LIBRARY_PATH=target/debug ./builtin_ordered_set_intersect
clean:
@rm -rf target
diff --git a/examples/c/builtin_ordered_set_intersect.c
b/examples/c/builtin_ordered_set_intersect.c
new file mode 100644
index 0000000..66af481
--- /dev/null
+++ b/examples/c/builtin_ordered_set_intersect.c
@@ -0,0 +1,421 @@
+/*
+ * 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.
+ *
+ */
+
+#include "teaclave_client_sdk.h"
+#include <stdio.h>
+#include <string.h>
+
+#define BUFFER_SIZE 4086
+
+const char *authentication_service_address = "localhost:7776";
+const char *frontend_service_address = "localhost:7777";
+const char *enclave_info_path = "../../release/services/enclave_info.toml";
+#ifdef DCAP
+const char *as_root_ca_cert_path = "../../keys/dcap_root_ca_cert.pem";
+#else
+const char *as_root_ca_cert_path = "../../keys/ias_root_ca_cert.pem";
+#endif
+
+typedef struct UserData {
+ char *user_id;
+ char *password;
+ char *input_url;
+ char *output_url;
+ char *input_cmac;
+ char key[16];
+} UserData;
+
+struct UserData user0_data = {
+ .user_id = "user0",
+ .password = "password",
+ .input_url =
"http://localhost:6789/fixtures/functions/ordered_set_intersect/psi0.txt.enc",
+ .output_url =
"http://localhost:6789/fixtures/functions/ordered_set_intersect/output_psi0.enc",
+ .input_cmac = "e08adeb021e876ffe82234445e632121",
+ .key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+
+struct UserData user1_data = {
+ .user_id = "user1",
+ .password = "password",
+ .input_url =
"http://localhost:6789/fixtures/functions/ordered_set_intersect/psi1.txt.enc",
+ .output_url =
"http://localhost:6789/fixtures/functions/ordered_set_intersect/output_psi1.enc",
+ .input_cmac = "538dafbf7802d962bb01e2389b4e943a",
+ .key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+
+const char *register_function_request_serialized =
+ "{"
+ " \"request\": \"register_function\","
+ " \"name\": \"builtin-ordered-set-intersect\","
+ " \"description\": \"Native Private Set Intersection\","
+ " \"executor_type\": \"builtin\","
+ " \"public\": true,"
+ " \"payload\": [],"
+ " \"arguments\": ["
+ " \"order\""
+ " ],"
+ " \"inputs\": ["
+ " {\"name\": \"input_data1\", \"description\": \"Client 0 data.\"},"
+ " {\"name\": \"input_data2\", \"description\": \"Client 1 data.\"}"
+ " ],"
+ " \"outputs\": ["
+ " {\"name\": \"output_result1\", \"description\": \"Output data.\"},"
+ " {\"name\": \"output_result2\", \"description\": \"Output data.\"}"
+ " ]"
+ "}";
+
+const char *create_task_request_serialized =
+ "{"
+ " \"request\": \"create_task\","
+ " \"function_id\": \"%s\","
+ " \"function_arguments\": \"{\\\"order\\\": \\\"ascending\\\"}\","
+ " \"executor\": \"builtin\","
+ " \"inputs_ownership\": ["
+ " {\"data_name\": \"input_data1\", \"uids\": [\"user0\"]},"
+ " {\"data_name\": \"input_data2\", \"uids\": [\"user1\"]}"
+ " ],"
+ " \"outputs_ownership\": ["
+ " {\"data_name\": \"output_result1\", \"uids\": [\"user0\"]},"
+ " {\"data_name\": \"output_result2\", \"uids\": [\"user1\"]}"
+ " ]"
+ "}";
+
+const char *register_input_serialized =
+ "{"
+ " \"request\": \"register_input_file\","
+ " \"url\": \"%s\","
+ " \"cmac\": \"%s\","
+ " \"crypto_info\": {\"schema\": \"teaclave-file-128\","
+ " \"key\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],"
+ " \"iv\": []}"
+ "}";
+
+const char *register_output_serialized =
+ "{"
+ " \"request\": \"register_output_file\","
+ " \"url\": \"%s\","
+ " \"crypto_info\": {\"schema\": \"teaclave-file-128\","
+ " \"key\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],"
+ " \"iv\": []}"
+ "}";
+
+const char *user0_assign_serialized =
+ "{"
+ " \"request\": \"assign_data\","
+ " \"task_id\": \"%s\","
+ " \"inputs\": ["
+ " {\"data_name\": \"input_data1\", \"data_id\": \"%s\"}"
+ " ],"
+ " \"outputs\": ["
+ " {\"data_name\": \"output_result1\", \"data_id\": \"%s\"}"
+ " ]"
+ "}";
+
+const char *user1_assign_serialized =
+ "{"
+ " \"request\": \"assign_data\","
+ " \"task_id\": \"%s\","
+ " \"inputs\": ["
+ " {\"data_name\": \"input_data2\", \"data_id\": \"%s\"}"
+ " ],"
+ " \"outputs\": ["
+ " {\"data_name\": \"output_result2\", \"data_id\": \"%s\"}"
+ " ]"
+ "}";
+
+const char *approve_serialized =
+ "{"
+ " \"request\": \"approve_task\","
+ " \"task_id\": \"%s\""
+ "}";
+
+int login(char *user_id, char *password, char *token, size_t *token_len)
+{
+ int ret = 0;
+
+ AuthenticationClient *authentication_client =
teaclave_connect_authentication_service(
+ authentication_service_address, enclave_info_path,
as_root_ca_cert_path);
+ if (authentication_client == NULL) {
+ fprintf(stderr, "[-] %s Failed to connect to the authentication
service.\n", user_id);
+ ret = 1;
+ return ret;
+ }
+
+ ret = teaclave_user_register(authentication_client, user_id, password);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to register user.\n");
+ fprintf(stderr, "[-] Maybe `%s' already exists. Continue. \n",
user_id);
+ }
+
+ ret = teaclave_user_login(authentication_client, user_id, password, token,
token_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] %s Failed to login.\n", user_id);
+ return ret;
+ }
+ printf("[+] token: %s\n", token);
+
+ return ret;
+}
+
+struct FrontendClient *init_client(char *user_id, char *password)
+{
+ struct FrontendClient *frontend_client;
+ int ret;
+ char token[BUFFER_SIZE] = {0};
+ size_t token_len = BUFFER_SIZE;
+
+ /* Login. */
+ ret = login(user_id, password, token, &token_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] %s Failed to login.\n", user_id);
+ }
+
+ /* Connect to the frontend serivice. */
+ frontend_client =
+ teaclave_connect_frontend_service(frontend_service_address,
enclave_info_path, as_root_ca_cert_path);
+ if (frontend_client == NULL) {
+ fprintf(stderr, "[-] %s Failed to connect to the frontend service.\n",
user_id);
+ return frontend_client;
+ }
+
+ /* Set user id and token. */
+ ret = teaclave_set_credential(frontend_client, user_id, token);
+ if (ret != 0) {
+ fprintf(stderr, "[-] %s Failed to set credential.\n", user_id);
+ return frontend_client;
+ }
+
+ return frontend_client;
+}
+
+int set_task(struct FrontendClient *frontend_client, char
*serialized_response, size_t serialized_response_len)
+{
+ /* Register function. */
+ int ret = 0;
+ char serialized_request[BUFFER_SIZE] = {0};
+ char function_id[BUFFER_SIZE] = {0};
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_register_function_serialized(frontend_client,
register_function_request_serialized,
+ serialized_response,
&serialized_response_len);
+
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to register the function.\n");
+ return ret;
+ }
+ sscanf(serialized_response, "{\"function_id\":\"%45s", function_id);
+ printf("[+] function_id: %s\n", function_id);
+
+ /* Create task. */
+ snprintf(serialized_request, BUFFER_SIZE, create_task_request_serialized,
function_id);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_create_task_serialized(frontend_client, serialized_request,
serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to create a task.\n");
+ }
+ return ret;
+}
+
+int main()
+{
+ int ret = 0;
+ char task_id[BUFFER_SIZE] = {0};
+ char user0_task_result[BUFFER_SIZE] = {0};
+ char user1_task_result[BUFFER_SIZE] = {0};
+ char user0_serialized_input_request[BUFFER_SIZE] = {0};
+ char user0_serialized_output_request[BUFFER_SIZE] = {0};
+ char user0_serialized_assign_request[BUFFER_SIZE] = {0};
+ char user1_serialized_input_request[BUFFER_SIZE] = {0};
+ char user1_serialized_output_request[BUFFER_SIZE] = {0};
+ char user1_serialized_assign_request[BUFFER_SIZE] = {0};
+ char user0_approve_request[BUFFER_SIZE] = {0};
+ char user1_approve_request[BUFFER_SIZE] = {0};
+ char user0_input_id[BUFFER_SIZE] = {0};
+ char user0_output_id[BUFFER_SIZE] = {0};
+ char user1_input_id[BUFFER_SIZE] = {0};
+ char user1_output_id[BUFFER_SIZE] = {0};
+ char serialized_response[BUFFER_SIZE] = {0};
+ size_t serialized_response_len = BUFFER_SIZE;
+
+ FrontendClient *client0 = init_client(user0_data.user_id,
user0_data.password);
+ if (client0 == NULL) {
+ fprintf(stderr, "[-] %s Failed to init the client.\n",
user0_data.user_id);
+ goto bail;
+ }
+
+ FrontendClient *client1 = init_client(user1_data.user_id,
user1_data.password);
+ if (client0 == NULL) {
+ fprintf(stderr, "[-] %s Failed to init the client.\n",
user1_data.user_id);
+ goto bail;
+ }
+
+ ret = set_task(client0, serialized_response, serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] %s failed to set the task.\n",
user0_data.user_id);
+ goto bail;
+ }
+ sscanf(serialized_response, "{\"task_id\":\"%41s", task_id);
+ printf("[+] task_id: %s\n", task_id);
+
+ /* User0 register input data. */
+ printf("[+] %s register input data\n", user0_data.user_id);
+ snprintf(user0_serialized_input_request, BUFFER_SIZE,
register_input_serialized, user0_data.input_url,
+ user0_data.input_cmac);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_register_input_file_serialized(client0,
user0_serialized_input_request, serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] %s Failed to register input data.\n",
user0_data.user_id);
+ goto bail;
+ }
+ sscanf(serialized_response, "{\"data_id\":\"%42s", user0_input_id);
+
+ /* User0 register output data. */
+ printf("[+] %s register output data\n", user0_data.user_id);
+ snprintf(user0_serialized_output_request, BUFFER_SIZE,
register_output_serialized, user0_data.output_url);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_register_output_file_serialized(client0,
user0_serialized_output_request, serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to register output data.\n");
+ goto bail;
+ }
+ sscanf(serialized_response, "{\"data_id\":\"%43s", user0_output_id);
+
+ /* User0 assign data. */
+ snprintf(user0_serialized_assign_request, BUFFER_SIZE,
user0_assign_serialized, task_id, user0_input_id,
+ user0_output_id);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ printf("[+] %s assign data\n", user0_data.user_id);
+ ret = teaclave_assign_data_serialized(client0,
user0_serialized_assign_request, serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] %s failed to assign data.\n", user0_data.user_id);
+ goto bail;
+ }
+
+ /* User1 register input data. */
+ printf("[+] %s register input data\n", user1_data.user_id);
+ snprintf(user1_serialized_input_request, BUFFER_SIZE,
register_input_serialized, user1_data.input_url,
+ user1_data.input_cmac);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_register_input_file_serialized(client1,
user1_serialized_input_request, serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to register input data.\n");
+ goto bail;
+ }
+ sscanf(serialized_response, "{\"data_id\":\"%42s", user1_input_id);
+
+ /* User1 register output data. */
+ printf("[+] %s register output data\n", user1_data.user_id);
+ snprintf(user1_serialized_output_request, BUFFER_SIZE,
register_output_serialized, user1_data.output_url);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_register_output_file_serialized(client1,
user1_serialized_output_request, serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to register output data. %d\n", ret);
+ goto bail;
+ }
+ sscanf(serialized_response, "{\"data_id\":\"%43s", user1_output_id);
+
+ /* User1 assign data. */
+ printf("[+] %s assign data\n", user1_data.user_id);
+ snprintf(user1_serialized_assign_request, BUFFER_SIZE,
user1_assign_serialized, task_id, user1_input_id,
+ user1_output_id);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret = teaclave_assign_data_serialized(client1,
user1_serialized_assign_request, serialized_response,
+ &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to assign data.\n");
+ goto bail;
+ }
+
+ /* User0 approve task. */
+ printf("[+] user0 approve task \n");
+ snprintf(user0_approve_request, BUFFER_SIZE, approve_serialized, task_id);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret =
+ teaclave_approve_task_serialized(client0, user0_approve_request,
serialized_response, &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to approve task.\n");
+ goto bail;
+ }
+
+ /* User1 approve task. */
+ printf("[+] user1 approve task \n");
+ snprintf(user1_approve_request, BUFFER_SIZE, approve_serialized, task_id);
+ memset(serialized_response, 0, BUFFER_SIZE);
+ serialized_response_len = BUFFER_SIZE;
+ ret =
+ teaclave_approve_task_serialized(client1, user1_approve_request,
serialized_response, &serialized_response_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to approve task.\n");
+ goto bail;
+ }
+
+ /* User0 Invoke task. */
+ printf("[+] user0 invoke task \n");
+ ret = teaclave_invoke_task(client0, task_id);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to invoke the task.\n");
+ goto bail;
+ }
+
+ /* User0 get task result. */
+ printf("[+] user0 get task result \n");
+ size_t user0_task_result_len = BUFFER_SIZE;
+ ret = teaclave_get_task_result(client0, task_id, user0_task_result,
&user0_task_result_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to get the task result.\n");
+ goto bail;
+ }
+ printf("[+] %s task result in string: %s\n", user0_data.user_id,
user0_task_result);
+
+ /* User1 get task result. */
+ printf("[+] user1 get task result \n");
+ size_t user1_task_result_len = BUFFER_SIZE;
+ ret = teaclave_get_task_result(client1, task_id, user1_task_result,
&user1_task_result_len);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to get the task result.\n");
+ goto bail;
+ }
+ printf("[+] %s task result in string: %s\n", user1_data.user_id,
user1_task_result);
+
+bail:
+ printf("close client - 0\n");
+ ret = teaclave_close_frontend_service(client0);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to close the frontend service client.\n");
+ }
+ printf("close client - 1\n");
+ ret = teaclave_close_frontend_service(client1);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to close the frontend service client.\n");
+ }
+ return ret;
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]