Передача вектора в анклав в Intel SGX

у меня есть vector<vector <string>> a; Как я мог передать его в анклав? Как я объявляю функцию edl.
Пример объявления функции для приложения, edl и enclave очень важен.

Я знаю об этом: Аргументы C ++ для функций SGX Enclave Edge.

Образец, чтобы передать даже vector<string> это нормально для меня.

update1:
Я придумал это:

App.cpp

const char *convert(const std::string & s)
{
return s.c_str();
}

vector<string> members_data;
member_data.push_back("apple");
member_data.push_back("orange"); //just for sample

std::vector<const char*>  vc;
std::transform(members_data.begin(), members_data.end(), std::back_inserter(vc), convert);

EDL:

trusted {
public void ecall_receive_vector([in, size=len] const char **arr, size_t len);
};

анклав

void ecall_receive_vector(const char *arr[], size_t len)
{
vector<string> v(arr, arr+len);

printf("%s\n", v[2].c_str());

}

Но анклав не получает никаких данных, программа прекрасно компилируется без ошибок. Кто-нибудь может помочь? Printf является образцом ocall.

1

Решение

В использовании EDL count вместо size,

trusted {
public void ecall_receive_vector([in, count=len] const char **arr, size_t len);
};

Вы передаете двойной указатель, это указатель на char (char **).

В то время как маршалинг / демаршалинг указателей, процессор EDL обрабатывает (копирует и проверяет ввод и вывод) только первый уровень косвенности, разработчик должен обрабатывать дополнительные уровни косвенности. Следовательно, для массива указателей он будет копировать только первый массив указателей, а не указанные значения, копирование их является обязанностью разработчика.

Если не указано count а также size по умолчанию 1 а также sizeof(<pointed-type>) соответственно. В твоем случае size = sizeof(<pointer>) который на большинстве платформ 4,

В вашем случае вы предоставили только size, Поскольку вы не предоставляете код вызывающей стороны, я предполагаю, что вы передаете длину строки, и как count не было указано, по умолчанию 1, Тогда общее количество байтов, основанное на Total number of bytes = count * size будет 1 * len что неправильно.

Используя только count позволит size по умолчанию sizeof(<pointed-type>), затем Total number of bytes = count * size будет count * sizeof(<pointed-type>), что правильно, потому что вы передаете массив указателей.

Чтобы закрыть, попав внутрь анклава, вам нужно скопировать данные указателей, потому что эти указатели находятся вне анклава, что можно сделать автоматически, назначив их std::string,


Из документации Intel SGX SDK:

Обработка указателей (последний абзац)

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

А также,

Расчет размера буфера

Обобщенная формула для расчета размера буфера с использованием этих атрибутов:

Total number of bytes = count * size

  • Приведенная выше формула имеет место, когда оба count а также size/sizefunc указаны.
  • size может быть указан либо size или же sizefunc приписывать.
  • Если count не указан для параметра указателя, то предполагается, что он равен 1то есть count=1, Тогда общее количество байтов равно size/sizefunc,
  • Если size не указан, то размер буфера рассчитывается по приведенной выше формуле где size является sizeof (element pointed by the pointer).
2

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

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

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