Почему в 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 это будет скопировано обратно в Анклав автоматически. Если вы не укажете размер, то только один символ будет скопирован обратно в Анклав.

Другие вопросы по тегам