Intel SGX Передача класса/структуры С++ как void* для анклава и отбрасывания обратно

Примечание. Этот вопрос очень похож на Передача структуры 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? Почему я не могу видеть это, как ожидалось?


person Naveen KH    schedule 23.01.2019    source источник
comment
УДАР !!!!!!!!!!   -  person Naveen KH    schedule 23.01.2019
comment
Теперь я пытаюсь поместить все в std::unordered_map и отправить его как void* в анклав. Может ли кто-нибудь сказать мне, можем ли мы преобразовать void* в std::unordered_map? Потому что моя IDE говорит, что я не могу. Разве нельзя приводить пустые указатели к типам STL?   -  person Naveen KH    schedule 23.01.2019


Ответы (1)


Я смог решить проблему.

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

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

Поэтому решением было переместить элемент value в конец структуры :).

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

person Naveen KH    schedule 30.01.2019