0

注意:- 这个问题非常类似于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;
};

一旦我在飞地内收到它,我就会将它转换为如下的结构类型。

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

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

有人可以告诉我这是否是向量的 SGX STL 实现的问题?为什么我无法按预期看到它?

4

1 回答 1

1

我能够解决这个问题。

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

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

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

现在我已经取得了进一步的进展并陷入了另一个问题。问题是字符串的 std::hash 计算在 enclave 内部和外部有所不同。我正在尝试计算不受信任层中字符串的 std::hash,然后在 enclave 内验证相同的值。由于 enclave 有自己的 stdlib 实现,因此实现不同,因此 std::hash 的输出:(

于 2019-01-30T12:40:34.400 回答