Почему в SGX строковый аргумент должен использоваться с атрибутом [in]
Используя OCALL, я хочу получить копию строки C, которая динамически создается в недоверенной памяти, в мой анклав. Таким образом, я должен использовать [out, string]
приписывать.
Тем не менее, я не могу сделать это, потому что я должен добавить [in]
атрибут также. Проблема в том, что я действительно не знаю размер строки и не хочу накладных расходов (это идет с [in]
) от ненужного копирования строки из анклава в ненадежную память каждый раз, когда я делаю OCALL.
Мой файл 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]
атрибут?
Из соображений производительности, есть ли способ избежать этих накладных расходов?
2 ответа
Я думаю, одним из решений было бы передать указатель на 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;
Может быть, вы должны попробовать это:
void ocall_get_string([out, size=sz] char* str, size_t sz);
size=sz
означает размер str
это будет скопировано обратно в Анклав автоматически. Если вы не укажете размер, то только один символ будет скопирован обратно в Анклав.