Передача структуры C++ в анклав из приложения в Intel SGX

У меня есть такая структура С++:

struct node                                                 
{
    string splitOn;                                         
    string label;                                           
    bool isLeaf;                                            
    vector<string> childrenValues;                          
    vector<node*> children;                                 
};

Я хотел передать или прочитать это из приложения в анклав Intel SGX. На основании того, что упомянуто здесь: https://software.intel.com/en-us/forums/intel-software-guard-extensions-intel-sgx/topic/703489

Я пробовал это:

ПРИЛОЖЕНИЕ:

node *root = new node;                                          
root = buildDecisionTree(dataTable, root, *tableInfo);  //this initializes the root
void *data3 = static_cast<void*>(root);
ecall_my_dtree(global_eid, &ecall_return, data3);

EDL:

  public int ecall_my_dtree([user_check] void* data);

Анклав:

int ecall_my_dtree(void *data2)
node* root2 = static_cast<node*>(data2);

Но, похоже, root2 не может правильно инициализироваться и указывает на мусор.

О user_check: https://software.intel.com/en-us/node/708978< /а>

Любая помощь относительно того, как я мог правильно читать данные внутри анклава. PS: анклав Intel SGX не поддерживает библиотеки сериализации.

Я тоже задавал аналогичный вопрос здесь, но не нашел реального полезного ответа для моего маленького мозга. https://github.com/intel/linux-sgx/issues/229


person Roshan Mehta    schedule 16.03.2018    source источник
comment
Анклав может читать ненадежную память, проблема скорее всего в обработке указателей. Напечатали ли вы значение указателя перед ecall и сразу внутри него? Другой ваш вопрос на форуме linux-sgx имеет другой код, он также, похоже, сериализует структуру node с fwrite, которая не будет работать при чтении из другого процесса. Кроме того, почему слепки? Почему бы не использовать правильный тип указателя? Это EDL ограничено?   -  person Margaret Bloom    schedule 24.03.2018
comment
Да, я пытался распечатать его и выдает мусор, включая некоторые данные, которые я установил на стороне приложения.   -  person Roshan Mehta    schedule 24.03.2018
comment
На форуме Intel SGX, если вы прочитаете весь пост, вы увидите разные попытки, и последняя попытка имеет тот же код, что и этот. Я мог бы поделиться с вами кодом.   -  person Roshan Mehta    schedule 24.03.2018
comment
Что значит мусор? Одинаково ли значение указателя в недоверенном и доверенном домене?   -  person Margaret Bloom    schedule 24.03.2018
comment
Некоторые двоичные данные и фактические данные, которые я установил в приложении.   -  person Roshan Mehta    schedule 24.03.2018
comment
Извините, но я в замешательстве. Кажется, вы успешно передали указатель на доверенный домен (что касается названия этого вопроса).   -  person Margaret Bloom    schedule 24.03.2018
comment
Возможный дубликат stackoverflow.com/ вопросы/41901884/.   -  person Arya Pourtabatabaie    schedule 19.04.2018


Ответы (1)


Вы не должны делать это:

struct node                                                 
{
    string splitOn;                                         
    string label;                                           
    bool isLeaf;                                            
    vector<string> childrenValues;                          
    vector<node*> children;                                 
};

Возможные проблемы:

  • STL не гарантирует бинарную совместимость для большинства своих типов: например, std::string или std::vector.

  • Реализация STL в SGX — это всего лишь модифицированное/уменьшенное его подмножество.

  • Вы можете столкнуться с проблемами, связанными с выравниванием памяти.

Вместо этого вы должны реализовать пользовательскую сериализацию.

person ruizpauker    schedule 03.05.2018