diff --git a/docs/zh/docs/secGear/figures/BJCA_Crypto_Module.png b/docs/zh/docs/secGear/figures/BJCA_Crypto_Module.png new file mode 100644 index 0000000000000000000000000000000000000000..68850639553841299d65c3a666a0b57cfa5500dc Binary files /dev/null and b/docs/zh/docs/secGear/figures/BJCA_Crypto_Module.png differ diff --git a/docs/zh/docs/secGear/figures/Mindspore.png b/docs/zh/docs/secGear/figures/Mindspore.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e415062b7474fb4a5a1d4d02af2f16796da8b7 Binary files /dev/null and b/docs/zh/docs/secGear/figures/Mindspore.png differ diff --git a/docs/zh/docs/secGear/figures/Mindspore_original.png b/docs/zh/docs/secGear/figures/Mindspore_original.png new file mode 100644 index 0000000000000000000000000000000000000000..7812fd1803ceccb4b7a0e9b4debe6833f1a77280 Binary files /dev/null and b/docs/zh/docs/secGear/figures/Mindspore_original.png differ diff --git a/docs/zh/docs/secGear/figures/architecture.png b/docs/zh/docs/secGear/figures/architecture.png deleted file mode 100644 index 9f2f15ebaa8404ae10cd770b514b7efa78c7538d..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/secGear/figures/architecture.png and /dev/null differ diff --git a/docs/zh/docs/secGear/figures/develop_step.png b/docs/zh/docs/secGear/figures/develop_step.png new file mode 100644 index 0000000000000000000000000000000000000000..4241739df0bcd015dc1589f023d5d1d44f839438 Binary files /dev/null and b/docs/zh/docs/secGear/figures/develop_step.png differ diff --git a/docs/zh/docs/secGear/figures/openLooKeng.png b/docs/zh/docs/secGear/figures/openLooKeng.png new file mode 100644 index 0000000000000000000000000000000000000000..2f810818c55f7913a95abfa0a7a4a7136b0d7a93 Binary files /dev/null and b/docs/zh/docs/secGear/figures/openLooKeng.png differ diff --git a/docs/zh/docs/secGear/figures/secGear_arch.png b/docs/zh/docs/secGear/figures/secGear_arch.png new file mode 100644 index 0000000000000000000000000000000000000000..d7639d138ddbcd154860fce45460e4d256b376a2 Binary files /dev/null and b/docs/zh/docs/secGear/figures/secGear_arch.png differ diff --git a/docs/zh/docs/secGear/figures/secret_gaussdb.png b/docs/zh/docs/secGear/figures/secret_gaussdb.png new file mode 100644 index 0000000000000000000000000000000000000000..05ab4c1b649751a76cdd0db9d47eefe57c44f180 Binary files /dev/null and b/docs/zh/docs/secGear/figures/secret_gaussdb.png differ diff --git a/docs/zh/docs/secGear/secGear.md b/docs/zh/docs/secGear/secGear.md index c2bbd422a3a315005adfed7768acb1f6439a8377..2717afebe51fd5ea7e82a3f0b8245ffa634c85bd 100644 --- a/docs/zh/docs/secGear/secGear.md +++ b/docs/zh/docs/secGear/secGear.md @@ -1,3 +1,5 @@ # secGear 开发指南 -本文档介绍如何使用 secGear 统一机密计算编程框架开发应用程序,以及所包含工具的使用方法。 \ No newline at end of file +本文档介绍openEuler机密计算统一开发框架secGear的架构、特性、安装、开发指导、落地应用场景等,帮助用户快速了解并使用secGear。 + +本文档适用于使用openEuler系统并希望了解和使用secGear的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。 \ No newline at end of file diff --git "a/docs/zh/docs/secGear/\344\275\277\347\224\250switchless\347\211\271\346\200\247.md" "b/docs/zh/docs/secGear/\344\275\277\347\224\250switchless\347\211\271\346\200\247.md" deleted file mode 100644 index 8cd59bac537143487bdc798cbfc95eba38ed8e5d..0000000000000000000000000000000000000000 --- "a/docs/zh/docs/secGear/\344\275\277\347\224\250switchless\347\211\271\346\200\247.md" +++ /dev/null @@ -1,499 +0,0 @@ -# 使用switchless特性 - -## switchless特性介绍 -**技术定义:** switchless是一种通过共享内存减少REE与TEE上下文切换及数据拷贝次数,优化REE与TEE交互性能的技术。 - - **典型应用场景:** 传统应用做机密计算改造拆分成非安全侧CA与安全侧TA后 - -- 当CA业务逻辑中存在频繁调用TA接口时,调用中间过程耗时占比较大,严重影响业务性能。 -- 当CA与TA存在频繁大块数据交换时,普通ECALL调用底层会有多次内存拷贝,导致性能低下。 - 针对以上两种典型场景,可以通过switchless优化交互性能,降低机密计算拆分带来的性能损耗,最佳效果可达到与拆分前同等数量级。 - - **支持硬件平台:** - -- Intel SGX -- ARM TrustZone 鲲鹏920 - -## 约束限制 -虽然开启switchless节省了一定时间,但它们需要额外的线程来为调用提供服务。如果工作线程忙于等待消息,将会消耗大量CPU,另外更多的工作线程通常意味着更多的CPU资源竞争和更多的线程上下文切换,反而可能损害性能,所以switchless的最佳配置是经过实际业务模型与性能测试,在资源占用与性能要求中选出平衡点。 - -##特性配置项规格 -用户调用cc_enclave_create创建Enclave时,需在feature参数中传入switchless的特性配置,配置项如下: -``` -typedef struct _cc_sl_config_t { - uint32_t num_uworkers; - uint32_t num_tworkers; - uint32_t switchless_calls_pool_size; - uint32_t retries_before_fallback; - uint32_t retries_before_sleep; - uint32_t parameter_num; -} cc_sl_config_t; -``` -各配置项规格如下表: - -| 配置项 | 说明 | -| ------------ | ---- | -| num_uworkers | 非安全侧代理工作线程数,用于执行switchless OCALL,当前该字段仅在SGX平台生效,ARM平台可以配置,但是因ARM平台暂不支持OCALL,所以配置后不会生效。
规格:
ARM:最大值:512;最小值:1;默认值:8(当num_uworkers配置为0时,会使用默认参数)
SGX:最大值:4294967295;最小值:1| -| num_tworkers | 安全侧代理工作线程数,用于执行switchless ECALL。
规格:
ARM:最大值:512;最小值:1;默认值:8(当num_tworkers配置为0时,会使用默认参数)
SGX:最大值:4294967295;最小值:1| -| switchless_calls_pool_size | switchless调用任务池的大小,实际可容纳switchless_calls_pool_size * 64个switchless调用任务(例:switchless_calls_pool_size=1,可容纳64个switchless调用任务)。
规格:
ARM:最大值:8;最小值:1;默认值:1(配置为0时)
SGX:最大值:8;最小值:1;默认值:1(当switchless_calls_pool_size配置为0时,会使用默认参数)| -| retries_before_fallback | 执行retries_before_fallback次汇编pause指令后,若switchless调用仍没有被另一侧的代理工作线程执行,就回退到switch调用模式,该字段仅在SGX平台生效。
规格:
SGX:最大值:4294967295;最小值:1;默认值:20000(当retries_before_fallback配置为0时,会使用默认参数)| -| retries_before_sleep | 执行retries_before_sleep次汇编pause指令后,若代理工作线程一直没有等到有任务来,则进入休眠状态,该字段仅在SGX平台生效。
规格:
SGX:最大值:4294967295;最小值:1;默认值:20000(当retries_before_sleep配置为0时,会使用默认参数)| -| parameter_num | switchless函数支持的最大参数个数,该字段仅在ARM平台生效,SGX平台无此限制。
规格:
ARM:最大值:16;最小值:0| - -## switchless开发流程 - -这里给出使用 switchless 特性开发一个 C 语言程序 switchless 的例子,方便用户理解使用 switchless 开发应用程序。 - -基于secGear API开发应用的具体流程请参考[开发secGear应用程序.md](./开发secGear应用程序.md) - -1. 编写 EDL(Enclave Definition Language)文件 - - switchless 函数需添加'transition_using_threads'标识。 - - ```c - enclave { - include "secgear_urts.h" - from "secgear_tstdc.edl" import *; - from "secgear_tswitchless.edl" import *; - trusted { - public int get_string_switchless([out, size=32]char *buf) transition_using_threads; - }; - }; - ``` - -2. 编写顶层文件 CMakeLists.txt - - 编写顶层文件 CMakeLists.txt,置于 switchless 工作目录下,用于配置编译时的处理器架构、所需的 EDL 文件等信息。 - - 其中,EDL_FILE 是 EDL 文件,需用户指定,例子中为 switchless.edl。DPATH 是安全侧加载动态库,配置如例子中所示。 - - ```c - cmake_minimum_required(VERSION 3.10 FATAL_ERROR) - - project(switchless C) - - set(CMAKE_C_STANDARD 99) - - if (NOT DEFINED ENCLAVE) - set(ENCLAVE "SGX") - endif() - set(SGX_SDK_DEFAULT_PATH /opt/intel/sgxsdk) - set(GP_SDK_DEFAULT_PATH /opt/itrustee_sdk) - set(PL_SDK_DEFAULT_PATH /root/dev/sdk) - - set(SGX_SSL_DEFAULT_PATH /opt/intel/sgxssl) - set(GP_SSL_DEFAULT_PATH /opt/itrustee_sdk/itrustee_sdk_ssl) - - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) - - if(${ENCLAVE} STREQUAL "GP") - if (NOT DEFINED SDK_PATH) - set(iTrusteeSDK ${GP_SDK_DEFAULT_PATH}) - else() - set(iTrusteeSDK ${SDK_PATH}) - endif() - message("Current Platform: ARM Trustzone, iTrustee SDK PATH:${iTrusteeSDK}") - if(NOT IS_DIRECTORY ${iTrusteeSDK}) - message(FATAL_ERROR "Please provide the correct iTrusteeSDK path") - endif() - set(CC_GP ON) - endif() - - if(${ENCLAVE} STREQUAL "SGX") - if (NOT DEFINED SDK_PATH) - set(SGXSDK ${SGX_SDK_DEFAULT_PATH}) - else() - set(SGXSDK ${SDK_PATH}) - endif() - message("Current Platform: Intel SGX, SGX SDK PATH:${SGXSDK}") - if(NOT IS_DIRECTORY ${SGXSDK}) - message(FATAL_ERROR "Please provide the correct SGXSDK path") - endif() - set(CC_SGX ON) - endif() - - if(${ENCLAVE} STREQUAL "PL") - if (NOT DEFINED SDK_PATH) - set(PLSDK ${PL_SDK_DEFAULT_PATH}) - else() - set(PLSDK ${SDK_PATH}) - endif() - message("Current Platform: RISC-V, Penglai SDK PATH:${PLSDK}") - if(NOT IS_DIRECTORY ${PLSDK}) - message(FATAL_ERROR "Please provide the correct Penglai SDK path") - endif() - set(CC_PL ON) - endif() - - set(CURRENT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) - - #set edl name - set(EDL_FILE switchless.edl) - set(CODEGEN codegen) - - if(CC_GP) - set(CODETYPE trustzone) - set(UUID ebc87fc2-05dc-41b3-85b9-f9f0ef481bad) - add_definitions(-DPATH="${LOCAL_ROOT_PATH_INSTALL}/data/${UUID}.sec") - endif() - - if(CC_SGX) - set(CODETYPE sgx) - add_definitions(-DPATH="${CMAKE_CURRENT_BINARY_DIR}/enclave/enclave.signed.so") - endif() - - add_subdirectory(${CURRENT_ROOT_PATH}/enclave) - add_subdirectory(${CURRENT_ROOT_PATH}/host) - - ``` - -3. 编写非安全侧代码和 CMakeLists.txt - - 4.1 编写 main.c - - 使用 cc_enclave_create 创建安全区 enclave 上下文时,需在 features 参数中传入 switchless 特性配置。使能 switchless 特性的主要工作有:创建任务池,大小由配置中的 switchless_call_pool_size 决定;根据 num_uworkers / num_tworkers 创建 Untrust / Trust 工作线程池等。 - - ```c - #include - #include - #include - #include - #include - #include "enclave.h" - #include "secgear_uswitchless.h" - #include "secgear_shared_memory.h" - #include "switchless_u.h" - - #define BUF_LEN 32 - - int main() - { - int retval = 0; - char *path = PATH; - char buf[BUF_LEN]; - cc_enclave_t *context = NULL; - context = (cc_enclave_t *)malloc(sizeof(cc_enclave_t)); - cc_enclave_result_t res = CC_FAIL; - char real_p[PATH_MAX]; - - /* switchless configuration */ - cc_sl_config_t sl_cfg = CC_USWITCHLESS_CONFIG_INITIALIZER; - sl_cfg.num_tworkers = 2; /* 2 tworkers */ - sl_cfg.sl_call_pool_size_qwords = 2; /* 2 * 64 tasks */ - enclave_features_t features = {ENCLAVE_FEATURE_SWITCHLESS, (void *)&sl_cfg}; - - res = cc_enclave_create(real_p, AUTO_ENCLAVE_TYPE, 0, SECGEAR_DEBUG_FLAG, &features, 1, context); - ... - - char *shared_buf = (char *)cc_malloc_shared_memory(context, BUF_LEN); - ... - - /* switchless ecall */ - res = get_string_switchless(context, &retval, shared_buf); - if (res != CC_SUCCESS || retval != (int)CC_SUCCESS) { - printf("Switchless ecall error\n"); - } else { - printf("shared_buf: %s\n", shared_buf); - } - - res = cc_free_shared_memory(context, shared_buf); - ... - - res = cc_enclave_destroy(context); - ... - - return res; - } - ``` - - 4.2 编写非安全侧 CMakeLists.txt - - ```c - # 设置编译环境变量 - #set auto code prefix - set(PREFIX switchless) - #set host exec name - set(OUTPUT secgear_switchless) - #set host src code - set(SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/main.c) - - # 使用代码生成工具生成辅助代码。CODEGEN 和 CODETYPE 变量也在顶层 CMakeLists.txt 中定义。--search-path 用于指定 switchless.edl 中导入依赖的其他 EDL 文件路径 - # set auto code - if(CC_GP) - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.h - ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.c - ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_args.h) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} - --untrusted ${CURRENT_ROOT_PATH}/${EDL_FILE} - --search-path /usr/include/secGear) - endif() - - if(CC_SGX) - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.c) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} - --untrusted ${CURRENT_ROOT_PATH}/${EDL_FILE} - --search-path /usr/include/secGear - --search-path ${SGXSDK}/include) - endif() - - # 设置编译选项和链接选项 - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE -L/usr/lib64") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -s") - - # 编译链接引用目录 - if(CC_GP) - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - endif() - add_executable(${OUTPUT} ${SOURCE_FILE} ${AUTO_FILES}) - target_include_directories(${OUTPUT} PRIVATE ${CMAKE_BINARY_DIR}/host - /usr/include/secGear - ${CMAKE_CURRENT_BINARY_DIR}) - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${OUTPUT} PRIVATE /usr/lib64 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - endif() - endif() - - if(CC_SGX) - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - endif() - add_executable(${OUTPUT} ${SOURCE_FILE} ${AUTO_FILES}) - target_include_directories(${OUTPUT} PRIVATE /usr/include/secGear - /opt/intel/sgxsdk/include - ${CMAKE_CURRENT_BINARY_DIR}) - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${OUTPUT} PRIVATE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ${SGXSDK}/lib64) - endif() - endif() - - if(CC_SIM) - target_link_libraries(${OUTPUT} secgearsim pthread) - else() - if(CC_GP) - target_link_libraries(${OUTPUT} secgear pthread) - endif() - if(CC_SGX) - target_link_libraries(${OUTPUT} secgear pthread -Wl,--whole-archive -lsgx_uswitchless -Wl,--no-whole-archive -lsgx_urts) - endif() - endif() - - # 指定二进制安装目录 - set_target_properties(${OUTPUT} PROPERTIES SKIP_BUILD_RPATH TRUE) - if(CC_GP) - install(TARGETS ${OUTPUT} - RUNTIME - DESTINATION ${LOCAL_ROOT_PATH_INSTALL}/vendor/bin/ - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) - endif() - - if(CC_SGX) - install(TARGETS ${OUTPUT} - RUNTIME - DESTINATION ${CMAKE_BINARY_DIR}/bin/ - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) - endif() - - ``` - -5. 编写安全侧代码、CMakeLists.txt 和配置文件,放在 enclave 目录 - - 5.1 编写安全侧代码 enclave.c - - ```c - #include - #include - #include "switchless_t.h" - - #define TA_HELLO_WORLD "secgear hello world!" - #define BUF_MAX 32 - - int get_string_switchless(char *shared_buf) - { - strncpy(shared_buf, TA_HELLO_WORLD, strlen(TA_HELLO_WORLD) + 1); - return 0; - } - - ``` - - 5.2 编写安全侧 CMakeLists.txt - - ``` - #set auto code prefix - set(PREFIX switchless) - - #set sign key - set(PEM Enclave_private.pem) - - #set sign tool - set(SIGN_TOOL sign_tool.sh) - - #set enclave src code - set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/enclave.c) - - #set log level - set(PRINT_LEVEL 3) - add_definitions(-DPRINT_LEVEL=${PRINT_LEVEL}) - - # WHITE_LIST_x:为设置iTrustee的二进制白名单,用来设置哪些非安全侧的二进制可以调用安全侧的动态库。 - # WHITE_LIST_OWNER:设置运行二进制所属的用户权限,只有该用户才可以调用安全侧动态库。 - if(CC_GP) - #set signed output - set(OUTPUT ${UUID}.sec) - set(WHITE_LIST_0 ${LOCAL_ROOT_PATH_INSTALL}/vendor/bin/secgear_switchless) - set(WHITE_LIST_OWNER root) - set(WHITELIST WHITE_LIST_0) - - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.h - ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.c - ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_args.h) - - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} - --trusted ${CURRENT_ROOT_PATH}/${EDL_FILE} - --search-path /usr/include/secGear) - endif() - - # SGX 安全侧动态库签名 - if(CC_SGX) - set(OUTPUT enclave.signed.so) - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.c) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} - --trusted ${CURRENT_ROOT_PATH}/${EDL_FILE} - --search-path /usr/include/secGear - --search-path ${SGXSDK}/include) - endif() - - # 设置编译选项 - set(COMMON_C_FLAGS "-W -Wall -Werror -fno-short-enums -fno-omit-frame-pointer -fstack-protector-strong \ - -Wstack-protector --param ssp-buffer-size=4 -frecord-gcc-switches -Wextra -nostdinc -nodefaultlibs \ - -fno-peephole -fno-peephole2 -Wno-main -Wno-error=unused-parameter -D_FORTIFY_SOURCE=2 -O2 \ - -Wno-error=unused-but-set-variable -L/usr/lib64 -Wno-error=format-truncation=") - set(COMMON_C_LINK_FLAGS "-Wl,-z,now -Wl,-z,relro -Wl,-z,noexecstack -Wl,-nostdlib -nodefaultlibs -nostartfiles") - - # itrustee 需生成 manifest.txt。指定 itrustee 编译选项和头文件、链接文件的搜索路径 - if(CC_GP) - set(CMAKE_C_FLAGS "${COMMON_C_FLAGS} -march=armv8-a") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -s -fPIC") - set(CMAKE_SHARED_LINKER_FLAGS "${COMMON_C_LINK_FLAGS} -Wl,-s") - - set(ITRUSTEE_TEEDIR ${iTrusteeSDK}/) - set(ITRUSTEE_LIBC ${iTrusteeSDK}/thirdparty/open_source/musl/libc) - - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${CMAKE_BINARY_DIR}/lib/) - endif() - - add_library(${PREFIX} SHARED ${SOURCE_FILES} ${AUTO_FILES}) - - target_include_directories( ${PREFIX} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_BINARY_DIR}/enclave - /usr/include/secGear - ${ITRUSTEE_TEEDIR}/include/TA - ${ITRUSTEE_TEEDIR}/include/TA/huawei_ext - ${ITRUSTEE_LIBC}/arch/aarch64 - ${ITRUSTEE_LIBC}/ - ${ITRUSTEE_LIBC}/arch/arm/bits - ${ITRUSTEE_LIBC}/arch/generic - ${ITRUSTEE_LIBC}/arch/arm) - - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${PREFIX} PUBLIC /usr/lib64) - endif() - - foreach(WHITE_LIST ${WHITELIST}) - add_definitions(-D${WHITE_LIST}="${${WHITE_LIST}}") - endforeach(WHITE_LIST) - add_definitions(-DWHITE_LIST_OWNER="${WHITE_LIST_OWNER}") - - target_link_libraries(${PREFIX} secgear_tee) - - #for trustzone compiling, you should contact us to get config and private_key.pem for test, so we will not sign and install binary in this example # - add_custom_command(TARGET ${PREFIX} - POST_BUILD - COMMAND bash ${SIGN_TOOL} -d sign - -x trustzone - -i ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${PREFIX}.so - -c ${CMAKE_CURRENT_SOURCE_DIR}/manifest.txt - -m ${CMAKE_CURRENT_SOURCE_DIR}/config_cloud.ini - -o ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${OUTPUT}) - - install(FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${OUTPUT} - #DESTINATION /data - DESTINATION ${LOCAL_ROOT_PATH_INSTALL}/data - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - endif() - - if(CC_SGX) - set(SGX_DIR ${SGXSDK}) - set(CMAKE_C_FLAGS "${COMMON_C_FLAGS} -m64 -fvisibility=hidden") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -s") - set(LINK_LIBRARY_PATH ${SGX_DIR}/lib64) - - if(CC_SIM) - set(Trts_Library_Name sgx_trts_sim) - set(Service_Library_Name sgx_tservice_sim) - else() - set(Trts_Library_Name sgx_trts) - set(Service_Library_Name sgx_tservice) - endif() - - set(Crypto_Library_Name sgx_tcrypto) - - set(CMAKE_SHARED_LINKER_FLAGS "${COMMON_C_LINK_FLAGS} -Wl,-z,defs -Wl,-pie -Bstatic -Bsymbolic -eenclave_entry \ - -Wl,--export-dynamic -Wl,--defsym,__ImageBase=0 -Wl,--gc-sections \ - -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/Enclave.lds") - - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${LINK_LIBRARY_PATH}) - endif() - - add_library(${PREFIX} SHARED ${SOURCE_FILES} ${AUTO_FILES}) - - target_include_directories(${PREFIX} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - /usr/include/secGear - ${SGX_DIR}/include/tlibc - ${SGX_DIR}/include/libcxx - ${SGX_DIR}/include) - - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${PREFIX} PRIVATE ${LINK_LIBRARY_PATH}) - endif() - - target_link_libraries(${PREFIX} -Wl,--whole-archive -lsgx_tswitchless ${Trts_Library_Name} -Wl,--no-whole-archive -Wl,--start-group - -lsgx_tstdc -lsgx_tcxx -l${Crypto_Library_Name} -l${Service_Library_Name} -Wl,--end-group) - add_custom_command(TARGET ${PREFIX} - POST_BUILD - COMMAND umask 0177 - COMMAND openssl genrsa -3 -out ${PEM} 3072 - COMMAND bash ${SIGN_TOOL} -d sign - -x sgx - -i ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${PREFIX}.so - -k ${PEM} - -o ${OUTPUT} - -c ${CMAKE_CURRENT_SOURCE_DIR}/Enclave.config.xml) - endif() - - if(NOT DEFINED CC_PL) - set_target_properties(${PREFIX} PROPERTIES SKIP_BUILD_RPATH TRUE) - endif() - ``` - -## 常见问题 -- sgx环境下开启switchless特性创建enclave后,直接销毁enclave,再使用enclave会产生core dump - - sgx开启switchless需有以下两步: - - 1. cc_enclave_create时传入switchless feature参数 - 2. 在第一次ecall调用中初始化switchless线程调度 - - 如果没有调用ecall函数,就直接调用cc_enclave_destroy,会在sgx库中销毁switchless调度线程时异常。 - - 由于switchless的实际应用场景是存在频繁ecall调用的,所以初始化switchless特性后,通常会有ecall调用,不会存在问题。 diff --git "a/docs/zh/docs/secGear/\345\256\211\350\243\205secGear.md" "b/docs/zh/docs/secGear/\345\256\211\350\243\205secGear.md" index 222b2a0abbe66b1bcdb7c810a2e1c8fcf2318f11..f4809db33221d85d007650f0b5be10033e655ffa 100644 --- "a/docs/zh/docs/secGear/\345\256\211\350\243\205secGear.md" +++ "b/docs/zh/docs/secGear/\345\256\211\350\243\205secGear.md" @@ -1,56 +1,131 @@ # 安装 secGear +### ARM环境 -## 操作系统 +#### 环境要求 -openEuler 21.03、openEuler 20.03 LTS SP2 或更高版本 +- 硬件环境要求 -## CPU 架构 + | 项目 | 版本 | + | ------ | --------------------------------------------------- | + | 服务器 | TaiShan 200服务器(型号2280) | + | 主板 | 鲲鹏主板 | + | BMC | 1711单板(型号BC82SMMAB),固件版本不低于3.01.12.49 | + | CPU | 鲲鹏920处理器(型号7260、5250、5220) | + | 机箱 | 不限,建议8盘或12盘 | -#### x86_64 + -需要有 Intel SGX ( Intel Software Guard Extensions ) 功能 + > ![img](./public_sys-resources/icon-note.gif)说明 + > + > - 要求服务器已经预置TrustZone特性套件,即预装TEE OS、TEE OS启动秘钥、BMC、BIOS和License许可证。 + > - 普通服务器无法仅通过升级BMC、BIOS、TEE OS固件实现TrustZone特性使能。 + > - 带TrustZone特性的服务器出厂默认特性关闭,请参考BIOS设置使能服务器TrustZone特性。 -#### AArch64 +- 操作系统 - - 硬件要求 + openEuler 20.03 LTS SP2及以上 - | 项目 | 版本 | - | ------ | --------------------------------------------- | - | 服务器 | TaiShan 200 服务器(型号 2280),仅限双路服务器 | - | 主板 | 鲲鹏主板 | - | BMC | 1711 单板(型号 BC82SMMAB) | - | CPU | 鲲鹏 920 处理器(型号 7260、5250、5220) | - | 机箱 | 不限,建议 8 盘或 12 盘 | + openEuler 22.09 - 要求运行的泰山服务器已经预置了 TrustZone 特性,即预装 iTrustee 安全 OS 以及配套的 BMC、BIOS 固件。 + openEuler 22.03 LTS及以上 - - 运行环境要求 +#### 环境准备 - CA(Client Application)应用需要 REE(Rich Execution Environment)侧 patch 才能实现与 TEE(Trusted Execution Environment)侧的 TA(Trusted Application)应用通信,在安装 secGear 前,请先搭建运行环境,操作如下: + 参考鲲鹏官网[环境要求](https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/fg-tz/kunpengtrustzone_04_0006.html)和[搭建步骤](https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/fg-tz/kunpengtrustzone_04_0007.html)。 - 1. [搭建 TA/CA 应用运行环境](https://support.huaweicloud.com/dpmg-tz-kunpengcctrustzone/kunpengtrustzone_04_0007.html#:~:text=%E6%90%AD%E5%BB%BA%3E%20%E6%90%AD%E5%BB%BA%E6%AD%A5%E9%AA%A4-,%E6%90%AD%E5%BB%BA%E6%AD%A5%E9%AA%A4,-%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4%EF%BC%9A2022) +#### 安装操作 - 2. 申请调测环境TA应用开发者证书 +1. 配置openEuler yum源,在线yum源或通过ISO挂载配置本地yum源,配置在线源如下。 - a. [生成 configs.xml 文件](https://support.huaweicloud.com/dpmg-tz-kunpengcctrustzone/kunpengtrustzone_04_0009.html#:~:text=%E5%88%86%E4%BA%AB-,%E7%94%9F%E6%88%90configs.xml%E6%96%87%E4%BB%B6,-%E6%A0%B9%E6%8D%AEmanifest.txt) + ```shell + vi openEuler.repo + [osrepo] + name=osrepo + baseurl=http://repo.openeuler.org/openEuler-22.03-LTS/everything/aarch64/ + enabled=1 + gpgcheck=1 + gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS/everything/aarch64/RPM-GPG-KEY-openEuler + ``` + +2. 安装secGear + + ```shell + #安装编译工具 + yum install cmake ocaml-dune + + #安装secGear + yum install secGear-devel + + #检查是否安装成功。命令和回显如下表示安装成功。 + rpm -qa | grep -E 'secGear|itrustee|ocaml-dune' + itrustee_sdk-xxx + itrustee_sdk-devel-xxx + secGear-xxx + secGear-devel-xxx + ocaml-dune-xxx + ``` + +### X86环境 + +#### 环境要求 + +- 硬件环境要求 - b. [申请 TA 开发者证书](https://support.huaweicloud.com/dpmg-tz-kunpengcctrustzone/kunpengtrustzone_04_0009.html#:~:text=%E5%86%85%E5%AE%B9%E4%BA%88%E4%BB%A5%E6%9B%BF%E6%8D%A2%E3%80%82-,TA%E5%BC%80%E5%8F%91%E8%80%85%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7,-%E7%94%9F%E6%88%90%E6%9C%AC%E5%9C%B0%E5%AF%86) + 支持Intel SGX(Intel Software Guard Extensions) 特性的处理器。 -## 安装指导 +- 操作系统 -使用 secGear 机密计算编程框架,需要安装 secGear、secGear-devel 开发包。安装前,请确保已经配置了openEuler yum 源。 + openEuler 20.03 LTS SP2及以上 -1. 使用 root 权限,安装 secGear 组件,参考命令如下: + openEuler 22.09 + + openEuler 22.03 LTS及以上 + +#### 环境准备 + +购买支持Intel SGX特性设备,参考对应设备BIOS配置手册,开启SGX特性。 + +#### 安装操作 + +1. 配置openEuler yum源,在线yum源或通过ISO挂载配置本地yum源,配置在线源如下。 ```shell - #yum install secGear - #yum install secGear-devel + vi openEuler.repo + [osrepo] + name=osrepo + baseurl=http://repo.openeuler.org/openEuler-22.03-LTS/everything/x86_64/ + enabled=1 + gpgcheck=1 + gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS/everything/x86_64/RPM-GPG-KEY-openEuler ``` -2. 查看安装是否成功。参考命令如下,若回显有对应软件包,表示安装成功: +2. 安装secGear ```shell - #rpm -q secGear - #rpm -q secGear-devel - ``` \ No newline at end of file + #安装编译工具 + yum install cmake ocaml-dune + + #安装secGear + yum install secGear-devel + + #检查是否安装成功。命令和回显如下表示安装成功。 + rpm -qa | grep -E 'secGear|ocaml-dune|sgx' + secGear-xxx + secGear-devel-xxx + ocaml-dune-xxx + libsgx-epid-xxx + libsgx-enclave-common-xxx + libsgx-quote-ex-xxx + libsgx-aesm-launch-plugin-xxx + libsgx-uae-service-xxx + libsgx-ae-le-xxx + libsgx-urts-xxx + sgxsdk-xxx + sgx-aesm-service-xxx + linux-sgx-driver-xxx + libsgx-launch-xxx + ``` + + + diff --git "a/docs/zh/docs/secGear/\345\272\224\347\224\250\345\234\272\346\231\257.md" "b/docs/zh/docs/secGear/\345\272\224\347\224\250\345\234\272\346\231\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..b9ba9a0add4e6ce9a851eebe795c10ad7b81e591 --- /dev/null +++ "b/docs/zh/docs/secGear/\345\272\224\347\224\250\345\234\272\346\231\257.md" @@ -0,0 +1,72 @@ +# 应用场景 + +本文通过举例介绍典型场景机密计算解决方案,帮助读者理解secGear的使用场景,进而结合自己的业务构建对应的机密计算解决方案。 + +### BJCA基于TEE的密码模块 + +在政策和业务的双驱动下,密码应用保障基础设施一直在向虚拟化演进,随着业务上云,密码服务支撑也需要构建全新的密码交付模式,实现密码、云服务与业务应用的融合,因此数字认证(BJCA)推出基于TEE的密码模块,数字认证既可以利用鲲鹏TEE环境构建合规的密码计算模块,支撑密码云服务平台,同时也可以基于鲲鹏主机构建“机密计算平台”,为云计算、隐私计算、边缘计算等各类场景提供“高速泛在、弹性部署、灵活调度”的密码服务支撑。基于鲲鹏处理器的内生式密码模块已经成为密码行业变革型的创新方案,并作为内生可信密码计算新起点。 + +![](./figures/BJCA_Crypto_Module.png) + +传统密码模块中算法协议以及处理的数据是隐私数据,可基于TEE保护。如图所示,基于secGear机密计算开发框架将密码模块拆分成两部分:管理服务、算法协议。 + +- 管理服务:运行在REE侧,负责对外提供密码服务,转发请求到TEE中处理。 +- 算法协议:运行在TEE侧,负责用户数据加解密等处理。 + +由于密码服务可能存在高并发、大数据请求,此时REE与TEE存在频繁交互以及大数据拷贝,会导致性能直线下降,针对类似场景可使用secGear零切换特性优化,减少调用切换及数据拷贝次数,实现性能倍增。 + +### GaussDB基于TEE的全密态数据库 + +云数据库俨然已成为数据库业务未来重要的增长点,绝大多数的传统数据库服务厂商正在加速提供更优质的云数据库服务。然而云数据库所面临的风险相较于传统数据库更复杂多样,无论是应用程序漏洞、系统配置错误,还是恶意管理员都可能对数据安全与隐私保护造成巨大风险。 + +云数据库的部署网络由“私有环境”向“开放环境”转变,系统运维管理角色被拆分为业务管理员和运维管理员。业务管理员拥有业务管理的权限,属于企业业务方,而运维管理员属于云服务提供商。数据库运维管理员虽然被定义成系统运维管理,其实际依旧享有对数据的完全使用权限,通过运维管理权限或提权来访问数据甚至篡改数据;再者,由于开放式的环境和网络边界的模糊化,用户数据在整个业务流程中被更充分的暴露给攻击者,无论是传输、存储、运维还是运行态,都有可能遭受来自攻击者的攻击。因此对于云数据库场景,如何解决第三方可信问题,如何更加可靠的保护数据安全相比传统数据库面临着更大挑战,其中数据安全、隐私不泄露是整个云数据库面临的首要安全挑战。 + +面对上述挑战,基于TEE的GaussDB(openGauss)全密态数据库的设计思路是:用户自己持有数据加解密密钥,数据以密文形态存在于数据库服务侧的整个生命周期过程中,并在数据库服务端TEE内完成查询运算。 + +![](./figures/secret_gaussdb.png) + +如图所示,全密态数据库的特点如下: + +1. 数据文件以密文形式存储,不存储密钥明文信息。 +2. DB数据密钥保存在客户端。 +3. 客户端发起查询请求时,在服务端REE侧执行密态SQL语法得到相关密文记录,送入TEE中。 +4. 客户端通过secGear安全通道将DB数据密钥加密传输到服务端TEE中,在TEE中解密得到DB数据密钥,用DB数据密钥将密文记录解密得到明文记录,执行SQL语句,得到查询结果,再将DB数据密钥加密后的查询结果发送给客户端。 + +其中步骤3在数据库高并发请求场景下,会频繁触发REE-TEE之间调用以及大量的数据传输,导致性能直线下降,通过secGear零切换特性优化,减少调用切换及数据拷贝次数,实现性能倍增。 + +### openLooKeng基于TEE的联邦SQL + +openLooKeng联邦SQL是跨数据中心查询的一种,典型场景如下,有三个数据中心:中心数据中心A,边缘数据中心B和边缘数据中心C。openLooKeng集群部署在三个数据中心中,当数据中心A收到一次跨域查询请求时,会下发执行计划到各数据中心,在边缘数据中心B和C的openLookeng集群完成计算后,通过网络将结果传递给数据中心A中的openLookeng集群完成聚合计算。 +​在以上方案中,计算结果在不同数据中心的openLookeng集群之间传递,避免了网络带宽不足,一定程度上解决了跨域查询问题。但是计算结果是从原始数据计算得到的,可能带有敏感信息,导致数据出域存在一定安全和合规风险。怎么保护聚合计算过程中边缘数据中心的计算结果,在中心数据中心实现 “可用而不可见”呢?这里我们一起看看与机密计算结合的解决方案。 +​其基本思想是:数据中心A中,openLookeng集群将聚合计算逻辑及算子拆分出独立的模块,部署到鲲鹏TEE环境上中;其他边缘数据中心的计算结果通过安全通道传输到数据中心A的TEE中;所有数据最终在TEE中完成聚合计算,从而保护聚合计算过程中边缘数据中心的计算结果不会被数据中心A上REE侧特权程序或恶意程序获取、篡改。 + +![](./figures/openLooKeng.png) + +如图所示,具体查询流程如下: + +1. 用户在数据中心A下发跨域查询请求,openLooKeng的Coordinator根据查询SQL及数据源分布,拆解下发执行计划到本地工作节点以及边缘数据中心的coordinator,边缘数据中心的coordinator再下发到本地工作节点。 +2. 各工作节点执行计划,得到本地计算结果。 +3. 边缘数据中心通过secGear安全通道将本地计算结果加密后经网络传到数据中心A的REE侧,并中转到TEE中,在TEE中解密计算结果。 +4. 数据中心A在TEE中对数据中心A、B、C的计算结果执行聚合计算,得到最终执行结果,并返回给用户。 + +其中步骤4,在存在大量查询请求时,会频繁触发REE-TEE调用,并且有大量数据的拷贝,导致性能直线下降。通过secGear零切换特性优化,减少调用切换及数据拷贝次数,实现性能倍增。 + +### MindSpore基于TEE的纵向联邦特征保护 + +纵向联邦学习是联邦学习的一个重要分支,当不同的参与方拥有来自相同一批用户但属性不同的数据时,可以利用纵向联邦学习进行协同训练,方案流程如图所示。 + +![](./figures/Mindspore_original.png) + +1. 拥有属性的参与方(Follower方)都会持有一个底层网络,参与方属性输入底层网络得到中间结果,再将中间结果发送给拥有标签的参与方(Leader方) +2. Leader方使用各参与方的中间结果和标签来训练顶层网络,再将计算得到的梯度回传给各参与方来训练底层网络。 + +此方案避免了Follower方直接上传自己的原始数据,保护原始数据不出域,一定程度上保护了隐私安全。然而,攻击者还是有可能从上传的中间结果反推出用户信息,导致存在隐私泄露风险。因此我们需要对训练时出域的中间结果和梯度提供更强的隐私保护方案,来满足安全合规要求。 + +借鉴之前三个场景的安全风险及解决方案可以发现,想要达到中间结果出域后的“可用不可见”,正是机密计算的“拿手好戏”。基于TEE的纵向联邦特征保护方案如图所示。 + +![](./figures/Mindspore.png) + +1. Follower方的中间结果通过secGear的安全通道加密后传输到Leader方,Leader方非安全世界接收到加密的中间结果后中转到安全世界,在安全世界通过安全通道接口解密。 +2. 在安全世界中将中间结果输入到联邦拆分层计算模块,完成结果计算。 + +以上过程中Follower方的中间结果明文只存在于安全世界内存中,对Leader方来说就是黑盒子,无法访问。 diff --git "a/docs/zh/docs/secGear/\345\274\200\345\217\221secGear\345\272\224\347\224\250\347\250\213\345\272\217.md" "b/docs/zh/docs/secGear/\345\274\200\345\217\221secGear\345\272\224\347\224\250\347\250\213\345\272\217.md" index af1f374eb85e99530b334779f5ec49403006279c..551964b567f599476c81c64d2ac6e497c0eb1fc0 100644 --- "a/docs/zh/docs/secGear/\345\274\200\345\217\221secGear\345\272\224\347\224\250\347\250\213\345\272\217.md" +++ "b/docs/zh/docs/secGear/\345\274\200\345\217\221secGear\345\272\224\347\224\250\347\250\213\345\272\217.md" @@ -3,11 +3,18 @@ 这里给出使用 secGear 开发一个 C 语言程序 helloworld 的例子,方便用户理解使用 secGear 开发应用程序。 -## 目录结构说明 - -使用 secGear 开发的应用程序,遵循统一的目录结构如下: +### 下载样例 ``` +git clone https://gitee.com/openeuler/secGear.git +``` + +### 目录结构说明 + +```shell +cd examples/helloworld + +#目录结构如下 ├── helloworld │ ├── CMakeLists.txt │ ├── enclave @@ -23,425 +30,68 @@ │ └── main.c ``` -## 快速入门 - -1. 创建程序工作目录 helloworld,并在 helloworld 目录下新建 enclave 和 host - -2. 编写 EDL(Enclave Definition Language)文件 - - 为了确保开发代码的一致性,secGear 提供了 secgear_urts.h 和 secgear_tstdc.edl 用于屏蔽底层 Intel SGX 和 ARM iTrustee 之间的差异。因此,使用到 C 语言函数库时,EDL 文件默认需要导入 secgear_urts.h 和 secgear_tstdc.edl。helloworld.edl 文件参考如下: - - ```c - enclave { - include "secgear_urts.h" - from "secgear_tstdc.edl" import *; - trusted { - public int get_string([out, size=32]char *buf); - }; - }; - ``` - - 说明:EDL 语法详细信息请参见 Intel SGX 开发指南中对应内容。 - -3. 编写顶层文件 CMakeLists.txt - - 编写顶层文件 CMakeLists.txt,置于 helloworld 工作目录下,用于配置编译时的处理器架构、所需的 EDL 文件等信息。 - - 其中,EDL_FILE 是 EDL 文件,需用户指定,例子中为 helloworld.edl。DPATH 是安全侧加载动态库,配置如例子中所示。 +代码主体分为三块: - ```c - cmake_minimum_required(VERSION 3.12 FATAL_ERROR) - project(HelloWorld C) - set(CMAKE_C_STANDARD 99) - set(CURRENT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) - set(EDL_FILE helloworld.edl) - set(LOCAL_ROOT_PATH "$ENV{CC_SDK}") - set(SECGEAR_INSTALL_PATH /lib64/) - if(CC_GP) - set(CODETYPE trustzone) - set(CODEGEN codegen_arm64) - execute_process(COMMAND uuidgen -r OUTPUT_VARIABLE UUID) - string(REPLACE "\n" "" UUID ${UUID}) - add_definitions(-DPATH="/data/${UUID}.sec") - endif() - if(CC_SGX) - set(CODETYPE sgx) - set(CODEGEN codegen_x86_64) - add_definitions(-DPATH="${CMAKE_CURRENT_BINARY_DIR}/enclave/enclave.signed.so") - endif() - add_subdirectory(${CURRENT_ROOT_PATH}/enclave) - add_subdirectory(${CURRENT_ROOT_PATH}/host) - ``` +- 非安全侧程序(main.c) +- 非安全侧与安全侧调用接口头文件(helloworld.edl) +- 安全侧程序(hello.c) - +### 准备工作 -4. 编写非安全侧代码和 CMakeLists.txt +除以上三部分主体代码外,还有编译工程文件(CMakeLists.txt)、开发者证书(SGX的Enclave.config.xml/Enclave.lds,鲲鹏的manifest.txt/config_cloud.ini)。 - 4.1 编写 main.c +> ![](./public_sys-resources/icon-note.gif)说明: +> +> - 鲲鹏开发者证书需要向华为业务负责人[申请开发者证书](https://gitee.com/link?target=https%3A%2F%2Fwww.hikunpeng.com%2Fdocument%2Fdetail%2Fzh%2Fkunpengcctrustzone%2Ffg-tz%2Fkunpengtrustzone_04_0009.html)。 +> - SGX以Debug模式调试,暂时不用申请。如需正式商用并且用intel的远程证明服务,需要向Intel[申请License](https://gitee.com/link?target=https%3A%2F%2Fwww.intel.com%2Fcontent%2Fwww%2Fus%2Fen%2Fdeveloper%2Ftools%2Fsoftware-guard-extensions%2Frequest-license.html)。 - 编写非安全侧 main.c,置于 host目录。enclave.h 为 secGear 头文件,helloworld_u.h 为辅助代码生成工具生成的头文件。使用 cc_enclave_create 创建安全区 enclave 上下文,cc_enclave_destroy 销毁安全区上下文。 - get_string 为 EDL 文件中定义 trusted 的安全侧函数,注意这里与 EDL 中定义的 get_string 有差别,多出两个参数 context 为安全区上下文,retval 为 EDL 中get_string 的返回值。 - res 为 get_string 调用成功标志。 +申请成功后会得到开发者证书相关文件,需要放置到代码目录相应位置。 - ```c - #include - #include "enclave.h" - #include "helloworld_u.h" - - #define BUF_LEN 32 - - int main() - { - int retval = 0; - char *path = PATH; - char buf[BUF_LEN]; - cc_enclave_t *context = NULL; - cc_enclave_result_t res; - res = cc_enclave_create(path, AUTO_ENCLAVE_TYPE, 0, SECGEAR_DEBUG_FLAG, NULL, 0, &context); - ... - - res = get_string(context, &retval, buf); - if (res != CC_SUCCESS || retval != (int)CC_SUCCESS) { - printf("Ecall enclave error\n"); - } else { - printf("%s\n", buf); - } - - if (context != NULL) { - res = cc_enclave_destroy(context); - ... - } - return res; - } - ``` +### 开发步骤 - 4.2 编写非安全侧 CMakeLists.txt +基于secGear做机密计算应用拆分改造,类似于独立功能模块提取,识别敏感数据处理逻辑,提取成独立的lib库,部署在可信执行环境中,对非安全侧提供的接口定义在EDL文件中。 - ```c - # 设置编译环境变量 - #set auto code prefix - set(PREFIX helloworld) - #set host exec name - set(OUTPUT secgear_helloworld) - #set host src code - set(SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/main.c) - - # 使用代码生成工具生成辅助代码。CODEGEN 和 CODETYPE 变量也在顶层 CMakeLists.txt 中定义。--search-path 用于指定 helloword.edl 中导入依赖的其他 EDL 文件路径 - #set auto code - if(CC_GP) - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.c ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_args.h) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} --untrusted ${CURRENT_ROOT_PATH}/${EDL_FILE} --search-path ${LOCAL_ROOT_PATH}/inc/host_inc/gp) - endif() - - if(CC_SGX) - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.c) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} --untrusted ${CURRENT_ROOT_PATH}/${EDL_FILE} --search-path ${LOCAL_ROOT_PATH}/inc/host_inc/sgx --search-path ${SGXSDK}/include) - endif() - - # 设置编译选项和链接选项 - set(CMAKE_C_FLAGS "-fstack-protector-all -W -Wall -Werror -Wextra -Werror=array-bounds -D_FORTIFY_SOURCE=2 -O2 -ftrapv -fPIE") - set(CMAKE_EXE_LINKER_FLAGS "-Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack") - - # 编译链接引用目录 - if(CC_GP) - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${SECGEAR_INSTALL_PATH}) - endif() - add_executable(${OUTPUT} ${SOURCE_FILE} ${AUTO_FILES}) - target_include_directories(${OUTPUT} PRIVATE - /usr/include/secGear/host_inc - /usr/include/secGear/host_inc/gp - ${CMAKE_CURRENT_BINARY_DIR}) - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${OUTPUT} PRIVATE ${SECGEAR_INSTALL_PATH}) - endif() - target_link_libraries(${OUTPUT} secgear) - endif() - if(CC_SGX) - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${SECGEAR_INSTALL_PATH} ${SGXSDK}/lib64) - endif() - set(SGX_MODE HW) - if(${SGX_MODE} STREQUAL HW) - set(Urts_Library_Name sgx_urts) - else() - set(Urts_Library_Name sgx_urts_sim) - endif() - add_executable(${OUTPUT} ${SOURCE_FILE} ${AUTO_FILES} ${LOCAL_ROOT_PATH}/src/host_src/sgx/sgx_log.c) - target_include_directories(${OUTPUT} PRIVATE - /usr/include/secGear/host_inc - /usr/include/secGear/host_inc/sgx - ${CMAKE_CURRENT_BINARY_DIR}) - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${OUTPUT} PRIVATE ${SECGEAR_INSTALL_PATH} ${SGXSDK}/lib64) - endif() - target_link_libraries(${OUTPUT} secgear ${Urts_Library_Name}) - endif() - - # 指定二进制安装目录 - set_target_properties(${OUTPUT} PROPERTIES SKIP_BUILD_RPATH TRUE) - if(CC_GP) - install(TARGETS ${OUTPUT} - RUNTIME - DESTINATION /vendor/bin/ - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) - endif() - if(CC_SGX) - install(TARGETS ${OUTPUT} - RUNTIME - DESTINATION ${CMAKE_BINARY_DIR}/bin/ - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) - endif() - ``` +开发步骤如下图所示。 - +1. 开发非安全侧main函数及接口,管理encalve并调用安全侧函数。 +2. 开发EDL文件(类似C语言头文件定义非安全侧与安全侧交互接口) +3. 开发安全侧接口实现 +4. 调用代码生成工具,根据EDL自动生成非安全侧与安全侧交互源码,并分别编译到非安全侧与安全侧二进制文件中,非安全侧逻辑直接调用安全侧对应的接口即可,无需关心自动的生成的交互代码,降低开发成本。 +5. 调用签名工具对安全侧二进制签名,实现安全侧程序可信启动。 -5. 编写安全侧代码、CMakeLists.txt 和配置文件,放在 enclave 目录 +![](./figures/develop_step.png) - 5.1 编写安全侧代码 hello.c +### 编译运行 - 编写安全侧代码 hello.c,置于 enclave 目录。其中,helloworld_t.h 为辅助代码生成工具,通过 EDL 文件生成的安全侧头文件。 +#### ARM环境 - ```c - #include - #include - #include "helloworld_t.h" - - #define TA_HELLO_WORLD "secGear hello world!" - #define BUF_MAX 32 - int get_string(char *buf) - { - strncpy(buf, TA_HELLO_WORLD, strlen(TA_HELLO_WORLD) + 1); - return 0; - } - ``` +```shell +// clone secGear repository +git clone https://gitee.com/openeuler/secGear.git - 5.2 编写安全侧 CMakeLists.txt +// build secGear and examples +cd secGear +source environment +mkdir debug && cd debug && cmake -DENCLAVE=GP .. && make && sudo make install - ``` - #set auto code prefix - set(PREFIX helloworld) - - #set sign key - set(PEM Enclave_private.pem) - - #set sign tool - set(SIGN_TOOL ${LOCAL_ROOT_PATH}/tools/sign_tool/sign_tool.sh) - - #set enclave src code - set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/hello.c) - - #set log level - set(PRINT_LEVEL 3) - add_definitions(-DPRINT_LEVEL=${PRINT_LEVEL}) - - # WHITE_LIS_X 设置 itrustee 白名单,只有这些路径的主机二进制文件可以调用此安全映像,并且最多可以配置 8 个列表路径。WHITE_LIST_OWNER 设置用户,此用户将应用于所有白名单路径。DEVICEPEM 公钥由itrustee 使用,并用于通过动态生成的 aes 密钥加密安全侧的安全动态库。 - if(CC_GP) - #set signed output - set(OUTPUT ${UUID}.sec) - #set itrustee device key - set(DEVICEPEM ${CMAKE_CURRENT_SOURCE_DIR}/rsa_public_key_cloud.pem) - #set whilelist. default: /vendor/bin/teec_hello - set(WHITE_LIST_0 /vendor/bin/helloworld) - set(WHITE_LIST_OWNER root) - set(WHITE_LIST_1 /vendor/bin/secgear_helloworld) - set(WHITELIST WHITE_LIST_0 WHITE_LIST_1) - - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.c ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_args.h) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} --trusted ${CURRENT_ROOT_PATH}/${EDL_FILE} --search-path ${LOCAL_ROOT_PATH}/inc/host_inc/gp) - endif() - - # SGX 安全侧动态库签名 - if(CC_SGX) - set(OUTPUT enclave.signed.so) - set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_t.c) - add_custom_command(OUTPUT ${AUTO_FILES} - DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE} - COMMAND ${CODEGEN} --${CODETYPE} --trusted ${CURRENT_ROOT_PATH}/${EDL_FILE} --search-path ${LOCAL_ROOT_PATH}/inc/host_inc/sgx --search-path ${SGXSDK}/include) - endif() - - # 设置编译选项 - set(COMMON_C_FLAGS "-W -Wall -Werror -fno-short-enums -fno-omit-frame-pointer -fstack-protector \ - -Wstack-protector --param ssp-buffer-size=4 -frecord-gcc-switches -Wextra -nostdinc -nodefaultlibs \ - -fno-peephole -fno-peephole2 -Wno-main -Wno-error=unused-parameter \ - -Wno-error=unused-but-set-variable -Wno-error=format-truncation=") - - set(COMMON_C_LINK_FLAGS "-Wl,-z,now -Wl,-z,relro -Wl,-z,noexecstack -Wl,-nostdlib -nodefaultlibs -nostartfiles") - - # itrustee 需生成 manifest.txt。指定 itrustee 编译选项和头文件、链接文件的搜索路径 - if(CC_GP) - set(CMAKE_C_FLAGS "${COMMON_C_FLAGS} -march=armv8-a ") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -s -fPIC") - set(CMAKE_SHARED_LINKER_FLAGS "${COMMON_C_LINK_FLAGS} -Wl,-s") - - set(ITRUSTEE_TEEDIR ${iTrusteeSDK}/) - set(ITRUSTEE_LIBC ${iTrusteeSDK}/thirdparty/open_source/musl/libc) - - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${CMAKE_BINARY_DIR}/lib/) - endif() - - add_library(${PREFIX} SHARED ${SOURCE_FILES} ${AUTO_FILES}) - - target_include_directories( ${PREFIX} PRIVATE - ${CMAKE_CURRENT_BINARY_DIR} - ${LOCAL_ROOT_PATH}/inc/host_inc - ${LOCAL_ROOT_PATH}/inc/host_inc/gp - ${LOCAL_ROOT_PATH}/inc/enclave_inc - ${LOCAL_ROOT_PATH}/inc/enclave_inc/gp - ${ITRUSTEE_TEEDIR}/include/TA - ${ITRUSTEE_TEEDIR}/include/TA/huawei_ext - ${ITRUSTEE_LIBC}/arch/aarch64 - ${ITRUSTEE_LIBC}/ - ${ITRUSTEE_LIBC}/arch/arm/bits - ${ITRUSTEE_LIBC}/arch/generic - ${ITRUSTEE_LIBC}/arch/arm - ${LOCAL_ROOT_PATH}/inc/enclave_inc/gp/itrustee) - - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${PREFIX} PRIVATE - ${CMAKE_BINARY_DIR}/lib/) - endif() - - foreach(WHITE_LIST ${WHITELIST}) - add_definitions(-D${WHITE_LIST}="${${WHITE_LIST}}") - endforeach(WHITE_LIST) - add_definitions(-DWHITE_LIST_OWNER="${WHITE_LIST_OWNER}") - - target_link_libraries(${PREFIX} -lsecgear_tee) - - add_custom_command(TARGET ${PREFIX} - POST_BUILD - COMMAND bash ${SIGN_TOOL} -d sign -x trustzone -i ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${PREFIX}.so -c ${CMAKE_CURRENT_SOURCE_DIR}/manifest.txt - -m ${CMAKE_CURRENT_SOURCE_DIR}/config_cloud.ini -o ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${OUTPUT}) - - install(FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${OUTPUT} - DESTINATION /data - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - - endif() - - if(CC_SGX) - set(SGX_DIR ${SGXSDK}) - set(CMAKE_C_FLAGS "${COMMON_C_FLAGS} -m64 -fvisibility=hidden") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -s") - set(LINK_LIBRARY_PATH ${SGX_DIR}/lib64) - - if(CC_SIM) - set(Trts_Library_Name sgx_trts_sim) - set(Service_Library_Name sgx_tservice_sim) - else() - set(Trts_Library_Name sgx_trts) - set(Service_Library_Name sgx_tservice) - endif() - - set(Crypto_Library_Name sgx_tcrypto) - - set(CMAKE_SHARED_LINKER_FLAGS "${COMMON_C_LINK_FLAGS} -Wl,-z,defs -Wl,-pie -Bstatic -Bsymbolic -eenclave_entry \ - -Wl,--export-dynamic -Wl,--defsym,__ImageBase=0 -Wl,--gc-sections -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/Enclave.lds") - - if(${CMAKE_VERSION} VERSION_LESS "3.13.0") - link_directories(${LINK_LIBRARY_PATH}) - endif() - - add_library(${PREFIX} SHARED ${SOURCE_FILES} ${AUTO_FILES}) - - target_include_directories(${PREFIX} PRIVATE - ${CMAKE_CURRENT_BINARY_DIR} - ${SGX_DIR}/include/tlibc - ${SGX_DIR}/include/libcxx - ${SGX_DIR}/include - ${LOCAL_ROOT_PATH}/inc/host_inc - ${LOCAL_ROOT_PATH}/inc/host_inc/sgx) - - if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") - target_link_directories(${PREFIX} PRIVATE - ${LINK_LIBRARY_PATH}) - endif() - - target_link_libraries(${PREFIX} -Wl,--whole-archive ${Trts_Library_Name} -Wl,--no-whole-archive - -Wl,--start-group -lsgx_tstdc -lsgx_tcxx -l${Crypto_Library_Name} -l${Service_Library_Name} -Wl,--end-group) - add_custom_command(TARGET ${PREFIX} - POST_BUILD - COMMAND umask 0177 - COMMAND openssl genrsa -3 -out ${PEM} 3072 - COMMAND bash ${SIGN_TOOL} -d sign -x sgx -i ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${PREFIX}.so -k ${PEM} -o ${OUTPUT} -c ${CMAKE_CURRENT_SOURCE_DIR}/Enclave.config.xml) - endif() - - set_target_properties(${PREFIX} PROPERTIES SKIP_BUILD_RPATH TRUE) - ``` - - - -6. 编写配置文件 - -- 针对使用 Intel SGX 的 x86_64 处理器架构,请编写 Enclave.config.xml 和 Enclave.lds 文件,置于安全侧 enclave 目录。文件的具体配置格式请参见 SGX 官方文档。 - - Enclave.config.xml 参考: - - ```c - - 0 - 0 - 0x40000 - 0x100000 - 10 - 1 - - 0 - 0 - 0xFFFFFFFF - - ``` - - Enclave.lds 参考: - - ```c - enclave.so - { - global: - g_global_data_sim; - g_global_data; - enclave_entry; - g_peak_heap_used; - local: - *; - }; - ``` - -- 针对使用 ARM iTrustee 处理器架构,请编写 config_cloud.ini 和 manifest.txt 文件,置于安全侧 enclave 目录。 - - config_cloud.ini 和 manifest.txt 文件请参考[安装secGear应用程序.md 中的“申请调测环境TA应用开发者证书”](./安装secGear.md) - - -7. 编译程序 - -- SGX 版本编译命令如下,编译后将生成可执行程序 secgear_helloworld - - ```shell - cmake -DCMAKE_BUILD_TYPE=debug .. && make - ``` +// run helloworld +/vendor/bin/secgear_helloworld +``` -- iTrustee 版本编译命令如下,编译后将生成可执行程序 secgear_helloworld - ```shell - cmake -DCMAKE_BUILD_TYPE=debug -DENCLAVE=GP .. && make - ``` - +#### x86环境 -8. 执行程序 +```shell +// clone secGear repository +git clone https://gitee.com/openeuler/secGear.git - ```c - $ ./secgear_helloworld - Create secgear enclave - secgear hello world! - ``` +// build secGear and examples +cd secGear +source /opt/intel/sgxsdk/environment && source environment +mkdir debug && cd debug && cmake .. && make && sudo make install +// run helloworld +./examples/helloworld/host/secgear_helloworld +``` diff --git "a/docs/zh/docs/secGear/\346\216\245\345\217\243\345\217\202\350\200\203.md" "b/docs/zh/docs/secGear/\346\216\245\345\217\243\345\217\202\350\200\203.md" index fdcd311b9c3605a24de29d0d83b7b80692cee632..fe2baf5706c12334368f5a23390f484b2fc7345f 100644 --- "a/docs/zh/docs/secGear/\346\216\245\345\217\243\345\217\202\350\200\203.md" +++ "b/docs/zh/docs/secGear/\346\216\245\345\217\243\345\217\202\350\200\203.md" @@ -189,7 +189,7 @@ cc_enclave_result_t cc_enclave_seal_data(uint8_t *seal_data, uint32_t seal_data_ cc_enclave_result_t cc_enclave_unseal_data(cc_enclave_sealed_data_t *sealed_data, uint8_t *decrypted_data, uint32_t *decrypted_data_len, - + uint8_t *additional_text, uint32_t *additional_text_len) **参数:** @@ -335,7 +335,7 @@ void PrintInfo(int level, const char *fmt, ...); **参数:** - level:入参,日志打印等级,可选项为PRINT_ERROR, PRINT_WARNING, PRINT_STRACE, PRINT_DEBUG -- fmt: 入参,需要输出的字符创 +- fmt: 入参,需要输出的字符串 **返回值:** diff --git "a/docs/zh/docs/secGear/\350\256\244\350\257\206secGear.md" "b/docs/zh/docs/secGear/\350\256\244\350\257\206secGear.md" index 4a56acb0f2de80efe486ba06e21a137f7d78f4dd..9ab6c6b341de762310ce64714ae2db869c4b6543 100644 --- "a/docs/zh/docs/secGear/\350\256\244\350\257\206secGear.md" +++ "b/docs/zh/docs/secGear/\350\256\244\350\257\206secGear.md" @@ -1,19 +1,87 @@ ### 概述 -随着云计算的快速发展,越来越多的企业把计算业务部署到云上,对数据的保护变得更加复杂,同时,数据泄露是云计算面临的重大安全问题。因此,如何保障用户数据在云上的安全变得尤为重要。当前对数据的保护通常注重离线存储安全和网络传输安全,缺乏对数据运行时的安全防护。为了保障云端数据运行时的安全性,方便开发者开发云上应用,openEuler 推出了 secGear 。 +随着云计算的快速发展,越来越多的企业把计算业务部署到云上,面对第三方云基础设施,云上用户数据安全面临着巨大的挑战。机密计算是一种基于硬件可信执行环境的隐私保护技术,旨在依赖最底层硬件,构建最小信任依赖,将操作系统、Hypervisor、基础设施、系统管理员、服务提供商等都从信任实体列表中删除,视为未经授权的实体,从而减少潜在的风险,保护可信执行环境中数据的机密性、完整性。然而随着机密计算技术的兴起,业界机密计算技术种类繁多(如主流的Intel SGX、ARM Trustzone、RSIC-V keystone等),各技术SDK也千差万别,给开发者带来较大的开发维护成本,长远考虑,还造成了机密计算应用生态隔离。为方便开发者快速构建保护云上数据安全的机密计算解决方案,openEuler推出机密计算统一开发框架secGear。 -secGear 是统一机密计算编程框架,提供了易用的开发套件,包括安全区(使用 secGear 编程会将系统区分为安全区域和非安全区域) 生命周期管理、安全开发库、代码辅助生成工具、代码构建与签名工具、安全能力和安全服务组件实现方案。可用于信任环、密态数据库、多方计算、AI安全保护等多种场景。 +### 架构介绍 -本文档介绍 secGear 的使用方法,以便指导开发者基于 secGear 开发应用程序,从而更好地保护数据。 +![](./figures/secGear_arch.png) -### 架构介绍 +secGear机密计算统一开发框架技术架构如图所示,主要包括三层,共同组成openEuler机密计算软件生态底座。 + +- Base Layer:机密计算SDK统一层,屏蔽TEE及SDK差异,实现不同架构共源码。 +- Middleware Layer:通用组件层,机密计算软件货架,无需从头造轮子,帮助用户快速构建机密计算解决方案。 +- Server Layer:机密计算服务层,提供典型场景机密计算解决方案。 + + + +### 关键特性 + +#### 零切换 + +**客户痛点**:传统应用做机密计算拆分改造后,REE侧逻辑存在频繁调用TEE侧逻辑时或REE与TEE存在频繁大块数据交互时。由于REE与TEE之间的每次调用,都需要经过REE用户态 、REE内核态、驱动、TEE内核态、TEE用户态之间的上下文切换,调用传递的大块数据也要经过多次拷贝,并且驱动底层数据块大小限制等因素,频繁的REE与TEE交互性能直线下降,严重影响机密计算应用的落地。 + +**解决方案**:[零切换](https://gitee.com/openeuler/secGear#switchless%E7%89%B9%E6%80%A7)是一种通过共享内存减少REE与TEE上下文切换及数据拷贝次数,优化REE与TEE交互性能的技术。 + +**使用方法**:1. 创建enclave时启用零切换。2. 定义EDL文件时添加零切换标识。 + +- 创建enclave时启用零切换 + + 零切换配置项及说明如下。 + + ```c + typedef struct { + uint32_t num_uworkers; + uint32_t num_tworkers; + uint32_t switchless_calls_pool_size; + uint32_t retries_before_fallback; + uint32_t retries_before_sleep; + uint32_t parameter_num; + uint32_t workers_policy; + uint32_t rollback_to_common; + } cc_sl_config_t; + ``` + + | 配置项 | 说明 | + | -------------------------- | ------------------------------------------------------------ | + | num_uworkers | 非安全侧代理工作线程数,用于执行switchless OCALL,当前该字段仅在SGX平台生效,ARM平台可以配置,但是因ARM平台暂不支持OCALL,所以配置后不会生效。
规格:
ARM:最大值:512;最小值:1;默认值:8(配置为0时)
SGX:最大值:4294967295;最小值:1 | + | num_tworkers | 安全侧代理工作线程数,用于执行switchless ECALL。
规格:
ARM:最大值:512;最小值:1;默认值:8(配置为0时)
SGX:最大值:4294967295;最小值:1 | + | switchless_calls_pool_size | switchless调用任务池的大小,实际可容纳switchless_calls_pool_size * 64个switchless调用任务(例:switchless_calls_pool_size=1,可容纳64个switchless调用任务)。
规格:
ARM:最大值:8;最小值:1;默认值:1(配置为0时)
SGX:最大值:8;最小值:1;默认值:1(配置为0时) | + | retries_before_fallback | 执行retries_before_fallback次汇编pause指令后,若switchless调用仍没有被另一侧的代理工作线程执行,就回退到switch调用模式,该字段仅在SGX平台生效。
规格:SGX:最大值:4294967295;最小值:1;默认值:20000(配置为0时) | + | retries_before_sleep | 执行retries_before_sleep次汇编pause指令后,若代理工作线程一直没有等到有任务来,则进入休眠状态,该字段仅在SGX平台生效。
规格: SGX:最大值:4294967295;最小值:1;默认值:20000(配置为0时) | + | parameter_num | switchless函数支持的最大参数个数,该字段仅在ARM平台生效。
规格: ARM:最大值:16;最小值:0 | + | workers_policy | switchless代理线程运行模式,该字段仅在ARM平台生效。
规格: ARM: WORKERS_POLICY_BUSY:代理线程一直占用CPU资源,无论是否有任务需要处理,适用于对性能要求极高且系统软硬件资源丰富的场景; WORKERS_POLICY_WAKEUP:代理线程仅在有任务时被唤醒,处理完任务后进入休眠,等待再次被新任务唤醒 | + | rollback_to_common | 异步switchless调用失败时是否回退到普通调用,该字段仅在ARM平台生效。
规格: ARM:0:否,失败时仅返回相应错误码;其他:是,失败时回退到普通调用 | + +- 定义EDL文件中接口时添加零切换标识transition_using_threads + + ```ocaml + enclave { + include "secgear_urts.h" + from "secgear_tstdc.edl" import *; + from "secgear_tswitchless.edl" import *; + trusted { + public int get_string([out, size=32]char *buf); + public int get_string_switchless([out, size=32]char *buf) transition_using_threads; + }; + }; + ``` + + + +#### 安全通道 + +**客户痛点**:数据拥有者在请求云上机密计算服务时,需要把待处理数据上传到云上TEE环境中处理,由于TEE没有网络,用户数据需要经过网络先传输到REE,再中转进TEE。怎么保护REE中转过程中无法访问用户数据? + +**解决方案**:安全通道是一种结合机密计算远程证明,实现数据拥有者与云上TEE之间安全的密钥协商技术,协商出仅数据拥有者与云上TEE拥有的sessionkey,再通过sessionkey加密用户数据,网络传输到云上REE并中转进TEE中。 -![](./figures/architecture.png) +**使用方法**:安全通道属于secGear架构中的通用组件,提供安全通道lib库,供用户应用开发者、机密计算服务开发者像引用传统lib库一样使用。特性预计2023年Q1开源,如感兴趣可在机密计算SIG联系试用。 -如图所示,secGear 主题包含三个层级(当前仅开源基础层 Base Layer,服务层和中间件层逐步开源): -- 服务层:提供完整的运行在安全侧的安全服务。 -- 中间件层:提供一套协议接口,满足用户基本安全应用。 +### 缩略语 -- 基础层:提供丰富的 enclave 开发接口或工具,并且在安全侧支持 C POSIX APIs 和标准 OpenSSL 接口,用户基于这些接口可以自由开发安全应用程序 。 \ No newline at end of file +| 缩略语 | 英文全名 | 中文解释 | +| ------ | ----------------------------- | ---------------- | +| REE | Rich Execution Environment | 富执行环境 | +| TEE | Trusted Execution Environment | 可信执行环境 | +| EDL | Enclave Description Language | 安全应用描述语言 | diff --git a/docs/zh/menu/index.md b/docs/zh/menu/index.md index c02b0eea53f68c29fd82d24f031b13028e351ec6..671d5fc0909a23ce9d5dda2e775de519332bbf80 100644 --- a/docs/zh/menu/index.md +++ b/docs/zh/menu/index.md @@ -161,7 +161,7 @@ headless: true - [认识secGear]({{< relref "./docs/secGear/认识secGear.md" >}}) - [安装secGear]({{< relref "./docs/secGear/安装secGear.md" >}}) - [开发secGear应用程序]({{< relref "./docs/secGear/开发secGear应用程序.md" >}}) - - [使用switchless特性]({{< relref "./docs/secGear/使用switchless特性.md" >}}) + - [应用场景]({{< relref "./docs/secGear/应用场景.md" >}}) - [使用secGear工具]({{< relref "./docs/secGear/使用secGear工具.md" >}}) - [接口参考]({{< relref "./docs/secGear/接口参考.md" >}}) - [Kubernetes集群部署指南]({{< relref "./docs/Kubernetes/Kubernetes.md" >}})