Skip to content

EGETKEY

Henk-Jan Lebbink edited this page Jun 4, 2026 · 3 revisions

INTEL® SGX INSTRUCTION REFERENCES EGETKEY — Retrieves a Cryptographic Key

Opcode/ Instruction Op/En 64/32 bit Mode Support CPUID Feature Flag Description
EAX = 01H ENCLU[EGETKEY] IR V/V SGX1 This leaf function retrieves a cryptographic key.

Instruction Operand Encoding

Op/En EAX RBX RCX
IR EGETKEY (In) Return error code (Out) Address to a KEYREQUEST (In) Address of the OUTPUTDATA (In)

Description

The ENCLU[EGETKEY] instruction returns a 128-bit secret key from the processor specific key hierarchy. The register RBX contains the effective address of a KEYREQUEST structure, which the instruction interprets to determine the key being requested. The Requesting Keys section below provides a description of the keys that can be requested. The RCX register contains the effective address where the key will be returned. Both the addresses in RBX & RCX should be locations inside the enclave.

EGETKEY derives keys using a processor unique value to create a specific key based on a number of possible inputs. This instruction leaf can only be executed inside an enclave.

EEGETKEY Memory Parameter Semantics

KEYREQUEST OUTPUTDATA
Enclave read access Enclave write access

After validating the operands, the instruction determines which key is to be produced and performs the following actions:

  • The instruction assembles the derivation data for the key based on the Table 41-62.

  • Computes derived key using the derivation data and package specific value.

  • Outputs the calculated key to the address in RCX.

The instruction fails with #GP(0) if the operands are not properly aligned. Successful completion of the instruction will clear RFLAGS.{ZF, CF, AF, OF, SF, PF}. The instruction returns an error code if the user tries to request a key based on an invalid CR_CPUSVN or ISVSVN (when the user request is accepted, see the table below), requests a key for which it has not been granted the attribute to request, or requests a key that is not supported by the hardware. These checks may be performed in any order. Thus, an indication by error number of one cause (for example, invalid attribute) does not imply that there are not also other errors. Different processors may thus give different error numbers for the same Enclave. The correctness of software should not rely on the order resulting from the checks documented in this section. In such cases the ZF flag is set and the corresponding error bit (SGX_IN-VALID_SVN, SGX_INVALID_ATTRIBUTE, SGX_INVALID_KEYNAME) is set in RAX and the data at the address specified by RCX is unmodified.

Requesting Keys

The KEYREQUEST structure (see Section 38.18.1) identifies the key to be provided. The Keyrequest.KeyName field identifies which type of key is requested.

Deriving Keys

Key derivation is based on a combination of the enclave specific values (see Table 41-62) and a processor key. Depending on the key being requested a field may either be included by definition or the value may be included from the KeyRequest. A “yes” in Table 41-62 indicates the value for the field is included from its default location, identified in the source row, and a “request” indicates the values for the field is included from its corresponding KeyRequest field.

Vol. 3D 41-99 INTEL® SGX INSTRUCTION REFERENCES

Table 41-62. Key Derivation

Key Name Key Attributes Y := Owner Epoch CR_SGX CPU SVN Y := ISV SVN R := ISV PRODID SECS. ISVEXT PRODID SECS.IS ISVFAM ILYID SECS.IS MRENCLAVE MRSIGNER SECS. SECS. CONFIG ID SECS.CO CONFIGS VN SECS.CO RAND Req.
Source EINITTOKEN Key Dependent Constant Yes Y := SECS.ATTRIBUTES and SECS.MISCSELECT and SECS.CET_ATTRIB UTES; R := AttribMask & CR_SGX OWNER EPOCH Yes Y := CPUSVN Register; R := R := Req.ISV SVN; Request SECS. ISVID Yes SECS.IS VEXTPR ODID No SECS.IS VFAMIL YID No SECS. MRENCLAVE No SECS. MRSIGNER Yes SECS.CO NFIGID No SECS.CO NFIGSVN No Req. KEYID Request
R := AttribMask & SECS.ATTRIBUTES and SECS.MISCSELECT and SECS.CET_ATTRIB UTES; Request R := Req.CPU SVN; Request
EINITTOKEN Report Yes Yes Request Yes Yes Yes Request Yes Request No Yes No No No No No No Yes Yes No No Yes No Yes Request Request
Report Seal Yes Yes Yes Request Yes Yes Yes Request No Request No Request No Request No Request Yes Request No Request Yes Request Yes Request Request Request
Seal Provisioning Yes Yes Request Request Yes No Request Request Request Request Request Yes Request No Request No Request No Request Yes Request No Request No Request Yes
Provisioning Provisioning Yes Yes Request Request No No Request Request Request Request Yes Request No Request No Request No No Yes Yes No Request No Request Yes Yes
Provisioning Seal Yes Request No Request Request Request Request Request No Yes Request Request Yes

Keys that permit the specification of a CPU or ISV's code's, or enclave configuration's SVNs have additional require-ments. The caller may not request a key for an SVN beyond the current CPU, ISV or enclave configuration's SVN, respectively.

Several keys are access controlled. Access to the Provisioning Key and Provisioning Seal key requires the enclave's ATTRIBUTES.PROVISIONKEY be set. The EINITTOKEN Key requires ATTRIBUTES.EINITTOKEN_KEY be set and SECS.MRSIGNER equal IA32_SGXLEPUBKEYHASH.

Some keys are derived based on a hardcode PKCS padding constant (352 byte string):

HARDCODED_PKCS1_5_PADDING[15:0] := 0100H;

HARDCODED_PKCS1_5_PADDING[2655:16] := SignExtend330Byte(-1); // 330 bytes of 0FFH

HARDCODED_PKCS1_5_PADDING[2815:2656] := 2004000501020403650148866009060D30313000H;

The error codes are:

Table 41-63. EGETKEY Return Value in RAX

Error Code (see Table 41-3) Value Description
No Error 0 EGETKEY successful.
SGX_INVALID_ATTRIBUTE The KEYREQUEST contains a KEYNAME for which the enclave is not authorized.
SGX_INVALID_CPUSVN If KEYREQUEST.CPUSVN is an unsupported platforms CPUSVN value.
SGX_INVALID_ISVSVN If KEYREQUEST software SVN (ISVSVN or CONFIGSVN) is greater than the enclave's corresponding SVN.
SGX_INVALID_KEYNAME If KEYREQUEST.KEYNAME is an unsupported value.

Concurrency Restrictions

Table 41-64. Base Concurrency Restrictions of EGETKEY

Leaf Parameter Base Concurrency Restrictions
Access On Conflict
EGETKEY KEYREQUEST [DS:RBX] Concurrent
OUTPUTDATA [DS:RCX] Concurrent

41-100 Vol. INTEL® SGX INSTRUCTION REFERENCES

Table 41-65. Additional Concurrency Restrictions of EGETKEY

Leaf Parameter Additional Concurrency Restrictions
vs. EACCEPT, EACCEPTCOPY, EMODPE, EMODPR, EMODT vs. EADD, EEXTEND, EINIT vs. ETRACK
Access On Conflict Access On Conflict Access On Conflict
EGETKEY KEYREQUEST [DS:RBX] Concurrent Concurrent Concurrent
OUTPUTDATA [DS:RCX] Concurrent Concurrent Concurrent

Operation

Temp Variables in EGETKEY Operational Flow

Name Type Size (Bits) Description
TMP_CURRENTSECS Address of the SECS for the currently executing enclave.
TMP_KEYDEPENDENCIES Temp space for key derivation.
TMP_ATTRIBUTES 128 Temp Space for the calculation of the sealable Attributes.
TMP_ISVEXTPRODID 16 bytes Temp Space for ISVEXTPRODID.
TMP_ISVPRODID 2 bytes Temp Space for ISVPRODID.
TMP_ISVFAMILYID 16 bytes Temp Space for ISVFAMILYID.
TMP_CONFIGID 64 bytes Temp Space for CONFIGID.
TMP_CONFIGSVN 2 bytes Temp Space for CONFIGSVN.
TMP_OUTPUTKEY 128 Temp Space for the calculation of the key.
(* Make sure KEYREQUEST is properly aligned and inside the current enclave *)
IF ( (DS:RBX is not 512Byte aligned) or (DS:RBX is not within CR_ELRANGE) )
    THEN #GP(0); FI;
(* Make sure DS:RBX is an EPC address and the EPC page is valid *)
IF ( (DS:RBX does not resolve to an EPC address) or (EPCM(DS:RBX).VALID = 0) )
    THEN #PF(DS:RBX); FI;
IF (EPCM(DS:RBX).BLOCKED = 1)
    THEN #PF(DS:RBX); FI;
(* Check page parameters for correctness *)
IF ( (EPCM(DS:RBX).PTPT_REG) or (EPCM(DS:RBX).ENCLAVESECSCR_ACTIVE_SECS) or (EPCM(DS:RBX).PENDING = 1) or
    (EPCM(DS:RBX).MODIFIED = 1) or (EPCM(DS:RBX).ENCLAVEADDRESS ≠ (DS:RBX & ~0FFFH) ) or (EPCM(DS:RBX).R = 0) )
    THEN #PF(DS:RBX);
FI;
(* Make sure OUTPUTDATA is properly aligned and inside the current enclave *)
IF ( (DS:RCX is not 16Byte aligned) or (DS:RCX is not within CR_ELRANGE) )
    THEN #GP(0); FI;
(* Make sure DS:RCX is an EPC address and the EPC page is valid *)
IF ( (DS:RCX does not resolve to an EPC address) or (EPCM(DS:RCX).VALID = 0) )
                            Vol. 3D 41-101
INTEL® SGX INSTRUCTION REFERENCES
    THEN #PF(DS:RCX); FI;
IF (EPCM(DS:RCX).BLOCKED = 1)
    THEN #PF(DS:RCX); FI;
(* Check page parameters for correctness *)
IF ( (EPCM(DS:RCX).PTPT_REG) or (EPCM(DS:RCX).ENCLAVESECSCR_ACTIVE_SECS) or (EPCM(DS:RCX).PENDING = 1) or
    (EPCM(DS:RCX).MODIFIED = 1) or (EPCM(DS:RCX).ENCLAVEADDRESS ≠ (DS:RCX & ~0FFFH) ) or (EPCM(DS:RCX).W = 0) )
    THEN #PF(DS:RCX);
FI;
(* Verify RESERVED spaces in KEYREQUEST are valid *)
IF ( (DS:RBX).RESERVED0) or (DS:RBX.KEYPOLICY.RESERVED0) )
    THEN #GP(0); FI;
TMP_CURRENTSECSCR_ACTIVE_SECS;
(* Verify that CONFIGSVN & New Policy bits are not used if KSS is not enabled *)
IF ((TMP_CURRENTSECS.ATTRIBUTES.KSS == 0) AND ((DS:RBX.KEYPOLICY & 0x003C0) OR (DS:RBX.CONFIGSVN > 0)))
    THEN #GP(0); FI;
(* Determine which enclave attributes that must be included in the key. Attributes that must always be include INIT & DEBUG *)
REQUIRED_SEALING_MASK[127:0] ← 00000000 00000000 00000000 00000003H;
TMP_ATTRIBUTES ← (DS:RBX.ATTRIBUTEMASK | REQUIRED_SEALING_MASK) & TMP_CURRENTSECS.ATTRIBUTES;
(* Compute MISCSELECT fields to be included *)
TMP_MISCSELECTDS:RBX.MISCMASK & TMP_CURRENTSECS.MISCSELECT
(* Compute CET_ATTRIBUTES fields to be included *)
IF (CPUID.12H.01H:EAX[6] = 1)
    THEN TMP_CET_ATTRIBUTESDS:RBX.CET_ATTRIBUTES_ MASK & TMP_CURRENTSECS.CET_ATTRIBUTES; FI;
TMP_KEYDEPENDENCIES0;
CASE (DS:RBX.KEYNAME)
    SEAL_KEY:
        IF (DS:RBX.CPUSVN is beyond current CPU configuration)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_CPUSVN;
                GOTO EXIT;
        FI;
        IF (DS:RBX.ISVSVN > TMP_CURRENTSECS.ISVSVN)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ISVSVN;
                GOTO EXIT;
        FI;
        IF (DS:RBX.CONFIGSVN > TMP_CURRENTSECS.CONFIGSVN)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ISVSVN;
                GOTO EXIT;
        FI;
        (*Include enclave identity?*)
    41-102 Vol.
                            INTEL® SGX INSTRUCTION REFERENCES
        TMP_MRENCLAVE0;
        IF (DS:RBX.KEYPOLICY.MRENCLAVE = 1)
            THEN TMP_MRENCLAVETMP_CURRENTSECS.MRENCLAVE;
        FI;
        (*Include enclave author?*)
        TMP_MRSIGNER0;
        IF (DS:RBX.KEYPOLICY.MRSIGNER = 1)
            THEN TMP_MRSIGNERTMP_CURRENTSECS.MRSIGNER;
        FI;
(* Include enclave product family ID? *)
TMP_ISVFAMILYID0;
IF (DS:RBX.KEYPOLICY.ISVFAMILYID = 1)
THEN TMP_ISVFAMILYIDTMP_CURRENTSECS.ISVFAMILYID;
        FI;
(* Include enclave product ID? *)
TMP_ISVPRODID0;
IF (DS:RBX.KEYPOLICY.NOISVPRODID = 0)
TMP_ISVPRODIDTMP_CURRENTSECS.ISVPRODID;
        FI;
(* Include enclave Config ID? *)
TMP_CONFIGID0;
TMP_CONFIGSVN0;
IF (DS:RBX.KEYPOLICY.CONFIGID = 1)
TMP_CONFIGIDTMP_CURRENTSECS.CONFIGID;
TMP_CONFIGSVNDS:RBX.CONFIGSVN;
        FI;
(* Include enclave extended product ID? *)
TMP_ISVEXTPRODID0;
IF (DS:RBX.KEYPOLICY.ISVEXTPRODID = 1 )
TMP_ISVEXTPRODIDTMP_CURRENTSECS.ISVEXTPRODID;
FI;
        //Determine values key is based on
        TMP_KEYDEPENDENCIES.KEYNAMESEAL_KEY;
        TMP_KEYDEPENDENCIES.ISVFAMILYIDTMP_ISVFAMILYID;
        TMP_KEYDEPENDENCIES.ISVEXTPRODIDTMP_ISVEXTPRODID;
        TMP_KEYDEPENDENCIES.ISVPRODIDTMP_ISVPRODID;
        TMP_KEYDEPENDENCIES.ISVSVNDS:RBX.ISVSVN;
        TMP_KEYDEPENDENCIES.SGXOWNEREPOCHCR_SGXOWNEREPOCH;
        TMP_KEYDEPENDENCIES.ATTRIBUTESTMP_ATTRIBUTES;
        TMP_KEYDEPENDENCIES.ATTRIBUTESMASKDS:RBX.ATTRIBUTEMASK;
        TMP_KEYDEPENDENCIES.MRENCLAVETMP_MRENCLAVE;
        TMP_KEYDEPENDENCIES.MRSIGNERTMP_MRSIGNER;
        TMP_KEYDEPENDENCIES.KEYIDDS:RBX.KEYID;
        TMP_KEYDEPENDENCIES.SEAL_KEY_FUSESCR_SEAL_FUSES;
        TMP_KEYDEPENDENCIES.CPUSVNDS:RBX.CPUSVN;
        TMP_KEYDEPENDENCIES.PADDINGTMP_CURRENTSECS.PADDING;
        TMP_KEYDEPENDENCIES.MISCSELECTTMP_MISCSELECT;
        TMP_KEYDEPENDENCIES.MISCMASK ← ~DS:RBX.MISCMASK;
        TMP_KEYDEPENDENCIES.KEYPOLICYDS:RBX.KEYPOLICY;
        TMP_KEYDEPENDENCIES.CONFIGIDTMP_CONFIGID;
                            Vol. 3D 41-103
INTEL® SGX INSTRUCTION REFERENCES
        TMP_KEYDEPENDENCIES.CONFIGSVNTMP_CONFIGSVN;
IF CPUID.12H.01H:EAX[6] = 1
            THEN
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTESTMP_CET_ATTRIBUTES;
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTES _MASKDS:RBX.CET_ATTRIBUTES _MASK;
        FI;
        BREAK;
    REPORT_KEY:
        //Determine values key is based on
        TMP_KEYDEPENDENCIES.KEYNAMEREPORT_KEY;
        TMP_KEYDEPENDENCIES.ISVFAMILYID0;
        TMP_KEYDEPENDENCIES.ISVEXTPRODID0;
        TMP_KEYDEPENDENCIES.ISVPRODID0;
        TMP_KEYDEPENDENCIES.ISVSVN0;
        TMP_KEYDEPENDENCIES.SGXOWNEREPOCHCR_SGXOWNEREPOCH;
        TMP_KEYDEPENDENCIES.ATTRIBUTESTMP_CURRENTSECS.ATTRIBUTES;
        TMP_KEYDEPENDENCIES.ATTRIBUTESMASK0;
        TMP_KEYDEPENDENCIES.MRENCLAVETMP_CURRENTSECS.MRENCLAVE;
        TMP_KEYDEPENDENCIES.MRSIGNER0;
        TMP_KEYDEPENDENCIES.KEYIDDS:RBX.KEYID;
        TMP_KEYDEPENDENCIES.SEAL_KEY_FUSESCR_SEAL_FUSES;
        TMP_KEYDEPENDENCIES.CPUSVNCR_CPUSVN;
        TMP_KEYDEPENDENCIES.PADDINGHARDCODED_PKCS1_5_PADDING;
        TMP_KEYDEPENDENCIES.MISCSELECTTMP_CURRENTSECS.MISCSELECT;
        TMP_KEYDEPENDENCIES.MISCMASK0;
        TMP_KEYDEPENDENCIES.KEYPOLICY0;
        TMP_KEYDEPENDENCIES.CONFIGIDTMP_CURRENTSECS.CONFIGID;
        TMP_KEYDEPENDENCIES.CONFIGSVNTMP_CURRENTSECS.CONFIGSVN;
IF (CPUID.12H.01H:EAX[6] = 1)
            THEN
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTESTMP_CURRENTSECS.CET_ATTRIBUTES;
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTES_MASK0;
        FI;
        BREAK;
    EINITTOKEN_KEY:
        (* Check ENCLAVE has EINITTOKEN Key capability *)
        IF (TMP_CURRENTSECS.ATTRIBUTES.EINITTOKEN_KEY = 0)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ATTRIBUTE;
                GOTO EXIT;
        FI;
        IF (DS:RBX.CPUSVN is beyond current CPU configuration)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_CPUSVN;
                GOTO EXIT;
        FI;
        IF (DS:RBX.ISVSVN > TMP_CURRENTSECS.ISVSVN)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ISVSVN;
                GOTO EXIT;
        FI;
    41-104 Vol.
                            INTEL® SGX INSTRUCTION REFERENCES
        (* Determine values key is based on *)
        TMP_KEYDEPENDENCIES.KEYNAMEEINITTOKEN_KEY;
        TMP_KEYDEPENDENCIES.ISVFAMILYID0;
        TMP_KEYDEPENDENCIES.ISVEXTPRODID0;
        TMP_KEYDEPENDENCIES.ISVPRODIDTMP_CURRENTSECS.ISVPRODID
        TMP_KEYDEPENDENCIES.ISVSVNDS:RBX.ISVSVN;
        TMP_KEYDEPENDENCIES.SGXOWNEREPOCHCR_SGXOWNEREPOCH;
        TMP_KEYDEPENDENCIES.ATTRIBUTESTMP_ATTRIBUTES;
        TMP_KEYDEPENDENCIES.ATTRIBUTESMASK0;
        TMP_KEYDEPENDENCIES.MRENCLAVE0;
        TMP_KEYDEPENDENCIES.MRSIGNERTMP_CURRENTSECS.MRSIGNER;
        TMP_KEYDEPENDENCIES.KEYIDDS:RBX.KEYID;
        TMP_KEYDEPENDENCIES.SEAL_KEY_FUSESCR_SEAL_FUSES;
        TMP_KEYDEPENDENCIES.CPUSVNDS:RBX.CPUSVN;
        TMP_KEYDEPENDENCIES.PADDINGTMP_CURRENTSECS.PADDING;
        TMP_KEYDEPENDENCIES.MISCSELECTTMP_MISCSELECT;
        TMP_KEYDEPENDENCIES.MISCMASK0;
        TMP_KEYDEPENDENCIES.KEYPOLICY0;
        TMP_KEYDEPENDENCIES.CONFIGID0;
        TMP_KEYDEPENDENCIES.CONFIGSVN0;
IF (CPUID.12H.01H:EAX[6] = 1)
            THEN
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTESTMP_CET_ATTRIBUTES;
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTES _MASK0;
        FI;
        BREAK;
    PROVISION_KEY:
    (* Check ENCLAVE has PROVISIONING capability *)
        IF (TMP_CURRENTSECS.ATTRIBUTES.PROVISIONKEY = 0)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ATTRIBUTE;
                GOTO EXIT;
        FI;
        IF (DS:RBX.CPUSVN is beyond current CPU configuration)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_CPUSVN;
                GOTO EXIT;
        FI;
        IF (DS:RBX.ISVSVN > TMP_CURRENTSECS.ISVSVN)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ISVSVN;
                GOTO EXIT;
        FI;
        (* Determine values key is based on *)
        TMP_KEYDEPENDENCIES.KEYNAMEPROVISION_KEY;
        TMP_KEYDEPENDENCIES.ISVFAMILYID0;
        TMP_KEYDEPENDENCIES.ISVEXTPRODID0;
        TMP_KEYDEPENDENCIES.ISVPRODIDTMP_CURRENTSECS.ISVPRODID;
        TMP_KEYDEPENDENCIES.ISVSVNDS:RBX.ISVSVN;
        TMP_KEYDEPENDENCIES.SGXOWNEREPOCH0;
        TMP_KEYDEPENDENCIES.ATTRIBUTESTMP_ATTRIBUTES;
                            Vol. 3D 41-105
INTEL® SGX INSTRUCTION REFERENCES
        TMP_KEYDEPENDENCIES.ATTRIBUTESMASKDS:RBX.ATTRIBUTEMASK;
        TMP_KEYDEPENDENCIES.MRENCLAVE0;
        TMP_KEYDEPENDENCIES.MRSIGNERTMP_CURRENTSECS.MRSIGNER;
        TMP_KEYDEPENDENCIES.KEYID0;
        TMP_KEYDEPENDENCIES.SEAL_KEY_FUSES0;
        TMP_KEYDEPENDENCIES.CPUSVNDS:RBX.CPUSVN;
        TMP_KEYDEPENDENCIES.PADDINGTMP_CURRENTSECS.PADDING;
        TMP_KEYDEPENDENCIES.MISCSELECTTMP_MISCSELECT;
        TMP_KEYDEPENDENCIES.MISCMASK ← ~DS:RBX.MISCMASK;
        TMP_KEYDEPENDENCIES.KEYPOLICY0;
        TMP_KEYDEPENDENCIES.CONFIGID0;
IF (CPUID.12H.01H:EAX[6] = 1)
            THEN
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTESTMP_CET_ATTRIBUTES;
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTES _MASK0;
        FI;
        BREAK;
    PROVISION_SEAL_KEY:
        (* Check ENCLAVE has PROVISIONING capability *)
        IF (TMP_CURRENTSECS.ATTRIBUTES.PROVISIONKEY = 0)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ATTRIBUTE;
                GOTO EXIT;
        FI;
        IF (DS:RBX.CPUSVN is beyond current CPU configuration)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_CPUSVN;
                GOTO EXIT;
        FI;
        IF (DS:RBX.ISVSVN > TMP_CURRENTSECS.ISVSVN)
            THEN
                RFLAGS.ZF1;
                RAXSGX_INVALID_ISVSVN;
                GOTO EXIT;
        FI;
(* Include enclave product family ID? *)
TMP_ISVFAMILYID0;
IF (DS:RBX.KEYPOLICY.ISVFAMILYID = 1)
THEN TMP_ISVFAMILYIDTMP_CURRENTSECS.ISVFAMILYID;
        FI;
(* Include enclave product ID? *)
TMP_ISVPRODID0;
IF (DS:RBX.KEYPOLICY.NOISVPRODID = 0)
TMP_ISVPRODIDTMP_CURRENTSECS.ISVPRODID;
        FI;
(* Include enclave Config ID? *)
TMP_CONFIGID0;
TMP_CONFIGSVN0;
IF (DS:RBX.KEYPOLICY.CONFIGID = 1)
TMP_CONFIGIDTMP_CURRENTSECS.CONFIGID;
    41-106 Vol.
                            INTEL® SGX INSTRUCTION REFERENCES
TMP_CONFIGSVNDS:RBX.CONFIGSVN;
        FI;
(* Include enclave extended product ID? *)
TMP_ISVEXTPRODID0;
IF (DS:RBX.KEYPOLICY.ISVEXTPRODID = 1)
TMP_ISVEXTPRODIDTMP_CURRENTSECS.ISVEXTPRODID;
FI;
        (* Determine values key is based on *)
        TMP_KEYDEPENDENCIES.KEYNAMEPROVISION_SEAL_KEY;
        TMP_KEYDEPENDENCIES.ISVFAMILYIDTMP_ISVFAMILYID;
        TMP_KEYDEPENDENCIES.ISVEXTPRODIDTMP_ISVEXTPRODID;
        TMP_KEYDEPENDENCIES.ISVPRODIDTMP_ISVPRODID;
        TMP_KEYDEPENDENCIES.ISVSVNDS:RBX.ISVSVN;
        TMP_KEYDEPENDENCIES.SGXOWNEREPOCH0;
        TMP_KEYDEPENDENCIES.ATTRIBUTESTMP_ATTRIBUTES;
        TMP_KEYDEPENDENCIES.ATTRIBUTESMASKDS:RBX.ATTRIBUTEMASK;
        TMP_KEYDEPENDENCIES.MRENCLAVE0;
        TMP_KEYDEPENDENCIES.MRSIGNERTMP_CURRENTSECS.MRSIGNER;
        TMP_KEYDEPENDENCIES.KEYID0;
        TMP_KEYDEPENDENCIES.SEAL_KEY_FUSESCR_SEAL_FUSES;
        TMP_KEYDEPENDENCIES.CPUSVNDS:RBX.CPUSVN;
        TMP_KEYDEPENDENCIES.PADDINGTMP_CURRENTSECS.PADDING;
        TMP_KEYDEPENDENCIES.MISCSELECTTMP_MISCSELECT;
        TMP_KEYDEPENDENCIES.MISCMASK ← ~DS:RBX.MISCMASK;
        TMP_KEYDEPENDENCIES.KEYPOLICYDS:RBX.KEYPOLICY;
        TMP_KEYDEPENDENCIES.CONFIGIDTMP_CONFIGID;
        TMP_KEYDEPENDENCIES.CONFIGSVNTMP_CONFIGSVN;
IF (CPUID.12H.01H:EAX[6] = 1)
            THEN
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTESTMP_CET_ATTRIBUTES;
                TMP_KEYDEPENDENCIES.CET_ATTRIBUTES _MASK0;
        FI;
        BREAK;
    DEFAULT:
        (* The value of KEYNAME is invalid *)
        RFLAGS.ZF1;
        RAXSGX_INVALID_KEYNAME;
        GOTO EXIT:
ESAC;
(* Calculate the final derived key and output to the address in RCX *)
TMP_OUTPUTKEYderivekey(TMP_KEYDEPENDENCIES);
DS:RCX[15:0] ← TMP_OUTPUTKEY;
RAX0;
RFLAGS.ZF0;
EXIT:
RFLAGS.CF0;
RFLAGS.PF0;
RFLAGS.AF0;
RFLAGS.OF0;
RFLAGS.SF0;
                            Vol. 3D 41-107
INTEL® SGX INSTRUCTION REFERENCES

Flags Affected

ZF is cleared if successful, otherwise ZF is set. CF, PF, AF, OF, SF are cleared.

Protected Mode Exceptions

#GP(0) If executed outside an enclave. If a memory operand effective address is outside the current enclave. If an effective address is not properly aligned. If an effective address is outside the DS segment limit. If KEYREQUEST format is invalid.

#PF(error code) If a page fault occurs in accessing memory.

64-Bit Mode Exceptions

#GP(0) If executed outside an enclave. If a memory operand effective address is outside the current enclave. If an effective address is not properly aligned. If an effective address is not canonical. If KEYREQUEST format is invalid.

#PF(error code) If a page fault occurs in accessing memory operands.

41-108 Vol.


Source: Intel® 64 and IA-32 Architectures Software Developer's Manual, Combined Volumes (Order Number 325462-091US, March 2026)
Generated: 7-6-2026

Clone this wiki locally