Как вернуть указатель неизвестного размера в sgx ecall?

Как я могу вернуть указатель неизвестного размера в ecall, используя [out]? Текущий метод, который я знаю, требует, чтобы размер указателя был установлен при вызове ecall, например:

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

Есть ли другой способ, где мне не нужно указывать размер указателя при вызове функции ecall?

0

Решение

Кажется, вам нужен код, сгенерированный 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,
);

Краевой код должен заранее знать размеры буфера, и он не может принять длину данных только от доверенной функции (в этом случае нет способа выделить соответствующий буфер для переноса копии данных на ненадежной стороне). ).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]