总的EPC内部布局长这样。后续结构体描述的资料来源于在SGX手册。
SECS
SGX Enclave Control Structure,每个Enclave进程都具有一个该结构体,用于保存关于该进程的信息,如Enclave的线性基址(对于整个程序而言)和大小。保存在EPC中该Enclave的内存空间,只能由CPU访问。部分成员变量如下:
1. ATTRIBUTES
通过每个bit设置属性,在SECS、CPUID枚举、REPORT和KEYREQUEST 结构体中可能会用到。
XFRM:设置处理器的扩展状态。在AEX时会被保存
2. MISCSELECT
设当AEX发生时,设置在SSA的MISC域中保存哪些扩展信息,目前可用的扩展信息是:在Enclave内部能够报告page fault和general protection异常。
TCS
Thread Control Structure,每个Enclave可以拥有很多个Worker Thread,每个线程都对应一个TCS,用于描述这个线程的信息,如线程执行flag、SSA的位置、当前使用的SSA(若干个SSA组成一个栈)。存储在EPC中,只能由处理器访问。部分成员结构体如下
FLAGS:描述线程执行的Flag,目前只有DBGOPTIN一项,描述是否开启调试特征。
OSSA:SSA栈相对Enclave内存空间的基址。
CSSA:目前使用的SSA
NSSA:可用的SSA数量
SSA
STATE SAVE AREA。AEX(异步Enclave退出,由于中断退出Enclave)时,Enclave线程所需要保存的环境状态,如处理器通用寄存器,杂项属性域。保存在Enclave内存空间。
GPRSGX:General Purpose Register。从RAX到R15、URSP、URBP、EXITINFO等等。EXITINFO:描述导致AEX的异常原因。如果是因为Enclave内部报告的异常,包括异常类型号(如除零错误、断点,其中#GP、#PF需要开启SECS.MISCSELECT.EXINFO = 1)、异常是源自硬件的还是软件的等。
MISC:根据CPUID.(EAX=12H, ECX=0):EBX[31:0]查看硬件支持的杂项属性和SECS.MISCSELECT所开启的杂项属性确定MISC内容,目前可以包含一个EXITINFO结构体。EXITINFO结构体具体存储EXITINFO结构体,包括Page Fault地址、错误代码ERRCD。ERRCD
PAGEINFO
PAGE INFORMATION。作为EPC管理指令的参数来引用某个页,内容包括Enclave线性地址、页地址、指向SECINFO/PCMD的指针、指向SECS的指针。
SECINFO:SECURITY INFORMATION。存储Enclave Page的属性,包括FLAGS和保留空间。FLAGS包括访问权限(读/写/执行)和类型(SECS,TCS,普通Page或VA)等。
PCMD:PAGING CRYPTO METADATA。Page换出时(由于EPC大小有限,处理器可以将页加密存放到不安全内存中)EWB指令计算MAC值存放在PCMD的成员结构体MAC中。有了PCMD加上PAGEINFO,处理器有足够信息来验证、解密、加载之前换出的页(ELDB/U加载该页时候会检查MAC)。该结构体此外还包括SECINFO、ENCLAVEID。
SIGSTRUCT
ENCLAVE SIGNATURE STRUCTURE。每个Enclave具有一个SIGSTRUCT,包括MODULUS、SIGNATURE、Q1、Q2,其中签名包含厂家编号、Build日期、版本号、产品标识符等属性。
MRENCLAVE:每个enclave都由其属性以及页面的位置、内容和保护的哈希值(MRENCLAVE)表示,具有相同哈希的两个enclave是相同的。用于检查enclave的完整性,MRENCLAVE使用SHA-256哈希函数生成。
MRSIGNER:每个Enclave由其管理者进行签名并保存在MRSIGNER,MRSIGNER此外包含管理者公钥的哈希值,MRSIGNER使用SHA-256哈希函数生成。MRSIGNER可以用于后续的签名检查,确保Enclave未被修改。
EINITTOKEN
EINIT TOKEN STRUCTURE。EINIT指令使用EINITTOKEN结构来检查是否允许执行enclave。它包含enclave的属性、MRENCLAVE、MRSIGNER等,它使用启动**执行的HMAC进行身份验证。
REPORT
EREPORT指令的输出,包含CPUSVN、MISCSELECT、MRENCLAVE、MRSIGNER、ISVPRODID、ISVSVN、REPORTDATA等
TARGETINFO
EREPORT指令的输入参数
KEYREQUEST
KEY REQUEST。EGETKEY指令的输入参数
EPCM
ENCLAVE PAGE CACHE MAP,由处理器使用的用于跟踪EPC内容,每一个Entry对应一个EPC Page。软件不可访问。每个Entry会说明EPC Page的RWX权限、Page类型、Page所属的Enclave的SECS、Page的线性地址、锁定状态、挂起状态、修改状态。