C语言 为什么在 SGX 中飞地字符串参数必须与 [in] 属性一起使用



使用 OCALL,我想将不受信任的内存中动态创建的 C 字符串的副本获取到我的飞地中。因此,我必须使用[out, string]属性。

但是,我不能这样做,因为我还必须添加[in]属性。问题是我真的不知道字符串的大小,我不希望每次制作 OCALL 时从 enclave 到不受信任的内存中不必要的字符串复制开销(随[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);

然后使用memcpy()手动将 C 字符串从不受信任的内存复制到受信任的内存。

飞地内部:

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;

也许你应该试试这个:

void ocall_get_string([out, size=sz] char* str, size_t sz);

size=sz表示将自动复制回 Enclave 的str的大小。如果未指定大小,则只会将一个字符复制回安全区。