0

在阅读了大量文档后,我做了第一个简单的 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

然后它生成了以下文件,您可以在架构中看到:

生成的文件

所以我假设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。我想编译模拟模式而不是真正的模式。

4

2 回答 2

1

Dimitris 首先检查您是否有此列表中的兼容硬件 https://github.com/ayeks/SGX-hardware

然后尝试克隆运行这个 repo https://github.com/digawp/hello-enclave

这将帮助您了解它是如何工作的

于 2017-11-04T07:10:30.323 回答
1

edger8r 的自动生成输出仅用于提供 enclave 和不受信任的外部世界之间的接口。它们不应该包含您的实现。

您应该myFirstMethod在另一个源文件中定义,例如enclave.cenclave.cpp将其与项目的其余部分链接。该函数的签名与您在 edl 中声明的完全一样,除了指针限定符,它们供 edger8r 使用。

它会是这样的:

飞地.cpp:

void myFirstMethod(int *a, int *b, int *sum)
{
  *sum = *a + *b;
}
于 2017-11-04T16:20:02.710 回答