Intel SGX开发者参考书(二)——构建一个SGX项目(一)

@Intel SGX 读书笔记…

构建一个Intel SGX项目

VS2017 Professional环境和VS2017 Add-in工具适配。所以我下载了VS2017 Professional版做实验。

创建一个Enclave

  1. 在VS2017菜单栏中选择文件——>新建——>项目
  2. 选择Visual C++ ——>Intel SGX Enclave Project,根据自己的需要修改名称、位置和解决方案名称。
  3. 点击OK

Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第1张图片
Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第2张图片

  1. 点击Next跳转到Enclave设置页。
    Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第3张图片
  2. 使用适当的配置设置Enclave
    • Project Type:
      Enclave —— 创建一个Enclave项目
      Enclave library —— 给Enclave项目创建一个静态库
    • Additional Libraries:
      C++ 11 —— 给Enclave项目连接C++ 11
      EDL File —— 在Enclave项目中创建一个EDL文件
    • Signing Key:
      输入一个现存的签名密钥到Enclave项目中。如果不输入签名密钥,Enclave则会随机产生一个密钥。
    • Additional Configurations:
      CVE-2020-0551 Load —— 加入CVE-2020-0551缓解负荷水平配置(什么玩意啊,希望早日得到大神指点)
      CVE-2020-0551 Control Flow —— 加入CVE-2020-0551减缓控制流级配置
      Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第4张图片

使用VS Intel SGX插件

该VS插件是提供给Intel SGX开发者更方便有效地配置一个Enclave和输入一个Enclave到一个不可信的组件中。

Enclave Setting帮助保持Enclave的配置设置.Enclave配置文件时Enclave项目的一部分,它描述了Enclave元的信息.
打开包含Enclave的项目,点击右键,先择Intel SGX Configuration->Enclave Settings.
Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第5张图片

名称 描述 在Enclave配置文件中的Tag
Product ID ISV分配项目ID
ISV SVN ISV分配SVN
Thread Stack Size 每个可信线程的堆栈大小(以字节为单位)
Global Heap Size Enclave的堆大小(以字节为单位)
Thread Number 可信线程的数量
Thread Bound Policy TCS管理策略

点击Advanced按钮可以修改高级特点,下图是Advanced Settings的窗口:Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第6张图片
如果你想要Enclave不能在debug模式下运行,就确认Debug Selection选项。这个选项跟Enclave配置文件中的标签是相关的。在Debug模式下的Enclave内存区内的代码和数据是能够被调试器或其他Enclave的外部软件访问的。因此,Debug模式下的Enclave就没有非Debug模式下的Enclave相同的内存访问保护,只有在以Debug模式启动时才能调试Debug。如果这个选项被勾选,配置文件中就会设置该Enclave不能被调试。
你还可以设置Misc SelectMisc Mask的位值。这两个设置分别跟配置文件中的相关联。这俩推荐设置默认值哦。
如果你想要为Enclave使用Key Separation & Sharing(KSS),就要勾选Enable KSS选项,就是配置文件中选项。你可以在文本框中为ISV分配的Extended Product ID和ISV分配的Family ID设置值。注意:你需要在设置ISV分配的Extended Product ID和ISV分配的Family ID之前打开KSS。

Enclave首选的加载地址

你可以使用链接器选项选择/BASE和/FIXED去构建一个Enclave。/FIXED告诉uRTS和驱动只在Enclave首选的加载地址加载Enclave,可以使用/BASE选项指定该地址。
当你使用/BASE时,Enclave 的PE的OptionalHeader.ImageBase是用首选的加载地址设置的。当你指定了/FIXED,链接器不会为Enclave生成一个重定位节,且Enclave的PE的Header.Characteristics将有IMAGE_FILE_RELOCS_STRIPPED设置。另外,PE的OptionalHeader.DLLCharacteristic没有IMAGE_DLL_CHARACTERISTICS_SYNAMIC_BASE设置,以说明这个Enclave DLL不能在加载时重分配。(其实我不太懂这个/BASE和/FIXED,然后百度了一下,大概是在写命令行的时候指定的)
1.当你对Enclave签名时,如果sgx_sign.exe发现一个Enclave在PE的Header.Characteristics中有IMAGE_FILE_RELOCS_STRIPPED设置,它会执行以下操作。2.它将验证Enclave没有重定位节,并且IMAGE_DLL_CHARACTERISTIC_DYNAMIC_BASE在PE的OptionalHeader.DLLCharacteristics中没有设置。3.另外,sgx_sign.exe确保所选的BASE与Enclave大小自然对齐。如果以上三点中的任何一个要求没有满足,sgx_sign.exe会报错。加载器sgx_urts.dll只加载满足以上三个条件的Enclave。如果Enclave没有在首选的加载地址被加载,sgx_urts.dll同样会报错。

Enclave签名

Enclave Signing为发布模式执行"两步签名"。
对于Enclave启动控制,用于release mode的Enclave签名密钥必须以安全的方式存储,例如由HSM管理的平台。Enclave Signing提供了一个GUI帮助开发者执行“两步签名”。
步骤一:产生Enclave签名材料
打开包含Enclave的项目,点击右键,选择Intel SGX Configuration -> Enclave Signing。如下图。
Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第7张图片
输出的签名材料的默认名和地址是指定的。但是你可以改变名字和地址。点击Generate Signing按钮产生Enclave签名材料。
完成步骤一后,你需要用你自己的签名工具,该工具可以访问你的私有签名密钥对输出Enclave签名材料签名,然后将生成的签名文件带回步骤二。(默认情况下,对于release mode,在编译Enclave之后,会自动生成Enclave签名材料)
步骤二:
如果你产生了Enclave签名材料,也已经准备好了结果签名文件,你可以产生签名Enclave文件了.如下图,选中Step2-Generate Signed Enclave File:
Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第8张图片
签名材料和Enclave文件的默认地址是指定的,但是不要忘记确认一下哦.点击Public Key File旁边的Select按钮,指定相应的公钥.点击Signature File按钮旁边的Select按钮,指定结果签名文件.
指定所有正确的文件后,点击Generate Signed Enclave按钮,然后会在指定的Enclave文件同一目录下产生最后的签名Enclave文件.

输入Enclave

Import Enclave帮助选择Enclaves输入到一个不可信的组件中,以保证不可信的组件可以使用该Enclave.
Import Enclave提供一下的作用:

  • 允许从同一个解决方案中中用Intel SGX Wizard创建的一个Enclave。
  • 支持从第三方浏览/搜索EDL文件。
  • 支持移除任何已经被挑选的Enclave。
  • 对于添加到应用程序中的/从应用程序中删除的每个enclave,在不受信任的组件项目中添加/删除enclave的_u.h和_u.c文件。
  • 为不可信的组件建立项目设置。

输入Enclaves:
打开包含Enclave项目和将输入Enclave的不可信应用程序。点击右键不可信的应用程序项目。选择Intel SGX Configuration->Import Enclave。如下图:
Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第9张图片
图中Include EDLs模块中包含该解决方案中所有的Enclave和外部输入的的任何一个Enclave。每个Enclave用一个EDL文件表示。EDL是一个最小的用作描述Enclave结构的IDL。选择Enclave输入到应用程序中。
如果想要输入不是解决方案中的一个Enclave,你可以点击Import EDL去挑选一个新的EDL文件。
你可以从EDL列表中勾选一个你想要输入的EDL文件。
如果所选的EDL文件需要其他的搜索路径给EDL文件,在Search Path Settings中指定搜索路径。
点击OK。然后两个文件会增加到不可信的应用程序项目中:sample_enclave_u.c和sample_enclave_u.h。它们包含用于调用enclave函数的不可信包装函数的声明和定义。另外,当项目重新构建后,不可信应用程序项目的属性就会被修改以重新创建文件。这个文件用户不要修改。为了取消这个行为,可以点Cancel
想要移除一个已经输入的EDL文件,取消勾选,再点击OK即可

Enclave项目配置

Enclave Project Configuration帮助添加CVE-2020-0551 mitigation来激活配置到现存的可信项目中.
增加新的配置:
打开包含可新项目的解决方案。点击右键,选择Intel SGX Configuration->Enclave Project Configuration。如下图所示。
Intel SGX开发者参考书(二)——构建一个SGX项目(一)_第10张图片
CVE-2020-0551对话框为用户提供了选择两个级别的CVE-2020-0551缓解配置的界面.

Enclave项目文件

Intel SGX Wizard是用来创建Enclave项目的。他创建的几个文件的文件名是来源于项目的名字。假设项目名字是sample_enclave,以下是Wizard会产生的文件列表。
源文件:
sample_enclave.cpp-主要的源文件,由用户的函数和变量组成。用户可以增加其他的源文件。
sample_enclave_t.c-可信的自动产生的包装函数。不要修改这个文件,因为每次构建都会重新创建他。
sample_enclave.edl-EDL文件。声明哪些函数由enclave导出(受信任)和导入(不受信任)。
头文件:
sample_enclave_t.h-为打包函数可信任的自动产生的头文件。同样不要修改这个文件,因为每次构建都会重新创建他。
资源文件:
sample_enclave.config.xml-指定Enclave配置。
sample_encalve.private.pem-用作给Enclave签名的RSA私钥。

注意:这个私钥一定要保管好!落入别人手中,人家就可以拿你这个私钥创建一个合法的Enclave了.你可以用sgx_sign在一个分开的环境中给enclave签名.

如有误,请指正!感激!

你可能感兴趣的:(sgx,sgx)