读取 SGX 飞地中的文件内容

Read file content in SGX enclave

我正在尝试使用 OCalls 从 enclave 读取文件的内容。

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, '[=12=]', sizeof(char) *10);
    char tmp[] = "1234567890";
    copy(&tmp[0], &tmp[9], content);

    cout << content << endl;
}

但我收到的结果如下:

123456789 (null)

我不确定我做错了什么?

如果您希望它输出 1234567890,那么您可能需要 malloc(11) 而不是 malloc(10),plus 您使用复制的方式可能包含一个错误也是。

复制(&tmp[0], &tmp[9], 内容); 正在将 123456789 复制到内容中,据我所知,它排除了最后一个迭代器 &tmp[9] 。有关更多详细信息,您可能需要查看:http://www.cplusplus.com/reference/algorithm/copy/

此外,我认为您也没有读取文件 "test.txt" 中的任何内容。

在上面的程序中,"read_IMA_file" 受信函数是使用 character.Here 类型的指针变量(OUT 指针)调用的,我们在传递指针变量时没有分配任何内存。 "read_IMA_file" 启动一个分配内存的 OCall 并执行 "Copy" operation.Now 分配的内存在不受信任的区域内有效。所以我们得到了“cout<

由于没有为"content"分配可信内存(在调用Ocall之前),所以在Ocall returns期间"OUT"指针没有发生复制回操作。 因此 "buf" 在受信任区域中的 Ocall returns 之后执行 "print(buf)" 时不包含任何有效数据。

请尝试使用指向字符缓冲区的有效 OUT 指针(分配了一些内存)或指向字符串缓冲区的 IN 和 OUT 指针。