首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在SGX enclave中字符串参数必须与[ in ]属性一起使用

为什么在SGX enclave中字符串参数必须与[ in ]属性一起使用
EN

Stack Overflow用户
提问于 2017-08-06 21:16:45
回答 2查看 668关注 0票数 3

使用OCALL,我想将在不可信内存中动态创建的C字符串的副本放到我的enclave中。因此,我必须使用[out, string]属性。

但是,我不能这样做,因为我还必须添加[in]属性。问题是,我真的不知道字符串的大小,我不想每次创建[in]时,从enclave不必要地将字符串复制到不可信的内存,从而产生开销(这是由OCALL带来的)。

我的edl文件:

代码语言:javascript
复制
enclave {
    trusted {
        public void ecall_open(void);
    };
    untrusted {
        void ocall_get_string([out, string] char* str);
    };
};

error: string/wstring/sizefunc should be used with an 'in' attribute

为什么要添加[in]属性?

出于性能方面的原因,有没有办法避免这种开销?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-06 22:40:56

我猜,一种解决方案是将一个指针传递给具有[out]属性和长度的char*

void ocall_get_string([out] char** str, [out] size_t* length);

然后使用memcpy()手动将C字符串从不可信的内存复制到可信的。

在enclave内部:

代码语言:javascript
复制
char* untrusted_str; // pointer to string in untrusted memory that we would get form OCALL
size_t length;  // length of string

ocall_get_string(&untrusted_str, &length);

char *trusted_str = new char[length]; // pointer to string in trusted memory 
memcpy(trusted_str, untrusted_str, length);

// delete it later
delete[] trusted_str;
票数 2
EN

Stack Overflow用户

发布于 2018-09-28 17:13:15

也许你应该试试这个:

void ocall_get_string([out, size=sz] char* str, size_t sz);

size=sz表示将自动复制回Enclave的str的大小。如果你不指定大小,那么只有一个字符会被复制回Enclave。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45532406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档