文章目录
- 前言
- 一、Overview of Enclave Execution Environment
- 二、Terminology
- 三、Access-control Requirements
- 四、Segment-based Access Control
- 五、Page-based Access Control
- 5.1 Access-control for Accesses that Originate from non-SGX Instructions
- 5.2 Memory Accesses that Split across ELRANGE
- 5.3 Implicit vs. Explicit Accesses
- 5.3.1 Explicit Accesses
- 5.3.2 Implicit Accesses
- 六、Intel SGX Data Structures Overview
- 七、SGX Enclave Control Structure (SECS)
- 7.1 ATTRIBUTES
- 7.2 SECS.MISCSELECT Field
- 7.3 SECS.CET_ATTRIBUTES Field
- 八、Thread Control Structure (TCS)
- 8.1 TCS.FLAGS
- 8.2 State Save Area Offset (OSSA)
- 8.3 Current State Save Area Frame (CSSA)
- 8.4 Number of State Save Area Frames (NSSA)
- 九、State Save Area (SSA) Frame
- 9.1 GPRSGX Region
- 9.1.1 EXITINFO
- 9.1.2 VECTOR Field Definition
- 9.2 MISC Region
- 9.2.1 EXINFO Structure
- 9.2.2 Page Fault Error Code
- 十、CET State Save Area Frame
- 十一、Page Information (PAGEINFO)
- 十二、Security Information (SECINFO)
- 12.1 SECINFO.FLAGS
- 12.2 PAGE_TYPE Field Definition
- 十三、Paging Crypto MetaData (PCMD)
- 十四、Enclave Signature Structure (SIGSTRUCT)
- 十五、EINIT Token Structure (EINITTOKEN)
- 十六、Report (REPORT)
- 16.1 REPORTDATA
- 十七、Report Target Info (TARGETINFO)
- 十八、Key Request (KEYREQUEST)
- 18.1 KEY REQUEST KeyNames
- 18.2 Key Request Policy Structure
- 十九、Version Array (VA)
- 二十、Enclave Page Cache Map (EPCM)
- 二十一、Read Info (RDINFO)
- 21.1 RDINFO Status Structure
- 21.2 RDINFO Flags Structure
- 参考资料
前言
本文来自于Intel vol3 Chapter 34 Enclave Access Control and Data Structures
本章介绍在 Intel SGX 体系结构中交互的主要概念、对象和数据结构格式。
一、Overview of Enclave Execution Environment
当创建一个保护区域(enclave)时,它拥有一段线性地址范围,处理器会对这个范围应用加强的访问控制。这个范围被称为ELRANGE。当保护区域进行内存访问时,会应用现有的IA32分段和分页架构。此外,ELRANGE内的线性地址必须映射到一个EPC页,否则当保护区域尝试访问该线性地址时会引发一个错误。
EPC页不需要在物理上连续。系统软件将EPC页分配给不同的保护区域。保护区域必须遵守操作系统/虚拟机监视器(OS/VMM)强制的分段和分页策略。OS/VMM管理的页表和扩展页表为保护区域的页面提供地址转换。硬件要求这些页面正确映射到EPC(任何失败都会引发异常)。
保护区域的进入必须通过特定的保护区域指令:
ENCLU[EENTER]、ENCLU[ERESUME]
保护区域的退出必须通过特定的保护区域指令或事件:
ENCLU[EEXIT]、异步保护区域退出(AEX)
当不在保护区域内尝试执行、读取或写入映射到EPC页的线性地址时,处理器会改变访问方式以保护保护区域的机密性和完整性。具体行为可能因实现而异。例如,读取保护区域页面可能会返回全1或返回密文缓存行。写入保护区域页面可能会导致写入被丢弃,或在稍后的时间引发机器检查。处理器将根据第4节和第5节中描述的方式提供这些访问的保护机制。
这些机制确保只有通过指定的保护区域指令进入保护区域的程序可以访问和操作保护区域的内容,而在保护区域之外的访问会受到处理器的保护以维护保护区域的机密性和完整性。
二、Terminology
对ELRANGE的内存访问由保护区域执行的指令发起,称为直接保护区域访问(Direct Enclave Access,Direct EA)。
由某些Intel® SGX指令叶函数(例如ECREATE,EADD,EDBGRD,EDBGWR,ELDU/ELDB,EWB,EREMOVE,EENTER和ERESUME)发起的对EPC页的内存访问称为间接保护区域访问(Indirect Enclave Access,Indirect EA)。表34-1列出了SGX1和SGX2扩展的间接EA的附加细节。
直接EA和间接EA合称为保护区域访问(Enclave Access,EA)。
任何不是保护区域访问的内存访问称为非保护区域访问(non-enclave access)。
三、Access-control Requirements
保护区域访问具有以下访问控制属性:
(1)所有内存访问必须符合分段和分页保护机制。
(2)从保护区域内部进行代码获取(code fetch)到保护区域外部的线性地址会导致 #GP(0) 异常。
(3)从保护区域内部进行影子栈加载(shadow-stack-load)或影子栈存储(shadow-stack-store)到保护区域外部的线性地址会导致 #GP(0) 异常。
(4)对EPC内存的非保护区域访问会导致未定义的行为。对于此类访问,EPC内存受到第4节和第5节中描述的保护。
(5)页面类型为PT_REG、PT_TCS和PT_TRIM的EPC页面必须在分配给保护区域时,通过ENCLS[EADD]或ENCLS[EAUG]叶函数将其映射到ELRANGE的线性地址。通过其他线性地址进行的保护区域访问会导致带有设置了PFEC.SGX位的 #PF 异常。
(6)对任何EPC页面的直接保护区域访问必须符合EPCM中该EPC页面当前定义的安全属性。这些属性可以在创建保护区域时(EADD)定义,也可以在保护区域使用SGX2指令设置时定义。未通过这些检查会导致带有设置了PFEC.SGX位的 #PF 异常。
目标页面必须属于当前正在执行的保护区域。
如果EPCM允许写访问,则可以向EPC页面写入数据。
如果EPCM允许读取访问,则可以从EPC页面读取数据。
如果EPCM允许执行访问,则可以从EPC页面获取指令。
仅当页面类型为PT_SS_FIRST或PT_SS_REST时,才允许从EPC页面进行影子栈加载和影子栈存储。
如果EPCM页面类型为PT_SS_FIRST或PT_SS_REST,则不允许进行非影子栈存储的数据写入。
目标页面不能具有受限的页面类型1(PT_SECS、PT_TCS、PT_VA或PT_TRIM)。
EPC页面不能处于BLOCKED状态。
EPC页面不能处于PENDING状态。
EPC页面不能处于MODIFIED状态。
这些属性和规则确保对保护区域的访问符合安全要求,并防止对保护区域以外的内存产生未授权的访问。
四、Segment-based Access Control
Intel SGX架构不修改逻辑处理器执行的段检查。所有来自保护模式下逻辑处理器的内存访问(包括保护区域访问)都要受到适用段寄存器的段检查。
为了确保外部实体不会以意外的方式修改保护区域的逻辑到线性地址映射,ENCLU[EENTER]和ENCLU[ERESUME]会检查CS、DS、ES和SS寄存器的段基址是否为零(如果可用,即非空)。这些寄存器具有非零的段基址值会导致 #GP(0) 异常。
在通过EENTER或ERESUME进入保护区域时,处理器会保存外部FS和GS寄存器的内容,并将这些寄存器加载为在构建时存储在TCS中的值,以便保护区域内部使用这些寄存器来访问线程本地存储。在EEXIT和AEX时,会恢复进入时的内容。在AEX中,FS和GS的值会保存在SSA帧中。在ERESUME中,FS和GS会从SSA帧中恢复。有关这些操作的详细信息可以在EENTER、ERESUME、EEXIT和AEX流程的描述中找到。
通过这些机制,SGX确保了对保护区域的访问受到段检查的限制,并提供了对FS和GS寄存器的正确保存和恢复,以便保护区域可以安全地使用这些寄存器。
五、Page-based Access Control
5.1 Access-control for Accesses that Originate from non-SGX Instructions
Intel SGX利用处理器的分页机制来为保护区域页面提供以页面为粒度的访问控制。如果某个页面属于当前正在执行的保护区域,那么该页面只能从保护区域内部访问。此外,保护区域访问必须符合第3节中描述的访问控制要求,或通过某些Intel SGX指令进行。如果不在保护区域内部,尝试执行、读取或写入映射到EPC页面的线性地址将导致处理器更改访问方式,以保护保护区域的机密性和完整性。具体行为在不同的实现之间可能会有所不同。
这意味着只有在保护区域内部,才能直接访问EPC页面。如果在保护区域外部尝试访问映射到EPC页面的线性地址,处理器将采取措施以保护保护区域的内容。这样可以防止未经授权的外部实体访问保护区域内的数据。
5.2 Memory Accesses that Split across ELRANGE
在处理器位于保护区域内部时,允许内存数据访问跨越ELRANGE(即部分访问位于ELRANGE内部,部分访问位于ELRANGE外部)。如果访问跨越ELRANGE,处理器会将访问拆分为两个子访问(一个位于ELRANGE内部,另一个位于ELRANGE外部),并对每个访问进行评估。如果代码获取访问跨越ELRANGE,由于位于ELRANGE外部的部分,将导致 #GP 异常。
这意味着当访问涉及到ELRANGE边界时,处理器会将访问分成两部分,并分别对每个部分进行处理。其中一部分位于ELRANGE内,另一部分位于ELRANGE外。对于代码获取访问,如果其中一部分位于ELRANGE外部,将引发 #GP 异常。
这种行为确保了对跨越ELRANGE的内存访问的正确处理,以维护保护区域的安全性和完整性。
5.3 Implicit vs. Explicit Accesses
从Intel SGX指令叶函数发起的内存访问可以分为显式访问和隐式访问两类。表34-1列出了Intel SGX叶函数进行的隐式和显式内存访问。
5.3.1 Explicit Accesses
对于作为Intel SGX指令叶函数的显式操作数或其关联数据结构提供的内存位置的访问称为显式访问。
显式访问始终使用逻辑地址进行。这些访问受到段、分页、扩展分页和APIC虚拟化检查的限制,并在进行访问时触发与这些检查相关的任何故障/退出。
显式访问是指直接指定的内存访问,通过作为叶函数的操作数或链接的数据结构提供。这些访问使用逻辑地址,并受到段、分页、扩展分页和APIC虚拟化检查的约束。当进行访问时,如果违反了这些检查,将触发相应的故障或退出。
显式内存访问与数据断点的交互是叶函数特定的,并在Inte vol3第39.3.4节中有详细记录。
5.3.2 Implicit Accesses
对于由处理器缓存的物理地址访问的数据结构称为隐式访问。这些地址不作为指令的操作数传递,而是通过指令的使用隐含地确定。
这些访问不会触发任何访问控制故障/退出或数据断点。表34-1列出了Intel SGX指令叶函数通过显式访问或隐式访问访问的内存对象。显式访问对象的地址通过寄存器操作数传递,表34-1的第二到第四列与隐式编码的寄存器RBX、RCX、RDX相匹配。
不同隐式访问中使用的物理地址通过不同的指令进行缓存,并具有不同的持续时间。与每个EPC页面相关联的SECS的物理地址在将页面通过ENCLS[EADD]或ENCLS[EAUG]添加到保护区域时进行缓存,或者在通过ENCLS[ELDB]或ENCLS[ELDU]将页面加载到EPC时进行缓存。当通过ENCLS[EREMOVE]或ENCLS[EWB]从EPC中删除相应页面时,此绑定将被解除。TCS和SSA页面的物理地址在最近的保护区域进入时进行缓存。从保护区域退出(ENCLU[EEXIT]或AEX)会清除此缓存。有关异步保护区域退出的详细信息,请参阅第36章。
用于隐式访问的缓存物理地址是根据逻辑(或线性)地址在进行分段、分页、EPT和APIC虚拟化检查等检查之后派生的。但是,请注意,在缓存物理地址并用于隐式访问之后,可能不会触发此类异常或虚拟机退出。
六、Intel SGX Data Structures Overview
保护区域操作通过一组数据结构进行管理。许多顶层数据结构包含子结构。这些顶层数据结构与Intel SGX指令或AEX事件可能在保护区域设置/维护中使用的参数相关。以下是顶层数据结构:
• SGX Enclave Control Structure (SECS)
• Thread Control Structure (TCS)
• State Save Area (SSA)
• Page Information (PAGEINFO)
• Security Information (SECINFO)
• Paging Crypto MetaData (PCMD)
• Enclave Signature Structure (SIGSTRUCT)
• EINIT Token Structure (EINITTOKEN)
• Report Structure (REPORT)
• Report Target Info (TARGETINFO)
• Key Request (KEYREQUEST)
• Version Array (VA)
• Enclave Page Cache Map (EPCM)
• Read Info (RDINFO)
这些顶层数据结构用于管理保护区域操作的各个方面,包括控制保护区域的执行、保存和加载状态、提供加密和安全相关信息等。
七、SGX Enclave Control Structure (SECS)
SECS数据结构需要4K字节对齐。
7.1 ATTRIBUTES
ATTRIBUTES数据结构由以位为单位的字段组成,用于SECS(SGX保护区域控制结构)、REPORT结构和KEYREQUEST结构中。CPUID.(EAX=12H, ECX=1)列举了ATTRIBUTES中允许设置为1的位的位图。
ATTRIBUTES数据结构是一组以位为单位的字段,用于指定保护区域行为和安全性相关的各种属性和设置。
使用输入参数EAX=12H和ECX=1的CPUID指令可以枚举ATTRIBUTES字段中允许设置为1的位的位图。这意味着CPUID指令提供了关于在ATTRIBUTES字段中可以设置为1的特定位的信息。
通过查询EAX=12H和ECX=1的CPUID指令,软件可以获取ATTRIBUTES字段中允许的位设置的位图。这使得软件能够确定CPU支持哪些属性和设置,并可以在相应的数据结构中使用。
7.2 SECS.MISCSELECT Field
CPUID.(EAX=12H, ECX=0):EBX[31:0]枚举了处理器在发生AEX时可以保存到SSA的MISC区域的扩展信息。通过SIGSTRUCT,保护区域编写者可以指定如何设置SECS.MISCSELECT字段。MISCSELECT的位向量选择了在生成AEX时要保存在SSA帧的MISC区域中的扩展信息。扩展信息的位向量定义列在表34-4中。
如果CPUID.(EAX=12H, ECX=0):EBX[31:0] = 0,则SECS.MISCSELECT字段必须全部为零。
SECS.MISCSELECT字段确定了SSA帧的MISC区域的大小,请参阅第9.2节。
根据CPUID.(EAX=12H, ECX=0):EBX[31:0]的值,处理器可以将不同的扩展信息保存在SSA的MISC区域中。通过设置SECS.MISCSELECT字段的位向量,保护区域编写者可以选择要保存的扩展信息。根据所选的位向量,MISC区域的大小也会相应确定。
如果CPUID.(EAX=12H, ECX=0):EBX[31:0] = 0,则表示处理器不支持保存任何扩展信息,并且SECS.MISCSELECT字段必须全部为零。
7.3 SECS.CET_ATTRIBUTES Field
SECS.CET_ATTRIBUTES字段可由保护区域编写者用于在保护区域中启用各种CET(Control-flow Enforcement Technology)属性。当枚举CPUID.(EAX=12, ECX=1):EAX[6]为1时,此字段存在。当CPUID.(EAX=7, ECX=0):ECX.CET_SS为1时,定义了位1:0,当CPUID.(EAX=7, ECX=0):EDX.CET_IBT为1时,定义了位5:2。
CET是一项用于增强控制流程的技术,可以帮助防止恶意软件利用控制流程攻击。SECS.CET_ATTRIBUTES字段允许保护区域编写者通过设置相应的位来启用CET属性。具体而言,当CPU支持CET并且相关的CPUID位已设置时,可以使用SECS.CET_ATTRIBUTES字段来启用特定的CET属性。
当CPU支持CET且CPUID.(EAX=7, ECX=0):ECX.CET_SS位设置为1时,SECS.CET_ATTRIBUTES字段的位1:0定义了特定的CET属性。同样,当CPU支持CET且CPUID.(EAX=7, ECX=0):EDX.CET_IBT位设置为1时,SECS.CET_ATTRIBUTES字段的位5:2定义了其他的CET属性。
保护区域编写者可以根据CPU支持的CET属性和相关的CPUID位设置,通过设置SECS.CET_ATTRIBUTES字段来启用相应的CET属性。
八、Thread Control Structure (TCS)
保护区中的每个执行线程都与一个线程控制结构相关联。它需要4K字节对齐。
8.1 TCS.FLAGS
如果设置了该选项,允许在此 TCS 上执行保护区时启用和激活调试功能(单步执行、断点等)。硬件在执行 EADD 指令时会清除该位。如果保护区的 ATTRIBUTES.DEBUG 被设置,调试器可能会稍后修改该选项。
8.2 State Save Area Offset (OSSA)
OSSA指向一个状态保存区(State Save Area,SSA)帧的堆栈(参见第9节),用于在保护区执行过程中发生中断或异常时保存处理器状态。
8.3 Current State Save Area Frame (CSSA)
CSSA是当前SSA帧的索引,处理器根据它确定在发生中断或异常时保存处理器状态的位置,该中断或异常发生在保护区执行过程中。CSSA是对由OSSA寻址的帧数组的索引。在AEX(Asynchronous Enclave Exit)操作时,CSSA会增加;在ERESUME(Enclave Resume)操作时,CSSA会减少。
8.4 Number of State Save Area Frames (NSSA)
NSSA指定了为该TCS可用的SSA帧的数量。在进入保护区(EENTER)时,至少必须有一个可用的SSA帧,否则EENTER操作将失败。
九、State Save Area (SSA) Frame
当在保护区中运行时发生AEX(异步保护区退出 - asynchronous enclave exit)时,体系结构状态将保存在线程当前的SSA帧中,该帧由TCS.CSSA指向。SSA帧必须按页对齐,并包含以下区域:
(1)XSAVE区域从SSA帧的基地址开始,该区域以XSAVE/FXSAVE兼容的非压缩格式存储扩展特征寄存器状态。
(2)Pad区域:软件可以选择在XSAVE区域和MISC区域之间维护一个填充区域。填充区域的大小由MISC区域和GPRSGX区域的大小决定。
(3)GPRSGX区域。GPRSGX区域是SSA帧的最后一个区域(参见表格34-8)。它用于保存处理器的通用寄存器(RAX … R15)、RIP、外部RSP和RBP、RFLAGS以及AEX信息。
(4)MISC区域(如果CPUID.EAX=12H,ECX=0且EBX[31:0] != 0)。MISC区域与GRPSGX区域相邻,可能包含在发生AEX时需要保存的零个或多个扩展信息组件。如果MISC区域不存在,则在GPRSGX和XSAVE区域之间的区域是软件可用的填充区域。如果MISC区域存在,则在MISC和XSAVE区域之间的区域是软件可用的填充区域。请参考第9.2节中的附加细节。
9.1 GPRSGX Region
GPRSGX区域的布局如表34-9所示:
9.1.1 EXITINFO
EXITINFO包含用于向保护区内部的软件报告退出原因的信息。它是一个4字节的字段,格式如表格34-10所示。VALID位仅在报告在保护区内部发生的异常情况时设置。请参阅表格34-11,了解在保护区内部报告的异常情况。如果异常情况不是在保护区内部报告的异常,则VECTOR和EXIT_TYPE被清除。当在保护区内部执行时,如果同时发生更高优先级的事件(如SMI)和挂起的调试异常,则更高优先级的事件优先。例如,在SMI事件中,SSA退出信息为零。调试异常将在从SMI返回时被传递。在这种情况下,EXITINFO字段将不包含调试异常的信息。
9.1.2 VECTOR Field Definition
表格34-11包含VECTOR字段。该字段包含在保护区内部发生的某些异常的信息。这些向量值与进入常规异常处理程序时使用的值相同。未显示的所有值在保护区内部不会报告。
9.2 MISC Region
MISC区域的布局如表格34-12所示。处理器在MISC区域中支持的组件数量与CPUID.(EAX=12H, ECX=0):EBX[31:0]位设置为1的位数对应。CPUID.(EAX=12H, ECX=0):EBX[31:0]中的每个置位位都有一个对应组件的定义大小,如表格34-12所示。保护区编写者需要执行以下操作:
(1)决定保护区将支持哪些MISC区域组件。
(2)分配足够大的SSA帧来容纳上述选择的组件。
(3)指示每个保护区构建软件在SECS.MISCSELECT中设置适当的位。
第一个组件EXINFO紧接着GPRSGX区域开始。MISC区域中的其他组件按照升序逐渐增长,朝向XSAVE区域。
MISC区域的大小计算如下:
(4)如果CPUID.(EAX=12H, ECX=0):EBX[31:0] = 0,则不支持MISC区域。
(5)如果CPUID.(EAX=12H, ECX=0):EBX[31:0] != 0,则MISC区域的大小由SECS.MISCSELECT中最高位设置和对应位的MISC组件大小之和确定。当前定义的MISC组件的偏移和大小信息列在表格34-12中。例如,如果SECS.MISCSELECT中设置的最高位是位0,则MISC区域的偏移是OFFSET(GPRSGX)-16,大小为16字节。
(6)处理器只在SECS.MISCSELECT[i]为1时,才在MISC区域中保存MISC组件i。
9.2.1 EXINFO Structure
表34-13包含提供附加信息的EXINFO结构的布局。
9.2.2 Page Fault Error Code
表格34-14包含可能在EXINFO.ERRCD中报告的页面故障错误代码。
注:
在保护区模式下报告U/S=0的页面故障不会在EXINFO中报告。
十、CET State Save Area Frame
CET(Control-flow Enforcement Technology)状态保存区由一组CET状态保存帧组成。CET状态保存帧的数量等于TCS.NSSA。当前的CET SSA帧由TCS.CSSA指示。CET状态保存区的偏移由TCS.OCETSSA指定。
十一、Page Information (PAGEINFO)
PAGEINFO是一个体系结构数据结构,用作EPC管理指令的参数。它需要32字节对齐。
十二、Security Information (SECINFO)
SECINFO数据结构保存了关于保护区页面的元数据信息。
12.1 SECINFO.FLAGS
SECINFO.FLAGS是一组字段,用于描述保护区页面的属性。
12.2 PAGE_TYPE Field Definition
SECINFO标志和EPC标志包含指示页面类型的位。
十三、Paging Crypto MetaData (PCMD)
PCMD结构用于跟踪与分页出的页面相关的加密元数据。结合PAGEINFO,它提供了处理器验证、解密和重新加载分页出的EPC页面所需的足够信息。PCMD结构的大小(128字节)是根据体系结构规定的。EWB计算消息认证码(MAC)值并写入PCMD。ELDB/U读取字段并检查MAC。
PCMD的格式如下:
十四、Enclave Signature Structure (SIGSTRUCT)
SIGSTRUCT是由保护区开发者创建和签名的结构,包含有关保护区的信息。SIGSTRUCT由EINIT叶函数处理,以验证保护区是否被正确构建。
SIGSTRUCT包括ENCLAVEHASH作为SHA256摘要,其定义在FIPS PUB 180-4中。摘要是长度为32的字节字符串,其中的8个HASH双字以小端序存储。
SIGSTRUCT包括四个3072位整数(MODULUS,SIGNATURE,Q1,Q2)。每个整数都表示为长度为384的字节字符串,最高有效字节位于位置“offset + 383”,最低有效字节位于位置“offset”。
(3072位整数)SIGNATURE应该是一个RSA签名,其中:a)RSA模数(MODULUS)是一个3072位整数;b)公共指数设置为3;c)签名过程使用EMSA-PKCS1-v1.5格式,其中的“DigestInfo”值按照PKCS#1 v2.1/RFC 3447中规定的DER编码方式进行编码。
3072位整数Q1和Q2的定义如下:
q1 = floor(Signature^2 / Modulus);
q2 = floor((Signature^3 - q1 * Signature * Modulus) / Modulus);
SIGSTRUCT必须按页对齐。
在表格34-21的第5列中,'Y’表示该字段应该包含在开发者生成的签名中。
十五、EINIT Token Structure (EINITTOKEN)
EINIT令牌(token)由EINIT用于验证保护区是否被允许启动。EINIT令牌由持有EINITTOKEN密钥(启动保护区)的保护区生成。
EINIT令牌必须按512字节对齐。
十六、Report (REPORT)
REPORT结构是EREPORT指令的输出,必须按512字节对齐。
16.1 REPORTDATA
REPORTDATA是一个64字节的数据结构,由保护区提供并包含在报告中。它可以用于安全地将信息从一个保护区传递到目标保护区。
十七、Report Target Info (TARGETINFO)
这个结构是EREPORT叶函数的输入参数。TARGETINFO的地址在RBX中作为有效地址指定。它用于标识目标保护区,该保护区可以对EREPORT返回的REPORT结构进行加密验证。TARGETINFO必须按512字节对齐。
十八、Key Request (KEYREQUEST)
这个结构是EGETKEY叶函数的输入参数。它以RBX中的有效地址的形式传递,并且必须按512字节对齐。它用于选择适当的密钥以及在密钥派生过程中所需的任何附加参数。
18.1 KEY REQUEST KeyNames
18.2 Key Request Policy Structure
十九、Version Array (VA)
为了安全地存储被分页出的EPC页面的版本,Intel SGX定义了一种特殊的EPC页面类型,称为版本数组(Version Array,VA)。每个VA页面包含512个插槽,每个插槽可以存储一个8字节的版本号,用于表示从EPC中分页出的页面的版本。当一个EPC页面被分页出时,软件会选择一个空的VA页面插槽,将被分页出的页面的唯一版本号存储在该插槽中。当EPC页面重新加载时,必须存在一个VA插槽来保存该页面的版本号。如果页面成功重新加载,VA插槽中的版本号将被清除。
VA页面可以像其他EPC页面一样被分页出。在分页出VA页面时,必须使用另一个VA页面中的版本插槽来保存被分页出的VA页面的版本号。版本数组页面必须按4K字节对齐。
二十、Enclave Page Cache Map (EPCM)
EPCM(Enclave Page Cache Map)是处理器用于跟踪EPC内容的安全结构。EPCM对于当前加载到EPC中的每个页面都恰好保存一个条目。EPCM对软件不可访问,而且EPCM字段的布局是特定于实现的。
二十一、Read Info (RDINFO)
RDINFO结构包含有关EPC页面的状态信息。它必须按32字节对齐。
21.1 RDINFO Status Structure
21.2 RDINFO Flags Structure
参考资料
Intel vol3