1. Add Occlum.json as Occlum's config file 2. Add tools/bin/build_enclave 3. Add tools/bin/protect_integrity 4. Validate Occlum.json.protected on LibOS startup 5. Parse Occlum.json.protected on LibOS startup 6. Config enclave size using Occlum.json 7. Config process memory sizes using Occlum.json
205 lines
6.5 KiB
Makefile
205 lines
6.5 KiB
Makefile
######## SGX SDK Settings ########
|
|
|
|
SGX_SDK ?= /opt/intel/sgxsdk
|
|
SGX_MODE ?= HW
|
|
SGX_ARCH ?= x64
|
|
SGX_DEBUG ?= 1
|
|
|
|
ifeq ($(shell getconf LONG_BIT), 32)
|
|
SGX_ARCH := x86
|
|
else ifeq ($(findstring -m32, $(CXXFLAGS)), -m32)
|
|
SGX_ARCH := x86
|
|
endif
|
|
|
|
ifeq ($(SGX_ARCH), x86)
|
|
SGX_COMMON_CFLAGS := -m32
|
|
SGX_LIBRARY_PATH := $(SGX_SDK)/lib
|
|
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x86/sgx_sign
|
|
SGX_EDGER8R := $(SGX_SDK)/bin/x86/sgx_edger8r
|
|
else
|
|
SGX_COMMON_CFLAGS := -m64
|
|
SGX_LIBRARY_PATH := $(SGX_SDK)/lib64
|
|
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x64/sgx_sign
|
|
SGX_EDGER8R := $(SGX_SDK)/bin/x64/sgx_edger8r
|
|
endif
|
|
|
|
ifeq ($(SGX_DEBUG), 1)
|
|
ifeq ($(SGX_PRERELEASE), 1)
|
|
$(error Cannot set SGX_DEBUG and SGX_PRERELEASE at the same time!!)
|
|
endif
|
|
endif
|
|
|
|
SGX_COMMON_CFLAGS += -Wall -Wno-unused-result
|
|
|
|
ifeq ($(SGX_DEBUG), 1)
|
|
SGX_COMMON_CFLAGS += -O2 -g
|
|
else
|
|
SGX_COMMON_CFLAGS += -O2
|
|
endif
|
|
|
|
######## App Settings ########
|
|
|
|
ifneq ($(SGX_MODE), HW)
|
|
Urts_Library_Name := sgx_urts_sim
|
|
else
|
|
Urts_Library_Name := sgx_urts
|
|
endif
|
|
|
|
App_Cpp_Files := App/App.cpp
|
|
App_Include_Paths := -IInclude -IApp -I$(SGX_SDK)/include
|
|
|
|
App_C_Flags := $(SGX_COMMON_CFLAGS) -fPIC -Wno-attributes $(App_Include_Paths)
|
|
|
|
# Three configuration modes - Debug, prerelease, release
|
|
# Debug - Macro DEBUG enabled.
|
|
# Prerelease - Macro NDEBUG and EDEBUG enabled.
|
|
# Release - Macro NDEBUG enabled.
|
|
ifeq ($(SGX_DEBUG), 1)
|
|
App_C_Flags += -DDEBUG -UNDEBUG -UEDEBUG
|
|
else ifeq ($(SGX_PRERELEASE), 1)
|
|
App_C_Flags += -DNDEBUG -DEDEBUG -UDEBUG
|
|
else
|
|
App_C_Flags += -DNDEBUG -UEDEBUG -UDEBUG
|
|
endif
|
|
|
|
App_Cpp_Flags := $(App_C_Flags) -std=c++11
|
|
App_Link_Flags := $(SGX_COMMON_CFLAGS) -L$(SGX_LIBRARY_PATH) -l$(Urts_Library_Name) -lsgx_uprotected_fs -lpthread
|
|
|
|
ifneq ($(SGX_MODE), HW)
|
|
App_Link_Flags += -lsgx_uae_service_sim
|
|
else
|
|
App_Link_Flags += -lsgx_uae_service
|
|
endif
|
|
|
|
App_Cpp_Objects := $(App_Cpp_Files:.cpp=.o)
|
|
|
|
App_Name := protect-integrity
|
|
|
|
######## Enclave Settings ########
|
|
|
|
ifneq ($(SGX_MODE), HW)
|
|
Trts_Library_Name := sgx_trts_sim
|
|
Service_Library_Name := sgx_tservice_sim
|
|
else
|
|
Trts_Library_Name := sgx_trts
|
|
Service_Library_Name := sgx_tservice
|
|
endif
|
|
Crypto_Library_Name := sgx_tcrypto
|
|
|
|
Enclave_Cpp_Files := Enclave/Enclave.cpp
|
|
Enclave_C_Files :=
|
|
Enclave_Include_Paths := -IInclude -IEnclave -I$(SGX_SDK)/include -I$(SGX_SDK)/include/tlibc -I$(SGX_SDK)/include/stlport
|
|
|
|
Enclave_C_Flags := $(SGX_COMMON_CFLAGS) -nostdinc -fvisibility=hidden -fpie -fPIC -fstack-protector $(Enclave_Include_Paths)
|
|
Enclave_Cpp_Flags := $(Enclave_C_Flags) -std=c++03 -nostdinc++
|
|
|
|
# To generate a proper enclave, it is recommended to follow below guideline to link the trusted libraries:
|
|
# 1. Link sgx_trts with the `--whole-archive' and `--no-whole-archive' options,
|
|
# so that the whole content of trts is included in the enclave.
|
|
# 2. For other libraries, you just need to pull the required symbols.
|
|
# Use `--start-group' and `--end-group' to link these libraries.
|
|
# Do NOT move the libraries linked with `--start-group' and `--end-group' within `--whole-archive' and `--no-whole-archive' options.
|
|
# Otherwise, you may get some undesirable errors.
|
|
Enclave_Link_Flags := $(SGX_COMMON_CFLAGS) -Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_LIBRARY_PATH) \
|
|
-Wl,--whole-archive -l$(Trts_Library_Name) -Wl,--no-whole-archive \
|
|
-Wl,--start-group -lsgx_tstdc -lsgx_tcxx -lsgx_tprotected_fs -l$(Crypto_Library_Name) -l$(Service_Library_Name) -Wl,--end-group \
|
|
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \
|
|
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic \
|
|
-Wl,--defsym,__ImageBase=0 \
|
|
-Wl,--version-script=Enclave/Enclave.lds
|
|
|
|
Enclave_Cpp_Objects := $(Enclave_Cpp_Files:.cpp=.o)
|
|
Enclave_C_Objects := $(Enclave_C_Files:.c=.o)
|
|
|
|
Enclave_Name := protect-integrity-enclave.so
|
|
Signed_Enclave_Name := protect-integrity-enclave.signed.so
|
|
Enclave_Config_File := Enclave/Enclave.config.xml
|
|
|
|
ifeq ($(SGX_MODE), HW)
|
|
ifneq ($(SGX_DEBUG), 1)
|
|
ifneq ($(SGX_PRERELEASE), 1)
|
|
Build_Mode = HW_RELEASE
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
|
|
.PHONY: all run
|
|
|
|
ifeq ($(Build_Mode), HW_RELEASE)
|
|
all: $(App_Name) $(Enclave_Name)
|
|
@echo "The project has been built in release hardware mode."
|
|
@echo "Please sign the $(Enclave_Name) first with your signing key before you run the $(App_Name) to launch and access the enclave."
|
|
@echo "To sign the enclave use the command:"
|
|
@echo " $(SGX_ENCLAVE_SIGNER) sign -key <your key> -enclave $(Enclave_Name) -out <$(Signed_Enclave_Name)> -config $(Enclave_Config_File)"
|
|
@echo "You can also sign the enclave using an external signing tool."
|
|
@echo "To build the project in simulation mode set SGX_MODE=SIM. To build the project in prerelease mode set SGX_PRERELEASE=1 and SGX_MODE=HW."
|
|
else
|
|
|
|
all: $(App_Name) $(Signed_Enclave_Name)
|
|
|
|
endif
|
|
|
|
|
|
######## App Objects ########
|
|
|
|
App/Enclave_u.c: $(SGX_EDGER8R) Enclave/Enclave.edl
|
|
@cd App && $(SGX_EDGER8R) --untrusted ../Enclave/Enclave.edl --search-path ../Enclave --search-path $(SGX_SDK)/include
|
|
@echo "GEN => $@"
|
|
|
|
App/Enclave_u.o: App/Enclave_u.c
|
|
@$(CC) $(App_C_Flags) -c $< -o $@
|
|
@echo "CC <= $<"
|
|
|
|
App/%.o: App/%.cpp
|
|
@$(CXX) $(App_Cpp_Flags) -c $< -o $@
|
|
@echo "CXX <= $<"
|
|
|
|
$(App_Name): App/Enclave_u.o $(App_Cpp_Objects)
|
|
@$(CXX) $^ -o $@ $(App_Link_Flags)
|
|
@cp $(App_Name) ../bin/
|
|
@echo "LINK => $@"
|
|
|
|
|
|
######## Enclave Objects ########
|
|
|
|
Enclave/Enclave_t.c: $(SGX_EDGER8R) Enclave/Enclave.edl
|
|
@cd Enclave && $(SGX_EDGER8R) --trusted ../Enclave/Enclave.edl --search-path ../Enclave --search-path $(SGX_SDK)/include
|
|
@echo "GEN => $@"
|
|
|
|
Enclave/Enclave_t.o: Enclave/Enclave_t.c
|
|
@$(CC) $(Enclave_C_Flags) -c $< -o $@
|
|
@echo "CC <= $<"
|
|
|
|
$(Enclave_Cpp_Objects): Enclave/%.o: Enclave/%.cpp
|
|
@$(CXX) $(Enclave_Cpp_Flags) -c $< -o $@
|
|
@echo "CXX <= $<"
|
|
|
|
$(Enclave_C_Objects): Enclave/%.o: Enclave/%.c
|
|
@$(CC) $(Enclave_C_Flags) -c $< -o $@
|
|
@echo "CC <= $<"
|
|
|
|
$(Enclave_Name): Enclave/Enclave_t.o $(Enclave_Cpp_Objects) $(Enclave_C_Objects)
|
|
$(CXX) $^ -o $@ $(Enclave_Link_Flags)
|
|
@echo "LINK => $@"
|
|
|
|
$(Signed_Enclave_Name): $(Enclave_Name)
|
|
@$(SGX_ENCLAVE_SIGNER) sign -key Enclave/Enclave_private.pem -enclave $(Enclave_Name) -out $@ -config $(Enclave_Config_File)
|
|
@cp $(Signed_Enclave_Name) ../bin/
|
|
@echo "SIGN => $@"
|
|
|
|
.PHONY: test
|
|
test: all random.txt
|
|
./protect-integrity protect random.txt
|
|
./protect-integrity show random.txt.protected > random.txt.unprotected
|
|
./protect-integrity show-mac random.txt.protected
|
|
diff random.txt random.txt.unprotected
|
|
@echo "Pass ^_^"
|
|
|
|
random.txt:
|
|
@base64 /dev/urandom | head -c 10000000 > random.txt
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
@rm -f $(App_Name) $(Enclave_Name) $(Signed_Enclave_Name) $(App_Cpp_Objects) App/Enclave_u.* $(Enclave_Cpp_Objects) $(Enclave_C_Objects) Enclave/Enclave_t.* *.test.txt random.txt*
|