将矢量传递到英特尔SGX的飞地

时间:2018-02-19 17:55:27

标签: c++ c sgx

我有vector<vector <string>> a;我怎么能把它传递到飞地?我如何声明edl函数。 非常感谢app,edl和enclave的示例函数声明。

我知道这一点:C++ Arguments to SGX Enclave Edge Functions

即使是vector<string>即可通过的示例也适合我。

UPDATE1: 我想出了这个:

App.cpp

const char *convert(const std::string & s)
{
   return s.c_str();
}

vector<string> members_data;
member_data.push_back("apple");
member_data.push_back("orange"); //just for sample

    std::vector<const char*>  vc;
    std::transform(members_data.begin(), members_data.end(), std::back_inserter(vc), convert);

EDL:

trusted {
       public void ecall_receive_vector([in, size=len] const char **arr, size_t len);
};

飞地

void ecall_receive_vector(const char *arr[], size_t len)
{
    vector<string> v(arr, arr+len);

    printf("%s\n", v[2].c_str());

}

但是飞地没有收到任何数据,程序完美编译,没有错误。有人可以帮忙吗? printf是样本ocall。

1 个答案:

答案 0 :(得分:2)

在EDL中使用count代替size

trusted {
    public void ecall_receive_vector([in, count=len] const char **arr, size_t len);
};

您正在传递一个双指针,它是指向char(char **)的指针。

在编组/解组指针时,EDL处理器仅处理(复制和验证输入和输出)第一级间接,它由开发人员处理额外的间接级别。因此,对于一个指针数组,它只会复制第一个指针数组,而不是指向的值,复制它们是开发人员的责任。

如果未指定,则countsize分别默认为1sizeof(<pointed-type>)。在您的情况size = sizeof(<pointer>)中,大多数平台都是4

在您的情况下,您仅提供了size。由于您没有提供来电者代码,我假设您传递了字符串的长度,并且未指定count时默认为1。然后,基于Total number of bytes = count * size的总字节数将为1 * len,这是错误的。

仅使用count会将size默认为sizeof(<pointed-type>),然后Total number of bytes = count * size将为count * sizeof(<pointed-type>),这是正确的,因为您正在通过指针数组。

要关闭,一旦进入Enclave,你需要复制指针&#39;数据因为这些指针位于飞地之外,可以通过将它们分配给std::string来自动完成。

来自英特尔SGX SDK文档:

  

Pointer Handling最后一段

     

您可以使用direction属性来保护性能。否则,您必须使用下面描述的user_check属性并在使用之前通过指针验证从不受信任的内存获得的数据,因为指针指向的内存可能会意外更改,因为它存储在不受信任的内存中。但是,方向属性 对包含指针的结构没有帮助。在这种情况下,开发人员必须自行验证和复制缓冲区内容,如果需要,可以递归

  

Buffer Size Calculation

     

使用以下属性计算缓冲区大小的通用公式:

     

Total number of bytes = count * size

     
      
  • 当指定countsize/sizefunc时,上述公式成立。
  •   
  • size可以由sizesizefunc属性指定。
  •   
  • 如果没有为指针参数指定count,则假定它等于1,即count=1。然后总字节数等于size/sizefunc
  •   
  • 如果未指定size,则使用上述公式计算缓冲区大小,其中size sizeof (element pointed by the pointer)
  •