英特尔SGX将c++类/结构作为void*传递到飞地并将其强制转换回

Intel SGX Passing c++ class/struct as void* to enclave and casting it back

本文关键字:转换 c++ SGX 结构 英特尔 void      更新时间:2023-10-16

注意:-这个问题与在英特尔SGX中从应用程序将C++结构传递到飞地非常相似。我再次发布它,因为这篇帖子已经快1年了,希望有一些解决方案。如果你认为这是重复的,请删除它。

我正在开发一款英特尔SGX应用程序。在我不受信任的应用程序中,我有一个类(名为SkipList),里面有一个结构(名为节点)。我正试图将此结构作为带有**[user_check]属性的*void***传递到飞地中。

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);

当我开始调试它时,我看到强制转换后"head"的地址是正确的(我在应用程序端也检查了这个地址,两个地址都相同),而且"forward"成员的地址也是正确的。但当我试图看到"前进"的元素时,我只能看到一个元素。实际上应该有更多的15个元素。

有人能告诉我这是否是SGX STL矢量实现的问题吗?为什么我不能按预期看到它?

我解决了这个问题。

问题出在我的节点结构上。如果看到结构的第二个成员,则它是一个模板参数。我在运行时将其设置为string类型。但是字符串的大小在编译时并不是固定的。由于编译器不知道字符串的长度,所以无法正确地键入

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

因此,解决方案是将成员移动到结构的末尾:)。

现在我又进步了,陷入了另一个问题。问题是字符串的std::hash计算在包围区内外都有所不同。我正在尝试计算不受信任层中字符串的std::hash,然后在飞地内验证它。由于飞地有自己的stdlib实现,因此实现不同,因此std::hash:(