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

问题描述 投票:1回答:1

我有一个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。

c++ c sgx
1个回答
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,你需要复制指针的数据,因为这些指针位于飞地之外,可以通过将它们分配给std::string自动完成。


从英特尔SGX SDK文档:

Pointer Handling(最后一段)

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

和,

Buffer Size Calculation

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

Total number of bytes = count * size

  • 当指定countsize/sizefunc时,上述公式成立。
  • size可以通过sizesizefunc属性指定。
  • 如果没有为指针参数指定count,则假定它等于1,即count=1。然后总字节数等于size/sizefunc
  • 如果未指定size,则使用上面的公式计算缓冲区大小,其中sizesizeof (element pointed by the pointer)
© www.soinside.com 2019 - 2024. All rights reserved.