@Intel SGX 读书笔记…
VS2017 Professional环境和VS2017 Add-in工具适配。所以我下载了VS2017 Professional版做实验。
该VS插件是提供给Intel SGX开发者更方便有效地配置一个Enclave和输入一个Enclave到一个不可信的组件中。
Enclave Setting帮助保持Enclave的配置设置.Enclave配置文件时Enclave项目的一部分,它描述了Enclave元的信息.
打开包含Enclave的项目,点击右键,先择Intel SGX Configuration->Enclave Settings.
名称 | 描述 | 在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的窗口:
如果你想要Enclave不能在debug模式下运行,就确认Debug Selection选项。这个选项跟Enclave配置文件中的
你还可以设置Misc Select和Misc Mask的位值。这两个设置分别跟配置文件中的
如果你想要为Enclave使用Key Separation & Sharing(KSS),就要勾选Enable KSS选项,就是配置文件中
你可以使用链接器选项选择/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 Signing为发布模式执行"两步签名"。
对于Enclave启动控制,用于release mode的Enclave签名密钥必须以安全的方式存储,例如由HSM管理的平台。Enclave Signing提供了一个GUI帮助开发者执行“两步签名”。
步骤一:产生Enclave签名材料
打开包含Enclave的项目,点击右键,选择Intel SGX Configuration -> Enclave Signing。如下图。
输出的签名材料的默认名和地址是指定的。但是你可以改变名字和地址。点击Generate Signing按钮产生Enclave签名材料。
完成步骤一后,你需要用你自己的签名工具,该工具可以访问你的私有签名密钥对输出Enclave签名材料签名,然后将生成的签名文件带回步骤二。(默认情况下,对于release mode,在编译Enclave之后,会自动生成Enclave签名材料)
步骤二:
如果你产生了Enclave签名材料,也已经准备好了结果签名文件,你可以产生签名Enclave文件了.如下图,选中Step2-Generate Signed Enclave File:
签名材料和Enclave文件的默认地址是指定的,但是不要忘记确认一下哦.点击Public Key File旁边的Select按钮,指定相应的公钥.点击Signature File按钮旁边的Select按钮,指定结果签名文件.
指定所有正确的文件后,点击Generate Signed Enclave按钮,然后会在指定的Enclave文件同一目录下产生最后的签名Enclave文件.
Import Enclave帮助选择Enclaves输入到一个不可信的组件中,以保证不可信的组件可以使用该Enclave.
Import Enclave提供一下的作用:
输入Enclaves:
打开包含Enclave项目和将输入Enclave的不可信应用程序。点击右键不可信的应用程序项目。选择Intel SGX Configuration->Import Enclave。如下图:
图中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 Project Configuration帮助添加CVE-2020-0551 mitigation来激活配置到现存的可信项目中.
增加新的配置:
打开包含可新项目的解决方案。点击右键,选择Intel SGX Configuration->Enclave Project Configuration。如下图所示。
CVE-2020-0551对话框为用户提供了选择两个级别的CVE-2020-0551缓解配置的界面.
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签名.
如有误,请指正!感激!