注意:- 这个问题与Passing C++ struct to enclave from app in Intel SGX非常相似。 。由于帖子已经发布快一年了,所以我再次发布它,希望可能有一些解决方案。如果您认为此内容重复,请删除此内容。
我正在开发英特尔 SGX 应用程序。在我不受信任的应用程序中,我有一个类(称为 SkipList),其中有一个结构(称为 node) 。我正在尝试将此结构作为具有 **[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”成员的地址也是正确的。但是当我尝试查看“forward”的元素时,我只能看到 1 个元素。实际上应该有更多的15个元素。
有人可以告诉我这是否是 SGX STL vector 实现的问题吗?为什么我无法按预期看到它?
最佳答案
我能够解决该问题。
问题是我的节点结构。如果您看到结构的第二个成员,它是模板参数。我在运行时将其设置为字符串类型。但字符串的大小在编译时并不是固定的。由于编译器不知道字符串的大小,因此无法正确进行类型转换
SkipList<int,string>::node* head = static_cast<SkipList<int,string>::node*>(Node);
所以解决方案是将成员值移动到结构的末尾:)。
现在我已经取得了进一步的进展,并陷入了另一个问题。问题是字符串的 std::hash 计算在飞地内部和外部有所不同。我正在尝试计算不受信任层中字符串的 std::hash,然后在飞地内验证相同的值。由于 enclave 有自己的 stdlib 实现,因此实现有所不同,因此 std::hash 的输出:(
关于c++ - 英特尔 SGX 将 c++ 类/结构作为 void* 传递给 enclave 并将其强制转换回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318444/