при запуске тестового стенда в графене-SGX, ошибка отображается как «Создание анклава не удалось: 25», так как я должен справиться с этим - PullRequest
0 голосов
/ 29 апреля 2020
  1. необходимое условие: ubuntu 16, graphene2.6 и SGX2.6 2. детали и дополнительная информация
    • драйвер, psw, sdk установлены правильно enter image description here

драйвер установлен правильно. enter image description here

служба 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

enter image description here не обращайте внимания на имя. по какой-то причине я изменил его, но нет проблем с этим тестовым кодом для его корректного вывода. enter image description here результат, который мы ожидали

  • Я попытался найти, откуда взялась строка. Используя grep, я нахожу его в $ GRAPHENE / Pal / src / host / Linux -SGX / sgx_main. c, в initialize_enclave enter image description here
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, &param);

    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;
}

из всех вещей, единственное, что я получил, это то, что анклав не был создан. что я должен сделать, чтобы получить правильный вывод. Большое спасибо.

...