Анклав SGX: куда идет фактическая функция, которая выполняет процессию и как она компилируется

После прочтения большого количества документации я сделал первую простую функцию анклава:

enclave {
     //Include files 

     //Import other edl files

     //Data structure declarations to be used as parameters of the
     //function prototypes in edl

     trusted {
          public function myFirstMethod([in]  int *a, [in]  int *b,[out] int *sum);
     };

     untrusted {
     };
};

Затем через bash я запускаю edger8r:

sgx_edger8r enclave.edl

Затем он сгенерировал следующие файлы, как вы можете видеть на схеме:

Сгенерированные файлы

Так что я предполагаю, что где-то над enclave_t.c единственная ссылка, которую я нашел, находится в этой функции:

static sgx_status_t SGX_CDECL sgx_myFirstMethod(void* pms)
{
    CHECK_REF_POINTER(pms, sizeof(ms_myFirstMethod_t));
    ms_myFirstMethod_t* ms = SGX_CAST(ms_myFirstMethod_t*, pms);
    sgx_status_t status = SGX_SUCCESS;
    int* _tmp_a = ms->ms_a;
    size_t _len_a = sizeof(*_tmp_a);
    int* _in_a = NULL;
    int* _tmp_b = ms->ms_b;
    size_t _len_b = sizeof(*_tmp_b);
    int* _in_b = NULL;

    CHECK_UNIQUE_POINTER(_tmp_a, _len_a);
    CHECK_UNIQUE_POINTER(_tmp_b, _len_b);

    if (_tmp_a != NULL) {
        _in_a = (int*)malloc(_len_a);
        if (_in_a == NULL) {
            status = SGX_ERROR_OUT_OF_MEMORY;
            goto err;
        }

        memcpy(_in_a, _tmp_a, _len_a);
    }
    if (_tmp_b != NULL) {
        _in_b = (int*)malloc(_len_b);
        if (_in_b == NULL) {
            status = SGX_ERROR_OUT_OF_MEMORY;
            goto err;
        }

        memcpy(_in_b, _tmp_b, _len_b);
    }
    ms->ms_retval = myFirstMethod(_in_a, _in_b);
err:
    if (_in_a) free(_in_a);
    if (_in_b) free(_in_b);

    return status;
}

Особенно в

    ms->ms_retval = myFirstMethod(_in_a, _in_b);

Но где поставить myFirstMethod? Также, как я буду компилировать свой анклав как часть приложения в виде статической библиотеки.

Так быстро, как я искал, учебник в этих ссылках:

Все упоминают Visual Studio, которая изначально не работает на GNU/Linux, поэтому мне немного сложно следовать.

Изменить 1:

Более того, я увидел на https://github.com/01org/linux-sgx что могу скомпилировать в режиме симуляции, так как ссылка упоминает:

make SGX_MODE=SIM

И я успешно установил драйвер и SDK. Я хочу скомпилировать в режиме SIMULATION, а не в режиме реального времени.

2 ответа

Решение

Автоматически сгенерированные выходы edger8r предназначены только для обеспечения интерфейса между анклавом и ненадежным внешним миром. Они не должны содержать ваши реализации.

Вы должны определить myFirstMethod в другом исходном файле, скажем enclave.c или же enclave.cpp и связать его с остальной частью вашего проекта. Сигнатура функции - это именно то, что вы объявили в своем edl, за исключением квалификаторов указателей, которые должен использовать edger8r.

Это пойдет так:

enclave.cpp:

void myFirstMethod(int *a, int *b, int *sum)
{
  *sum = *a + *b;
}

Dimitris сначала проверьте, есть ли у вас совместимое оборудование из этого списка https://github.com/ayeks/SGX-hardware

Затем попробуйте клонировать запустить этот репозиторий https://github.com/digawp/hello-enclave

Это поможет вам понять, как это работает

Другие вопросы по тегам