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

Why in SGX enclave string argument has to be used with [in] attribute

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

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

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

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

我想,一种解决方案是传递一个指向 char* 的指针,该指针具有 [out] 属性和长度:

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

然后使用 memcpy().

将 C 字符串从不受信任的内存手动复制到受信任的内存中

飞地内部:

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;

也许你应该试试这个:

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

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