c - 将可变大小缓冲区从 SGX enclave 传递到外部

标签 c sgx

我正在尝试使用以下原型(prototype)执行一个函数:

void pass_buffer(void** buffer_out, size_t* buffer_out_len, const void* buffer_in, size_t buffer_in_len);

因此,我们的想法是将一个缓冲区传递到飞地,然后在另一个缓冲区中返回响应,该缓冲区的大小可能有所不同,该大小存储在 buffer_out_len 中。

我在定义 EDL 函数时遇到问题。所以我的想法是做类似的事情:

public void pass_buffer([out]void** buffer_out, [out]size_t* buffer_out_len, [in, size = buffer_in_len]const void* buffer_in, size_t buffer_in_len);

现在,这只返回一个充满了一个的缓冲区。我知道我应该使用 size 参数传递缓冲区的长度,但不允许在 size 中使用指针:

public void pass_buffer([out, size = *buffer_out_len]void** buffer_out, [out]size_t* buffer_out_len, [in, size = buffer_in_len]const void* buffer_in, size_t buffer_in_len);

我的最后一个解决方案可以使用其他语法吗?或者也许通过将返回值设置为 size_t buffer_out_len?如果是这样,我如何从 [out] 中的 size 参数引用它?

或者也许还有另一种方法可以实现这种行为?初始化一个可变大小的缓冲区并将其传递给外部?非常感谢。

最佳答案

据我所知,不可能做你想做的事。看来 ecall 函数在调用函数时需要知道带有 [out] 属性的缓冲区的大小。这也是为什么你的最后一个解决方案不起作用,大小函数或变量是在函数调用时计算的。

我看到您的问题有两种解决方案,要么使用具有预定足够大小的缓冲区,要么声明一个具有可变大小参数的 ocall 函数,然后从 ecall 函数的代码中调用它来“设置”您的返回值。这是第二个解决方案的(未经测试的)示例:

在您的 .edl 文件中:

untrusted {
  public void get_buffer([in, size = buffer_in_len] void* buffer_in, size_t buffer_in_len);
};

trusted {
  void set_buffer([in, size = buffer_len] void* buffer, size_t buffer_len);
};

在你的飞地:

void get_buffer(void* buffer_in, size_t buffer_in_len){
  [...]
  set_buffer(my_buffer, my_buffer_len);
}

我不确定这是否是最佳的,但这是我最终使用的解决方案。

关于c - 将可变大小缓冲区从 SGX enclave 传递到外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395654/

相关文章:

c - 加载时 ELF 重定位

c - 为什么我的指针直接返回地址处的值?

c++ - 加载 enclave : Couldn't open file with CreateFile() 时出错

c - 如何正确地重复使用 curl 句柄

c - 结构变量别名

c - 为什么这个对象在函数调用后没有被设置为 NULL?

c - sgx_tcrypto 和 OpenSSL libcrypt 之间明显不兼容

sgx - 英特尔 SGX 中的本地证明如何确保 Enclave 中的代码安全?

ubuntu - 新交所开发环境

c++ - 保护新交所算法的安全