如何在 sgx ecall 中 return 一个未知大小的指针?
How to return a pointer of unknown size in an sgx ecall?
如何使用 [out] 在 ecall 中 return 一个未知大小的指针?我知道的当前方法要求在调用 ecall 时设置指针的大小,例如:
[out, size=len] int *p, size_t len
有没有另一种方法,在调用 ecall 函数时不必指定指针的大小?
您似乎需要 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
字节的数据和 return data_size
中的实际长度填充缓冲区。边缘功能代码仍会从受信任的输出缓冲区复制 data_capacity
字节,但你应该没问题,因为你的 data_size
< data_capacity
字节将得到处理。
选项 2 是两步过程:第一个 ecall 请求可信方法将要发送的实际数据长度 return,然后是另一个提供实际数据的调用。
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,
);
边缘代码需要提前知道缓冲区的大小,它无法接受来自可信函数的数据长度(在这种情况下,无法分配相应的缓冲区来携带数据的副本不受信任端的数据)。
如何使用 [out] 在 ecall 中 return 一个未知大小的指针?我知道的当前方法要求在调用 ecall 时设置指针的大小,例如:
[out, size=len] int *p, size_t len
有没有另一种方法,在调用 ecall 函数时不必指定指针的大小?
您似乎需要 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
字节的数据和 return data_size
中的实际长度填充缓冲区。边缘功能代码仍会从受信任的输出缓冲区复制 data_capacity
字节,但你应该没问题,因为你的 data_size
< data_capacity
字节将得到处理。
选项 2 是两步过程:第一个 ecall 请求可信方法将要发送的实际数据长度 return,然后是另一个提供实际数据的调用。
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,
);
边缘代码需要提前知道缓冲区的大小,它无法接受来自可信函数的数据长度(在这种情况下,无法分配相应的缓冲区来携带数据的副本不受信任端的数据)。