sgx_status_t sgx_create_enclave函数说明

创建一个Enclave的函数如下:

sgx_status_t sgx_create_enclave(
             const char *file_name,
             const int debug,
             sgx_launch_token_t *launch_token,
             int *launch_token_updated,
             sgx_enclave_id_t *enclave_id,
             sgx_misc_attribute_t *misc_attr
        );

下面介绍一下每个变量的含义:

  • file_name: 名称或到enclave镜像的完整路径。如果项目使用Unicode,则文件明使用Unicode编码,如果项目使用多字节字符集,file_name应该是一个ANSI字符串。

  • debug [in]: 1表示在debug模式下创建enclave, 在调试模式下创建的enclave内的代码/数据内存可由调试器或enclave外的其他软件访问,不受Enclave保护。SGX_DEBUG_FLAG这个宏变量表示是否在Debug模式下创建Enclave,这个变量在makefile文件中可以更改。

  • launch_token [in/out]: 指向sgx_launch_token_t对象的指针,用于初始化要创建的enclave, 不能为NULL。调用者可以提供一个全0的buffer作为sgx_launch_token_t,该函数将尝试创建一个有效的sgx_launch_token_t类型的变量token,并将其存储在这个buffer中。调用者存储这个值,并在以后的调用中重用它来创建相同的enclave。当然,某些平台配置可以更改token使其失效,如果这个token失效了。该函数会更新它使其有效。

  • launch_token_updated [out]: 输出是0或1,0表示没有更新token。1表示已更新了token。

  • enclave_id [out]: sgx_enclave_id_t的指针,这个指针接收enclave ID或句柄,不能为NULL。

  • misc_attr [out, optional]: 指向sgx_misc_attribute_t结构的指针,它接收enclave的misc select和属性。如果不需要该信息,则该指针为空。
    下面介绍一下这个函数的返回值:

  • SGX_SUCCESS: 成功加载并初始化了enclave。

  • SGX_ERROR_INVALID_ENCLAVE: enclave文件已损坏。

  • SGX_ERROR_INVALID_PARAMETER: ’ enclave_id ‘、’ updated ‘或’ token '参数为NULL。

  • SGX_ERROR_OUT_OF_MEMORY: 没有足够的内存来完成sgx_create_enclave()。

  • SGX_ERROR_ENCLAVE_FILE_ACCESS: 无法打开enclave文件。这可能是由于没有找到enclave文件或没有访问enclave文件的特权造成的。

  • SGX_ERROR_INVALID_METADATA: 嵌入到enclave镜像中的元数据已损坏或丢失。

  • SGX_ERROR_INVALID_VERSION: enclave元数据版本(由签名工具创建)和不可信库版本(uRTS)不匹配。

  • SGX_ERROR_INVALID_SIGNATURE: enclave的签名无效。

  • SGX_ERROR_OUT_OF_EPC: 受保护的内存已用完。例如,用户创建了太多的enclave, 或者enclave需要太多的内存,我们无法加载完成某个操作所需的架构包。

  • SGX_ERROR_NO_DEVICE: Intel SGX设备无效。这可能是因为没有安装Intel SGX驱动程序或禁用了Intel SGX驱动程序。

  • SGX_ERROR_MEMORY_MAP_CONFLICT: 在创建enclave期间,加载程序和另一个线程之间存在映射内存的竞争条件。加载程序可能无法映射虚拟地址。如果遇到此错误代码,请再次创建enclave。

  • SGX_ERROR_DEVICE_BUSY: 创建enclave时,Intel SGX驱动程序或低层系统非常繁忙。如果遇到此错误代码,我们建议再次创建enclave。

  • SGX_ERROR_MODE_INCOMPATIBLE: enclave模式与当前RTS模式不兼容。例如,64位应用程序尝试加载32位的enclave,或者模拟uRTS模式尝试使用硬件模式加载enclave。

  • SGX_ERROR_SERVICE_UNAVAILABLE: sgx_create_enclave()需要AE服务来获得token。如果服务不可用,则可能无法启动enclave。

  • SGX_ERROR_SERVICE_TIMEOUT: 对AE服务的请求超时。

  • SGX_ERROR_SERVICE_INVALID_PRIVILEGE: 请求需要enclave的一些特殊属性,但是没有特权。

  • SGX_ERROR_NDEBUG_ENCLAVE: enclave被签名为发布的enclave,不能创建为可调试的enclave。

  • SGX_ERROR_UNDEFINED_SYMBOL: enclave包含一个import表。在构建enclave时,签名工具通常应该报告这种类型的错误。

  • SGX_ERROR_INVALID_MISC: MiscSelct/MiscMask设置不正确。

  • SGX_ERROR_HYPERV_ENABLED: 检测到Windows* 10操作系统和Hyper-V*的不兼容版本。在这种情况下,需要禁用目标机器上的Hyper-V。

  • SGX_ERROR_IPLDR_ENCRYPTED: 调用了sgx_create_enclave,但是对enclave进行了加密

  • SGX_ERROR_UNEXPECTED: 检测到意外错误。

这个函数在sgx_urts.lib 或者sgx_urts_sim.lib (simulation)库中。

sgx_enclave_id_t global_eid = 0;
int initialize_enclave(void)
{
    sgx_launch_token_t token = {0};
    sgx_status_t ret = SGX_ERROR_UNEXPECTED;
    int updated = 0;
    ret = sgx_create_enclave(ENCLAVE_FILENAME, SGX_DEBUG_FLAG, &token, &updated, &global_eid, NULL);
    if (ret != SGX_SUCCESS) {
      printf("main: error %#x,failed to create enclave\n",ret );
        return -1;
    }

    return 0;
}

你可能感兴趣的:(SGX)