Локальная аттестация с Intel SGX

Я пытаюсь выполнить локальную аттестацию между двумя анклавами, созданными из двух разных приложений.

Приведенный пример кода для Linux Вот создает 3 разных анклава, а затем устанавливает безопасные соединения между ними. Но все эти анклавы были созданы одним и тем же приложением, которое поэтому знает все идентификаторы анклавов.

Если два разных приложения создают свой собственный анклав, который должен связываться друг с другом, как исходный анклав узнает идентификатор целевого анклава? Должен ли этот идентификатор передаваться из одного приложения в анклав по «общему» пути (IPC)?

Я попытался провести простой тест, запустив целевой анклав и напечатав его идентификатор: «26ce00000002»

Затем я использовал этот идентификатор в примере локальной аттестации, чтобы попытаться подключиться к этому действующему целевому анклаву:

uint64_t wrapper(const char *c) {
errno = 0;
uint64_t result = strtoull(c, NULL, 16);

if (errno == EINVAL) {
cout << "WRONG NUMBER" << endl;
} else if (errno == ERANGE) {
cout << "Too big\n";
}

return result;
}

uint32_t load_enclaves() {
uint32_t enclave_temp_no;
int ret, launch_token_updated;
sgx_launch_token_t launch_token;

enclave_temp_no = 0;

ret = sgx_create_enclave(ENCLAVE1_PATH, SGX_DEBUG_FLAG, &launch_token, &launch_token_updated, &e1_enclave_id, NULL);
if (ret != SGX_SUCCESS) {
return ret;
}
enclave_temp_no++;
g_enclave_id_map.insert(std::pair<sgx_enclave_id_t, uint32_t>(e1_enclave_id, enclave_temp_no));

const char *test = "26ce00000002";
e2_enclave_id = wrapper(test);

enclave_temp_no++;
g_enclave_id_map.insert(std::pair<sgx_enclave_id_t, uint32_t>(e2_enclave_id, enclave_temp_no));

return SGX_SUCCESS;
}

int main(int argc, char **argv) {
uint32_t ret_status;
sgx_status_t status;if(load_enclaves() != SGX_SUCCESS) {
printf("\nLoad Enclave Failure");
}

printf("\nAvaliable Enclaves");
printf("\nEnclave1 - EnclaveID %lx",e1_enclave_id);
printf("\nEnclave2 - EnclaveID %lx",e2_enclave_id);

do {
//Test Create session between Enclave1(Source) and Enclave2(Destination)
status = Enclave1_test_create_session(e1_enclave_id, &ret_status, e1_enclave_id, e2_enclave_id);
if (status!=SGX_SUCCESS)
{
printf("Enclave1_test_create_session Ecall failed: Error status code is %x", status);
print_error_message(status);
break;
}
else
{
if(ret_status==0)
{
printf("\n\nSecure Channel Establishment between Source (E1) and Destination (E2) Enclaves successful !!!");
}
else
{
printf("\nSession establishment and key exchange failure between Source (E1) and Destination (E2): Error return status is %x\n", ret_status);
break;
}
}

При выполнении локальной программы аттестации с исходным анклавом я получаю ошибку «SGX_ERROR_INVALID_ENCLAVE_ID»? Эта ошибка не выдается программой примера локальной аттестации, а происходит откуда-то из библиотек SGX, и я не знаю, почему, поскольку целевой анклав все еще работает, следовательно, идентификатор должен существовать !?

0

Решение

Нам не нужно безопасное соединение для обмена идентификаторами анклавов. Приложение может хранить идентификатор анклава в реестре или на диске вместе с именами анклава, которые могут быть получены соответствующим приложением для получения идентификатора требуемого анклава. Затем приложение инициирует сеанс между исходным анклавом и целевым анклавом, выполняя ECALL в исходный анклав, передавая идентификатор анклава целевого анклава. После получения идентификатора анклава целевого анклава исходный анклав выполняет OCALL в основной недоверенный код, который затем выполняет ECALL в целевой анклав для обмена сообщениями, необходимыми для установления сеанса с использованием протокола обмена ключами ECDH.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]