我有一个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。
在EDL中使用count
而不是size
。
trusted {
public void ecall_receive_vector([in, count=len] const char **arr, size_t len);
};
你正在传递一个双指针,它是一个指向char(char **
)的指针。
在编组/解组指针时,EDL处理器仅处理(复制和验证输入和输出)第一级间接,由开发人员处理额外的间接级别。因此,对于一个指针数组,它只会复制第一个指针数组,而不是指向的值,复制它们是开发人员的责任。
如果没有指定,count
和size
分别默认为1
和sizeof(<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属性对包含指针的结构没有帮助。在这种情况下,开发人员必须自己验证并复制缓冲区内容(如果需要的话)。
和,
使用以下属性计算缓冲区大小的通用公式:
Total number of bytes = count * size
- 当指定
count
和size/sizefunc
时,上述公式成立。size
可以通过size
或sizefunc
属性指定。- 如果没有为指针参数指定
count
,则假定它等于1
,即count=1
。然后总字节数等于size/sizefunc
。- 如果未指定
size
,则使用上面的公式计算缓冲区大小,其中size
是sizeof (element pointed by the pointer)
。