我正在尝试使用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/

10-09 04:03