Teaclave Service Protocols
==========================

* This is a draft. Add `AuthorizeData` in ACS.
## Common Message Types
### UserCredential
```proto
message UserCredential {
string id = 1;
string token = 2;
}
```
### FileEncryptedInfo
```proto
enum FileType {
AesGcm128EncryptedFile = 0;
TeaclaveEncryptedFile = 1;
}
message FileEncryptedInfo {
FileType type = 1;
bytes key = 2;
}
```
### Empty
```proto
message Empty { }
```
## Teaclave Authorization Service
```proto
service TeaclaveAuthorizationService {
rpc UserLogin (UserLoginRequest) returns (UserLoginResponse);
rpc UserAuthorize (UserAuthorizeRequest) returns (UserAuthorizeResponse);
}
```
## Teaclave Authorization Service Message Types
### UserLogin
```proto
message UserLoginRequest {
string id = 1;
string password = 2;
}
message UserLoginResponse {
string token = 1;
}
```
### UserAuthorize
```proto
message UserAuthorizeRequest {
UserCredential credential = 1;
}
message UserAuthorizeResponse {
bool accept = 1;
}
```
## Teaclave Frontend Service Interfaces
```proto
service TeaclaveFrontend {
rpc RegisterInputFile (RegisterInputFileRequest) returns (RegisterInputFileResponse);
rpc RegisterOutputFile (RegisterOutputFileRequest) returns (RegisterOutputFileResponse);
rpc RegisterFunction (RegisterFunctionRequest) returns (RegisterFunctionResponse);
rpc GetFunction (GetFunctionRequest) returns (GetFunctionResponse);
rpc GetOutputFile (GetOutputFileRequest) returns (GetoutputFileResponse);
rpc GetFusionData (GetFusionDataRequest) returns (GetFusionDataResponse);
rpc InvokeTask (InvokeTaskRequest) returns (Empty);
rpc GetTask (GetTaskRequest) returns (GetTaskResponse);
}
```
## Teaclave Frontend Service Message Types
### RegisterInputFile
```proto
message RegisterInputFileRequest {
string uri = 1;
string hash = 2;
FileEncryptedInfo encrypted_info = 3;
UserCredential credential = 99;
}
message RegisterInputFileResponse {
string data_id = 1;
}
```
### RegisterOutputFile
```proto
message RegisterOutputFileRequest {
string uri = 1;
FileEncryptedInfo encrypted_info = 2;
UserCredential credential = 99;
}
message RegisterOutputFileResponse {
string data_id = 1;
}
```
### RegisterFunction
```proto
message FunctionInput {
string name = 1;
string description = 2;
}
message FunctionOutput {
string name = 1;
string description = 2;
}
message RegisterFunctionRequest {
string name = 1;
string description = 2;
bytes function_content = 3;
bool is_public = 4;
repeated FunctionInput input_list = 5;
repeated FunctionOutput output_list = 6;
UserCredential credential = 99;
}
message RegisterFunctionResponse {
string function_id = 1;
}
```
### GetFunction
```proto
message GetFunctionRequest {
string function_id = 1;
UserCredential credential = 99;
}
message GetFunctionResponse {
string name = 1;
string description = 2;
bytes function_content = 3;
bool is_public = 4;
repeated FunctionInput input_list = 5;
repeated FunctionOutput output_list = 6;
}
```
### GetOutputFile
```proto
message GetOutputFileRequest {
string data_id = 1;
UserCredential credential = 99;
}
message GetOutputFileResponse {
string hash = 1;
}
```
### GetFusionData
```proto
message GetFusionDataRequest {
string data_id = 1;
UserCredential credential = 99;
}
message GetFusionDataResponse {
string hash = 1;
repeated string data_owner_id_list = 2;
}
```
### InvokeTask
```proto
message InvokeTaskRequest {
string task_payload = 1;
map<string, string> signature_map = 2;
UserCredential credential = 99;
}
message InvokeTaskRequest {
string task_id = 1;
UserCredential credential = 99;
}
```
### GetTask
```proto
message GetTaskRequest {
string task_id = 1;
UserCredential credential = 99;
}
message GetTaskResponse {
string function_id = 1;
string function_owner = 2;
map<string, DataOwnerList> input_data_owner_list_map = 3;
map<string, DataOwnerList> output_data_owner_list_map = 4;
map<string, string> input_map = 2;
map<string, string> output_map = 3;
map<string, bytes> signature_map = 4;
}
```
## Teaclave Management Service Interfaces
```proto
service TeaclaveManagementService {
rpc RegisterInputFile (RegisterInputFileRequest) returns (RegisterInputFileResponse);
rpc RegisterOutputFile (RegisterOutputFileRequest) returns (RegisterOutputFileResponse);
rpc RegisterFunction (RegisterFunctionRequest) returns (RegisterFunctionResponse);
rpc GetFunction (GetFunctionRequest) returns (GetFunctionResponse);
rpc GetOutputFile (GetOutputFileRequest) returns (GetoutputFileResponse);
rpc GetFusionData (GetFusionDataRequest) returns (GetFusionDataResponse);
rpc InvokeTask (InvokeTaskRequest) returns (Empty);
rpc GetTask (GetTaskRequest) returns (GetTaskResponse);
}
```
## Teaclave Management Service Message Types
### RegisterInputFile
```proto
message RegisterInputFileRequest {
string uri = 1;
string hash = 2;
FileEncryptedInfo encrypted_info = 3;
UserCredential credential = 99;
}
message RegisterInputFileResponse {
string data_id = 1;
}
```
### RegisterOutputFile
```proto
message RegisterOutputFileRequest {
string uri = 1;
FileEncryptedInfo encrypted_info = 2;
UserCredential credential = 99;
}
message RegisterOutputFileResponse {
string data_id = 1;
}
```
### RegisterFunction
```proto
message FunctionInput {
string name = 1;
string description = 2;
}
message FunctionOutput {
string name = 1;
string description = 2;
}
message RegisterFunctionRequest {
string name = 1;
string description = 2;
bytes function_content = 3;
bool is_public = 4;
repeated FunctionInput input_list = 5;
repeated FunctionOutput output_list = 6;
UserCredential credential = 99;
}
message RegisterFunctionResponse {
string function_id = 1;
}
```
### GetFunction
```proto
message GetFunctionRequest {
string function_id = 1;
UserCredential credential = 99;
}
message GetFunctionResponse {
string name = 1;
string description = 2;
bytes function_content = 3;
bool is_public = 4;
repeated FunctionInput input_list = 5;
repeated FunctionOutput output_list = 6;
}
```
### GetOutputFile
```proto
message GetOutputFileRequest {
string data_id = 1;
UserCredential credential = 99;
}
message GetOutputFileResponse {
string hash = 1;
}
```
### GetFusionData
```proto
message GetFusionDataRequest {
string data_id = 1;
UserCredential credential = 99;
}
message GetFusionDataResponse {
string hash = 1;
repeated string data_owner_id_list = 2;
}
```
### CreateTask
```proto
message DataOwnerList {
repeated string user_id_list = 1;
}
message CreateTaskRequest {
string function_id = 1;
string function_owner = 2;
map<string, DataOwnerList> input_data_owner_list_map = 3;
map<string, DataOwnerList> output_data_owner_list_map = 4;
UserCredential credential = 99;
}
message CreateTaskResponse {
string task_id = 1;
}
```
### InvokeTask
```proto
message InvokeTaskRequest {
string task_id = 1;
// name, data_id
map<string, string> input_map = 2;
map<string, string> output_map = 3;
map<string, bytes> signatures = 4;
UserCredential credential = 99;
}
message InvokeTaskRequest {
string task_id = 1;
UserCredential credential = 99;
}
```
### GetTask
```proto
message GetTaskRequest {
string task_id = 1;
UserCredential credential = 99;
}
message GetTaskResponse {
string function_id = 1;
string function_owner = 2;
map<string, DataOwnerList> input_data_owner_list_map = 3;
map<string, DataOwnerList> output_data_owner_list_map = 4;
map<string, string> input_map = 2;
map<string, string> output_map = 3;
map<string, bytes> signatures = 4;
}
```
## Teaclave Access Control Service Interfaces
```
service AccessControlService {
rpc AuthorizeData (AuthorizeDataRequest) returns (AuthorizeDataResponse);
rpc AuthorizeFunction (AuthorizeFunctionRequest) returns (AuthorizeFunctionResponse);
rpc AuthorizeTask (AuthorizeTaskRequest) returns (AuthorizeTaskResponse);
rpc AuthorizeStagedTask (AuthorizeStagedTaskRequest) returns (AuthorizeStagedTaskResponse);
}
```
## Teaclave Access Control Service Message Types
```proto
message AuthorizeDataRequest {
string subject_user_id = 1;
repeated string object_data_owner_id_list = 2;
}
message AuthorizeDataResponse {
bool accepted = 1;
}
message AuthorizeFunctionRequest {
string subject_user_id = 1;
string object_function_owner_id = 2;
}
message AuthorizeFunctionResponse {
bool accepted = 1;
}
message AuthorizeTaskRequest {
string subject_user_id = 1;
string object_function_owner_id = 2;
repeated string object_input_owner_id_list = 3;
repeated string object_output_owner_id_list = 4;
}
message AuthorizeTaskResponse {
bool accepted = 1;
}
message AuthorizeStagedTaskRequest {
string subject_function_owner_id = 1;
map<string, DataOwnerList> subject_input_owner_list_map = 2;
map<string, DataOwnerList> subject_output_owner_list_map = 3;
string object_function_owner_id = 4;
string object_is_function_public = 5;
map<string, DataOwnerList> object_input_owner_list_map = 6;
map<string, DataOwnerList> object_output_owner_list_map = 7;
}
message AuthorizeStagedTaskResponse {
bool accepted = 1;
}
```
## Teaclave Database Service Interfaces
```proto
service DatabaseService {
rpc Get (GetRequest) returns (GetResponse);
rpc Put (SetRequest) returns (Empty);
rpc Delete (DeleteRequest) returns (Empty);
rpc Enqueue (EnqueueRequest) returns (Empty);
rpc Dequeue (DequeueRequest) returns (DequeueResponse);
}
```
## Teaclave Database Service Message Types
### Get
```proto
message GetRequest {
bytes key = 1;
}
message GetResponse {
bytes value = 1;
}
```
### Put
```proto
message PutRequest {
bytes key = 1;
bytes value = 2;
}
```
### Delete
```proto
message DeleteRequest {
bytes key = 1;
}
```
### Enqueue
```proto
message EnqueueRequest {
bytes key = 1;
bytes value = 2;
}
```
### Dequeue
```proto
message DequeueRequest {
bytes key = 1;
}
message DequeueResponse {
bytes value = 1;
}
```
## Teaclave Task Scheduler Service
```proto
service TaskSchedulerService {
rpc RegisterWorker (RegisterWorkerRequest) returns (RegisterWorkerResponse);
rpc GetStagedTask (GetStagedTaskRequest) returns (GetStagedTaskReponse);
rpc ReportStagedTaskStatus (ReportStagedTaskStatusRequest) returns (Empty);
}
message RegisterWorkerReqeust {
string worker_label = 1;
repeated string worker_capability = 2;
}
message RegisterWorkerResponse {
string worker_id = 1;
}
message StagedArgument {
string uri = 1;
string hash = 2;
FileEncryptedInfo encrypted_info = 3;
}
message StagedFunction {
bool is_builtin = 1;
string function_id = 2;
bytes function_content = 3;
}
message StagedTask {
string task_id = 1;
StagedFunction function = 2;
map<string, StagedArgument> input_map = 3;
map<string, StagedArgument> output_map = 4;
map<string, StagedArgument> arg_map = 5;
}
message GetStagedTaskRequest {
string worker_id;
}
message GetStagedTaskResponse {
StagedTask task = 1;
}
enum StagedTaskStatus {
Preparing = 0;
Running = 1;
Finished = 2;
Failed = 3;
}
message ReportStagedTaskStatusRequest {
StagedTaskStatus status;
}
```
## Teaclave Worker Interfaces (no interfaces)