2

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

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

所以想法是将一个缓冲区传递到 enclave,然后在另一个缓冲区中返回响应,该缓冲区的大小可以不同,该大小存储在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]

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

4

1 回答 1

2

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

我看到您的问题的两种解决方案,或者使用具有预定足够大小的缓冲区,或者声明一个具有可变大小参数的 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);
}

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

于 2018-04-10T08:12:17.677 回答