为什么在SGX enclave字符串参数必须与[in]属性配合使用
问题描述:
使用OCALL,我想获得一个在非信任内存中动态创建的C字符串副本到我的飞地。因此,我必须使用[out, string]
属性。为什么在SGX enclave字符串参数必须与[in]属性配合使用
但是,我不能那样做,因为我还必须添加[in]
属性。问题是我真的不知道字符串的大小,并且我不希望每次制作OCALL时都会从字符串不必要地复制字符串到不受信任的内存,从而导致开销([in]
附带)。
我EDL文件:
enclave {
trusted {
public void ecall_open(void);
};
untrusted {
void ocall_get_string([out, string] char* str);
};
};
error: string/wstring/sizefunc should be used with an 'in' attribute
为什么我要补充[in]
属性?
出于性能的原因,有没有办法避免这种开销?
答
我想,一个解决办法是将指针传递给char*
与[out]
属性和长度:
void ocall_get_string([out] char** str, [out] size_t* length);
,然后手动从不可信的存储器复制C字符串使用memcpy()
信赖。
内飞地:
char* untrusted_str; // pointer to string in untrusted memory that we would get form OCALL
size_t length; // length of string
ocall_get_string(&untrusted_str, &length);
char *trusted_str = new char[length]; // pointer to string in trusted memory
memcpy(trusted_str, untrusted_str, length);
// delete it later
delete[] trusted_str;
开发者手册上说 “'string'和'wstring'不能 用'单独out'使用。”也许你可以让你的OCALL使用自己的ECALL把数据发送到飞地,像这样:'ocall_get_string()允许ecall_to_pass_string([in,string] char * str)''。在手册中,这是写在第59页的标题*授予访问ECALLs *。 – Daniel