You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by hs...@apache.org on 2023/04/10 07:26:26 UTC

[incubator-teaclave] 01/03: Add the execution service running in the LibOS

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

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

commit c66a8e2ef67998f268961fc98f3634965a318376
Author: GeminiCarrie <sp...@163.com>
AuthorDate: Thu Apr 6 10:41:33 2023 +0000

    Add the execution service running in the LibOS
---
 CMakeLists.txt                                     |  20 +
 attestation/Cargo.toml                             |  20 +-
 attestation/src/attestation.rs                     |   1 +
 attestation/src/cert.rs                            |   2 +-
 attestation/src/key.rs                             |   1 +
 attestation/src/lib.rs                             |   2 +-
 .../src/platform/libos/mod.rs                      |  19 +-
 attestation/src/platform/libos/occlum.rs           | 150 ++++
 rpc/src/lib.rs => attestation/src/platform/mod.rs  |  40 +-
 attestation/src/{platform.rs => platform/sgx.rs}   |   6 +-
 attestation/src/service.rs                         |  27 +-
 cmake/TeaclaveUtils.cmake                          |   5 +-
 cmake/tomls/Cargo.sgx_trusted_lib.lock             | 826 ++++++++++++++++++-
 cmake/tomls/Cargo.sgx_untrusted_app.lock           | 893 +++++++++++++++++++--
 cmake/tomls/Cargo.sgx_untrusted_app.toml           |   7 +
 cmake/tomls/Cargo.unix_app.lock                    |   2 +
 executor/Cargo.toml                                |   7 +
 executor/context/Cargo.toml                        |   5 +
 executor/context/src/context.rs                    |   1 -
 executor/src/lib.rs                                |   6 +-
 file_agent/src/agent.rs                            |   3 +-
 file_agent/src/lib.rs                              |   2 +-
 function/Cargo.toml                                |   6 +
 logger/Cargo.toml                                  |   2 +-
 rpc/Cargo.toml                                     |   6 +
 rpc/src/lib.rs                                     |   2 +-
 rpc/src/server.rs                                  |   4 +
 runtime/Cargo.toml                                 |   3 +
 runtime/src/raw_io.rs                              |   4 +-
 services/authentication/enclave/src/user_db.rs     |   3 +-
 services/execution/app/Cargo.toml                  |  16 +-
 services/execution/app/build.rs                    |  26 +-
 services/execution/app/src/main.rs                 |  32 +-
 services/execution/enclave/Cargo.toml              |  15 +-
 services/execution/enclave/src/ecall.rs            |  55 ++
 .../enclave/src/{ocall.rs => file_handler.rs}      |  16 +-
 services/execution/enclave/src/lib.rs              |  55 +-
 .../execution/enclave/src/task_file_manager.rs     |  13 +-
 services/proto/Cargo.toml                          |   5 +
 services/storage/enclave/src/lib.rs                |   3 +-
 services/utils/service_enclave_utils/Cargo.toml    |   5 +
 services/utils/service_enclave_utils/src/lib.rs    |  17 +-
 worker/Cargo.toml                                  |   5 +
 worker/src/worker.rs                               |   3 +-
 44 files changed, 2104 insertions(+), 237 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 818de3e7..59b01f52 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -347,3 +347,23 @@ add_cargo_build_dylib_staticlib_target(teaclave_client_sdk
 # ${TEACLAVE_EXAMPLE_INSTALL_DIR}/quickstart_c )
 
 add_enclave_sig_target_n_hooks()
+
+set(LIBOS_EXTRA_CARGO_FLAGS --features "libos")
+set(LIBOS_DEPENDS prep)
+if(EXECUTOR_WAMR)
+    list(APPEND LIBOS_DEPENDS wamr)
+endif()
+add_cargo_build_target(
+    teaclave_execution_service
+    TARGET_NAME
+    "teaclave_execution_service_libos"
+    TOML_DIR
+    ${MT_SGXAPP_TOML_DIR}
+    TARGET_DIR
+    ${UNTRUSTED_TARGET_DIR}
+    INSTALL_DIR
+    ${TEACLAVE_BIN_INSTALL_DIR}/teaclave_execution_service_libos
+    EXTRA_CARGO_FLAGS
+    ${LIBOS_EXTRA_CARGO_FLAGS}
+    DEPENDS
+    ${LIBOS_DEPENDS})
\ No newline at end of file
diff --git a/attestation/Cargo.toml b/attestation/Cargo.toml
index 955064e1..df7d3728 100644
--- a/attestation/Cargo.toml
+++ b/attestation/Cargo.toml
@@ -25,14 +25,25 @@ edition = "2021"
 
 [features]
 default = []
+app = [
+    "teaclave_types/app",
+    "sgx_crypto/ucrypto",
+    "teaclave_config/build_config"
+]
 mesalock_sgx = [
-    "sgx_crypto",
+    "sgx_crypto/tcrypto",
     "sgx_rand/trand",
     "sgx_tse",
     "teaclave_types/mesalock_sgx",
     "teaclave_config/mesalock_sgx",
     "teaclave_config/build_config",
 ]
+libos = [
+    "app",
+    "libc",
+    "sgx_rand/urand",
+]
+
 enclave_unit_test = ["teaclave_test_utils/mesalock_sgx"]
 
 [dependencies]
@@ -43,6 +54,7 @@ cfg-if           = { version = "0.1.9" }
 chrono           = { version = "0.4.6", default-features = false }
 hex              = { version = "0.4.0" }
 httparse         = { version = "1.3.2", default-features = false }
+libc             = { version = "0.2.66", optional = true }
 log              = { version = "0.4.17", features = ["release_max_level_info"] }
 num-bigint       = { version = "0.2.2" }
 percent-encoding = { version = "2.1.0" }
@@ -60,9 +72,9 @@ teaclave_types  = { path = "../types" }
 teaclave_config = { path = "../config" }
 teaclave_test_utils = { path = "../tests/utils", optional = true }
 
-sgx_rand    = { version = "2.0.0", optional = true }
-sgx_crypto  = { version = "2.0.0", optional = true }
-sgx_tse     = { version = "2.0.0", optional = true }
+sgx_crypto  = { version = "2.0.0", optional = true, default-features = false}
+sgx_tse     = { version = "2.0.0", features = ["capi"], optional = true }
+sgx_rand    = { version = "2.0.0", default-features = false, optional = true }
 
 [target.'cfg(not(target_vendor = "teaclave"))'.dependencies]
 sgx_types   = { version = "2.0.0" }
diff --git a/attestation/src/attestation.rs b/attestation/src/attestation.rs
index 14aa3020..0f8cace5 100644
--- a/attestation/src/attestation.rs
+++ b/attestation/src/attestation.rs
@@ -26,6 +26,7 @@ use std::sync::{Arc, RwLock};
 use std::thread;
 use std::time::{Duration, SystemTime};
 #[allow(unused_imports)]
+#[cfg(feature = "mesalock_sgx")]
 use std::untrusted::time::SystemTimeEx;
 
 use anyhow::{anyhow, Result};
diff --git a/attestation/src/cert.rs b/attestation/src/cert.rs
index 084ea444..6e547afb 100644
--- a/attestation/src/cert.rs
+++ b/attestation/src/cert.rs
@@ -350,7 +350,7 @@ macro_rules! asn1_set_ty {
     };
 }
 
-#[cfg(feature = "mesalock_sgx")]
+#[cfg(any(feature = "mesalock_sgx", feature = "libos"))]
 macro_rules! asn1_seq {
     () => { () };
     ($e: expr) => {
diff --git a/attestation/src/key.rs b/attestation/src/key.rs
index 03e3ba1f..8388936c 100644
--- a/attestation/src/key.rs
+++ b/attestation/src/key.rs
@@ -96,6 +96,7 @@ impl NistP256KeyPair {
         use std::time::SystemTime;
         use std::time::UNIX_EPOCH;
         #[allow(unused_imports)]
+        #[cfg(feature = "mesalock_sgx")]
         use std::untrusted::time::SystemTimeEx;
         use yasna::construct_der;
         use yasna::models::{ObjectIdentifier, UTCTime};
diff --git a/attestation/src/lib.rs b/attestation/src/lib.rs
index 1c2a537f..497c0434 100644
--- a/attestation/src/lib.rs
+++ b/attestation/src/lib.rs
@@ -160,7 +160,7 @@ pub mod report;
 pub mod verifier;
 
 cfg_if::cfg_if! {
-    if #[cfg(feature = "mesalock_sgx")]  {
+    if #[cfg(any(feature = "mesalock_sgx", feature = "libos"))]  {
         mod service;
         pub mod key;
         mod platform;
diff --git a/services/execution/app/src/main.rs b/attestation/src/platform/libos/mod.rs
similarity index 70%
copy from services/execution/app/src/main.rs
copy to attestation/src/platform/libos/mod.rs
index 4482860f..31922826 100644
--- a/services/execution/app/src/main.rs
+++ b/attestation/src/platform/libos/mod.rs
@@ -15,14 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use anyhow::Result;
-use teaclave_service_app_utils::launch_teaclave_service;
+pub(crate) mod occlum;
+// TODO gramine or other LibOS
 
-// Use to import ocall
-pub use teaclave_file_agent::ocall_handle_file_request;
-
-const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME");
-
-fn main() -> Result<()> {
-    launch_teaclave_service(PACKAGE_NAME)
+#[derive(thiserror::Error, Debug)]
+pub enum PlatformError {
+    #[error("Failed to call {0}: {1}")]
+    Ioctl(String, i32),
+    #[error("Failed to get quote: {0}")]
+    GetQuote(String),
+    #[error("Failed to use SGX rng to generate random number: {0}")]
+    RngError(std::io::Error),
 }
diff --git a/attestation/src/platform/libos/occlum.rs b/attestation/src/platform/libos/occlum.rs
new file mode 100644
index 00000000..4f6fae74
--- /dev/null
+++ b/attestation/src/platform/libos/occlum.rs
@@ -0,0 +1,150 @@
+// 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.
+
+// Depend on occlum(https://github.com/occlum/occlum.git)
+
+use super::super::{PlatformError, Result};
+use libc::*;
+use log::debug;
+use sgx_crypto::ecc::EcPublicKey;
+use sgx_rand::{RdRand, Rng};
+use sgx_types::types::*;
+use std::ffi::CString;
+
+// From occlum/src/libos/src/fs/dev_fs/dev_sgx/consts.rs.
+const SGX_CMD_NUM_GEN_EPID_QUOTE: u64 = (2u32
+    | ('s' as u32) << 8
+    | (std::mem::size_of::<IoctlGenEPIDQuoteArg>() as u32) << 16
+    | 3u32 << 30) as u64;
+// for dcap
+const IOCTL_MAX_RETRIES: u32 = 20;
+const SGXIOC_GET_DCAP_QUOTE_SIZE: u64 = 0x80047307;
+const SGXIOC_GEN_DCAP_QUOTE: u64 = 0xc0187308;
+
+// From occlum/src/libos/src/fs/dev_fs/dev_sgx/mod.rs
+#[repr(C)]
+pub struct IoctlGenDCAPQuoteArg {
+    pub report_data: *const ReportData, // Input
+    pub quote_size: *mut u32,           // Input/output
+    pub quote_buf: *mut u8,             // Output
+}
+
+// From occlum/src/libos/src/fs/dev_fs/dev_sgx/mod.rs
+#[repr(C)]
+struct IoctlGenEPIDQuoteArg {
+    report_data: ReportData,   // Input
+    quote_type: QuoteSignType, // Input
+    spid: Spid,                // Input
+    nonce: QuoteNonce,         // Input
+    sigrl_ptr: *const u8,      // Input (optional)
+    sigrl_len: u32,            // Input (optional)
+    quote_buf_len: u32,        // Input
+    quote_buf: *mut u8,        // Output
+}
+
+fn get_dev_fd() -> libc::c_int {
+    let path = CString::new("/dev/sgx").unwrap();
+    let fd = unsafe { libc::open(path.as_ptr(), O_RDONLY) };
+    if fd > 0 {
+        fd
+    } else {
+        panic!("Open /dev/sgx failed")
+    }
+}
+
+/// Create report data.
+pub(crate) fn create_sgx_report_data(pub_k: EcPublicKey) -> ReportData {
+    debug!("create_sgx_report_data");
+    let mut report_data: ReportData = ReportData::default();
+    let mut pub_k_gx = pub_k.public_key().gx;
+    pub_k_gx.reverse();
+    let mut pub_k_gy = pub_k.public_key().gy;
+    pub_k_gy.reverse();
+    report_data.d[..32].clone_from_slice(&pub_k_gx);
+    report_data.d[32..].clone_from_slice(&pub_k_gy);
+    report_data
+}
+
+macro_rules! do_ioctl {
+    ($cmd:expr,$arg:expr) => {
+        let mut retries = 0;
+        let mut ret = -1;
+        let fd = get_dev_fd();
+        log::debug!("begin do_ioctl {}", stringify!($cmd));
+        while retries < IOCTL_MAX_RETRIES {
+            ret = unsafe { libc::ioctl(fd, $cmd, $arg) };
+            if ret == 0 {
+                break;
+                // EBUSY 16
+            }
+            std::thread::sleep(std::time::Duration::from_secs(2));
+            retries += 1;
+        }
+        if retries == IOCTL_MAX_RETRIES {
+            return Err(PlatformError::Ioctl(stringify!($cmd).to_string(), ret));
+        }
+    };
+}
+
+/// Get quote with attestation key ID and enclave's local report.
+pub(crate) fn get_sgx_epid_quote(spid: &Spid, report_data: ReportData) -> Result<Vec<u8>> {
+    let sigrl_ptr: *const u8 = std::ptr::null();
+    let quote_len: u32 = 4096;
+    let mut quote = vec![0u8; quote_len as usize];
+    let mut qe_report_info = QeReportInfo::default();
+    let mut quote_nonce = QuoteNonce::default();
+
+    let mut rng = RdRand::new().map_err(PlatformError::RngError)?;
+    rng.fill_bytes(&mut quote_nonce.rand);
+    qe_report_info.nonce = quote_nonce;
+
+    debug!("SGX_CMD_NUM_GEN_EPID_QUOTE");
+    let mut quote_arg = IoctlGenEPIDQuoteArg {
+        report_data,                         // Input
+        quote_type: QuoteSignType::Linkable, // Input
+        spid: spid.to_owned(),               // Input
+        nonce: quote_nonce,                  // Input
+        sigrl_ptr,                           // Input (optional)
+        sigrl_len: 0,                        // Input (optional)
+        quote_buf_len: quote_len,            // Input
+        quote_buf: quote.as_mut_ptr(),       // Output
+    };
+
+    // gen quote and check qe_quote and quote nonce
+    do_ioctl!(SGX_CMD_NUM_GEN_EPID_QUOTE, &mut quote_arg);
+    let sgx_quote = unsafe { &*(quote.as_ptr() as *const Quote) };
+    let quote_size = std::mem::size_of::<Quote>() + sgx_quote.signature_len as usize;
+    if quote_size > quote.len() {
+        return Err(PlatformError::GetQuote("wrong quote size".to_string()));
+    }
+    let quote_buf = quote[..quote_size].to_vec();
+    Ok(quote_buf)
+}
+
+/// Get dcap quote
+pub(crate) fn get_sgx_dcap_quote(_spid: &Spid, report_data: ReportData) -> Result<Vec<u8>> {
+    let mut quote_len: u32 = 0;
+    do_ioctl!(SGXIOC_GET_DCAP_QUOTE_SIZE, &mut quote_len);
+    let mut quote_buf = vec![0; quote_len as usize];
+    let mut quote_arg: IoctlGenDCAPQuoteArg = IoctlGenDCAPQuoteArg {
+        report_data: &report_data as _,
+        quote_size: &mut quote_len,
+        quote_buf: quote_buf.as_mut_ptr(),
+    };
+    do_ioctl!(SGXIOC_GEN_DCAP_QUOTE, &mut quote_arg);
+    Ok(quote_buf)
+}
diff --git a/rpc/src/lib.rs b/attestation/src/platform/mod.rs
similarity index 55%
copy from rpc/src/lib.rs
copy to attestation/src/platform/mod.rs
index e396c16c..503f9934 100644
--- a/rpc/src/lib.rs
+++ b/attestation/src/platform/mod.rs
@@ -15,30 +15,24 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#[cfg(feature = "libos")]
+pub(crate) mod libos;
+pub(crate) mod sgx;
+#[cfg(all(feature = "libos", feature = "mesalock_sgx"))]
+compile_error!("feature \"mesalock_sgx\" and feature \"libos\" cannot be enabled at the same time");
+
+#[cfg(feature = "libos")]
+pub(crate) use libos::{
+    occlum::{create_sgx_report_data, get_sgx_dcap_quote, get_sgx_epid_quote},
+    PlatformError,
+};
 #[cfg(feature = "mesalock_sgx")]
-extern crate sgx_trts;
+pub(crate) use sgx::{create_sgx_isv_enclave_report, get_sgx_quote, init_sgx_quote, PlatformError};
 
-use serde::{Deserialize, Serialize};
-use teaclave_types::TeaclaveServiceResponseError;
+type Result<T> = std::result::Result<T, PlatformError>;
 
-pub trait TeaclaveService<V, U>
-where
-    U: Serialize + std::fmt::Debug,
-    V: for<'de> Deserialize<'de> + std::fmt::Debug,
-{
-    fn handle_request(
-        &self,
-        request: Request<V>,
-    ) -> std::result::Result<U, TeaclaveServiceResponseError>;
+#[cfg(all(feature = "enclave_unit_test", feature = "mesalock_sgx"))]
+pub mod tests {
+    use super::*;
+    pub use sgx::tests::*;
 }
-
-pub mod channel;
-pub mod config;
-pub mod endpoint;
-mod protocol;
-mod request;
-pub use request::{IntoRequest, Request};
-pub use teaclave_rpc_proc_macro::into_request;
-#[cfg(feature = "mesalock_sgx")]
-pub mod server;
-mod transport;
diff --git a/attestation/src/platform.rs b/attestation/src/platform/sgx.rs
similarity index 99%
rename from attestation/src/platform.rs
rename to attestation/src/platform/sgx.rs
index 94e2c65d..d3005bd1 100644
--- a/attestation/src/platform.rs
+++ b/attestation/src/platform/sgx.rs
@@ -17,7 +17,9 @@
 
 //! This module provides SGX platform related functions like getting local
 //! report and transform into a remotely verifiable quote.
+#![cfg(feature = "mesalock_sgx")]
 
+use super::Result;
 use log::debug;
 use sgx_crypto::ecc::EcPublicKey;
 use sgx_crypto::sha::Sha256;
@@ -26,10 +28,8 @@ use sgx_tse::{EnclaveReport, EnclaveTarget};
 use sgx_types::error::SgxStatus;
 use sgx_types::error::SgxStatus::Success;
 use sgx_types::types::*;
-
-type Result<T> = std::result::Result<T, PlatformError>;
-
 #[derive(thiserror::Error, Debug)]
+
 pub enum PlatformError {
     #[error("Failed to call {0}: {1}")]
     OCallError(String, SgxStatus),
diff --git a/attestation/src/service.rs b/attestation/src/service.rs
index 6b6cdc7e..b69be8ec 100644
--- a/attestation/src/service.rs
+++ b/attestation/src/service.rs
@@ -32,7 +32,6 @@ use anyhow::{anyhow, bail, Result};
 use log::{debug, trace, warn};
 use serde_json::json;
 use sgx_crypto::ecc::EcPublicKey;
-use sgx_types::types::QlAttKeyId;
 
 /// Root certification of the DCAP attestation service provider.
 #[cfg(dcap)]
@@ -70,6 +69,7 @@ pub(crate) enum AttestationServiceError {
     Unknown,
 }
 
+#[cfg(all(feature = "mesalock_sgx", not(feature = "libos")))]
 impl EndorsedAttestationReport {
     pub fn new(
         att_service_cfg: &AttestationServiceConfig,
@@ -79,7 +79,7 @@ impl EndorsedAttestationReport {
 
         // For IAS-based attestation, we need to fill our SPID (obtained from Intel)
         // into the attestation key id. For DCAP-based attestation, SPID should be 0
-        const SPID_OFFSET: usize = std::mem::size_of::<QlAttKeyId>();
+        const SPID_OFFSET: usize = std::mem::size_of::<sgx_types::types::QlAttKeyId>();
         ak_id.att_key_id[SPID_OFFSET..(SPID_OFFSET + att_service_cfg.spid.id.len())]
             .clone_from_slice(&att_service_cfg.spid.id);
 
@@ -96,6 +96,27 @@ impl EndorsedAttestationReport {
     }
 }
 
+#[cfg(all(feature = "libos", not(feature = "mesalock_sgx")))]
+impl EndorsedAttestationReport {
+    pub fn new(att_service_cfg: &AttestationServiceConfig, pub_k: EcPublicKey) -> Result<Self> {
+        let report_data = platform::create_sgx_report_data(pub_k);
+        let quote = match &att_service_cfg.algo {
+            crate::AttestationAlgorithm::SgxEpid => {
+                platform::get_sgx_epid_quote(&att_service_cfg.spid, report_data)?
+            }
+            crate::AttestationAlgorithm::SgxEcdsa => {
+                platform::get_sgx_dcap_quote(&att_service_cfg.spid, report_data)?
+            }
+        };
+        crate::service::get_report(
+            &att_service_cfg.algo,
+            &att_service_cfg.as_url,
+            &att_service_cfg.api_key,
+            &quote,
+        )
+    }
+}
+
 fn new_tls_stream(url: &url::Url) -> Result<rustls::StreamOwned<rustls::ClientSession, TcpStream>> {
     let host_str = url
         .host_str()
@@ -123,7 +144,7 @@ fn new_tls_stream(url: &url::Url) -> Result<rustls::StreamOwned<rustls::ClientSe
 
 /// Get attestation report form the attestation service (e.g., Intel Attestation
 /// Service and customized DCAP attestation service).
-fn get_report(
+pub(crate) fn get_report(
     algo: &AttestationAlgorithm,
     url: &url::Url,
     api_key: &str,
diff --git a/cmake/TeaclaveUtils.cmake b/cmake/TeaclaveUtils.cmake
index 0195a846..6adb3772 100644
--- a/cmake/TeaclaveUtils.cmake
+++ b/cmake/TeaclaveUtils.cmake
@@ -88,9 +88,8 @@ endmacro()
 # [NOT_SET_COMMON_ENV] [EXTRA_CARGO_FLAGS flg...] )
 function(add_cargo_build_target package_name)
   set(options NOT_SET_COMMON_ENV)
-  set(oneValueArgs TARGET_NAME TOML_DIR TARGET_DIR INSTALL_DIR
-                   EXTRA_CARGO_FLAGS)
-  set(multiValueArgs DEPENDS)
+  set(oneValueArgs TARGET_NAME TOML_DIR TARGET_DIR INSTALL_DIR)
+  set(multiValueArgs DEPENDS EXTRA_CARGO_FLAGS)
   cmake_parse_arguments(MTEE "${options}" "${oneValueArgs}" "${multiValueArgs}"
                         ${ARGN})
 
diff --git a/cmake/tomls/Cargo.sgx_trusted_lib.lock b/cmake/tomls/Cargo.sgx_trusted_lib.lock
index ade5d7fd..4d679c10 100644
--- a/cmake/tomls/Cargo.sgx_trusted_lib.lock
+++ b/cmake/tomls/Cargo.sgx_trusted_lib.lock
@@ -41,12 +41,24 @@ version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
 
+[[package]]
+name = "base64"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
+
 [[package]]
 name = "bit-vec"
 version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
 
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
 [[package]]
 name = "bumpalo"
 version = "3.11.1"
@@ -105,6 +117,22 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
 
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
 [[package]]
 name = "crc"
 version = "2.0.0"
@@ -116,7 +144,7 @@ version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
 dependencies = [
- "quote 1.0.23",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -126,6 +154,15 @@ version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
 
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
 [[package]]
 name = "env_logger"
 version = "0.9.3"
@@ -135,12 +172,57 @@ dependencies = [
  "log",
 ]
 
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
 [[package]]
 name = "fnv"
 version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
 [[package]]
 name = "form_urlencoded"
 version = "1.1.0"
@@ -150,6 +232,95 @@ dependencies = [
  "percent-encoding",
 ]
 
+[[package]]
+name = "futures"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364"
+
+[[package]]
+name = "futures-task"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366"
+
+[[package]]
+name = "futures-util"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
 [[package]]
 name = "gbdt"
 version = "0.1.1"
@@ -171,7 +342,7 @@ dependencies = [
  "cfg-if 1.0.0",
  "libc",
  "sgx_libc",
- "wasi",
+ "wasi 0.10.2+wasi-snapshot-preview1",
 ]
 
 [[package]]
@@ -180,11 +351,36 @@ version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "41973d4c45f7a35af8753ba3457cc99d406d863941fd7f52663cff54a5ab99b3"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
+[[package]]
+name = "h2"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
 [[package]]
 name = "hashbrown_tstd"
 version = "0.12.0"
@@ -215,12 +411,66 @@ dependencies = [
  "itoa",
 ]
 
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
 [[package]]
 name = "httparse"
 version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
 
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
 [[package]]
 name = "idna"
 version = "0.3.0"
@@ -245,6 +495,25 @@ dependencies = [
  "num-traits",
 ]
 
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
 [[package]]
 name = "integer-encoding"
 version = "1.1.7"
@@ -268,11 +537,27 @@ version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7e41b53715c6f0c4be49510bb82dee2c1e51c8586d885abe65396e82ed518548"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
+[[package]]
+name = "io-lifetimes"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3"
+dependencies = [
+ "libc",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
+
 [[package]]
 name = "itertools"
 version = "0.8.2"
@@ -344,6 +629,12 @@ version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
 
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+
 [[package]]
 name = "log"
 version = "0.4.17"
@@ -369,6 +660,42 @@ version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
 
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "mio"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
 [[package]]
 name = "num"
 version = "0.1.42"
@@ -483,6 +810,51 @@ version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
 
+[[package]]
+name = "openssl"
+version = "0.10.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
 [[package]]
 name = "pem"
 version = "0.8.3"
@@ -500,6 +872,24 @@ version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
 
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
 [[package]]
 name = "ppv-lite86"
 version = "0.2.17"
@@ -517,9 +907,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.49"
+version = "1.0.56"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
 dependencies = [
  "unicode-ident",
 ]
@@ -542,8 +932,8 @@ checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b"
 dependencies = [
  "anyhow",
  "itertools 0.10.5",
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -558,11 +948,11 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.23"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
 dependencies = [
- "proc-macro2 1.0.49",
+ "proc-macro2 1.0.56",
 ]
 
 [[package]]
@@ -626,6 +1016,15 @@ dependencies = [
  "rand_core 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
 [[package]]
 name = "regex"
 version = "1.7.0"
@@ -643,6 +1042,45 @@ version = "0.6.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
 
+[[package]]
+name = "reqwest"
+version = "0.11.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254"
+dependencies = [
+ "base64 0.21.0",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "tokio-util",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+ "winreg",
+]
+
 [[package]]
 name = "ring"
 version = "0.16.20"
@@ -678,6 +1116,20 @@ dependencies = [
  "serde_json",
 ]
 
+[[package]]
+name = "rustix"
+version = "0.36.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.45.0",
+]
+
 [[package]]
 name = "rustls"
 version = "0.17.0"
@@ -722,6 +1174,15 @@ version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
 
+[[package]]
+name = "schannel"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+dependencies = [
+ "windows-sys 0.42.0",
+]
+
 [[package]]
 name = "sct"
 version = "0.6.1"
@@ -732,6 +1193,29 @@ dependencies = [
  "untrusted",
 ]
 
+[[package]]
+name = "security-framework"
+version = "2.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
 [[package]]
 name = "serde"
 version = "1.0.151"
@@ -747,8 +1231,8 @@ version = "1.0.151"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -763,6 +1247,18 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
 [[package]]
 name = "sgx_alloc"
 version = "2.0.0"
@@ -829,8 +1325,8 @@ dependencies = [
 name = "sgx_macros"
 version = "2.0.0"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -980,6 +1476,15 @@ dependencies = [
  "num-traits",
 ]
 
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
 [[package]]
 name = "snap"
 version = "0.2.5"
@@ -990,6 +1495,16 @@ dependencies = [
  "lazy_static",
 ]
 
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
 [[package]]
 name = "spin"
 version = "0.5.2"
@@ -1019,8 +1534,8 @@ version = "1.0.107"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "unicode-ident",
 ]
 
@@ -1058,6 +1573,7 @@ dependencies = [
  "chrono",
  "hex",
  "httparse",
+ "libc",
  "log",
  "num-bigint 0.2.6",
  "percent-encoding",
@@ -1171,6 +1687,7 @@ dependencies = [
  "teaclave_binder",
  "teaclave_config",
  "teaclave_crypto",
+ "teaclave_file_agent",
  "teaclave_proto",
  "teaclave_rpc",
  "teaclave_service_enclave_utils",
@@ -1224,6 +1741,28 @@ dependencies = [
  "thiserror",
 ]
 
+[[package]]
+name = "teaclave_file_agent"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "base64 0.13.1",
+ "futures",
+ "futures-util",
+ "http",
+ "itertools 0.8.2",
+ "log",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "thiserror",
+ "tokio",
+ "tokio-util",
+ "url",
+]
+
 [[package]]
 name = "teaclave_frontend_service_enclave"
 version = "0.5.0"
@@ -1386,6 +1925,7 @@ dependencies = [
  "anyhow",
  "cfg-if 0.1.10",
  "http",
+ "libc",
  "log",
  "rustls",
  "serde",
@@ -1403,8 +1943,8 @@ dependencies = [
 name = "teaclave_rpc_proc_macro"
 version = "0.5.0"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -1465,8 +2005,8 @@ dependencies = [
 name = "teaclave_service_enclave_utils_proc_macro"
 version = "0.5.0"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -1520,8 +2060,8 @@ dependencies = [
 name = "teaclave_test_utils_proc_macro"
 version = "0.0.1"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -1595,6 +2135,19 @@ dependencies = [
  "thiserror",
 ]
 
+[[package]]
+name = "tempfile"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fastrand",
+ "redox_syscall",
+ "rustix",
+ "windows-sys 0.42.0",
+]
+
 [[package]]
 name = "thiserror"
 version = "1.0.38"
@@ -1610,8 +2163,8 @@ version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -1639,6 +2192,46 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
 
+[[package]]
+name = "tokio"
+version = "1.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "socket2",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
 [[package]]
 name = "toml"
 version = "0.5.10"
@@ -1648,6 +2241,38 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if 1.0.0",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
 [[package]]
 name = "unicode-bidi"
 version = "0.3.8"
@@ -1715,18 +2340,40 @@ dependencies = [
  "version_check",
 ]
 
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
 [[package]]
 name = "version_check"
 version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
 [[package]]
 name = "wasi"
 version = "0.10.2+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
 
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
 [[package]]
 name = "wasm-bindgen"
 version = "0.2.83"
@@ -1746,19 +2393,31 @@ dependencies = [
  "bumpalo",
  "log",
  "once_cell",
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
  "wasm-bindgen-shared",
 ]
 
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
 [[package]]
 name = "wasm-bindgen-macro"
 version = "0.2.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
 dependencies = [
- "quote 1.0.23",
+ "quote 1.0.26",
  "wasm-bindgen-macro-support",
 ]
 
@@ -1768,8 +2427,8 @@ version = "0.2.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
@@ -1781,6 +2440,19 @@ version = "0.2.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
 
+[[package]]
+name = "wasm-streams"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
 [[package]]
 name = "web-sys"
 version = "0.3.60"
@@ -1832,6 +2504,96 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "yasna"
 version = "0.3.2"
diff --git a/cmake/tomls/Cargo.sgx_untrusted_app.lock b/cmake/tomls/Cargo.sgx_untrusted_app.lock
index 758e3e6d..e4aebc45 100644
--- a/cmake/tomls/Cargo.sgx_untrusted_app.lock
+++ b/cmake/tomls/Cargo.sgx_untrusted_app.lock
@@ -37,12 +37,27 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "autocfg"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
 [[package]]
 name = "autocfg"
 version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
+[[package]]
+name = "base64"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
+
 [[package]]
 name = "base64"
 version = "0.13.1"
@@ -55,6 +70,12 @@ version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
 
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
 [[package]]
 name = "bitflags"
 version = "1.3.2"
@@ -67,6 +88,18 @@ version = "3.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
 
+[[package]]
+name = "bytemuck"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
 [[package]]
 name = "bytes"
 version = "1.3.0"
@@ -91,6 +124,16 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
+dependencies = [
+ "num-integer",
+ "num-traits",
+]
+
 [[package]]
 name = "clap"
 version = "2.34.0"
@@ -106,6 +149,21 @@ dependencies = [
  "vec_map",
 ]
 
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
 [[package]]
 name = "core-foundation"
 version = "0.9.3"
@@ -128,7 +186,7 @@ version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
 dependencies = [
- "quote 1.0.23",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -170,6 +228,15 @@ dependencies = [
  "termcolor",
 ]
 
+[[package]]
+name = "env_logger"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
+dependencies = [
+ "log",
+]
+
 [[package]]
 name = "fastrand"
 version = "1.8.0"
@@ -209,6 +276,12 @@ dependencies = [
  "percent-encoding",
 ]
 
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
 [[package]]
 name = "futures"
 version = "0.3.25"
@@ -263,8 +336,8 @@ version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -298,6 +371,20 @@ dependencies = [
  "slab",
 ]
 
+[[package]]
+name = "gbdt"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74248386ea349f903cee13fae53f41bdae987f74eb798c6cbcb08370c99ccd34"
+dependencies = [
+ "cfg-if 0.1.10",
+ "rand 0.6.5",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+]
+
 [[package]]
 name = "getrandom"
 version = "0.2.8"
@@ -315,8 +402,8 @@ version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "41973d4c45f7a35af8753ba3457cc99d406d863941fd7f52663cff54a5ab99b3"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -472,13 +559,28 @@ dependencies = [
  "unicode-normalization",
 ]
 
+[[package]]
+name = "image"
+version = "0.23.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "jpeg-decoder",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
 [[package]]
 name = "indexmap"
 version = "1.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
 dependencies = [
- "autocfg",
+ "autocfg 1.1.0",
  "hashbrown",
 ]
 
@@ -508,8 +610,8 @@ version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7e41b53715c6f0c4be49510bb82dee2c1e51c8586d885abe65396e82ed518548"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -528,12 +630,27 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
 [[package]]
 name = "itoa"
 version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
 
+[[package]]
+name = "jpeg-decoder"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
+
 [[package]]
 name = "js-sys"
 version = "0.3.60"
@@ -555,6 +672,12 @@ version = "0.2.139"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
 
+[[package]]
+name = "libm"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
+
 [[package]]
 name = "log"
 version = "0.4.17"
@@ -562,6 +685,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
 dependencies = [
  "cfg-if 1.0.0",
+ "value-bag",
+]
+
+[[package]]
+name = "matrixmultiply"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcad67dcec2d58ff56f6292582377e6921afdf3bfbd533e26fb8900ae575e002"
+dependencies = [
+ "rawpointer",
 ]
 
 [[package]]
@@ -618,6 +751,105 @@ dependencies = [
  "static_assertions",
 ]
 
+[[package]]
+name = "num"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
+dependencies = [
+ "num-integer",
+ "num-iter",
+ "num-traits",
+]
+
+[[package]]
+name = "num"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f"
+dependencies = [
+ "num-bigint 0.3.3",
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-bigint 0.3.3",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg 1.1.0",
+ "libm",
+]
+
 [[package]]
 name = "num_cpus"
 version = "1.15.0"
@@ -655,8 +887,8 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -672,7 +904,7 @@ version = "0.9.80"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7"
 dependencies = [
- "autocfg",
+ "autocfg 1.1.0",
  "cc",
  "libc",
  "pkg-config",
@@ -716,8 +948,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
 dependencies = [
  "proc-macro-error-attr",
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
  "version_check",
 ]
@@ -728,8 +960,8 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "version_check",
 ]
 
@@ -744,13 +976,36 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.49"
+version = "1.0.56"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
 dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "prost"
+version = "0.11.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e48e50df39172a3e7eb17e14642445da64996989bc212b583015435d39a58537"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.11.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b"
+dependencies = [
+ "anyhow",
+ "itertools 0.10.5",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
+ "syn 1.0.107",
+]
+
 [[package]]
 name = "quick-error"
 version = "1.2.3"
@@ -768,11 +1023,30 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.23"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
 dependencies = [
- "proc-macro2 1.0.49",
+ "proc-macro2 1.0.56",
+]
+
+[[package]]
+name = "rand"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
+dependencies = [
+ "autocfg 0.1.8",
+ "libc",
+ "rand_chacha 0.1.1",
+ "rand_core 0.4.2",
+ "rand_hc",
+ "rand_isaac",
+ "rand_jitter",
+ "rand_os",
+ "rand_pcg",
+ "rand_xorshift",
+ "winapi",
 ]
 
 [[package]]
@@ -782,8 +1056,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
  "libc",
- "rand_chacha",
- "rand_core",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.3.1",
 ]
 
 [[package]]
@@ -793,9 +1077,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
 ]
 
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
 [[package]]
 name = "rand_core"
 version = "0.6.4"
@@ -805,6 +1104,78 @@ dependencies = [
  "getrandom",
 ]
 
+[[package]]
+name = "rand_distr"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
+dependencies = [
+ "num-traits",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_isaac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_jitter"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
+dependencies = [
+ "libc",
+ "rand_core 0.4.2",
+ "winapi",
+]
+
+[[package]]
+name = "rand_os"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+dependencies = [
+ "cloudabi",
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.4.2",
+ "rdrand 0.4.0",
+ "winapi",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
 [[package]]
 name = "raw-cpuid"
 version = "10.7.0"
@@ -814,13 +1185,28 @@ dependencies = [
  "bitflags",
 ]
 
+[[package]]
+name = "rawpointer"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebac11a9d2e11f2af219b8b8d833b76b1ea0e054aa0e8d8e9e4cbde353bdf019"
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
 [[package]]
 name = "rdrand"
 version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e233b642160555c1aa1ff7a78443c6139342f411b6fa6602af2ebbfee9e166bb"
 dependencies = [
- "rand_core",
+ "rand_core 0.6.4",
 ]
 
 [[package]]
@@ -912,6 +1298,53 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "rulinalg"
+version = "0.4.2"
+source = "git+https://github.com/AtheMathmo/rulinalg?rev=1ed8b937#1ed8b937d7b54d08a440f7db91994142bfe47388"
+dependencies = [
+ "matrixmultiply",
+ "num 0.1.42",
+]
+
+[[package]]
+name = "rustface"
+version = "0.1.7"
+source = "git+https://github.com/apache/incubator-teaclave-crates#4c9325839e94bb8e280898f94c98a79cdc025312"
+dependencies = [
+ "byteorder",
+ "image",
+ "num 0.3.1",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "rustls"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1"
+dependencies = [
+ "base64 0.11.0",
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rusty-machine"
+version = "0.5.4"
+source = "git+https://github.com/apache/incubator-teaclave-crates#4c9325839e94bb8e280898f94c98a79cdc025312"
+dependencies = [
+ "num 0.1.42",
+ "rand 0.8.5",
+ "rand_distr",
+ "rulinalg",
+ "serde",
+ "serde_json",
+]
+
 [[package]]
 name = "ryu"
 version = "1.0.12"
@@ -928,6 +1361,16 @@ dependencies = [
  "windows-sys 0.36.1",
 ]
 
+[[package]]
+name = "sct"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
 [[package]]
 name = "security-framework"
 version = "2.7.0"
@@ -966,8 +1409,8 @@ version = "1.0.151"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -1002,6 +1445,15 @@ version = "2.0.0"
 name = "sgx_build_helper"
 version = "2.0.0"
 
+[[package]]
+name = "sgx_cov"
+version = "2.0.0"
+dependencies = [
+ "sgx_trts",
+ "sgx_tstd",
+ "sgx_types",
+]
+
 [[package]]
 name = "sgx_crypto"
 version = "2.0.0"
@@ -1035,6 +1487,27 @@ dependencies = [
  "sgx_types",
 ]
 
+[[package]]
+name = "sgx_libc"
+version = "2.0.0"
+dependencies = [
+ "sgx_ffi",
+ "sgx_oc",
+ "sgx_sync",
+ "sgx_tlibc_sys",
+ "sgx_trts",
+ "sgx_types",
+]
+
+[[package]]
+name = "sgx_macros"
+version = "2.0.0"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
+ "syn 1.0.107",
+]
+
 [[package]]
 name = "sgx_oc"
 version = "2.0.0"
@@ -1049,8 +1522,8 @@ dependencies = [
 name = "sgx_rand"
 version = "2.0.0"
 dependencies = [
- "rand_core",
- "rdrand",
+ "rand_core 0.6.4",
+ "rdrand 0.8.2",
  "sgx_trts",
  "sgx_tstd",
 ]
@@ -1196,7 +1669,7 @@ version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
 dependencies = [
- "autocfg",
+ "autocfg 1.1.0",
 ]
 
 [[package]]
@@ -1246,11 +1719,17 @@ checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0"
 dependencies = [
  "heck",
  "proc-macro-error",
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
+[[package]]
+name = "sval"
+version = "1.0.0-alpha.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45f6ee7c7b87caf59549e9fe45d6a69c75c8019e79e212a835c5da0e92f0ba08"
+
 [[package]]
 name = "syn"
 version = "0.15.44"
@@ -1268,8 +1747,8 @@ version = "1.0.107"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "unicode-ident",
 ]
 
@@ -1278,18 +1757,51 @@ name = "teaclave_access_control_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "signal-hook",
  "teaclave_service_app_utils",
 ]
 
+[[package]]
+name = "teaclave_attestation"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "base64 0.13.1",
+ "bit-vec",
+ "cfg-if 0.1.10",
+ "chrono",
+ "hex",
+ "httparse",
+ "libc",
+ "log",
+ "num-bigint 0.2.6",
+ "percent-encoding",
+ "rustls",
+ "serde",
+ "serde_json",
+ "sgx_crypto",
+ "sgx_rand",
+ "sgx_tse",
+ "sgx_types",
+ "teaclave_config",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "thiserror",
+ "url",
+ "uuid",
+ "webpki",
+ "webpki-roots",
+ "yasna",
+]
+
 [[package]]
 name = "teaclave_authentication_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "signal-hook",
  "teaclave_service_app_utils",
@@ -1338,7 +1850,7 @@ version = "0.5.0"
 dependencies = [
  "anyhow",
  "hex",
- "rand",
+ "rand 0.8.5",
  "ring",
  "serde",
  "serde_json",
@@ -1351,13 +1863,86 @@ name = "teaclave_execution_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
+ "log",
  "signal-hook",
+ "teaclave_config",
+ "teaclave_execution_service_enclave",
  "teaclave_file_agent",
+ "teaclave_logger",
  "teaclave_service_app_utils",
 ]
 
+[[package]]
+name = "teaclave_execution_service_enclave"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "gbdt",
+ "log",
+ "serde",
+ "serde_json",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_attestation",
+ "teaclave_binder",
+ "teaclave_config",
+ "teaclave_crypto",
+ "teaclave_file_agent",
+ "teaclave_proto",
+ "teaclave_rpc",
+ "teaclave_service_enclave_utils",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "teaclave_worker",
+ "thiserror",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "teaclave_executor"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "gbdt",
+ "itertools 0.8.2",
+ "log",
+ "rusty-machine",
+ "serde",
+ "serde_json",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_crypto",
+ "teaclave_executor_context",
+ "teaclave_function",
+ "teaclave_runtime",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "thiserror",
+]
+
+[[package]]
+name = "teaclave_executor_context"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "gbdt",
+ "itertools 0.8.2",
+ "log",
+ "rusty-machine",
+ "serde",
+ "serde_json",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_crypto",
+ "teaclave_runtime",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "thiserror",
+]
+
 [[package]]
 name = "teaclave_file_agent"
 version = "0.5.0"
@@ -1367,7 +1952,7 @@ dependencies = [
  "futures",
  "futures-util",
  "http",
- "itertools",
+ "itertools 0.8.2",
  "log",
  "reqwest",
  "serde",
@@ -1385,18 +1970,44 @@ name = "teaclave_frontend_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "signal-hook",
  "teaclave_service_app_utils",
 ]
 
+[[package]]
+name = "teaclave_function"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "base64 0.13.1",
+ "gbdt",
+ "hex",
+ "image",
+ "itertools 0.8.2",
+ "log",
+ "ring",
+ "rustface",
+ "rusty-machine",
+ "serde",
+ "serde_json",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_crypto",
+ "teaclave_executor_context",
+ "teaclave_runtime",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "thiserror",
+]
+
 [[package]]
 name = "teaclave_functional_tests"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "log",
  "sgx_types",
  "structopt",
@@ -1409,7 +2020,7 @@ name = "teaclave_integration_tests"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "log",
  "sgx_types",
  "teaclave_binder",
@@ -1418,23 +2029,96 @@ dependencies = [
  "teaclave_types",
 ]
 
+[[package]]
+name = "teaclave_logger"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "log",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_test_utils",
+]
+
 [[package]]
 name = "teaclave_management_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "signal-hook",
  "teaclave_service_app_utils",
 ]
 
+[[package]]
+name = "teaclave_proto"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "base64 0.13.1",
+ "cfg-if 0.1.10",
+ "prost",
+ "rand 0.8.5",
+ "serde",
+ "serde_json",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_crypto",
+ "teaclave_rpc",
+ "teaclave_types",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "teaclave_rpc"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "cfg-if 0.1.10",
+ "http",
+ "libc",
+ "log",
+ "rustls",
+ "serde",
+ "serde_json",
+ "sgx_libc",
+ "teaclave_attestation",
+ "teaclave_rpc_proc_macro",
+ "teaclave_types",
+ "thiserror",
+ "threadpool",
+ "webpki",
+]
+
+[[package]]
+name = "teaclave_rpc_proc_macro"
+version = "0.5.0"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "teaclave_runtime"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "log",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_test_utils",
+ "teaclave_types",
+]
+
 [[package]]
 name = "teaclave_scheduler_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "signal-hook",
  "teaclave_service_app_utils",
@@ -1446,7 +2130,7 @@ version = "0.5.0"
 dependencies = [
  "anyhow",
  "ctrlc",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "log",
  "signal-hook",
@@ -1455,12 +2139,39 @@ dependencies = [
  "teaclave_types",
 ]
 
+[[package]]
+name = "teaclave_service_enclave_utils"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "env_logger 0.9.3",
+ "log",
+ "sgx_cov",
+ "sgx_macros",
+ "teaclave_attestation",
+ "teaclave_config",
+ "teaclave_logger",
+ "teaclave_proto",
+ "teaclave_rpc",
+ "teaclave_service_enclave_utils_proc_macro",
+ "teaclave_types",
+]
+
+[[package]]
+name = "teaclave_service_enclave_utils_proc_macro"
+version = "0.5.0"
+dependencies = [
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
+ "syn 1.0.107",
+]
+
 [[package]]
 name = "teaclave_sgx_tool"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "log",
  "raw-cpuid",
  "serde",
@@ -1476,7 +2187,7 @@ name = "teaclave_storage_service"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "libc",
  "signal-hook",
  "teaclave_service_app_utils",
@@ -1494,8 +2205,8 @@ dependencies = [
 name = "teaclave_test_utils_proc_macro"
 version = "0.0.1"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
@@ -1506,7 +2217,7 @@ dependencies = [
  "anyhow",
  "hex",
  "log",
- "rand",
+ "rand 0.8.5",
  "ring",
  "serde",
  "serde_json",
@@ -1525,7 +2236,7 @@ name = "teaclave_unit_tests"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.7.1",
  "log",
  "sgx_types",
  "teaclave_binder",
@@ -1534,6 +2245,22 @@ dependencies = [
  "teaclave_types",
 ]
 
+[[package]]
+name = "teaclave_worker"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "log",
+ "serde_json",
+ "sgx_cov",
+ "sgx_types",
+ "teaclave_executor",
+ "teaclave_runtime",
+ "teaclave_test_utils",
+ "teaclave_types",
+ "thiserror",
+]
+
 [[package]]
 name = "tempfile"
 version = "3.3.0"
@@ -1581,11 +2308,20 @@ version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
 ]
 
+[[package]]
+name = "threadpool"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
+dependencies = [
+ "num_cpus",
+]
+
 [[package]]
 name = "tinyvec"
 version = "1.6.0"
@@ -1607,7 +2343,7 @@ version = "1.27.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
 dependencies = [
- "autocfg",
+ "autocfg 1.1.0",
  "bytes",
  "libc",
  "mio",
@@ -1750,6 +2486,17 @@ dependencies = [
  "sha1",
 ]
 
+[[package]]
+name = "value-bag"
+version = "1.0.0-alpha.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
+dependencies = [
+ "ctor",
+ "sval",
+ "version_check",
+]
+
 [[package]]
 name = "vcpkg"
 version = "0.2.15"
@@ -1803,8 +2550,8 @@ dependencies = [
  "bumpalo",
  "log",
  "once_cell",
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
  "wasm-bindgen-shared",
 ]
@@ -1827,7 +2574,7 @@ version = "0.2.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
 dependencies = [
- "quote 1.0.23",
+ "quote 1.0.26",
  "wasm-bindgen-macro-support",
 ]
 
@@ -1837,8 +2584,8 @@ version = "0.2.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
 dependencies = [
- "proc-macro2 1.0.49",
- "quote 1.0.23",
+ "proc-macro2 1.0.56",
+ "quote 1.0.26",
  "syn 1.0.107",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
@@ -1873,6 +2620,25 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "webpki"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940"
+dependencies = [
+ "webpki",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2036,3 +2802,14 @@ checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
 dependencies = [
  "winapi",
 ]
+
+[[package]]
+name = "yasna"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de7bff972b4f2a06c85f6d8454b09df153af7e3a4ec2aac81db1b105b684ddb"
+dependencies = [
+ "bit-vec",
+ "chrono",
+ "num-bigint 0.2.6",
+]
diff --git a/cmake/tomls/Cargo.sgx_untrusted_app.toml b/cmake/tomls/Cargo.sgx_untrusted_app.toml
index 017840a9..f41e982f 100644
--- a/cmake/tomls/Cargo.sgx_untrusted_app.toml
+++ b/cmake/tomls/Cargo.sgx_untrusted_app.toml
@@ -38,7 +38,14 @@ exclude = [
 [patch.crates-io]
 # We cannot remove these crates, because proto crates depend on them
 sgx_crypto        = { path = "../../../third_party/rust-sgx-sdk/sgx_crypto" }
+sgx_cov           = { path = "../../../third_party/rust-sgx-sdk/sgx_tests/cov" }
+sgx_libc          = { path = "../../../third_party/rust-sgx-sdk/sgx_libc" }
+sgx_macros        = { path = "../../../third_party/rust-sgx-sdk/sgx_macros" }
+sgx_rand          = { path = "../../../third_party/rust-sgx-sdk/sgx_rand" }
 sgx_tprotected_fs = { path = "../../../third_party/rust-sgx-sdk/sgx_protected_fs/tfs" }
 sgx_tse           = { path = "../../../third_party/rust-sgx-sdk/sgx_tse" }
 sgx_types         = { path = "../../../third_party/rust-sgx-sdk/sgx_types" }
 sgx_urts          = { path = "../../../third_party/rust-sgx-sdk/sgx_urts" }
+
+rustface          = { git = "https://github.com/apache/incubator-teaclave-crates" }
+rusty-machine     = { git = "https://github.com/apache/incubator-teaclave-crates" }
\ No newline at end of file
diff --git a/cmake/tomls/Cargo.unix_app.lock b/cmake/tomls/Cargo.unix_app.lock
index 8e17ccb2..6f0e64fc 100644
--- a/cmake/tomls/Cargo.unix_app.lock
+++ b/cmake/tomls/Cargo.unix_app.lock
@@ -1856,6 +1856,7 @@ dependencies = [
  "chrono",
  "hex",
  "httparse",
+ "libc",
  "log",
  "num-bigint",
  "percent-encoding",
@@ -1985,6 +1986,7 @@ dependencies = [
  "anyhow",
  "cfg-if 0.1.10",
  "http",
+ "libc",
  "log",
  "rustls 0.17.0",
  "serde",
diff --git a/executor/Cargo.toml b/executor/Cargo.toml
index 28d7edd7..974273c0 100644
--- a/executor/Cargo.toml
+++ b/executor/Cargo.toml
@@ -36,6 +36,13 @@ mesalock_sgx = [
   "teaclave_function/mesalock_sgx",
   "teaclave_executor_context/mesalock_sgx",
 ]
+app = [
+  "teaclave_types/app",
+  "teaclave_crypto/app",
+  "teaclave_runtime/app",
+  "teaclave_function/app",
+  "teaclave_executor_context/app",
+]
 cov = ["sgx_cov"]
 enclave_unit_test = [
   "teaclave_test_utils/mesalock_sgx",
diff --git a/executor/context/Cargo.toml b/executor/context/Cargo.toml
index 5d41b928..b40bd7c6 100644
--- a/executor/context/Cargo.toml
+++ b/executor/context/Cargo.toml
@@ -29,6 +29,11 @@ crate-type = ["staticlib", "rlib"]
 
 [features]
 default = []
+app = [
+  "teaclave_types/app",
+  "teaclave_crypto/app",
+  "teaclave_runtime/app",
+]
 mesalock_sgx = [
   "teaclave_types/mesalock_sgx",
   "teaclave_crypto/mesalock_sgx",
diff --git a/executor/context/src/context.rs b/executor/context/src/context.rs
index ccccc199..8970c5f3 100644
--- a/executor/context/src/context.rs
+++ b/executor/context/src/context.rs
@@ -15,7 +15,6 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#[cfg(feature = "mesalock_sgx")]
 use std::cell::RefCell;
 use std::slice;
 use std::thread_local;
diff --git a/executor/src/lib.rs b/executor/src/lib.rs
index 60fbcfcb..872880bf 100644
--- a/executor/src/lib.rs
+++ b/executor/src/lib.rs
@@ -20,14 +20,14 @@ extern crate sgx_types;
 
 #[cfg(executor_builtin)]
 mod builtin;
-#[cfg(executor_mesapy)]
+#[cfg(all(executor_mesapy, not(feature = "app")))]
 mod mesapy;
 #[cfg(executor_wamr)]
 mod wamr;
 
 #[cfg(executor_builtin)]
 pub use builtin::BuiltinFunctionExecutor;
-#[cfg(executor_mesapy)]
+#[cfg(all(executor_mesapy, not(feature = "app")))]
 pub use mesapy::MesaPy;
 #[cfg(executor_wamr)]
 pub use wamr::WAMicroRuntime;
@@ -39,7 +39,7 @@ pub mod tests {
     #[allow(clippy::vec_init_then_push)]
     pub fn run_tests() -> bool {
         let mut v: Vec<bool> = Vec::new();
-        #[cfg(executor_mesapy)]
+        #[cfg(all(executor_mesapy, not(feature = "app")))]
         v.push(mesapy::tests::run_tests());
         #[cfg(executor_builtin)]
         v.push(builtin::tests::run_tests());
diff --git a/file_agent/src/agent.rs b/file_agent/src/agent.rs
index 650f47a6..b9313aa7 100644
--- a/file_agent/src/agent.rs
+++ b/file_agent/src/agent.rs
@@ -97,6 +97,7 @@ async fn handle_download(
             download_remote_input_to_file(remote, dst).await?;
         }
         "file" => {
+            // Note: For LibOS, the file path must be inside the LibOS's file system
             let src = remote
                 .to_file_path()
                 .map_err(|e| anyhow::anyhow!("Cannot convert file:// to path: {:?}", e))?;
@@ -191,7 +192,7 @@ async fn handle_upload(info: HandleFileInfo, fusion_base: impl AsRef<Path>) -> a
     Ok(())
 }
 
-fn handle_file_request(bytes: &[u8]) -> anyhow::Result<()> {
+pub fn handle_file_request(bytes: &[u8]) -> anyhow::Result<()> {
     let req: FileAgentRequest = serde_json::from_slice(bytes)?;
     let results = tokio::runtime::Builder::new_multi_thread()
         .enable_all()
diff --git a/file_agent/src/lib.rs b/file_agent/src/lib.rs
index 0dd97b24..40dc91fa 100644
--- a/file_agent/src/lib.rs
+++ b/file_agent/src/lib.rs
@@ -19,4 +19,4 @@
 extern crate log;
 
 mod agent;
-pub use agent::ocall_handle_file_request;
+pub use agent::{handle_file_request, ocall_handle_file_request};
diff --git a/function/Cargo.toml b/function/Cargo.toml
index 321d3209..a4fe6851 100644
--- a/function/Cargo.toml
+++ b/function/Cargo.toml
@@ -29,6 +29,12 @@ crate-type = ["staticlib", "rlib"]
 
 [features]
 default = []
+app = [
+  "teaclave_types/app",
+  "teaclave_crypto/app",
+  "teaclave_runtime/app",
+  "teaclave_executor_context/app",
+]
 mesalock_sgx = [
   "teaclave_types/mesalock_sgx",
   "teaclave_crypto/mesalock_sgx",
diff --git a/logger/Cargo.toml b/logger/Cargo.toml
index 8754198a..0b30858e 100644
--- a/logger/Cargo.toml
+++ b/logger/Cargo.toml
@@ -28,7 +28,7 @@ name = "teaclave_logger"
 crate-type = ["staticlib", "rlib"]
 
 [features]
-default = ["mesalock_sgx"]
+default = []
 mesalock_sgx = []
 cov = ["sgx_cov"]
 enclave_unit_test = ["teaclave_test_utils/mesalock_sgx"]
diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml
index 9c51f1b4..0363b994 100644
--- a/rpc/Cargo.toml
+++ b/rpc/Cargo.toml
@@ -25,6 +25,11 @@ edition = "2021"
 
 [features]
 default = []
+app = [
+    "libc",
+    "teaclave_types/app",
+    "teaclave_attestation/app"
+]
 mesalock_sgx = [
     "sgx_libc",
     "teaclave_types/mesalock_sgx",
@@ -35,6 +40,7 @@ mesalock_sgx = [
 anyhow     = { version = "1.0.26" }
 cfg-if     = { version = "0.1.9" }
 http       = { version = "0.2" }
+libc       = { version = "0.2.66", optional = true }
 log        = { version = "0.4.17", features = ["release_max_level_info"] }
 rustls     = { version = "0.17.0", features = ["dangerous_configuration"] }
 serde      = { version = "1.0.92", features = ["derive"] }
diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs
index e396c16c..69cbc3f3 100644
--- a/rpc/src/lib.rs
+++ b/rpc/src/lib.rs
@@ -39,6 +39,6 @@ mod protocol;
 mod request;
 pub use request::{IntoRequest, Request};
 pub use teaclave_rpc_proc_macro::into_request;
-#[cfg(feature = "mesalock_sgx")]
+#[cfg(any(feature = "mesalock_sgx", feature = "app"))]
 pub mod server;
 mod transport;
diff --git a/rpc/src/server.rs b/rpc/src/server.rs
index 97c1087d..27c3fc7e 100644
--- a/rpc/src/server.rs
+++ b/rpc/src/server.rs
@@ -19,9 +19,13 @@ use crate::config::SgxTrustedTlsServerConfig;
 use crate::transport::{ServerTransport, SgxTrustedTlsTransport};
 use crate::TeaclaveService;
 use anyhow::Result;
+#[cfg(not(feature = "mesalock_sgx"))]
+use libc::setsockopt;
 use log::{debug, error, warn};
 use serde::{Deserialize, Serialize};
+#[cfg(feature = "mesalock_sgx")]
 use sgx_libc as libc;
+#[cfg(feature = "mesalock_sgx")]
 use sgx_libc::ocall::setsockopt;
 use std::{io, mem, os::unix::io::AsRawFd};
 
diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml
index 210f3a8c..da1969d3 100644
--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -29,6 +29,9 @@ crate-type = ["staticlib", "rlib"]
 
 [features]
 default = []
+app = [
+  "teaclave_types/app",
+]
 mesalock_sgx = [
   "teaclave_types/mesalock_sgx",
 ]
diff --git a/runtime/src/raw_io.rs b/runtime/src/raw_io.rs
index 90475429..2d8da63a 100644
--- a/runtime/src/raw_io.rs
+++ b/runtime/src/raw_io.rs
@@ -15,9 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#[cfg(not(feature = "mesalock_sgx"))]
+use std::fs::File;
 use std::io;
+#[cfg(feature = "mesalock_sgx")]
 use std::untrusted::fs::File;
-
 use teaclave_types::StagedFiles;
 use teaclave_types::TeaclaveRuntime;
 
diff --git a/services/authentication/enclave/src/user_db.rs b/services/authentication/enclave/src/user_db.rs
index 72cd7f5a..75ca29b5 100644
--- a/services/authentication/enclave/src/user_db.rs
+++ b/services/authentication/enclave/src/user_db.rs
@@ -125,8 +125,7 @@ pub(crate) fn create_persistent_auth_db(base_dir: impl AsRef<Path>) -> DB {
     let opt = rusty_leveldb::Options::new_disk_db_with(key);
     let db_path = base_dir.as_ref().join("authentication_db");
     log::info!("open auth db: {:?}", db_path);
-    let database = DB::open(db_path, opt).unwrap();
-    database
+    DB::open(db_path, opt).unwrap()
 }
 
 #[cfg(test_mode)]
diff --git a/services/execution/app/Cargo.toml b/services/execution/app/Cargo.toml
index 01d5f640..d57cbb3f 100644
--- a/services/execution/app/Cargo.toml
+++ b/services/execution/app/Cargo.toml
@@ -24,11 +24,23 @@ license = "Apache-2.0"
 build = "build.rs"
 edition = "2021"
 
+[features]
+default =[]
+libos = [
+  "teaclave_execution_service_enclave/libos",
+  "teaclave_config/build_config",
+  "teaclave_logger"
+  ]
+
 [dependencies]
 env_logger  = { version = "0.7.1" }
 anyhow      = { version = "1.0.26" }
 libc        = { version = "0.2.66" }
+log         = { version = "0.4.17", features = ["release_max_level_info"] }
 signal-hook = { version = "0.1.13" }
 
-teaclave_file_agent        = { path = "../../../file_agent" }
-teaclave_service_app_utils = { path = "../../utils/service_app_utils" }
+teaclave_config                    = { path = "../../../config" }
+teaclave_logger                    = { path = "../../../logger", optional = true }
+teaclave_file_agent                = { path = "../../../file_agent" }
+teaclave_service_app_utils         = { path = "../../utils/service_app_utils" }
+teaclave_execution_service_enclave = { path = "../enclave", optional = true }
diff --git a/services/execution/app/build.rs b/services/execution/app/build.rs
index 39dc9d1b..9a3101ae 100644
--- a/services/execution/app/build.rs
+++ b/services/execution/app/build.rs
@@ -18,16 +18,7 @@
 use std::env;
 use std::path::PathBuf;
 
-fn choose_sgx_dylib(is_sim: bool) {
-    if is_sim {
-        println!("cargo:rustc-link-lib=dylib=sgx_urts_sim");
-        println!("cargo:rustc-link-lib=dylib=sgx_uae_service_sim");
-    } else {
-        println!("cargo:rustc-link-lib=dylib=sgx_urts");
-        println!("cargo:rustc-link-lib=dylib=sgx_uae_service");
-    }
-}
-
+#[cfg(not(feature = "libos"))]
 fn main() {
     let sdk_dir = env::var("SGX_SDK").unwrap_or("/opt/intel/sgxsdk".into());
     println!("cargo:rustc-link-search=native={}/lib64", sdk_dir);
@@ -49,6 +40,19 @@ fn main() {
             panic!("Stop build process, wrong SGX_MODE env provided.");
         }
     };
+    if is_sim {
+        println!("cargo:rustc-link-lib=dylib=sgx_urts_sim");
+        println!("cargo:rustc-link-lib=dylib=sgx_uae_service_sim");
+    } else {
+        println!("cargo:rustc-link-lib=dylib=sgx_urts");
+        println!("cargo:rustc-link-lib=dylib=sgx_uae_service");
+    }
+}
 
-    choose_sgx_dylib(is_sim);
+#[cfg(feature = "libos")]
+fn main() {
+    let out_path = env::var_os("TEACLAVE_OUT_DIR").unwrap_or("out".into());
+    let out_dir = &PathBuf::from(out_path);
+    println!("cargo:rustc-link-search=native={}", out_dir.display());
+    println!("cargo:rustc-link-lib=static:+whole-archive=vmlib");
 }
diff --git a/services/execution/app/src/main.rs b/services/execution/app/src/main.rs
index 4482860f..10d7a821 100644
--- a/services/execution/app/src/main.rs
+++ b/services/execution/app/src/main.rs
@@ -15,14 +15,28 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use anyhow::Result;
-use teaclave_service_app_utils::launch_teaclave_service;
-
-// Use to import ocall
-pub use teaclave_file_agent::ocall_handle_file_request;
-
-const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME");
+#[cfg(feature = "libos")]
+fn main() {
+    let env = env_logger::Env::new()
+        .filter_or("TEACLAVE_LOG", "RUST_LOG")
+        .write_style_or("TEACLAVE_LOG_STYLE", "RUST_LOG_STYLE");
+    let env_logger = env_logger::Builder::from_env(env).build();
+    teaclave_logger::Builder::new()
+        .secondary_logger(env_logger)
+        .init();
+    // The Absolute path of runtime.config.toml in occlum instance
+    let config_path = "runtime.config.toml";
+    let config = teaclave_config::RuntimeConfig::from_toml(config_path)
+        .expect("Failed to load config file.");
+    if let Err(e) = teaclave_execution_service_enclave::start_service(&config) {
+        log::error!("app will exit, error {:?}", e);
+    }
+}
 
-fn main() -> Result<()> {
-    launch_teaclave_service(PACKAGE_NAME)
+#[cfg(not(feature = "libos"))]
+fn main() -> anyhow::Result<()> {
+    // Use to import ocall
+    pub use teaclave_file_agent::ocall_handle_file_request;
+    const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME");
+    teaclave_service_app_utils::launch_teaclave_service(PACKAGE_NAME)
 }
diff --git a/services/execution/enclave/Cargo.toml b/services/execution/enclave/Cargo.toml
index 8c18a832..32d58cbb 100644
--- a/services/execution/enclave/Cargo.toml
+++ b/services/execution/enclave/Cargo.toml
@@ -41,6 +41,18 @@ mesalock_sgx = [
   "teaclave_config/build_config",
   "teaclave_worker/mesalock_sgx",
 ]
+libos = [  
+  "teaclave_attestation/libos",
+  "teaclave_binder/app",
+  "teaclave_config/build_config",
+  "teaclave_crypto/app",
+  "teaclave_file_agent",
+  "teaclave_proto/app",
+  "teaclave_rpc/app",
+  "teaclave_service_enclave_utils/libos",
+  "teaclave_types/app",
+  "teaclave_worker/app",
+]
 cov = ["teaclave_service_enclave_utils/cov"]
 enclave_unit_test = ["teaclave_binder/enclave_unit_test", "teaclave_test_utils/mesalock_sgx"]
 
@@ -63,7 +75,8 @@ teaclave_service_enclave_utils = { path = "../../utils/service_enclave_utils" }
 teaclave_types                 = { path = "../../../types" }
 teaclave_crypto                = { path = "../../../crypto" }
 teaclave_worker                = { path = "../../../worker" }
-teaclave_test_utils            = { path = "../../../tests/utils" , optional = true }
+teaclave_test_utils            = { path = "../../../tests/utils", optional = true }
+teaclave_file_agent            = { path = "../../../file_agent", optional = true }
 
 sgx_cov       = { version = "2.0.0", optional = true }
 
diff --git a/services/execution/enclave/src/ecall.rs b/services/execution/enclave/src/ecall.rs
new file mode 100644
index 00000000..a6a68d2d
--- /dev/null
+++ b/services/execution/enclave/src/ecall.rs
@@ -0,0 +1,55 @@
+// 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.
+
+use teaclave_binder::proto::{
+    ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, InitEnclaveInput, InitEnclaveOutput,
+    StartServiceInput, StartServiceOutput,
+};
+use teaclave_binder::{handle_ecall, register_ecall_handler};
+use teaclave_service_enclave_utils::ServiceEnclave;
+use teaclave_types::{TeeServiceError, TeeServiceResult};
+
+#[handle_ecall]
+fn handle_start_service(input: &StartServiceInput) -> TeeServiceResult<StartServiceOutput> {
+    match super::start_service(&input.config) {
+        Ok(_) => Ok(StartServiceOutput),
+        // terminate the enclave for executor
+        Err(e) => {
+            log::error!("Service shutdown, reason: {}", e);
+            Err(TeeServiceError::EnclaveForceTermination)
+        }
+    }
+}
+
+#[handle_ecall]
+fn handle_init_enclave(_: &InitEnclaveInput) -> TeeServiceResult<InitEnclaveOutput> {
+    ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
+    Ok(InitEnclaveOutput)
+}
+
+#[handle_ecall]
+fn handle_finalize_enclave(_: &FinalizeEnclaveInput) -> TeeServiceResult<FinalizeEnclaveOutput> {
+    ServiceEnclave::finalize()?;
+    Ok(FinalizeEnclaveOutput)
+}
+
+register_ecall_handler!(
+    type ECallCommand,
+    (ECallCommand::StartService, StartServiceInput, StartServiceOutput),
+    (ECallCommand::InitEnclave, InitEnclaveInput, InitEnclaveOutput),
+    (ECallCommand::FinalizeEnclave, FinalizeEnclaveInput, FinalizeEnclaveOutput),
+);
diff --git a/services/execution/enclave/src/ocall.rs b/services/execution/enclave/src/file_handler.rs
similarity index 82%
rename from services/execution/enclave/src/ocall.rs
rename to services/execution/enclave/src/file_handler.rs
index c542b124..d1c5e252 100644
--- a/services/execution/enclave/src/ocall.rs
+++ b/services/execution/enclave/src/file_handler.rs
@@ -15,28 +15,34 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use anyhow::ensure;
 use anyhow::Result;
+#[cfg(feature = "mesalock_sgx")]
 use sgx_types::error::SgxStatus;
 use teaclave_types::FileAgentRequest;
 
+#[cfg(feature = "mesalock_sgx")]
 extern "C" {
     fn ocall_handle_file_request(p_retval: *mut u32, in_buf: *const u8, in_len: u32) -> SgxStatus;
 }
 
-#[allow(dead_code)]
+#[cfg(feature = "mesalock_sgx")]
 pub(crate) fn handle_file_request(request: FileAgentRequest) -> Result<()> {
     let mut rt: u32 = 2;
     let bytes = serde_json::to_vec(&request)?;
     let buf_len = bytes.len();
     let res =
         unsafe { ocall_handle_file_request(&mut rt as _, bytes.as_ptr() as _, buf_len as u32) };
-
-    ensure!(res == SgxStatus::Success, "ocall sgx_error = {:?}", res);
-    ensure!(rt == 0, "ocall error = {:?}", rt);
+    anyhow::ensure!(res == SgxStatus::Success, "ocall sgx_error = {:?}", res);
+    anyhow::ensure!(rt == 0, "ocall error = {:?}", rt);
     Ok(())
 }
 
+#[cfg(not(feature = "mesalock_sgx"))]
+pub(crate) fn handle_file_request(request: FileAgentRequest) -> Result<()> {
+    let bytes = serde_json::to_vec(&request)?;
+    teaclave_file_agent::handle_file_request(&bytes)
+}
+
 #[cfg(feature = "enclave_unit_test")]
 pub mod tests {
     use super::*;
diff --git a/services/execution/enclave/src/lib.rs b/services/execution/enclave/src/lib.rs
index e9d9ce6d..7f092ce5 100644
--- a/services/execution/enclave/src/lib.rs
+++ b/services/execution/enclave/src/lib.rs
@@ -18,29 +18,25 @@
 #![feature(strict_provenance)]
 
 extern crate sgx_types;
-
+#[cfg(feature = "mesalock_sgx")]
 use std::untrusted::path::PathEx;
 
 use anyhow::{anyhow, ensure, Result};
-
 use log::info;
 use teaclave_attestation::{verifier, AttestationConfig, RemoteAttestation};
-use teaclave_binder::proto::{
-    ECallCommand, FinalizeEnclaveInput, FinalizeEnclaveOutput, InitEnclaveInput, InitEnclaveOutput,
-    StartServiceInput, StartServiceOutput,
-};
-use teaclave_binder::{handle_ecall, register_ecall_handler};
 use teaclave_config::build::{AS_ROOT_CA_CERT, AUDITOR_PUBLIC_KEYS};
 use teaclave_config::RuntimeConfig;
 use teaclave_service_enclave_utils::create_trusted_scheduler_endpoint;
-use teaclave_service_enclave_utils::ServiceEnclave;
-use teaclave_types::{EnclaveInfo, TeeServiceError, TeeServiceResult};
 
-mod ocall;
+use teaclave_types::EnclaveInfo;
+
+#[cfg(feature = "mesalock_sgx")]
+mod ecall;
+mod file_handler;
 mod service;
 mod task_file_manager;
 
-fn start_service(config: &RuntimeConfig) -> Result<()> {
+pub fn start_service(config: &RuntimeConfig) -> Result<()> {
     info!("Starting Execution...");
 
     let attestation_config = AttestationConfig::from_teaclave_config(config)?;
@@ -68,8 +64,10 @@ fn start_service(config: &RuntimeConfig) -> Result<()> {
 
     // We only create this base directory in test_mode
     // This directory should be mounted in release mode
-    #[cfg(test_mode)]
+    #[cfg(all(test_mode, feature = "mesalock_sgx"))]
     std::untrusted::fs::create_dir_all(&fusion_base)?;
+    #[cfg(all(test_mode, not(feature = "mesalock_sgx")))]
+    std::fs::create_dir_all(&fusion_base)?;
 
     ensure!(
         fusion_base.exists(),
@@ -84,37 +82,6 @@ fn start_service(config: &RuntimeConfig) -> Result<()> {
     service.start()
 }
 
-#[handle_ecall]
-fn handle_start_service(input: &StartServiceInput) -> TeeServiceResult<StartServiceOutput> {
-    match start_service(&input.config) {
-        Ok(_) => Ok(StartServiceOutput),
-        // terminate the enclave for executor
-        Err(e) => {
-            log::error!("Service shutdown, reason: {}", e);
-            Err(TeeServiceError::EnclaveForceTermination)
-        }
-    }
-}
-
-#[handle_ecall]
-fn handle_init_enclave(_: &InitEnclaveInput) -> TeeServiceResult<InitEnclaveOutput> {
-    ServiceEnclave::init(env!("CARGO_PKG_NAME"))?;
-    Ok(InitEnclaveOutput)
-}
-
-#[handle_ecall]
-fn handle_finalize_enclave(_: &FinalizeEnclaveInput) -> TeeServiceResult<FinalizeEnclaveOutput> {
-    ServiceEnclave::finalize()?;
-    Ok(FinalizeEnclaveOutput)
-}
-
-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 {
     use super::*;
@@ -122,7 +89,7 @@ pub mod tests {
 
     pub fn run_tests() -> bool {
         run_tests!(
-            ocall::tests::test_handle_file_request,
+            file_handler::tests::test_handle_file_request,
             service::tests::test_invoke_echo,
             service::tests::test_invoke_gbdt_train,
             task_file_manager::tests::test_input,
diff --git a/services/execution/enclave/src/task_file_manager.rs b/services/execution/enclave/src/task_file_manager.rs
index cf1de704..154fdd0f 100644
--- a/services/execution/enclave/src/task_file_manager.rs
+++ b/services/execution/enclave/src/task_file_manager.rs
@@ -15,12 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use crate::ocall::handle_file_request;
+use crate::file_handler::handle_file_request;
 use anyhow::Result;
 use std::collections::HashMap;
+#[cfg(not(feature = "mesalock_sgx"))]
+use std::fs;
 use std::path::Path;
 use std::path::PathBuf;
-use std::untrusted::path::PathEx;
+#[cfg(feature = "mesalock_sgx")]
+use std::untrusted::{fs, path::PathEx};
 use teaclave_crypto::TeaclaveFile128Key;
 use teaclave_types::*;
 use url::Url;
@@ -117,7 +120,7 @@ impl InterInput {
         let dst = &self.staged_path;
         let staged_file_info = match self.file.crypto_info {
             FileCrypto::TeaclaveFile128(crypto) => {
-                std::untrusted::fs::soft_link(src, dst)?;
+                std::os::unix::fs::symlink(src, dst)?;
                 StagedFileInfo::new(src, crypto, self.file.cmac)
             }
             FileCrypto::AesGcm128(crypto) => {
@@ -288,7 +291,7 @@ fn make_staged_path(base: impl AsRef<Path>, funiq_key: &str, url: &Url) -> Resul
     let staged_dir = format!("{}-{}", funiq_key, "staged");
     let file_dir = base.as_ref().to_owned().join(&staged_dir);
     if !file_dir.exists() {
-        std::untrusted::fs::create_dir_all(&file_dir)?;
+        fs::create_dir_all(&file_dir)?;
     }
     let local_dest = file_dir.join(original_name);
     Ok(local_dest)
@@ -303,7 +306,7 @@ fn make_intermediate_path(base: impl AsRef<Path>, funiq_key: &str, url: &Url) ->
 
     let file_dir = base.as_ref().to_owned().join(funiq_key);
     if !file_dir.exists() {
-        std::untrusted::fs::create_dir_all(&file_dir)?;
+        fs::create_dir_all(&file_dir)?;
     }
     let local_dest = file_dir.join(original_name);
     Ok(local_dest)
diff --git a/services/proto/Cargo.toml b/services/proto/Cargo.toml
index b480c4bb..d0f8783a 100644
--- a/services/proto/Cargo.toml
+++ b/services/proto/Cargo.toml
@@ -25,6 +25,11 @@ edition = "2021"
 
 [features]
 default = []
+app = [
+    "teaclave_types/app",
+    "teaclave_rpc/app",
+    "teaclave_crypto/app",
+]
 mesalock_sgx = [
     "teaclave_types/mesalock_sgx",
     "teaclave_rpc/mesalock_sgx",
diff --git a/services/storage/enclave/src/lib.rs b/services/storage/enclave/src/lib.rs
index 948bd8af..dabe7859 100644
--- a/services/storage/enclave/src/lib.rs
+++ b/services/storage/enclave/src/lib.rs
@@ -109,8 +109,7 @@ fn start_service(config: &RuntimeConfig) -> Result<()> {
 #[cfg(not(test_mode))]
 pub(crate) fn create_teaclave_db() -> DB {
     let opt = rusty_leveldb::in_memory();
-    let database = DB::open("teaclave_db", opt).expect("cannot open teaclave_db");
-    database
+    DB::open("teaclave_db", opt).expect("cannot open teaclave_db")
 }
 
 #[cfg(test_mode)]
diff --git a/services/utils/service_enclave_utils/Cargo.toml b/services/utils/service_enclave_utils/Cargo.toml
index 012f2f2f..670f6202 100644
--- a/services/utils/service_enclave_utils/Cargo.toml
+++ b/services/utils/service_enclave_utils/Cargo.toml
@@ -30,6 +30,11 @@ mesalock_sgx = [
     "teaclave_attestation/mesalock_sgx",
     "teaclave_rpc/mesalock_sgx",
 ]
+libos = [ 
+    "teaclave_attestation/libos",
+    "teaclave_rpc/app",
+    "teaclave_types/app",
+]
 cov = ["sgx_cov", "sgx_macros"]
 
 [dependencies]
diff --git a/services/utils/service_enclave_utils/src/lib.rs b/services/utils/service_enclave_utils/src/lib.rs
index 3be3e4bf..0c16a4eb 100644
--- a/services/utils/service_enclave_utils/src/lib.rs
+++ b/services/utils/service_enclave_utils/src/lib.rs
@@ -23,17 +23,18 @@ extern crate sgx_trts;
 use anyhow::Result;
 use log::debug;
 use log::error;
-use std::backtrace;
+#[cfg(not(feature = "mesalock_sgx"))]
+use std::fs;
 use std::path::PathBuf;
 use std::sync::{Arc, RwLock};
 #[cfg(feature = "mesalock_sgx")]
-use std::untrusted::path::PathEx;
+use std::untrusted::{fs, path::PathEx};
 use teaclave_attestation::verifier::AttestationReportVerificationFn;
 use teaclave_attestation::AttestedTlsConfig;
 use teaclave_config::RuntimeConfig;
 use teaclave_rpc::config::SgxTrustedTlsClientConfig;
 use teaclave_rpc::endpoint::Endpoint;
-use teaclave_types::{EnclaveInfo, TeeServiceError, TeeServiceResult};
+use teaclave_types::{EnclaveInfo, TeeServiceResult};
 
 mod macros;
 
@@ -62,10 +63,10 @@ impl ServiceEnclave {
             .init();
 
         debug!("Enclave initializing");
-
-        if backtrace::enable_backtrace(backtrace::PrintFormat::Full).is_err() {
+        #[cfg(feature = "mesalock_sgx")]
+        if std::backtrace::enable_backtrace(std::backtrace::PrintFormat::Full).is_err() {
             error!("Cannot enable backtrace");
-            return Err(TeeServiceError::SgxError);
+            return Err(teaclave_types::TeeServiceError::SgxError);
         }
 
         Ok(())
@@ -98,7 +99,7 @@ fn base_dir(config: &RuntimeConfig, sub_name: &str) -> Result<PathBuf> {
     // We only create this base directory in test_mode
     // This directory should be mounted in release mode
     #[cfg(test_mode)]
-    std::untrusted::fs::create_dir_all(fusion_base)?;
+    fs::create_dir_all(fusion_base)?;
     if !fusion_base.exists() {
         error!(
             "Fusion base directory is not mounted: {}",
@@ -108,7 +109,7 @@ fn base_dir(config: &RuntimeConfig, sub_name: &str) -> Result<PathBuf> {
     }
 
     let sub_base = fusion_base.join(sub_name);
-    std::untrusted::fs::create_dir_all(&sub_base)?;
+    fs::create_dir_all(&sub_base)?;
 
     if !sub_base.exists() {
         error!(
diff --git a/worker/Cargo.toml b/worker/Cargo.toml
index 8de9a842..b21c7310 100644
--- a/worker/Cargo.toml
+++ b/worker/Cargo.toml
@@ -29,6 +29,11 @@ crate-type = ["staticlib", "rlib"]
 
 [features]
 default = []
+app = [
+  "teaclave_types/app",
+  "teaclave_executor/app",
+  "teaclave_runtime/app"
+]
 mesalock_sgx = [
   "teaclave_types/mesalock_sgx",
   "teaclave_executor/mesalock_sgx",
diff --git a/worker/src/worker.rs b/worker/src/worker.rs
index 4334dbef..5a15ffbf 100644
--- a/worker/src/worker.rs
+++ b/worker/src/worker.rs
@@ -15,7 +15,6 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#[cfg(feature = "mesalock_sgx")]
 use std::collections::HashMap;
 use std::format;
 
@@ -50,7 +49,7 @@ impl Default for Worker {
         });
 
         // Register supported executors
-        #[cfg(executor_mesapy)]
+        #[cfg(all(executor_mesapy, not(feature = "app")))]
         worker.register_executor((ExecutorType::Python, Executor::MesaPy), || {
             Box::<MesaPy>::default()
         });


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org