3

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

但是,我不能这样做,因为我还必须添加[in]属性。问题是我真的不知道字符串的大小,并且我不希望[in]每次进行 OCALL 时将字符串从 enclave 不必要地复制到不受信任的内存中产生的开销(随之而来)。

我的edl文件:

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]属性?

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

4

2 回答 2

2

I guess, one solution would be to pass a pointer to char* with [out] attribute and length:

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

And then manually copy C string from untrusted memory to trusted using memcpy().

Inside enclave:

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;
于 2017-08-06T14:40:55.977 回答
0

也许你应该试试这个:

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

size=szstr表示将自动复制回 Enclave的大小。如果您不指定大小,则只会将一个字符复制回 Enclave。

于 2018-09-28T09:13:14.920 回答