c++ - 英特尔 SGX 将 c++ 类/结构作为 void* 传递给 enclave 并将其强制转换回来

标签 c++ intel sgx

注意:- 这个问题与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/

相关文章:

marshalling - 将 C++ 结构从英特尔 SGX 中的应用程序传递到 enclave

c++ - 使用组合设计模式对不同类型的对象进行操作,有没有办法避免对一个对象进行多次操作?

c++ - 为什么 "auto const&"不是只读的?

intel - hlt 期间程序计数器的状态

json - 新交所 IAS 报价认证

英特尔 SGX 线程与 TCS

c++ - 如果通过new创建对象,成员函数的局部变量在哪里创建?

c++ - visual c++ std::isfinite() 是否符合标准?

windows - 在 Hyper-V 虚拟机(Windows 10 Pro)上启用对英特尔 haxm 的 VT 支持?

x86 - 设置、清除 OF 和 TF 标志的汇编指令