将向量传递到 Intel SGX 中的 enclave

2024-05-01

我有一个vector<vector <string>> a;我怎样才能将它传递到飞地?我如何声明 edl 函数。 非常感谢应用程序、edl 和 enclave 的示例函数声明。

我知道这一点:SGX Enclave 边缘函数的 C++ 参数 https://stackoverflow.com/questions/41901884/c-arguments-to-sgx-enclave-edge-functions.

一个样品甚至可以通过vector<string>对我来说没问题。

更新1: 我想出了这个:

App.cpp

const char *convert(const std::string & s)
{
   return s.c_str();
}

vector<string> members_data;
member_data.push_back("apple");
member_data.push_back("orange"); //just for sample

    std::vector<const char*>  vc;
    std::transform(members_data.begin(), members_data.end(), std::back_inserter(vc), convert);

edl:

trusted {
       public void ecall_receive_vector([in, size=len] const char **arr, size_t len);
};

enclave

void ecall_receive_vector(const char *arr[], size_t len)
{
    vector<string> v(arr, arr+len);

    printf("%s\n", v[2].c_str());

}

但是enclave没有接收到任何数据,程序编译完美,没有错误。有人可以帮忙吗? printf 是示例 ocall。


在 EDL 中使用count代替size.

trusted {
    public void ecall_receive_vector([in, count=len] const char **arr, size_t len);
};

您正在传递一个双指针,它是一个指向 char (char **).

在编组/解组指针时,EDL 处理器仅处理(复制并验证输入和输出)第一级间接,由开发人员负责处理其他间接级别。因此,对于指针数组,它只会复制第一个指针数组,而不是指向的值,复制它们是开发人员的责任。

如果没有指定count and size默认为1 and sizeof(<pointed-type>)分别。在你的情况下size = sizeof(<pointer>)在大多数平台上是4.

就您而言,您只提供了size。由于您没有提供调用者代码,我假设您正在传递字符串的长度,并且count未指定,默认为1。然后根据总字节数Total number of bytes = count * size1 * len这是错误的。

仅使用count会让size默认为sizeof(<pointed-type>), then Total number of bytes = count * sizecount * sizeof(<pointed-type>),这是正确的,因为您正在传递一个指针数组。

要关闭,一旦进入飞地,您需要复制指针的数据,因为这些指针驻留在飞地之外,这可以通过将它们分配给std::string.


来自英特尔 SGX SDK 文档:

指针处理 https://software.intel.com/en-us/node/708975 (最后一段)

您可以使用方向属性来以保护换取性能。否则,您必须使用user_check下面描述的属性,并在使用之前验证通过指针从不可信内存获取的数据,因为指针指向的内存可能会意外更改,因为它存储在不可信内存中。然而,方向属性对于包含指针的结构没有帮助。在这种情况下,开发人员必须自己验证并复制缓冲区内容(如果需要的话,可以递归地进行).

And,

缓冲区大小计算 https://software.intel.com/en-us/node/708979

使用这些属性计算缓冲区大小的通用公式:

Total number of bytes = count * size

  • 当两者都成立时,上式成立count and size/sizefunc被指定。
  • size可以通过以下任一方式指定size or sizefunc属性。
  • If count没有为指针参数指定,则假定等于1, i.e., count=1。那么总字节数等于size/sizefunc.
  • If size未指定,则使用上述公式计算缓冲区大小,其中size is sizeof (element pointed by the pointer).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将向量传递到 Intel SGX 中的 enclave 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐