将可变大小的缓冲区从SGX飞地传递到外部

时间:2018-03-20 23:16:03

标签: c sgx

我正在尝试使用以下原型执行一项功能:

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?如果是,我如何从size中的[out]参数中引用它?

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

1 个答案:

答案 0 :(得分:0)

据我所知,不可能做你想做的事。看起来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);
}

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