2017-11-03 141 views
0

阅读大量的文件后,我做的第一简单飞地功能:SGX飞地:在哪里,做游行的实际功能去和它如何被编译

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

然后在庆典我运行edger8r:

sgx_edger8r enclave.edl 

然后生成以下文件,你可以在架构看:

Generated files

所以我假设之上的某个地方的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?另外,我将如何将我的飞地作为应用程序的一部分编译为静态库。

由于FAS因为我搜索是theese链接教程:

都提到Visual Studio中没有原生运行在GNU/Linux的所以我有点难以遵循。

编辑1:

而且找我看到的https://github.com/01org/linux-sgx为纽带提到,我可以编译在模拟模式:

make SGX_MODE=SIM 

我成功我已经安装了driversdk。我想在模拟模式下编译,而不是真正的。

回答

1

自动生成的输出具有兼容的硬件edger8r只是提供飞地与不信任的外部世界之间的接口。他们不应该包含你的实现。

您应该在另一个源文件中定义myFirstMethod,如enclave.cenclave.cpp,并将其与项目的其余部分进行链接。函数的签名与您在edl中声明的内容完全相同,除了用于edger8r使用的指针限定符外。

它会是这样的:

enclave.cpp:

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