secGear
secGear — это SDK для разработки приложений с конфиденциальными вычислениями на основе функций аппаратного анклава. Цель состоит в том, чтобы написать единый исходный код для приложений, работающих на разном оборудовании. В настоящее время secGear поддерживает Intel SGX и iTrustee, работающие в ARM Trustzone.
Предполагая, что каталог разработки — .../secGear/examples/test/
enclave {
include "secgear_urts.h"
from "secgear_tstdc.edl" import *;
trusted {
public int get_string([out, size=32]char *buf);
};
};
Включаются «secgear_urts.h» и импортируются все из «secgear_tstdc.edl», чтобы скрыть разницу между SGX и iTrustee при вызове библиотеки C. Поэтому, пока используются функции библиотеки C, для согласованности исходного кода необходимо импортировать два файла.
Для получения подробной информации о синтаксисе edl обратитесь к разделу «Синтаксис языка определения анклавов» документа по разработке SGX. На данный момент SGX и iTrustee совместимы друг с другом в основных типах, буферах указателей и глубокой копии структур, но в настоящее время только SGX поддерживает такие функции, как user_check, предоставление доступа к ECALLs, использование вызовов без переключения и так далее.
Затем сохраните файл как test.edl.
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(TEST C)
set(CMAKE_C_STANDARD 99)
set(CURRENT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
set(EDL_FILE test.edl)
set(LOCAL_ROOT_PATH "$ENV{CC_SDK}")
set(SECGEAR_INSTALL_PATH /usr/lib64/)
set(CODEGEN codegen)
if(CC_GP)
set(CODETYPE trustzone)
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)
add_definitions(-DPATH="${CMAKE_CURRENT_BINARY_DIR}/enclave/enclave.signed.so")
endif()
add_subdirectory(${CURRENT_ROOT_PATH}/enclave)
add_subdirectory(${CURRENT_ROOT_PATH}/host)
Установите атрибуты CODETYPE и EDL_FILE, которые используются при автоматической генерации кода на более позднем этапе. На платформе ARM изображение анклава должно быть названо уникальным UUID, поэтому оно динамически генерируется с помощью команды uuidgen. Определённый макрос DPATH используется при загрузке образа анклава.
#include <stdio.h>
#include "enclave.h"
#include "test_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;
}
Включите «enclave.h», чтобы импортировать заголовочный файл secGear, и «test_u.h», чтобы импортировать автоматически сгенерированный заголовочный файл кода. Затем вызовите cc_enclave_create(...), чтобы создать контекст анклава, а затем вызовите оболочку интерфейса, описанного в файле edl, чтобы войти в анклав для выполнения конфиденциального кода. Наконец, вызовите cc_enclave_destroy(...), чтобы уничтожить контекст анклава. 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 OWNOR_READ)
endif()
На основе -DCC_SIM=ON или ничего, переданного из cmake, связывание secgear или secgearsim. Укажите путь установки конечного двоичного файла. Небезопасное изображение стороны iTrustee должно быть установлено в указанном белом списке. Конфигурация белого списка будет представлена ниже.
#include <stdio.h>
#include <string.h>
#include "test_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;
}
Импортируйте test_t.h, сгенерированный инструментом автоматического создания кода, а затем напишите функцию в соответствии с описанием интерфейса в test.edl.
# Установите префикс автоматического кода
set(PREFIX test)
# Установить ключ подписи
set(PEM Enclave_private.pem)
Установите имя файла закрытого ключа, используемого для подписания двоичного файла анклава
# Установить инструмент подписи
set(SIGN_TOOL ${LOCAL_ROOT_PATH}/tools/sign_tool/sign_tool.sh)
# Установить исходный код анклава
set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/hello.c)
# Установить уровень журнала
set(PRINT_LEVEL 3)
add_definitions(-DPRINT_LEVEL=${PRINT_LEVEL})
Установите инструмент подписи и уровень печати журнала безопасности
if (CC_GP)
# Установить подписанный вывод
set(OUTPUT ${UUID}.sec)
set(WHITE_LIST_0 /vendor/bin/helloworld)
set(WHITE_LIST_1 /vendor/bin/secgear_test)
set(WHITE_LIST_OWNER root)
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 ()
WHITE_LIS_X устанавливает белый список iTrustee, только хост-двоичные файлы на этих путях могут вызывать это безопасное изображение, и можно настроить до 8 путей списка. WHITE_LIST_OWNER устанавливает пользователя, этот пользователь будет применяться ко всем путям белого списка. Наконец, установите имя безопасного изображения после окончательного подписания и сгенерируйте вспомогательный код.
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 ${SDK_PATH}/include)
endif ()
В случае SGX установите имя безопасного образа после окончательной подписи и сгенерируйте вспомогательный код.
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")
Безопасность стороны, независимо от того, SGX или iTrustee будут использовать некоторые параметры компиляции и компоновки, например, потому что безопасность стороны отличается от В запросе представлен текст технической направленности из области разработки и тестирования программного обеспечения. Основной язык текста запроса — английский.
В случае с iTrustee, генерируется конфигурационный файл manifest.txt (подробности конфигурационного файла будут объяснены позже), указываются некоторые опции компиляции, связанные с iTrustee, задаются пути поиска заголовочного файла и файла компоновки, а также создаётся двоичный файл анклава.
Что касается использования ocall iTrustee, есть некоторые другие примечания, которые будут представлены позже. Затем определяется макрос белого списка. Далее необходимо связать библиотеку secgear_tee, в которой есть интерфейсы для генерации случайных чисел, запечатывания, распечатывания и т. д. Последний шаг — подписать и установить.
Если используется SGX:
Также задаются общие флаги компоновщика CMAKE_SHARED_LINKER_FLAGS. Если версия CMake меньше 3.13.0, то добавляются каталоги компоновки. Создаётся библиотека с именем PREFIX, которая является общей и включает файлы SOURCE_FILES и AUTO_FILES. Задаются пути включения для библиотеки PREFIX. Если версия CMake больше или равна 3.13.0, добавляются каталоги компоновки.
Далее добавляется команда для подписи и установки. В запросе используется язык CMake.
Текст запроса:
${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 openssl genrsa -3 -out ${PEM} 3072
COMMAND bash ${SIGN_TOOL} -d sign -x sgx -i lib${PREFIX}.so -k ${PEM} -o ${OUTPUT} -c ${CMAKE_CURRENT_SOURCE_DIR}/Enclave.config.xml)
endif()
В случае SGX укажите некоторые параметры компиляции и компоновки, связанные с SGX. При компоновке библиотек SGX и iTrustee сильно различаются. Это связано с тем, что iTrustee — это безопасная ОС с большим количеством возможностей, таких как musl libc и openssl. При компиляции и компоновке анклава iTrustee нет необходимости связывать некоторые базовые библиотеки. Но в SGX нет концепции ОС. Все основные библиотечные интерфейсы, которые должны быть вызваны на стороне безопасности, представлены в виде статических библиотек в SDK SGX, поэтому требуется связать эти статические библиотеки, и чтобы иметь возможность правильно использовать эти статические библиотеки, необходимо связать некоторые библиотеки между указанными параметрами, такими как sgx_trts.
Для получения более подробной информации обратитесь к файлу Makefile примеров SGX. Наконец, подпишите анклав с помощью файла конфигурации, который будет представлен позже. Обратите внимание, что secGear в настоящее время не поддерживает удалённую аутентификацию.
set_target_properties(${PREFIX} PROPERTIES SKIP_BUILD_RPATH TRUE)
Установите некоторые безопасные параметры компиляции.
Напишите файлы конфигурации, связанные с анклавом SGX Содержимое конфигурационных файлов Enclave.config.xml и Enclave.lds совпадает с официальным файлом конфигурации SGX. Для получения подробной информации см. официальный документ по разработке.
Напишите файлы конфигурации, относящиеся к iTrustee Gpd.ta.appID в файле manifest.txt.in — это элемент конфигурации uuid, который генерируется динамически, а другие элементы конфигурации можно найти в документе разработки iTrustee.
сборка и установка (см. ссылку)
Запись журнала на незащищённой стороне:
Разработка на незащищённой стороне аналогична обычной разработке, пользователи могут самостоятельно реализовать функцию ведения журнала для приложений на незащищённой стороне.
Запись журнала в системе безопасности:
Из-за ограничений на различные возможности безопасности каждой платформы разработка на стороне системы безопасности невозможна так же, как и на незащищённой стороне, поэтому мы предоставляем интерфейс PrintInfo для записи журнала безопасности в систему Syslog. Соответствующие файлы конфигурации secgear и secgear.conf были установлены в системном каталоге на этапе сборки и установки secGear. Обратите внимание, что при использовании iTrustee необходимо импортировать заголовочный файл secgear_log.h, но SGX этого не требует. Поскольку SGX реализует функцию журнала через ocall, соответствующий код находится во вспомогательном коде. А когда файл конфигурации установлен, вам нужно запустить «systemctl restart rsyslog», чтобы журнал вступил в силу.
Наконец, чтобы журналы iTrustee выгружались в место, указанное в файле конфигурации, также необходимо запустить /vendor/bin/tlogcat -f. Инструмент tlogcat является частью sdk iTrustee. Значение уровня журнала (set(PRINT_LEVEL 3)).
PRINT_ERROR 0
PRINT_WARNING 1
PRINT_STRACE 2
PRINT_DEBUG 3
В настоящее время существуют некоторые различия в использовании функции журнала. После стабилизации функции ocall iTrustee использование будет унифицировано.
Функцию secGear ocall можно нормально использовать на платформе SGX. В настоящее время есть ограничения с iTrustee:
можно использовать только указанный uuid a3d88d2a-ae2a-4ea5-a37d-35fc5f607e9e, и два Программы, которые включают ocall, не могут работать одновременно, и config нельзя включить. ta.instanceKeepAlive.
Более того, если базовый iTrustee не включает ocall, SDK только сообщит об ошибке регистрации сбоя ocall, и функцию ecall можно будет использовать в обычном режиме.
Соответствующий интерфейс определён в secgear_dataseal.h, secgear_random.h. Для использования обратитесь к примерам / seal_data. Примечание: поскольку функция iTrustee для получения ключей всё ещё не идеальна, связанные с уплотнением интерфейсы в настоящее время не поддерживаются на платформе iTrustee.
secGear представляет EDL (Enclave Description Language) и инструмент промежуточного создания кода codegener. EDL совместим с определением Intel SGX.
secGear представляет инструмент подписи для подписания анклава.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )