我正在尝试使用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(空)
我不确定自己在做什么错?
最佳答案
在上面的程序中,使用字符类型的指针变量(OUT指针)调用“ read_IMA_file”受信任函数。这里我们传递的指针变量没有任何内存分配。
“ read_IMA_file”启动一个OCall,该OCall分配内存并执行“复制”操作。现在,所分配的内存在不受信任的区域内有效。因此,对于“ cout <
由于没有为“内容”分配可信内存(在调用Ocall之前),因此在Ocall返回期间,“ OUT”指针中不会发生任何回写操作。
因此,在Ocall返回受信任区域后执行“ print(buf)”时,“ buf”不包含任何有效数据。
请尝试使用有效的指向字符缓冲区的OUT指针(有一些内存分配)或指向字符串缓冲区的IN和OUT指针。
关于c++ - 在SGX飞地中读取文件内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41449431/