0

如何使用 [out] 在 ecall 中返回未知大小的指针?我知道的当前方法要求在调用ecall时设置指针的大小,例如:

[out, size=len] int *p, size_t len

还有另一种方法,在调用 ecall 函数时我不必指定指针的大小?

4

1 回答 1

2

您似乎需要 EDL 生成的代码来从 enclave 获取未知长度的数据(在调用时)。

选项 1 是提供一个足够大的缓冲区来接收数据:

public int ecall_test(
                              uint32_t  data_capacity,
    [out, size=data_capacity] uint8_t*  data,
    [out]                     uint32_t* data_size
);

受信任的实现可以用最多data_capacity字节的数据填充缓冲区并返回实际长度data_size。边缘功能代码仍会data_capacity从受信任的输出缓冲区复制字节,但您应该没问题,因为您的data_size<data_capacity字节将得到处理。

选项 2 是两步过程:第一个 ecall 请求可信方法将返回的实际数据长度,然后是另一个提供实际数据的调用。

public int ecall_test_1(
    [out]                 uint32_t* data_size
);

public int ecall_test_2(
                          uint32_t  data_size,
    [out, size=data_size] uint8_t*  data,
);

边缘代码需要提前知道缓冲区大小,并且它无法仅接受来自受信任函数的数据长度(在这种情况下,无法分配相应的缓冲区来承载不受信任端的数据副本)。

于 2018-04-12T11:33:16.943 回答