在SGX飞地阅读文件内容

时间:2017-01-03 17:49:09

标签: c++ file-io intel enclave 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(null)

我不确定我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

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

此外,我认为您没有阅读文件中的任何内容&#34; test.txt&#34;任

答案 1 :(得分:1)

在上面的程序中,使用类型为character的指针变量(OUT指针)调用“read_IMA_file”可信函数。这里我们传递指针变量而没有任何内存分配。 “read_IMA_file”启动OCall,分配内存并执行“复制”操作。现在,分配的内存在不受信任的区域内有效。所以我们得到了“cout&lt;”的预期结果。

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

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