在阅读了大量文档之后,我完成了第一个简单的enclave函数:

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

然后它生成了以下文件,您可以在架构上看到这些文件:
c - SGX Enclave:进行游行的实际功能在哪里以及如何进行编译-LMLPHP
所以我假设在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?另外,我将如何将飞地作为应用程序的一部分编译为静态库。
正如我搜索到的一样,这些链接中有一个教程:
https://software.intel.com/en-us/articles/intel-software-guard-extensions-developing-a-sample-enclave-application
https://software.intel.com/en-us/sgx/code-samples
所有这些都提到了Visual Studio,它不是在GNU/Linux上运行的,所以对我来说有点难以理解。
编辑1:
进一步看我在https://github.com/01org/linux-sgx上看到,我可以在链接提到的模拟模式下编译:
make SGX_MODE=SIM

我成功地安装了driversdk。我想编译超过模拟模式,而不是真正的一个。

最佳答案

edger8r的自动生成输出只是为了在飞地和不受信任的外部世界之间提供接口。它们不应该包含您的实现。
您应该在另一个源文件中定义myFirstMethod,比如enclave.cenclave.cpp,并将其与项目的其余部分链接起来。函数的签名正是您在edl中声明的,但指针限定符除外,这些限定符供edger8r使用。
会是这样的:
飞地.cpp:

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

关于c - SGX Enclave:进行游行的实际功能在哪里以及如何进行编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47105794/

10-11 17:56