Чтение содержимого файла в анклаве 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 (ноль)
Я не уверен, что я делаю не так?
2 ответа
В приведенной выше программе доверенная функция read_IMA_file вызывается с переменной-указателем (указатель OUT) типа символ. Здесь мы передаем переменную-указатель без выделения памяти. "read_IMA_file" инициирует OCall, который выделяет память и выполняет операцию "Копировать". Теперь выделенная память действительна в недоверенной области. Таким образом, мы получаем ожидаемый результат для "cout<
Поскольку нет доверенной памяти, выделенной для "содержимого"(до вызова Ocall), во время возврата Ocall в указателе "OUT" не происходит операция обратного копирования. Таким образом, "buf" не содержит никаких действительных данных при выполнении "print(buf)" после того, как Ocall вернется в доверенную область.
Пожалуйста, попробуйте с действительным указателем OUT на символьный буфер (с некоторым выделением памяти) или указателем IN и OUT на строковый буфер.
Если вы ожидаете, что он выведет 1234567890, то вам может понадобиться malloc(11) вместо malloc(10), плюс то, как вы используете copy, может также содержать ошибку.
copy (& tmp [0], &tmp[9], content); копирует 123456789 в контент, он исключает последний итератор &tmp[9], как я понимаю. Для более подробной информации, вы можете посмотреть на: http://www.cplusplus.com/reference/algorithm/copy/
Кроме того, я думаю, что вы также не читаете ни одного контента из файла "test.txt".