- необходимое условие: ubuntu 16, graphene2.6 и SGX2.6 2. детали и дополнительная информация
- драйвер, psw, sdk установлены правильно
драйвер установлен правильно.
служба aesmd правильно установлена и активна.
- правильно выполнены следующие действия
cd $GRAPHENE_DIR/Pal/src/host/Linux-SGX/signer
openssl genrsa -3 -out enclave-key.pem 3072
cd $GRAPHENE_DIR/Pal/src/host/Linux-SGX/sgx-driver
make
sudo insmod gsgx.ko//shows that it already exists
cd $GRAPHENE_DIR
make SGX=1
sudo sysctl vm.mmap_min_addr=0
cd $GRAPHENE_DIR/LibOS/shim/test/apps/helloworld
make SGX=1
показывает, что графен уже для теста
, когда я начал запускать sample-helloworld, ошибка отображалась как: «Ошибка создания анклава: 25»
SGX=1 ./pal_loader curl
не обращайте внимания на имя. по какой-то причине я изменил его, но нет проблем с этим тестовым кодом для его корректного вывода. результат, который мы ожидали
- Я попытался найти, откуда взялась строка. Используя grep, я нахожу его в $ GRAPHENE / Pal / src / host / Linux -SGX / sgx_main. c, в
initialize_enclave
ret = create_enclave(&enclave_secs,&enclave_token);
if(ret < 0){
SGX_DBG(DBG_E,"Creating enclave failed: ", -ret);
goto out;
}
и я думаю, что проблема может быть в create_enclave
int create_enclave(sgx_arch_secs_t * secs,
sgx_arch_token_t * token)
{
assert(secs->size && IS_POWER_OF_2(secs->size));
assert(IS_ALIGNED(secs->base, secs->size));
int flags = MAP_SHARED;
if (!zero_page) {
zero_page = (void *)
INLINE_SYSCALL(mmap, 6, NULL, g_page_size,
PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0);
if (IS_ERR_P(zero_page))
return -ENOMEM;
}
secs->ssa_frame_size = get_ssaframesize(token->body.attributes.xfrm) / g_page_size;
secs->misc_select = token->masked_misc_select_le;
memcpy(&secs->attributes, &token->body.attributes, sizeof(sgx_attributes_t));
/* Do not initialize secs->mr_signer and secs->mr_enclave here as they are
* not used by ECREATE to populate the internal SECS. SECS's mr_enclave is
* computed dynamically and SECS's mr_signer is populated based on the
* SIGSTRUCT during EINIT (see pp21 for ECREATE and pp34 for
* EINIT in https://software.intel.com/sites/default/files/managed/48/88/329298-002.pdf). */
uint64_t addr = INLINE_SYSCALL(mmap, 6, secs->base, secs->size,
PROT_READ|PROT_WRITE|PROT_EXEC,
flags|MAP_FIXED, isgx_device, 0);
if (IS_ERR_P(addr)) {
if (ERRNO_P(addr) == 1 && (flags | MAP_FIXED))
pal_printf("Permission denied on mapping enclave. "
"You may need to set sysctl vm.mmap_min_addr to zero\n");
SGX_DBG(DBG_I, "enclave ECREATE failed in allocating EPC memory "
"(errno = %ld)\n", ERRNO_P(addr));
return -ENOMEM;
}
assert(secs->base == addr);
struct sgx_enclave_create param = {
.src = (uint64_t) secs,
};
int ret = INLINE_SYSCALL(ioctl, 3, isgx_device, SGX_IOC_ENCLAVE_CREATE, ¶m);
if (IS_ERR(ret)) {
SGX_DBG(DBG_I, "enclave ECREATE failed in enclave creation ioctl - %d\n", ERRNO(ret));
return -ERRNO(ret);
}
if (ret) {
SGX_DBG(DBG_I, "enclave ECREATE failed - %d\n", ret);
return -EPERM;
}
secs->attributes.flags |= SGX_FLAGS_INITIALIZED;
SGX_DBG(DBG_I, "enclave created:\n");
SGX_DBG(DBG_I, " base: 0x%016lx\n", secs->base);
SGX_DBG(DBG_I, " size: 0x%016lx\n", secs->size);
SGX_DBG(DBG_I, " misc_select: 0x%08x\n", secs->misc_select);
SGX_DBG(DBG_I, " attr.flags: 0x%016lx\n", secs->attributes.flags);
SGX_DBG(DBG_I, " attr.xfrm: 0x%016lx\n", secs->attributes.xfrm);
SGX_DBG(DBG_I, " ssa_frame_size: %d\n", secs->ssa_frame_size);
SGX_DBG(DBG_I, " isv_prod_id: 0x%08x\n", secs->isv_prod_id);
SGX_DBG(DBG_I, " isv_svn: 0x%08x\n", secs->isv_svn);
return 0;
}
из всех вещей, единственное, что я получил, это то, что анклав не был создан. что я должен сделать, чтобы получить правильный вывод. Большое спасибо.