英特尔SGX将c ++类/结构作为void *传递给飞地并进行回退

时间:2019-01-23 00:37:40

标签: c++ intel sgx

注意:-这个问题与Passing C++ struct to enclave from app in Intel SGX非常相似。由于该职位将近1年,我将再次发布它,希望可能会有解决方案。如果您认为此重复项,请删除它。

我正在开发英特尔SGX应用程序。我不受信任的应用程序中有一个类(称为 SkipList ),其中包含一个结构(称为 node ) 。我试图将此结构作为具有[[user_check] ]属性的 * void ****传递给飞地。

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

一旦我在飞地内部收到了此消息,便将其转换为如下所示的struct类型。

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

当我开始调试它时,我看到强制转换后的“ head”地址正确(我也在应用程序侧检查了该地址,两个地址都相同),并且“ forward”成员的地址也正确。但是,当我尝试查看“转发”的元素时,只能看到1个元素。实际上应该有15个以上的元素。

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

1 个答案:

答案 0 :(得分:0)

我能够解决该问题。

问题是我的节点结构。如果看到结构的第二个成员,则它是模板参数。我在运行时将其设置为 string 类型。但是字符串的大小在编译时并不固定。由于编译器不知道字符串的大小,因此无法正确进行类型转换

gen ddtt=clock("21/11/12 01:20 PM", "MDYhm") 

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

现在,我取得了进一步的进步,陷入了另一个问题。问题是字符串的std :: hash计算在安全区内外是不同的。我试图在不受信任的层中计算字符串的std :: hash,然后在安全区域内进行验证。由于安全区具有自己的stdlib实现,因此实现有所不同,因此std :: hash:(