diff --git a/dockerfile/Dockerfile b/dockerfile/Dockerfile index e32585f9..b8feecc1 100644 --- a/dockerfile/Dockerfile +++ b/dockerfile/Dockerfile @@ -13,6 +13,8 @@ RUN apt-get update && \ && rm -rf /var/lib/apt/lists/* RUN /root/.cargo/bin/rustup target add wasm32-unknown-unknown && \ + /root/.cargo/bin/rustup component add rustfmt && \ + /root/.cargo/bin/cargo install bindgen cargo-audit && \ rm -rf /root/.cargo/registry && rm -rf /root/.cargo/git diff --git a/enigma-core/Makefile b/enigma-core/Makefile index 4dc55d37..e7b2ff9a 100644 --- a/enigma-core/Makefile +++ b/enigma-core/Makefile @@ -139,7 +139,7 @@ $(Signed_RustEnclave_Name): $(RustEnclave_Name) @echo "SIGN => $@" .PHONY: enclave -enclave: +enclave: $(Enclave_EDL_Files) mkdir -p ./lib $(MAKE) -C ./enclave/ CARGO_FLAGS=$(App_Rust_Flags) Rust_target_dir=$(Rust_target_dir) diff --git a/enigma-core/enclave/Makefile b/enigma-core/enclave/Makefile index 55359a30..718b8f16 100644 --- a/enigma-core/enclave/Makefile +++ b/enigma-core/enclave/Makefile @@ -1,10 +1,19 @@ +# Because build-dependencies and regular dependencies are mixed together it's not possible to import +# bindgen into the enclave's build.rs (https://github.com/rust-lang/cargo/issues/2589) +# The solution is to install the bindgen CLI in the docker and use it manually in the Makefile. Rust_Enclave_Name := libenclave.a Rust_Enclave_Files := $(wildcard src/*.rs) -.PHONY: all +BINDGEN_OUTPUT_FILE := src/auto_ffi.rs +BINDGEN_RAW_LINES := "\#![allow(dead_code)] use enigma_types::*; use sgx_types::*;" +BINDGEN_CLANG_FLAGS := -I/opt/sgxsdk/include -I$(HOME)/sgx/edl +BINDGEN_FLAGS := --default-enum-style=rust --rust-target=nightly \ + --no-recursive-whitelist --use-array-pointers-in-arguments \ + --whitelist-function ocall_.* --raw-line $(BINDGEN_RAW_LINES) -all: $(Rust_Enclave_Name) + +all: bindgen $(Rust_Enclave_Name) $(Rust_Enclave_Name): $(Rust_Enclave_Files) ifeq ($(XARGO_SGX), 1) @@ -13,4 +22,11 @@ ifeq ($(XARGO_SGX), 1) else cargo build $(CARGO_FLAGS) cp ./target/$(Rust_target_dir)/libenigmacoreenclave.a ../lib/libenclave.a -endif \ No newline at end of file +endif + + +.PHONY: bindgen +bindgen: Enclave_t.h + cargo build -p enigma-types # Meant to make sure `enigma-types.h` already exists and can be included. + bindgen Enclave_t.h $(BINDGEN_FLAGS) -- $(BINDGEN_CLANG_FLAGS) > $(BINDGEN_OUTPUT_FILE) + rustfmt $(BINDGEN_OUTPUT_FILE) \ No newline at end of file diff --git a/enigma-core/enclave/src/auto_ffi.rs b/enigma-core/enclave/src/auto_ffi.rs new file mode 100644 index 00000000..f167b06c --- /dev/null +++ b/enigma-core/enclave/src/auto_ffi.rs @@ -0,0 +1,46 @@ +// automatically generated by rust-bindgen + +#![allow(dead_code)] +use enigma_types::*; +use sgx_types::*; + +extern "C" { + pub fn ocall_get_home(output: *mut u8, result_length: *mut usize) -> sgx_status_t; +} +extern "C" { + pub fn ocall_update_state( + retval: *mut EnclaveReturn, db_ptr: *const RawPointer, contract_address: *const ContractAddress, enc_state: *const u8, + len: usize, + ) -> sgx_status_t; +} +extern "C" { + pub fn ocall_new_delta( + retval: *mut EnclaveReturn, db_ptr: *const RawPointer, enc_delta: *const u8, len: usize, + contract_address: *const ContractAddress, delta_index: *mut u32, + ) -> sgx_status_t; +} +extern "C" { + pub fn ocall_save_to_memory(retval: *mut u64, data_ptr: *const u8, data_len: usize) -> sgx_status_t; +} +extern "C" { + pub fn ocall_get_deltas_sizes( + retval: *mut EnclaveReturn, db_ptr: *const RawPointer, addr: *const ContractAddress, start: *const u32, end: *const u32, + res_ptr: *mut usize, res_len: usize, + ) -> sgx_status_t; +} +extern "C" { + pub fn ocall_get_deltas( + retval: *mut EnclaveReturn, db_ptr: *const RawPointer, addr: *const ContractAddress, start: *const u32, end: *const u32, + res_ptr: *mut u8, res_len: usize, + ) -> sgx_status_t; +} +extern "C" { + pub fn ocall_get_state_size( + retval: *mut EnclaveReturn, db_ptr: *const RawPointer, addr: *const ContractAddress, state_size: *mut usize, + ) -> sgx_status_t; +} +extern "C" { + pub fn ocall_get_state( + retval: *mut EnclaveReturn, db_ptr: *const RawPointer, addr: *const ContractAddress, state_pt: *mut u8, state_len: usize, + ) -> sgx_status_t; +}