1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openeuler-secGear

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.en.md

secGear

Введение

secGear — это SDK для разработки приложений с конфиденциальными вычислениями на основе функций аппаратного анклава. Цель состоит в том, чтобы написать единый исходный код для приложений, работающих на разном оборудовании. В настоящее время secGear поддерживает Intel SGX и iTrustee, работающие в ARM Trustzone.

Сборка и установка

Разработка приложения и компиляция

Предполагая, что каталог разработки — .../secGear/examples/test/

1. Напишите описание интерфейса edl

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.

2. Напишите верхний уровень CMakeLists.txt

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 используется при загрузке образа анклава.

3. Напишите код несекретной стороны и CMakeLists.txt

3.1 Создайте новый каталог хоста и напишите main.c

#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 должно быть установлено в указанном белом списке. Конфигурация белого списка будет представлена ниже.

4 Напишите код безопасности стороны, CMakeLists.txt и некоторые файлы конфигурации

4.1 Создайте новый каталог анклава и напишите hello.c

#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.

4.2 Напишите CMakeLists.txt

# Установите префикс автоматического кода
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:

  • задаётся переменная SGX_DIR, которая указывает на путь к SDK;
  • задаются флаги CMAKE_C_FLAGS и CMAKE_C_FLAGS_RELEASE для компилятора C;
  • задается путь LINK_LIBRARY_PATH, который будет использоваться при компоновке;
  • если используется симулятор, то задаются имена библиотек Trts_Library_Name и Service_Library_Name;
  • иначе используются имена Crypto_Library_Name.

Также задаются общие флаги компоновщика 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)

Установите некоторые безопасные параметры компиляции.

4.3 Файл конфигурации образа анклава

Напишите файлы конфигурации, связанные с анклавом SGX Содержимое конфигурационных файлов Enclave.config.xml и Enclave.lds совпадает с официальным файлом конфигурации SGX. Для получения подробной информации см. официальный документ по разработке.

Напишите файлы конфигурации, относящиеся к iTrustee Gpd.ta.appID в файле manifest.txt.in — это элемент конфигурации uuid, который генерируется динамически, а другие элементы конфигурации можно найти в документе разработки iTrustee.

5 Сборка и установка теста

сборка и установка (см. ссылку)

Журнал

Запись журнала на незащищённой стороне:

Разработка на незащищённой стороне аналогична обычной разработке, пользователи могут самостоятельно реализовать функцию ведения журнала для приложений на незащищённой стороне.

Запись журнала в системе безопасности:

Из-за ограничений на различные возможности безопасности каждой платформы разработка на стороне системы безопасности невозможна так же, как и на незащищённой стороне, поэтому мы предоставляем интерфейс 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 использование будет унифицировано.

Использование ocall

Функцию 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 в настоящее время не поддерживает plc, switchless и другие функции SGX.

Подробнее о codegener

secGear представляет EDL (Enclave Description Language) и инструмент промежуточного создания кода codegener. EDL совместим с определением Intel SGX.

Подробнее о sign_tool

secGear представляет инструмент подписи для подписания анклава.

Веха

secGear

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/openeuler-secGear.git
git@api.gitlife.ru:oschina-mirror/openeuler-secGear.git
oschina-mirror
openeuler-secGear
openeuler-secGear
master