Чтение содержимого файла в анклаве SGX

Я пытаюсь прочитать содержимое файла из анклава с помощью OCalls.

enclave.edl:

untrusted {
void ocall_print_string([in, string] const char *str);
void ocall_read_IMA_file([in, string] const char *filename, [out] char *buf, [out] int *size);
};

enclave.cpp:

void printf(const char *fmt, ...) {
ocall_print_string(fmt);
}

void read_IMA_file(const char *filename, char *buf, int *size) {
ocall_read_IMA_file(filename, buf, size);

printf(buf);
}

//whereas the read_IMA_file function is called with
char *buf;
int size;
read_IMA_file("test.txt", buf, &size);

Реализация функций ocall в приложении:

void ocall_print_string(const char *str) {
printf("%s\n", str);
}

void ocall_read_IMA_file(const char *filename, char *content, int *size) {
content = (char*) malloc(sizeof(char) * 10);
memset(content, '\0', sizeof(char) *10);
char tmp[] = "1234567890";
copy(&tmp[0], &tmp[9], content);

cout << content << endl;
}

Но результат, который я получаю, следующий:

123456789 (ноль)

Я не уверен, что я делаю не так?

0

Решение

В приведенной выше программе доверенная функция read_IMA_file вызывается с переменной-указателем (указатель OUT) типа символ. Здесь мы передаем переменную-указатель без выделения памяти.
«read_IMA_file» инициирует OCall, который выделяет память и выполняет операцию «Копировать». Теперь выделенная память действительна в недоверенной области. Таким образом, мы получаем ожидаемый результат для<

Поскольку нет доверенной памяти, выделенной для «содержимого» (до вызова Ocall), во время возврата Ocall в указателе «OUT» не происходит операция обратного копирования.
Таким образом, «buf» не содержит никаких действительных данных при выполнении «print (buf)» после того, как Ocall вернется в доверенную область.

Пожалуйста, попробуйте с действительным указателем OUT на символьный буфер (с некоторым выделением памяти) или указателем IN и OUT на строковый буфер.

1

Другие решения

Если вы ожидаете, что он выведет 1234567890, то вам может понадобиться malloc (11) вместо malloc (10), плюс способ, которым вы используете копию, может также содержать ошибку.

копия (&TMP [0], &tmp [9], content);
копирует 123456789 в контент, исключая последний итератор &ТМП [9], как я понимаю. Для более подробной информации, вы можете посмотреть на: http://www.cplusplus.com/reference/algorithm/copy/

Кроме того, я думаю, что вы также не читаете ни одного контента из файла «test.txt».

1

По вопросам рекламы [email protected]