class DataClient: def __init__(self, user_id, user_password): self.user_id = user_id self.user_password = user_password self.client = AuthenticationService( AUTHENTICATION_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() print(f"[+] {self.user_id} registering user") self.client.user_register(self.user_id, self.user_password) print(f"[+] {self.user_id} login") token = self.client.user_login(self.user_id, self.user_password) self.client = FrontendService( FRONTEND_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() metadata = {"id": self.user_id, "token": token} self.client.metadata = metadata def register_data(self, task_id, input_url, input_cmac, output_url, file_key, input_label, output_label): client = self.client print(f"[+] {self.user_id} registering input file") url = input_url cmac = input_cmac schema = "teaclave-file-128" key = file_key iv = [] input_id = client.register_input_file(url, schema, key, iv, cmac) print(f"[+] {self.user_id} registering output file") url = output_url schema = "teaclave-file-128" key = file_key iv = [] output_id = client.register_output_file(url, schema, key, iv) print(f"[+] {self.user_id} assigning data to task") client.assign_data_to_task(task_id, [DataList(input_label, input_id)], [DataList(output_label, output_id)]) def approve_task(self, task_id): client = self.client print(f"[+] {self.user_id} approving task") client.approve_task(task_id) def get_task_result(self, task_id): client = self.client print(f"[+] {self.user_id} getting task result") return bytes(client.get_task_result(task_id))
class ConfigClient: def __init__(self, user_id, user_password): self.user_id = user_id self.user_password = user_password self.client = AuthenticationService( AUTHENTICATION_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() print(f"[+] {self.user_id} registering user") self.client.user_register(self.user_id, self.user_password) print(f"[+] {self.user_id} login") token = self.client.user_login(self.user_id, self.user_password) self.client = FrontendService( FRONTEND_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() metadata = {"id": self.user_id, "token": token} self.client.metadata = metadata def set_task(self): client = self.client print(f"[+] {self.user_id} registering function") function_id = client.register_function( name="builtin-private-join-and-compute", description="Native Private Join And Compute", executor_type="builtin", arguments=["num_user"], inputs=[ FunctionInput("input_data0", "Bank A data file."), FunctionInput("input_data1", "Bank B data file."), FunctionInput("input_data2", "Bank C data file.") ], outputs=[ FunctionOutput("output_data0", "Output data."), FunctionOutput("output_data1", "Output data."), FunctionOutput("output_data2", "Output date.") ]) print(f"[+] {self.user_id} creating task") task_id = client.create_task(function_id=function_id, function_arguments=({ "num_user": 3, }), executor="builtin", inputs_ownership=[ OwnerList("input_data0", [USER_DATA_0.user_id]), OwnerList("input_data1", [USER_DATA_1.user_id]), OwnerList("input_data2", [USER_DATA_2.user_id]) ], outputs_ownership=[ OwnerList("output_data0", [USER_DATA_0.user_id]), OwnerList("output_data1", [USER_DATA_1.user_id]), OwnerList("output_data2", [USER_DATA_2.user_id]) ]) return task_id def run_task(self, task_id): client = self.client client.approve_task(task_id) print(f"[+] {self.user_id} invoking task") client.invoke_task(task_id)
class ConfigClient: def __init__(self, user_id, user_password): self.user_id = user_id self.user_password = user_password self.client = AuthenticationService( AUTHENTICATION_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() print(f"[+] {self.user_id} registering user") self.client.user_register(self.user_id, self.user_password) print(f"[+] {self.user_id} login") token = self.client.user_login(self.user_id, self.user_password) self.client = FrontendService( FRONTEND_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() metadata = {"id": self.user_id, "token": token} self.client.metadata = metadata def set_single_party_task(self, functionname, payloadpath, args={}, inlabels=["input_data_0"], outlabels=["result_data_0"], ex=Executor.builtin): client = self.client print(f"[+] {self.user_id} registering function") p_str = "" if payloadpath != "": print(f"[+] {self.user_id} reading payload file") with open(payloadpath, "rb") as f: p_str = f.read() function_id = client.register_function( name=functionname, description="worker: %s" % functionname, executor_type=ex.name, arguments=list(args.keys()), payload=list(p_str), inputs=[ FunctionInput(label, "user input data file: %s" % label) for label in inlabels ], outputs=[ FunctionOutput(label, "user output file: %s" % label) for label in outlabels ]) print(f"[+] {self.user_id} creating task") task_id = client.create_task(function_id=function_id, executor=ex.value, function_arguments=(args), inputs_ownership=[ OwnerList(label, [self.user_id]) for label in inlabels ], outputs_ownership=[ OwnerList(label, [self.user_id]) for label in outlabels ]) return task_id def run_task(self, task_id): client = self.client client.approve_task(task_id) print(f"[+] {self.user_id} invoking task") client.invoke_task(task_id) def register_data(self, task_id, inputs: List[InputData], outputs: List[OutputData]): client = self.client print(f"[+] {self.user_id} registering input file") input_data_list = [] for da in inputs: url = da.input_url cmac = da.input_cmac schema = da.schema key = da.file_key iv = da.iv input_id = client.register_input_file(url, schema, key, iv, cmac) input_data_list.append(DataList(da.label, input_id)) print(f"[+] {self.user_id} registering output file") output_data_list = [] for out_data in outputs: out_url = out_data.output_url schema = out_data.schema key = out_data.file_key iv = out_data.iv output_id = client.register_output_file(out_url, schema, key, iv) output_data_list.append(DataList(out_data.label, output_id)) print(f"[+] {self.user_id} assigning data to task") client.assign_data_to_task(task_id, input_data_list, output_data_list) return True def approve_task(self, task_id): client = self.client print(f"[+] {self.user_id} approving task") client.approve_task(task_id) def get_task_result(self, task_id): client = self.client print(f"[+] {self.user_id} getting task result") return bytes(client.get_task_result(task_id)) def get_output_cmac_by_tag(self, task_id, tag): client = self.client print(f"[+] {self.user_id} getting task output") return client.get_output_cmac_by_tag(task_id, tag)
class Client: def __init__(self, user_id, user_password): self.user_id = user_id self.user_password = user_password self.client = AuthenticationService( AUTHENTICATION_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() print(f"[+] {self.user_id} registering user") self.client.user_register(self.user_id, self.user_password) print(f"[+] {self.user_id} login") token = self.client.user_login(self.user_id, self.user_password) self.client = FrontendService( FRONTEND_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() metadata = {"id": self.user_id, "token": token} self.client.metadata = metadata def set_task(self): client = self.client print(f"[+] {self.user_id} registering function") function_id = client.register_function( name="builtin-ordered-set-intersect", description="Native Private Set Intersection", executor_type="builtin", arguments=["order"], inputs=[ FunctionInput("input_data1", "Client 0 data."), FunctionInput("input_data2", "Client 1 data.") ], outputs=[ FunctionOutput("output_result1", "Output data."), FunctionOutput("output_result2", "Output data.") ]) print(f"[+] {self.user_id} creating task") task_id = client.create_task( function_id=function_id, function_arguments=({ "order": "ascending", # Order can be ascending or desending }), executor="builtin", inputs_ownership=[ OwnerList("input_data1", [USER_DATA_0.user_id]), OwnerList("input_data2", [USER_DATA_1.user_id]) ], outputs_ownership=[ OwnerList("output_result1", [USER_DATA_0.user_id]), OwnerList("output_result2", [USER_DATA_1.user_id]) ]) return task_id def run_task(self, task_id): client = self.client print(f"[+] {self.user_id} invoking task") client.invoke_task(task_id) def register_data(self, task_id, input_url, input_cmac, output_url, file_key, input_label, output_label): client = self.client print(f"[+] {self.user_id} registering input file") url = input_url cmac = input_cmac schema = "teaclave-file-128" key = file_key iv = [] input_id = client.register_input_file(url, schema, key, iv, cmac) print(f"[+] {self.user_id} registering output file") url = output_url schema = "teaclave-file-128" key = file_key iv = [] output_id = client.register_output_file(url, schema, key, iv) print(f"[+] {self.user_id} assigning data to task") client.assign_data_to_task(task_id, [DataList(input_label, input_id)], [DataList(output_label, output_id)]) def approve_task(self, task_id): client = self.client print(f"[+] {self.user_id} approving task") client.approve_task(task_id) def get_task_result(self, task_id): client = self.client print(f"[+] {self.user_id} getting task result") return bytes(client.get_task_result(task_id))
class Client: def __init__(self, user_id, user_password): self.user_id = user_id self.user_password = user_password self.client = AuthenticationService( AUTHENTICATION_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() print(f"[+] {self.user_id} registering user") self.client.user_register(self.user_id, self.user_password) print(f"[+] {self.user_id} login") token = self.client.user_login(self.user_id, self.user_password) self.client = FrontendService( FRONTEND_SERVICE_ADDRESS, AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH).connect().get_client() metadata = {"id": self.user_id, "token": token} self.client.metadata = metadata def set_task(self): client = self.client print(f"[+] {self.user_id} registering function") function_id = client.register_function( name="builtin-password-check", description="Check whether a password is exposed.", executor_type="builtin", arguments=[], inputs=[ FunctionInput("password", "Client 0 data."), FunctionInput("exposed_passwords", "Client 1 data.") ], outputs=[]) print(f"[+] {self.user_id} creating task") task_id = client.create_task( function_id=function_id, function_arguments={}, executor="builtin", inputs_ownership=[ OwnerList("password", [USER_DATA_0.user_id]), OwnerList("exposed_passwords", [USER_DATA_1.user_id]) ], ) return task_id def run_task(self, task_id): client = self.client print(f"[+] {self.user_id} invoking task") client.invoke_task(task_id) def register_data(self, task_id, input_url, algorithm, input_cmac, file_key, iv, input_label): client = self.client print(f"[+] {self.user_id} registering input file") url = input_url cmac = input_cmac schema = algorithm key = file_key input_id = client.register_input_file(url, schema, key, iv, cmac) print(f"[+] {self.user_id} assigning data to task") client.assign_data_to_task(task_id, [DataList(input_label, input_id)], []) def approve_task(self, task_id): client = self.client print(f"[+] {self.user_id} approving task") client.approve_task(task_id) def get_task_result(self, task_id): client = self.client print(f"[+] {self.user_id} getting task result") return bytes(client.get_task_result(task_id))