Как я могу вернуть указатель неизвестного размера в ecall, используя [out]? Текущий метод, который я знаю, требует, чтобы размер указателя был установлен при вызове ecall, например:
[out, size=len] int *p, size_t len
Есть ли другой способ, где мне не нужно указывать размер указателя при вызове функции ecall?
Кажется, вам нужен код, сгенерированный EDL, чтобы получить данные неизвестной длины (во время вызова) из анклава.
Вариант 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
, Код Edge-функции все равно будет копироваться 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,
);
Краевой код должен заранее знать размеры буфера, и он не может принять длину данных только от доверенной функции (в этом случае нет способа выделить соответствующий буфер для переноса копии данных на ненадежной стороне). ).
Других решений пока нет …