为什么在 SGX enclave 中字符串参数必须与 [in] 属性一起使用
Why in SGX enclave string argument has to be used with [in] attribute
使用 OCALL,我想将在不受信任的内存中动态创建的 C 字符串的副本放入我的 enclave。因此,我必须使用 [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
的大小。如果您不指定大小,则只会将一个字符复制回 Enclave。
使用 OCALL,我想将在不受信任的内存中动态创建的 C 字符串的副本放入我的 enclave。因此,我必须使用 [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()
.
飞地内部:
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
的大小。如果您不指定大小,则只会将一个字符复制回 Enclave。