This is an automated email from the ASF dual-hosted git repository.

mssun pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git


The following commit(s) were added to refs/heads/develop by this push:
     new 05cfee3  Implement better error propagation mechanism for binder/ipc
05cfee3 is described below

commit 05cfee338f5876df3e6a30da150eaf4da76065bc
Author: Mingshen Sun <[email protected]>
AuthorDate: Wed Feb 5 23:07:55 2020 -0800

    Implement better error propagation mechanism for binder/ipc
---
 binder/Cargo.toml                          |  2 ++
 binder/src/binder.rs                       | 55 +++++++++++++++++++++---------
 ipc/Cargo.toml                             |  1 +
 ipc/src/channel/app_dep.rs                 | 34 +++++++++---------
 ipc/src/channel/tee_dep.rs                 |  8 ++---
 ipc/src/lib.rs                             | 16 +++++++--
 ipc/src/macros.rs                          | 17 +++++----
 services/access_control/app/Cargo.toml     |  1 +
 services/access_control/app/src/main.rs    | 12 ++++---
 services/access_control/enclave/src/lib.rs | 17 +++++----
 services/authentication/app/Cargo.toml     |  1 +
 services/authentication/app/src/main.rs    |  9 +++--
 services/authentication/enclave/src/lib.rs | 27 +++++++--------
 services/execution/app/Cargo.toml          |  1 +
 services/execution/app/src/main.rs         | 11 ++++--
 services/execution/enclave/src/lib.rs      | 31 ++++++++++-------
 services/frontend/app/Cargo.toml           |  1 +
 services/frontend/app/src/main.rs          |  9 +++--
 services/frontend/enclave/src/lib.rs       | 17 +++++----
 services/management/app/Cargo.toml         |  1 +
 services/management/app/src/main.rs        |  9 +++--
 services/management/enclave/src/lib.rs     | 17 +++++----
 services/storage/app/Cargo.toml            |  1 +
 services/storage/app/src/main.rs           | 15 ++++----
 services/storage/enclave/src/lib.rs        | 20 ++++++-----
 tests/functional_tests/app/Cargo.toml      |  1 +
 tests/functional_tests/app/src/main.rs     | 10 ++++--
 tests/functional_tests/enclave/src/lib.rs  | 10 +++---
 tests/integration_tests/app/Cargo.toml     |  1 +
 tests/integration_tests/app/src/main.rs    | 25 ++++++++------
 tests/integration_tests/enclave/src/lib.rs | 10 +++---
 tests/scripts/functional_tests.py          | 52 ++++++++++++++--------------
 tests/unit_tests/app/Cargo.toml            |  1 +
 tests/unit_tests/app/src/main.rs           | 11 ++++--
 tests/unit_tests/enclave/src/lib.rs        | 10 +++---
 types/src/lib.rs                           | 14 +++++++-
 utils/service_enclave_utils/Cargo.toml     |  1 +
 utils/service_enclave_utils/src/lib.rs     |  8 ++---
 38 files changed, 306 insertions(+), 181 deletions(-)

diff --git a/binder/Cargo.toml b/binder/Cargo.toml
index 0cbe149..209207c 100644
--- a/binder/Cargo.toml
+++ b/binder/Cargo.toml
@@ -12,8 +12,10 @@ env_logger   = { version = "0.7.1" }
 log          = { version = "0.4.6" }
 serde        = { version = "1.0.92", features = ["derive"] }
 serde_json   = { version = "1.0.39" }
+thiserror    = { version = "1.0.9" }
 
 teaclave_ipc = { path = "../ipc" }
+teaclave_types = { path = "../types" }
 
 sgx_types = { version = "1.1.0" }
 sgx_urts  = { version = "1.1.0", features = ["global_init"] }
diff --git a/binder/src/binder.rs b/binder/src/binder.rs
index d521174..7c3a70e 100644
--- a/binder/src/binder.rs
+++ b/binder/src/binder.rs
@@ -20,49 +20,69 @@ use sgx_urts::SgxEnclave;
 
 use serde::{Deserialize, Serialize};
 
-use anyhow::Result;
 use teaclave_ipc::channel::ECallChannel;
 use teaclave_ipc::proto::{
     ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, 
InitEnclaveInput, InitEnclaveOutput,
 };
 use teaclave_ipc::IpcSender;
+use teaclave_types::TeeServiceResult;
 
 static ENCLAVE_FILE_SUFFIX: &str = "_enclave.signed.so";
 
+#[derive(thiserror::Error, Debug)]
+pub enum TeeBinderError {
+    #[error("IpcError")]
+    IpcError,
+    #[error("SgxError")]
+    SgxError(sgx_types::sgx_status_t),
+    #[error("TeeServiceError")]
+    TeeServiceError,
+}
+
 pub struct TeeBinder {
     enclave: SgxEnclave,
 }
 
 impl TeeBinder {
-    pub fn new(name: &str, debug_launch: i32) -> Result<TeeBinder> {
-        let enclave = create_sgx_enclave(&name, debug_launch)?;
+    pub fn new(name: &str) -> std::result::Result<TeeBinder, TeeBinderError> {
+        let enclave = if cfg!(production) {
+            create_sgx_enclave(&name, false)?
+        } else {
+            create_sgx_enclave(&name, true)?
+        };
         debug!("EnclaveID: {}", enclave.geteid());
 
         let tee = TeeBinder { enclave };
 
-        let args_info = InitEnclaveInput::default();
-        let _ret_info = tee.invoke::<InitEnclaveInput, InitEnclaveOutput>(
-            ECallCommand::InitEnclave.into(),
-            args_info,
+        let input = InitEnclaveInput::default();
+        let _ = tee.invoke::<InitEnclaveInput, 
TeeServiceResult<InitEnclaveOutput>>(
+            ECallCommand::InitEnclave,
+            input,
         )?;
 
         Ok(tee)
     }
 
-    pub fn invoke<U, V>(&self, cmd: u32, args_info: U) -> Result<V>
+    pub fn invoke<U, V>(
+        &self,
+        command: ECallCommand,
+        input: U,
+    ) -> std::result::Result<V, TeeBinderError>
     where
         U: Serialize,
         V: for<'de> Deserialize<'de>,
     {
         let mut channel = ECallChannel::new(self.enclave.geteid());
-        channel.invoke::<U, V>(cmd, args_info)
+        channel
+            .invoke::<U, V>(command.into(), input)
+            .map_err(|_| TeeBinderError::IpcError)
     }
 
     pub fn finalize(&self) {
-        let args_info = FinalizeEnclaveInput::default();
-        match self.invoke::<FinalizeEnclaveInput, FinalizeEnclaveOutput>(
-            ECallCommand::FinalizeEnclave.into(),
-            args_info,
+        let input = FinalizeEnclaveInput::default();
+        match self.invoke::<FinalizeEnclaveInput, 
TeeServiceResult<FinalizeEnclaveOutput>>(
+            ECallCommand::FinalizeEnclave,
+            input,
         ) {
             Ok(_) => {}
             Err(e) => info!("{:?}", e),
@@ -77,7 +97,10 @@ impl Drop for TeeBinder {
     }
 }
 
-fn create_sgx_enclave(enclave_name: &str, debug_launch: i32) -> 
Result<SgxEnclave> {
+fn create_sgx_enclave(
+    enclave_name: &str,
+    debug_launch: bool,
+) -> std::result::Result<SgxEnclave, TeeBinderError> {
     let mut launch_token: sgx_launch_token_t = [0; 1024]; // launch_token is 
deprecated
     let mut launch_token_updated: i32 = 0; // launch_token is deprecated
 
@@ -90,12 +113,12 @@ fn create_sgx_enclave(enclave_name: &str, debug_launch: 
i32) -> Result<SgxEnclav
 
     let enclave = SgxEnclave::create(
         enclave_file,
-        debug_launch,
+        debug_launch as i32,
         &mut launch_token,         // launch_token is deprecated
         &mut launch_token_updated, // launch_token is deprecated
         &mut misc_attr,
     )
-    .map_err(|_| anyhow::anyhow!("sgx error"))?;
+    .map_err(TeeBinderError::SgxError)?;
 
     Ok(enclave)
 }
diff --git a/ipc/Cargo.toml b/ipc/Cargo.toml
index 8f5af63..89274ef 100644
--- a/ipc/Cargo.toml
+++ b/ipc/Cargo.toml
@@ -19,6 +19,7 @@ serde        = { version = "1.0.92", features = ["derive"] }
 anyhow       = { version = "1.0.26" }
 serde_json   = { version = "1.0.39" }
 log          = { version = "0.4.6" }
+thiserror    = { version = "1.0.9" }
 
 teaclave_ipc_attribute = { path = "./attribute" }
 teaclave_types         = { path = "../types" }
diff --git a/ipc/src/channel/app_dep.rs b/ipc/src/channel/app_dep.rs
index cd4d648..39f79e6 100644
--- a/ipc/src/channel/app_dep.rs
+++ b/ipc/src/channel/app_dep.rs
@@ -23,8 +23,8 @@ use serde::{Deserialize, Serialize};
 
 use sgx_types::{sgx_enclave_id_t, sgx_status_t};
 
+use crate::IpcError;
 use crate::IpcSender;
-use anyhow::{bail, Result};
 use teaclave_types::EnclaveStatus;
 
 // Delaration of ecall for App, the implementation is in TEE
@@ -59,7 +59,11 @@ impl ECallChannel {
         }
     }
 
-    fn ecall_ipc_app_to_tee(&mut self, cmd: u32, request_payload: Vec<u8>) -> 
Result<Vec<u8>> {
+    fn ecall_ipc_app_to_tee(
+        &mut self,
+        cmd: u32,
+        request_payload: Vec<u8>,
+    ) -> std::result::Result<Vec<u8>, IpcError> {
         debug! {"ecall_ipc_app_to_tee: {:x}, {:x} bytes", cmd, 
request_payload.len()};
 
         let in_ptr: *const u8 = request_payload.as_ptr();
@@ -87,17 +91,15 @@ impl ECallChannel {
                 )
             };
 
-            /* Check sgx return values */
+            // Check sgx return values
             if sgx_status != sgx_status_t::SGX_SUCCESS {
                 error!("ecall_ipc_entry_point, app sgx_error:{}", sgx_status);
-                bail!(sgx_status);
+                return Err(IpcError::SgxError(sgx_status as i32));
             }
 
-            /*
-             * Check rust logic return values
-             * If out_buf is not big enough, realloc based on the returned 
out_len
-             * We only retry once for once invocation.
-             */
+            // Check rust logic return values
+            // If out_buf is not big enough, realloc based on the returned 
out_len
+            // We only retry once for once invocation.
             if ecall_ret.is_err_ffi_outbuf() && !retried {
                 debug!(
                     "ecall_ipc_entry_point, expand app request buffer size: 
{:?}",
@@ -110,13 +112,11 @@ impl ECallChannel {
                 continue;
             }
 
-            /*
-             * Check rust logic return values
-             * Transparent deliever the errors to outer logic.
-             */
+            // Check rust logic return values
+            // Transparent deliever the errors to outer logic.
             if ecall_ret.is_err() {
                 error!("ecall_ipc_entry_point, app api_error: {:?}", 
ecall_ret);
-                bail!("ecall error");
+                return Err(IpcError::EnclaveError(ecall_ret));
             }
 
             unsafe {
@@ -132,14 +132,14 @@ impl ECallChannel {
 }
 
 impl IpcSender for ECallChannel {
-    fn invoke<U, V>(&mut self, cmd: u32, input: U) -> Result<V>
+    fn invoke<U, V>(&mut self, cmd: u32, input: U) -> std::result::Result<V, 
IpcError>
     where
         U: Serialize,
         V: for<'de> Deserialize<'de>,
     {
-        let request_payload = serde_json::to_vec(&input)?;
+        let request_payload = serde_json::to_vec(&input).map_err(|_| 
IpcError::SerdeError)?;
         let result_buf = self.ecall_ipc_app_to_tee(cmd, request_payload)?;
-        let response: V = serde_json::from_slice(&result_buf)?;
+        let response: V = serde_json::from_slice(&result_buf).map_err(|_| 
IpcError::SerdeError)?;
         Ok(response)
     }
 }
diff --git a/ipc/src/channel/tee_dep.rs b/ipc/src/channel/tee_dep.rs
index 3302b22..2515616 100644
--- a/ipc/src/channel/tee_dep.rs
+++ b/ipc/src/channel/tee_dep.rs
@@ -37,13 +37,9 @@ impl IpcReceiver for ECallReceiver {
         V: serde::Serialize,
         X: IpcService<U, V>,
     {
-        debug!("from_slice");
         let input: U = serde_json::from_slice(&input_payload)?;
-
-        debug!("handle_invoke");
-        let response = x.handle_invoke(input)?;
-
-        debug!("to_vec");
+        let response: std::result::Result<V, teaclave_types::TeeServiceError> =
+            x.handle_invoke(input);
         let response_payload = serde_json::to_vec(&response)?;
 
         Ok(response_payload)
diff --git a/ipc/src/lib.rs b/ipc/src/lib.rs
index 6f80fb9..2a9f42a 100644
--- a/ipc/src/lib.rs
+++ b/ipc/src/lib.rs
@@ -36,7 +36,7 @@ use serde::{Deserialize, Serialize};
 // Generic U: ArgmentsInfo type
 // Generic V: ReturnInfo type
 pub trait IpcSender {
-    fn invoke<U, V>(&mut self, cmd: u32, input: U) -> Result<V>
+    fn invoke<U, V>(&mut self, cmd: u32, input: U) -> std::result::Result<V, 
IpcError>
     where
         U: Serialize,
         V: for<'de> Deserialize<'de>;
@@ -50,7 +50,7 @@ where
     U: for<'de> Deserialize<'de>,
     V: Serialize,
 {
-    fn handle_invoke(&self, input: U) -> Result<V>;
+    fn handle_invoke(&self, input: U) -> teaclave_types::TeeServiceResult<V>;
 }
 
 // Callee of an IPC function
@@ -66,6 +66,18 @@ pub trait IpcReceiver {
         X: IpcService<U, V>;
 }
 
+#[derive(thiserror::Error, Debug, Serialize, Deserialize)]
+pub enum IpcError {
+    #[error("SgxError")]
+    SgxError(i32),
+    #[error("EnclaveError")]
+    EnclaveError(teaclave_types::EnclaveStatus),
+    #[error("SerdeError")]
+    SerdeError,
+    #[error("TeeServiceError")]
+    TeeServiceError,
+}
+
 pub mod channel;
 pub mod macros;
 pub mod proto;
diff --git a/ipc/src/macros.rs b/ipc/src/macros.rs
index aa5897a..e012d5e 100644
--- a/ipc/src/macros.rs
+++ b/ipc/src/macros.rs
@@ -35,7 +35,7 @@ macro_rules! register_ecall_handler {
         // Declear a local trait, the [handle_ecall] attribute macro
         // will help implement this trait and call user defined function.
         trait HandleRequest<V> {
-            fn handle(&self) -> anyhow::Result<V>;
+            fn handle(&self) -> teaclave_types::TeeServiceResult<V>;
         }
 
         struct ServeInstance<U, V>
@@ -65,7 +65,8 @@ macro_rules! register_ecall_handler {
             U: HandleRequest<V> + for<'de> serde::Deserialize<'de>,
             V: serde::Serialize,
         {
-            fn handle_invoke(&self, input: U) -> anyhow::Result<V> {
+            fn handle_invoke(&self, input: U) -> 
teaclave_types::TeeServiceResult<V> {
+                log::debug!("handle_invoke");
                 input.handle()
             }
         }
@@ -113,21 +114,19 @@ macro_rules! register_ecall_handler {
 
             if inner_len > out_max {
                 debug!("tee before copy out_buf check: out_max={:x} < 
inner={:x}", out_max, inner_len);
-                return teaclave_types::EnclaveStatus(0x0000_000c); // TODO: 
Error::from(mesatee_core::ErrorKind::FFICallerOutBufferTooSmall).into();
+                return teaclave_types::EnclaveStatus(0x0000_000c);
             }
 
-            // you can use anything to fill out the output buf
-            // another example could be found at crypto sample
-            // 
https://github.com/baidu/rust-sgx-sdk/blob/master/samplecode/crypto/enclave/src/lib.rs#L151
-            // The following lines use a trick of "constructing a mutable 
slice in place" using slice::from_raw_parts_mut
-            // You can always use ptr::copy_nonoverlapping to copy a buffer to 
the output pointer (see the above crypto sample)
+            // The following lines use a trick of "constructing a mutable slice
+            // in place" using slice::from_raw_parts_mut You can always use
+            // ptr::copy_nonoverlapping to copy a buffer to the output pointer
+            // (see the above crypto sample)
             unsafe {
                 std::ptr::copy_nonoverlapping(inner_vec.as_ptr(), out_buf, 
inner_len);
             }
 
             // out_len would be used in `set_len` in the untrusted app
             // so out_len cannot be larger than out_max. Additional checks are 
**required**.
-            // TODO: Ok(()).into()
             teaclave_types::EnclaveStatus::default()
         }
     }
diff --git a/services/access_control/app/Cargo.toml 
b/services/access_control/app/Cargo.toml
index c3df477..79b88de 100644
--- a/services/access_control/app/Cargo.toml
+++ b/services/access_control/app/Cargo.toml
@@ -15,5 +15,6 @@ anyhow     = { version = "1.0.26" }
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/services/access_control/app/src/main.rs 
b/services/access_control/app/src/main.rs
index 5e16411..5bfbeb3 100644
--- a/services/access_control/app/src/main.rs
+++ b/services/access_control/app/src/main.rs
@@ -18,14 +18,14 @@
 #[macro_use]
 extern crate log;
 
-use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
-
 use anyhow::Result;
 use teaclave_binder::TeeBinder;
+use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -36,7 +36,11 @@ fn start_enclave_service(tee: &TeeBinder) -> Result<()> {
     let config = 
teaclave_config::RuntimeConfig::from_toml("runtime.config.toml")?;
     let input = StartServiceInput { config };
     let cmd = ECallCommand::StartService;
-    let _ = tee.invoke::<StartServiceInput, StartServiceOutput>(cmd.into(), 
input);
+    match tee.invoke::<StartServiceInput, 
TeeServiceResult<StartServiceOutput>>(cmd, input) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/services/access_control/enclave/src/lib.rs 
b/services/access_control/enclave/src/lib.rs
index 883a24b..8ac92f7 100644
--- a/services/access_control/enclave/src/lib.rs
+++ b/services/access_control/enclave/src/lib.rs
@@ -23,7 +23,6 @@ extern crate sgx_tstd as std;
 #[macro_use]
 extern crate log;
 
-use anyhow::Result;
 use std::prelude::v1::*;
 use teaclave_attestation::{AttestationConfig, RemoteAttestation};
 use teaclave_ipc::proto::{
@@ -37,13 +36,12 @@ use teaclave_proto::teaclave_access_control_service::{
 use teaclave_rpc::config::SgxTrustedTlsServerConfig;
 use teaclave_rpc::server::SgxTrustedTlsServer;
 use teaclave_service_enclave_utils::ServiceEnclave;
+use teaclave_types::{TeeServiceError, TeeServiceResult};
 
 mod acs;
 mod service;
 
-#[handle_ecall]
-fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput> {
-    debug!("handle_start_service");
+fn start_service(args: &StartServiceInput) -> anyhow::Result<()> {
     let listen_address = 
args.config.internal_endpoints.access_control.listen_address;
     let ias_config = args.config.ias.as_ref().unwrap();
     let attestation = 
RemoteAttestation::generate_and_endorse(&AttestationConfig::ias(
@@ -69,18 +67,25 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
             error!("Service exit, error: {}.", e);
         }
     }
+    Ok(())
+}
 
+#[handle_ecall]
+fn handle_start_service(args: &StartServiceInput) -> 
TeeServiceResult<StartServiceOutput> {
+    start_service(args).map_err(|_| TeeServiceError::ServiceError)?;
     Ok(StartServiceOutput::default())
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/services/authentication/app/Cargo.toml 
b/services/authentication/app/Cargo.toml
index 6146a88..dd4a2bd 100644
--- a/services/authentication/app/Cargo.toml
+++ b/services/authentication/app/Cargo.toml
@@ -15,5 +15,6 @@ anyhow     = { version = "1.0.26" }
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/services/authentication/app/src/main.rs 
b/services/authentication/app/src/main.rs
index 3f259ad..5bfbeb3 100644
--- a/services/authentication/app/src/main.rs
+++ b/services/authentication/app/src/main.rs
@@ -21,10 +21,11 @@ extern crate log;
 use anyhow::Result;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -35,7 +36,11 @@ fn start_enclave_service(tee: &TeeBinder) -> Result<()> {
     let config = 
teaclave_config::RuntimeConfig::from_toml("runtime.config.toml")?;
     let input = StartServiceInput { config };
     let cmd = ECallCommand::StartService;
-    let _ = tee.invoke::<StartServiceInput, StartServiceOutput>(cmd.into(), 
input);
+    match tee.invoke::<StartServiceInput, 
TeeServiceResult<StartServiceOutput>>(cmd, input) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/services/authentication/enclave/src/lib.rs 
b/services/authentication/enclave/src/lib.rs
index 66682b7..33366da 100644
--- a/services/authentication/enclave/src/lib.rs
+++ b/services/authentication/enclave/src/lib.rs
@@ -23,7 +23,6 @@ extern crate sgx_tstd as std;
 #[macro_use]
 extern crate log;
 
-use anyhow::Result;
 use rand::RngCore;
 use std::prelude::v1::*;
 use std::sync::Arc;
@@ -43,7 +42,7 @@ use teaclave_proto::teaclave_authentication_service::{
 use teaclave_rpc::config::SgxTrustedTlsServerConfig;
 use teaclave_rpc::server::SgxTrustedTlsServer;
 use teaclave_service_enclave_utils::ServiceEnclave;
-use teaclave_types::EnclaveInfo;
+use teaclave_types::{EnclaveInfo, TeeServiceError, TeeServiceResult};
 
 mod api_service;
 mod internal_service;
@@ -114,9 +113,7 @@ fn start_api_endpoint(
     }
 }
 
-#[handle_ecall]
-fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput> {
-    debug!("handle_start_service");
+fn start_service(args: &StartServiceInput) -> anyhow::Result<()> {
     let enclave_info = EnclaveInfo::verify_and_new(
         args.config
             .audit
@@ -148,13 +145,9 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
     let api_listen_address = 
args.config.api_endpoints.authentication.listen_address;
     let internal_listen_address = 
args.config.internal_endpoints.authentication.listen_address;
     let ias_config = args.config.ias.as_ref().unwrap();
-    let attestation = Arc::new(
-        RemoteAttestation::generate_and_endorse(&AttestationConfig::ias(
-            &ias_config.ias_key,
-            &ias_config.ias_spid,
-        ))
-        .unwrap(),
-    );
+    let attestation = Arc::new(RemoteAttestation::generate_and_endorse(
+        &AttestationConfig::ias(&ias_config.ias_key, &ias_config.ias_spid),
+    )?);
     let database = user_db::Database::open()?;
     let mut api_jwt_secret = vec![0; user_info::JWT_SECRET_LEN];
     let mut rng = rand::thread_rng();
@@ -181,17 +174,23 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
     api_endpoint_thread_handler.join().unwrap();
     internal_endpoint_thread_handler.join().unwrap();
 
+    Ok(())
+}
+
+#[handle_ecall]
+fn handle_start_service(args: &StartServiceInput) -> 
TeeServiceResult<StartServiceOutput> {
+    start_service(args).map_err(|_| TeeServiceError::ServiceError)?;
     Ok(StartServiceOutput::default())
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(_: &FinalizeEnclaveInput) -> 
TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/services/execution/app/Cargo.toml 
b/services/execution/app/Cargo.toml
index 00b36e0..a602063 100644
--- a/services/execution/app/Cargo.toml
+++ b/services/execution/app/Cargo.toml
@@ -18,5 +18,6 @@ anyhow      = { version = "1.0.26" }
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/services/execution/app/src/main.rs 
b/services/execution/app/src/main.rs
index 1f7395a..5bfbeb3 100644
--- a/services/execution/app/src/main.rs
+++ b/services/execution/app/src/main.rs
@@ -21,11 +21,13 @@ extern crate log;
 use anyhow::Result;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
+
     Ok(())
 }
 
@@ -34,12 +36,17 @@ fn start_enclave_service(tee: &TeeBinder) -> Result<()> {
     let config = 
teaclave_config::RuntimeConfig::from_toml("runtime.config.toml")?;
     let input = StartServiceInput { config };
     let cmd = ECallCommand::StartService;
-    let _ = tee.invoke::<StartServiceInput, StartServiceOutput>(cmd.into(), 
input);
+    match tee.invoke::<StartServiceInput, 
TeeServiceResult<StartServiceOutput>>(cmd, input) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
 
 fn run(tee: &TeeBinder) -> Result<()> {
     start_enclave_service(tee)?;
+
     Ok(())
 }
diff --git a/services/execution/enclave/src/lib.rs 
b/services/execution/enclave/src/lib.rs
index 086c733..76776af 100644
--- a/services/execution/enclave/src/lib.rs
+++ b/services/execution/enclave/src/lib.rs
@@ -27,8 +27,6 @@ extern crate log;
 
 mod service;
 
-use anyhow::Result;
-
 use teaclave_ipc::proto::{
     ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, 
InitEnclaveInput, InitEnclaveOutput,
     StartServiceInput, StartServiceOutput,
@@ -43,16 +41,9 @@ use teaclave_proto::teaclave_execution_service::{
 };
 use teaclave_rpc::config::SgxTrustedTlsServerConfig;
 use teaclave_rpc::server::SgxTrustedTlsServer;
+use teaclave_types::{TeeServiceError, TeeServiceResult};
 
-register_ecall_handler!(
-    type ECallCommand,
-    (ECallCommand::StartService, StartServiceInput, StartServiceOutput),
-    (ECallCommand::InitEnclave, InitEnclaveInput, InitEnclaveOutput),
-    (ECallCommand::FinalizeEnclave, FinalizeEnclaveInput, 
FinalizeEnclaveOutput),
-);
-
-#[handle_ecall]
-fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput> {
+fn start_service(args: &StartServiceInput) -> anyhow::Result<()> {
     let listen_address = 
args.config.internal_endpoints.execution.listen_address;
     let ias_config = args.config.ias.as_ref().unwrap();
     let attestation = 
RemoteAttestation::generate_and_endorse(&AttestationConfig::ias(
@@ -77,23 +68,37 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
             error!("Service exit, error: {}.", e);
         }
     }
+    Ok(())
+}
 
+#[handle_ecall]
+fn handle_start_service(args: &StartServiceInput) -> 
TeeServiceResult<StartServiceOutput> {
+    start_service(args).map_err(|_| TeeServiceError::ServiceError)?;
     Ok(StartServiceOutput::default())
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     info!("Worker started");
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
 
+register_ecall_handler!(
+    type ECallCommand,
+    (ECallCommand::StartService, StartServiceInput, StartServiceOutput),
+    (ECallCommand::InitEnclave, InitEnclaveInput, InitEnclaveOutput),
+    (ECallCommand::FinalizeEnclave, FinalizeEnclaveInput, 
FinalizeEnclaveOutput),
+);
+
 #[cfg(feature = "enclave_unit_test")]
 pub mod tests {
 
diff --git a/services/frontend/app/Cargo.toml b/services/frontend/app/Cargo.toml
index 0b5c66d..971b2a3 100644
--- a/services/frontend/app/Cargo.toml
+++ b/services/frontend/app/Cargo.toml
@@ -15,5 +15,6 @@ anyhow     = { version = "1.0.26" }
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/services/frontend/app/src/main.rs 
b/services/frontend/app/src/main.rs
index 3f259ad..5bfbeb3 100644
--- a/services/frontend/app/src/main.rs
+++ b/services/frontend/app/src/main.rs
@@ -21,10 +21,11 @@ extern crate log;
 use anyhow::Result;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -35,7 +36,11 @@ fn start_enclave_service(tee: &TeeBinder) -> Result<()> {
     let config = 
teaclave_config::RuntimeConfig::from_toml("runtime.config.toml")?;
     let input = StartServiceInput { config };
     let cmd = ECallCommand::StartService;
-    let _ = tee.invoke::<StartServiceInput, StartServiceOutput>(cmd.into(), 
input);
+    match tee.invoke::<StartServiceInput, 
TeeServiceResult<StartServiceOutput>>(cmd, input) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/services/frontend/enclave/src/lib.rs 
b/services/frontend/enclave/src/lib.rs
index 4c1cc07..da27852 100644
--- a/services/frontend/enclave/src/lib.rs
+++ b/services/frontend/enclave/src/lib.rs
@@ -23,7 +23,6 @@ extern crate sgx_tstd as std;
 #[macro_use]
 extern crate log;
 
-use anyhow::Result;
 use std::prelude::v1::*;
 use teaclave_attestation::verifier;
 use teaclave_attestation::{AttestationConfig, RemoteAttestation};
@@ -41,12 +40,11 @@ use teaclave_rpc::config::SgxTrustedTlsServerConfig;
 use teaclave_rpc::endpoint::Endpoint;
 use teaclave_rpc::server::SgxTrustedTlsServer;
 use teaclave_service_enclave_utils::ServiceEnclave;
+use teaclave_types::{TeeServiceError, TeeServiceResult};
 
 mod service;
 
-#[handle_ecall]
-fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput> {
-    debug!("handle_start_service");
+fn start_service(args: &StartServiceInput) -> anyhow::Result<()> {
     let listen_address = args.config.api_endpoints.frontend.listen_address;
     let ias_config = args.config.ias.as_ref().unwrap();
     let attestation = 
RemoteAttestation::generate_and_endorse(&AttestationConfig::ias(
@@ -93,18 +91,25 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
             error!("Service exit, error: {}.", e);
         }
     }
+    Ok(())
+}
 
+#[handle_ecall]
+fn handle_start_service(args: &StartServiceInput) -> 
TeeServiceResult<StartServiceOutput> {
+    start_service(args).map_err(|_| TeeServiceError::ServiceError)?;
     Ok(StartServiceOutput::default())
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/services/management/app/Cargo.toml 
b/services/management/app/Cargo.toml
index 4e4832f..af7c251 100644
--- a/services/management/app/Cargo.toml
+++ b/services/management/app/Cargo.toml
@@ -15,5 +15,6 @@ anyhow     = { version = "1.0.26" }
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/services/management/app/src/main.rs 
b/services/management/app/src/main.rs
index 3f259ad..5bfbeb3 100644
--- a/services/management/app/src/main.rs
+++ b/services/management/app/src/main.rs
@@ -21,10 +21,11 @@ extern crate log;
 use anyhow::Result;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -35,7 +36,11 @@ fn start_enclave_service(tee: &TeeBinder) -> Result<()> {
     let config = 
teaclave_config::RuntimeConfig::from_toml("runtime.config.toml")?;
     let input = StartServiceInput { config };
     let cmd = ECallCommand::StartService;
-    let _ = tee.invoke::<StartServiceInput, StartServiceOutput>(cmd.into(), 
input);
+    match tee.invoke::<StartServiceInput, 
TeeServiceResult<StartServiceOutput>>(cmd, input) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/services/management/enclave/src/lib.rs 
b/services/management/enclave/src/lib.rs
index 2e897c6..9af1d48 100644
--- a/services/management/enclave/src/lib.rs
+++ b/services/management/enclave/src/lib.rs
@@ -23,7 +23,6 @@ extern crate sgx_tstd as std;
 #[macro_use]
 extern crate log;
 
-use anyhow::Result;
 use std::prelude::v1::*;
 use teaclave_attestation::{AttestationConfig, RemoteAttestation};
 use teaclave_ipc::proto::{
@@ -37,12 +36,11 @@ use teaclave_proto::teaclave_management_service::{
 use teaclave_rpc::config::SgxTrustedTlsServerConfig;
 use teaclave_rpc::server::SgxTrustedTlsServer;
 use teaclave_service_enclave_utils::ServiceEnclave;
+use teaclave_types::{TeeServiceError, TeeServiceResult};
 
 mod service;
 
-#[handle_ecall]
-fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput> {
-    debug!("handle_start_service");
+fn start_service(args: &StartServiceInput) -> anyhow::Result<()> {
     let listen_address = 
args.config.internal_endpoints.management.listen_address;
     let ias_config = args.config.ias.as_ref().unwrap();
     let attestation = 
RemoteAttestation::generate_and_endorse(&AttestationConfig::ias(
@@ -68,18 +66,25 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
             error!("Service exit, error: {}.", e);
         }
     }
+    Ok(())
+}
 
+#[handle_ecall]
+fn handle_start_service(args: &StartServiceInput) -> 
TeeServiceResult<StartServiceOutput> {
+    start_service(args).map_err(|_| TeeServiceError::ServiceError)?;
     Ok(StartServiceOutput::default())
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/services/storage/app/Cargo.toml b/services/storage/app/Cargo.toml
index 8e529fd..d76647c 100644
--- a/services/storage/app/Cargo.toml
+++ b/services/storage/app/Cargo.toml
@@ -15,5 +15,6 @@ anyhow     = { version = "1.0.26" }
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/services/storage/app/src/main.rs b/services/storage/app/src/main.rs
index ac0130b..5bfbeb3 100644
--- a/services/storage/app/src/main.rs
+++ b/services/storage/app/src/main.rs
@@ -18,15 +18,14 @@
 #[macro_use]
 extern crate log;
 
-use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
-
 use anyhow::Result;
 use teaclave_binder::TeeBinder;
-use teaclave_config;
+use teaclave_ipc::proto::{ECallCommand, StartServiceInput, StartServiceOutput};
+use teaclave_types::TeeServiceResult;
 
-fn main() -> anyhow::Result<()> {
+fn main() -> Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -37,7 +36,11 @@ fn start_enclave_service(tee: &TeeBinder) -> Result<()> {
     let config = 
teaclave_config::RuntimeConfig::from_toml("runtime.config.toml")?;
     let input = StartServiceInput { config };
     let cmd = ECallCommand::StartService;
-    let _ = tee.invoke::<StartServiceInput, StartServiceOutput>(cmd.into(), 
input);
+    match tee.invoke::<StartServiceInput, 
TeeServiceResult<StartServiceOutput>>(cmd, input) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/services/storage/enclave/src/lib.rs 
b/services/storage/enclave/src/lib.rs
index d7fa949..f54b599 100644
--- a/services/storage/enclave/src/lib.rs
+++ b/services/storage/enclave/src/lib.rs
@@ -24,16 +24,13 @@ extern crate log;
 
 use std::prelude::v1::*;
 
-use anyhow::Result;
-
 use teaclave_ipc::proto::{
     ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, 
InitEnclaveInput, InitEnclaveOutput,
     StartServiceInput, StartServiceOutput,
 };
-
 use teaclave_ipc::{handle_ecall, register_ecall_handler};
-
 use teaclave_service_enclave_utils::ServiceEnclave;
+use teaclave_types::{TeeServiceError, TeeServiceResult};
 
 use rusty_leveldb::DB;
 use teaclave_attestation::{AttestationConfig, RemoteAttestation};
@@ -48,9 +45,7 @@ use std::cell::RefCell;
 use std::sync::mpsc::channel;
 use std::thread;
 
-#[handle_ecall]
-fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput> {
-    debug!("handle_start_service");
+fn start_service(args: &StartServiceInput) -> anyhow::Result<()> {
     let listen_address = args.config.internal_endpoints.storage.listen_address;
     let ias_config = args.config.ias.as_ref().unwrap();
     let attestation = 
RemoteAttestation::generate_and_endorse(&AttestationConfig::ias(
@@ -86,18 +81,25 @@ fn handle_start_service(args: &StartServiceInput) -> 
Result<StartServiceOutput>
             error!("Service exit, error: {}.", e);
         }
     }
+    Ok(())
+}
 
+#[handle_ecall]
+fn handle_start_service(args: &StartServiceInput) -> 
TeeServiceResult<StartServiceOutput> {
+    start_service(args).map_err(|_| TeeServiceError::ServiceError)?;
     Ok(StartServiceOutput::default())
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/tests/functional_tests/app/Cargo.toml 
b/tests/functional_tests/app/Cargo.toml
index 76ffb97..03104b5 100644
--- a/tests/functional_tests/app/Cargo.toml
+++ b/tests/functional_tests/app/Cargo.toml
@@ -14,5 +14,6 @@ anyhow     = { version = "1.0.26" }
 
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/tests/functional_tests/app/src/main.rs 
b/tests/functional_tests/app/src/main.rs
index 4937d08..dd9ab4d 100644
--- a/tests/functional_tests/app/src/main.rs
+++ b/tests/functional_tests/app/src/main.rs
@@ -16,12 +16,14 @@
 // under the License.
 
 use anyhow;
+use log::error;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, RunTestInput, RunTestOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> anyhow::Result<()> {
     env_logger::init();
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -29,7 +31,11 @@ fn main() -> anyhow::Result<()> {
 
 fn start_enclave_unit_test_driver(tee: &TeeBinder) -> anyhow::Result<()> {
     let cmd = ECallCommand::RunTest;
-    let _ = tee.invoke::<RunTestInput, RunTestOutput>(cmd.into(), 
RunTestInput);
+    match tee.invoke::<RunTestInput, TeeServiceResult<RunTestOutput>>(cmd, 
RunTestInput) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/tests/functional_tests/enclave/src/lib.rs 
b/tests/functional_tests/enclave/src/lib.rs
index b4b3106..c92d939 100644
--- a/tests/functional_tests/enclave/src/lib.rs
+++ b/tests/functional_tests/enclave/src/lib.rs
@@ -25,7 +25,6 @@ extern crate log;
 
 use std::prelude::v1::*;
 
-use anyhow::Result;
 use teaclave_types;
 
 use teaclave_ipc::proto::{
@@ -35,6 +34,7 @@ use teaclave_ipc::proto::{
 use teaclave_ipc::{handle_ecall, register_ecall_handler};
 use teaclave_service_enclave_utils::ServiceEnclave;
 use teaclave_test_utils::check_all_passed;
+use teaclave_types::TeeServiceResult;
 
 mod teaclave_access_control_service;
 mod teaclave_authentication_service;
@@ -43,7 +43,7 @@ mod teaclave_frontend_service;
 mod teaclave_storage_service;
 
 #[handle_ecall]
-fn handle_run_test(_args: &RunTestInput) -> Result<RunTestOutput> {
+fn handle_run_test(_args: &RunTestInput) -> TeeServiceResult<RunTestOutput> {
     let ret = check_all_passed!(
         teaclave_access_control_service::run_tests(),
         teaclave_authentication_service::run_tests(),
@@ -57,13 +57,15 @@ fn handle_run_test(_args: &RunTestInput) -> 
Result<RunTestOutput> {
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/tests/integration_tests/app/Cargo.toml 
b/tests/integration_tests/app/Cargo.toml
index 9485345..10accdf 100644
--- a/tests/integration_tests/app/Cargo.toml
+++ b/tests/integration_tests/app/Cargo.toml
@@ -16,5 +16,6 @@ teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
 teaclave_config            = { path = "../../../config" }
 teaclave_test_utils        = { path = "../../test_utils" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/tests/integration_tests/app/src/main.rs 
b/tests/integration_tests/app/src/main.rs
index ed3e53a..dd9ab4d 100644
--- a/tests/integration_tests/app/src/main.rs
+++ b/tests/integration_tests/app/src/main.rs
@@ -16,29 +16,32 @@
 // under the License.
 
 use anyhow;
+use log::error;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, RunTestInput, RunTestOutput};
-
-mod teaclave_config_tests;
+use teaclave_types::TeeServiceResult;
 
 fn main() -> anyhow::Result<()> {
     env_logger::init();
-
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
-    run_app_integration_tests();
-    start_enclave_integration_tests(&tee)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
+    run(&tee)?;
 
     Ok(())
 }
 
-fn start_enclave_integration_tests(tee: &TeeBinder) -> anyhow::Result<()> {
+fn start_enclave_unit_test_driver(tee: &TeeBinder) -> anyhow::Result<()> {
     let cmd = ECallCommand::RunTest;
-    tee.invoke::<RunTestInput, RunTestOutput>(cmd.into(), RunTestInput)?;
+    match tee.invoke::<RunTestInput, TeeServiceResult<RunTestOutput>>(cmd, 
RunTestInput) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
 
-fn run_app_integration_tests() {
-    let ret = teaclave_config_tests::run_tests();
-    assert_eq!(ret, true);
+fn run(tee: &TeeBinder) -> anyhow::Result<()> {
+    start_enclave_unit_test_driver(tee)?;
+
+    Ok(())
 }
diff --git a/tests/integration_tests/enclave/src/lib.rs 
b/tests/integration_tests/enclave/src/lib.rs
index d4a49e2..1a82bb5 100644
--- a/tests/integration_tests/enclave/src/lib.rs
+++ b/tests/integration_tests/enclave/src/lib.rs
@@ -25,8 +25,8 @@ extern crate log;
 
 use std::prelude::v1::*;
 
-use anyhow::Result;
 use teaclave_types;
+use teaclave_types::TeeServiceResult;
 
 use teaclave_ipc::proto::{
     ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, 
InitEnclaveInput, InitEnclaveOutput,
@@ -42,7 +42,7 @@ mod teaclave_rpc;
 mod teaclave_worker;
 
 #[handle_ecall]
-fn handle_run_test(_args: &RunTestInput) -> Result<RunTestOutput> {
+fn handle_run_test(_args: &RunTestInput) -> TeeServiceResult<RunTestOutput> {
     let ret = check_all_passed!(
         rusty_leveldb_sgx::run_tests(),
         protected_fs_rs::run_tests(),
@@ -55,13 +55,15 @@ fn handle_run_test(_args: &RunTestInput) -> 
Result<RunTestOutput> {
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/tests/scripts/functional_tests.py 
b/tests/scripts/functional_tests.py
index 4b6873c..9de5dfc 100755
--- a/tests/scripts/functional_tests.py
+++ b/tests/scripts/functional_tests.py
@@ -12,6 +12,7 @@ context = ssl._create_unverified_context()
 
 
 def write_message(sock, message):
+    message = json.dumps(message)
     message = message.encode()
     sock.write(struct.pack(">Q", len(message)))
     sock.write(message)
@@ -25,41 +26,42 @@ def read_message(sock):
 
 class TestAuthenticationService(unittest.TestCase):
 
+    def setUp(self):
+        sock = socket.create_connection(authentication_service_address)
+        self.socket = context.wrap_socket(sock, server_hostname=hostname)
+
+    def tearDown(self):
+        self.socket.close()
+
     def test_invalid_request(self):
         user_id = "invalid_id"
         user_password = "invalid_password"
 
-        with socket.create_connection(authentication_service_address) as sock:
-            with context.wrap_socket(sock, server_hostname=hostname) as ssock:
-                message = {
-                    "invalid_request": "user_login",
-                    "id": user_id,
-                    "password": user_password
-                }
-                message = json.dumps(message)
-                write_message(ssock, message)
+        message = {
+            "invalid_request": "user_login",
+            "id": user_id,
+            "password": user_password
+        }
+        write_message(self.socket, message)
 
-                response = read_message(ssock)
-                self.assertEqual(
-                    response, b'{"result":"err","request_error":"invalid 
request"}')
+        response = read_message(self.socket)
+        self.assertEqual(
+            response, b'{"result":"err","request_error":"invalid request"}')
 
     def test_login_permission_denied(self):
         user_id = "invalid_id"
         user_password = "invalid_password"
 
-        with socket.create_connection(authentication_service_address) as sock:
-            with context.wrap_socket(sock, server_hostname=hostname) as ssock:
-                message = {
-                    "request": "user_login",
-                    "id": user_id,
-                    "password": user_password
-                }
-                message = json.dumps(message)
-                write_message(ssock, message)
-
-                response = read_message(ssock)
-                self.assertEqual(
-                    response, b'{"result":"err","request_error":"permission 
denied"}')
+        message = {
+            "request": "user_login",
+            "id": user_id,
+            "password": user_password
+        }
+        write_message(self.socket, message)
+
+        response = read_message(self.socket)
+        self.assertEqual(
+            response, b'{"result":"err","request_error":"permission denied"}')
 
 
 if __name__ == '__main__':
diff --git a/tests/unit_tests/app/Cargo.toml b/tests/unit_tests/app/Cargo.toml
index cc9e0b7..cea003a 100644
--- a/tests/unit_tests/app/Cargo.toml
+++ b/tests/unit_tests/app/Cargo.toml
@@ -14,5 +14,6 @@ anyhow     = { version = "1.0.26" }
 
 teaclave_ipc               = { path = "../../../ipc" }
 teaclave_binder            = { path = "../../../binder" }
+teaclave_types             = { path = "../../../types" }
 
 sgx_types = { version = "1.1.0" }
diff --git a/tests/unit_tests/app/src/main.rs b/tests/unit_tests/app/src/main.rs
index cb07272..dd9ab4d 100644
--- a/tests/unit_tests/app/src/main.rs
+++ b/tests/unit_tests/app/src/main.rs
@@ -16,13 +16,14 @@
 // under the License.
 
 use anyhow;
+use log::error;
 use teaclave_binder::TeeBinder;
 use teaclave_ipc::proto::{ECallCommand, RunTestInput, RunTestOutput};
+use teaclave_types::TeeServiceResult;
 
 fn main() -> anyhow::Result<()> {
     env_logger::init();
-
-    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"), 1)?;
+    let tee = TeeBinder::new(env!("CARGO_PKG_NAME"))?;
     run(&tee)?;
 
     Ok(())
@@ -30,7 +31,11 @@ fn main() -> anyhow::Result<()> {
 
 fn start_enclave_unit_test_driver(tee: &TeeBinder) -> anyhow::Result<()> {
     let cmd = ECallCommand::RunTest;
-    let _ = tee.invoke::<RunTestInput, RunTestOutput>(cmd.into(), 
RunTestInput);
+    match tee.invoke::<RunTestInput, TeeServiceResult<RunTestOutput>>(cmd, 
RunTestInput) {
+        Err(e) => error!("{:?}", e),
+        Ok(Err(e)) => error!("{:?}", e),
+        _ => (),
+    }
 
     Ok(())
 }
diff --git a/tests/unit_tests/enclave/src/lib.rs 
b/tests/unit_tests/enclave/src/lib.rs
index 74c5fae..942647d 100644
--- a/tests/unit_tests/enclave/src/lib.rs
+++ b/tests/unit_tests/enclave/src/lib.rs
@@ -24,8 +24,8 @@ extern crate log;
 
 use std::prelude::v1::*;
 
-use anyhow::Result;
 use teaclave_types;
+use teaclave_types::TeeServiceResult;
 
 use teaclave_ipc::proto::{
     ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, 
InitEnclaveInput, InitEnclaveOutput,
@@ -41,7 +41,7 @@ use teaclave_test_utils::check_all_passed;
 use teaclave_worker;
 
 #[handle_ecall]
-fn handle_run_test(_args: &RunTestInput) -> Result<RunTestOutput> {
+fn handle_run_test(_args: &RunTestInput) -> TeeServiceResult<RunTestOutput> {
     let ret = check_all_passed!(
         teaclave_storage_service_enclave::tests::run_tests(),
         teaclave_access_control_service_enclave::tests::run_tests(),
@@ -57,13 +57,15 @@ fn handle_run_test(_args: &RunTestInput) -> 
Result<RunTestOutput> {
 }
 
 #[handle_ecall]
-fn handle_init_enclave(_args: &InitEnclaveInput) -> Result<InitEnclaveOutput> {
+fn handle_init_enclave(_args: &InitEnclaveInput) -> 
TeeServiceResult<InitEnclaveOutput> {
     ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
     Ok(InitEnclaveOutput::default())
 }
 
 #[handle_ecall]
-fn handle_finalize_enclave(_args: &FinalizeEnclaveInput) -> 
Result<FinalizeEnclaveOutput> {
+fn handle_finalize_enclave(
+    _args: &FinalizeEnclaveInput,
+) -> TeeServiceResult<FinalizeEnclaveOutput> {
     ServiceEnclave::finalize()?;
     Ok(FinalizeEnclaveOutput::default())
 }
diff --git a/types/src/lib.rs b/types/src/lib.rs
index c3f2a92..030ef41 100644
--- a/types/src/lib.rs
+++ b/types/src/lib.rs
@@ -22,7 +22,7 @@ pub use worker::*;
 
 /// Status for Ecall
 #[repr(C)]
-#[derive(Debug)]
+#[derive(Debug, Serialize, Deserialize)]
 pub struct EnclaveStatus(pub u32);
 
 /// Status for Ocall
@@ -45,6 +45,18 @@ impl EnclaveStatus {
     }
 }
 
+#[derive(thiserror::Error, Debug, Serialize, Deserialize)]
+pub enum TeeServiceError {
+    #[error("SgxError")]
+    SgxError,
+    #[error("ServiceError")]
+    ServiceError,
+    #[error("CommandNotRegistered")]
+    CommandNotRegistered,
+}
+
+pub type TeeServiceResult<T> = std::result::Result<T, TeeServiceError>;
+
 pub type SgxMeasurement = [u8; sgx_types::SGX_HASH_SIZE];
 
 #[derive(Debug, Deserialize, Copy, Clone, Eq, PartialEq)]
diff --git a/utils/service_enclave_utils/Cargo.toml 
b/utils/service_enclave_utils/Cargo.toml
index 233ac22..d4b6bd4 100644
--- a/utils/service_enclave_utils/Cargo.toml
+++ b/utils/service_enclave_utils/Cargo.toml
@@ -19,6 +19,7 @@ env_logger = { version = "0.7.1" }
 log        = { version = "0.4.6" }
 
 teaclave_service_enclave_utils_proc_macro = { path = "./proc_macro" }
+teaclave_types       = { path = "../../types" }
 
 sgx_cov  = { version = "1.1.0", optional = true }
 sgx_trts = { version = "1.1.0", optional = true }
diff --git a/utils/service_enclave_utils/src/lib.rs 
b/utils/service_enclave_utils/src/lib.rs
index 818ff6c..a8db3db 100644
--- a/utils/service_enclave_utils/src/lib.rs
+++ b/utils/service_enclave_utils/src/lib.rs
@@ -3,8 +3,6 @@
 #[macro_use]
 extern crate sgx_tstd as std;
 
-use anyhow::{bail, Result};
-
 use log::debug;
 use log::error;
 use std::backtrace;
@@ -21,7 +19,7 @@ global_dtors_object! {
 pub struct ServiceEnclave;
 
 impl ServiceEnclave {
-    pub fn init(name: &str) -> Result<()> {
+    pub fn init(name: &str) -> teaclave_types::TeeServiceResult<()> {
         env_logger::init();
 
         debug!("Enclave initializing");
@@ -30,13 +28,13 @@ impl ServiceEnclave {
             .is_err()
         {
             error!("Cannot enable backtrace");
-            bail!("ecall error");
+            return Err(teaclave_types::TeeServiceError::SgxError);
         }
 
         Ok(())
     }
 
-    pub fn finalize() -> Result<()> {
+    pub fn finalize() -> teaclave_types::TeeServiceResult<()> {
         debug!("Enclave finalizing");
 
         Ok(())


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to