Intel SGX Передача класса / структуры c ++ как void * в анклав и приведение его обратно - PullRequest
0 голосов
/ 23 января 2019

Примечание: - Этот вопрос очень похож на Передача структуры C ++ в анклав из приложения в Intel SGX .Я публикую это снова, поскольку посту почти 1 год, надеясь, что может быть какое-то решение.Пожалуйста, удалите это, если считаете, что это дубликат.

Я занимаюсь разработкой приложения Intel SGX.У меня есть класс (называемый SkipList ) со структурой (называемой node ) внутри моего ненадежного приложения.Я пытаюсь передать эту структуру как * void **** с атрибутом ** [user_check] в анклав.

struct node {
    size_t key;
    T2 value;
    vector<size_t> hashlabel;
    vector<node*> forward;
};

Как только я получу это в анклаве, я произнесуэто в тип структуры, как показано ниже.

SkipList<int,string>::node* head = static_cast<SkipList<int,string>::node*>(Node);

Когда я начинаю отлаживать это, я вижу, что адрес «головы» после приведения является правильным (я проверил этот адрес и на стороне приложения, оба адреса одинаковы), а также адрес «форвард "член правильный.Но когда я пытаюсь увидеть элементы «вперед», я вижу только 1 элемент.На самом деле должно быть больше 15 элементов.

Может кто-нибудь сказать мне, если это проблема с реализацией векторов SGX STL?Почему я не могу видеть это, как ожидалось?

1 Ответ

0 голосов
/ 30 января 2019

Мне удалось решить проблему.

Проблема была в структуре моего узла . Если вы видите второго члена структуры, это параметр шаблона. Я установил string type во время выполнения. Но размер строки не фиксируется во время компиляции. Поскольку компилятор не знает, каков размер строки, он не смог правильно выполнить тип

SkipList<int,string>::node* head = static_cast<SkipList<int,string>::node*>(Node);

Таким образом, решение состояло в том, чтобы переместить элемент value в конец структуры :).

Теперь я продвинулся дальше и застрял в другой проблеме. Проблема в том, что вычисление строки в std :: hash варьируется внутри и снаружи анклава. Я пытаюсь вычислить std :: hash строки в ненадежном слое, а затем проверить то же самое внутри анклава. Поскольку анклав имеет свою собственную реализацию stdlib, реализация отличается и, следовательно, вывод std :: hash: (

...