background image

Vol. 3D 41-43

SGX INSTRUCTION REFERENCES

IF (EPCM(DS:RCX).VALID = 1) 

THEN #PF(DS:RCX); FI;

IF ( (EPCM(DS:RDX & ~0FFFH).VALID = 0) or (EPCM(DS:RDX & ~0FFFH).PT ≠ PT_VA) )

THEN #PF(DS:RDX); FI;

(* Copy PCMD into scratch buffer *)
SCRATCH_PCMD[1023: 0] DS:TMP_PCMD[1023:0];

(* Zero out TMP_HEADER*)
TMP_HEADER[sizeof(TMP_HEADER)-1: 0] 0;

TMP_HEADER.SECINFO  SCRATCH_PCMD.SECINFO;
TMP_HEADER.RSVD  SCRATCH_PCMD.RSVD;
TMP_HEADER.LINADDR  DS:RBX.LINADDR;

(* Verify various attributes of SECS parameter *)
IF ( (TMP_HEADER.SECINFO.FLAGS.PT = PT_REG) or (TMP_HEADER.SECINFO.FLAGS.PT = PT_TCS) or 

 (TMP_HEADER.SECINFO.FLAGS.PT = PT_TRIM) )
THEN 

IF ( DS:TMP_SECS is not 4KByte aligned) 

THEN #GP(0) FI;

IF (DS:TMP_SECS does not resolve within an EPC) 

THEN #PF(DS:TMP_SECS) FI;

IF ( Other instructions modifying SECS) 

THEN #GP(0) FI;

IF ( (EPCM(DS:TMP_SECS).VALID = 0) or (EPCM(DS:TMP_SECS).PT ≠ PT_SECS) )

THEN #PF(DS:TMP_SECS) FI;

ELSIF ( (TMP_HEADER.SECINFO.FLAGS.PT = PT_SECS) or (TMP_HEADER.SECINFO.FLAGS.PT = PT_VA) ) 

IF ( ( TMP_SECS ≠ 0) )

THEN #GP(0) FI;

ELSE

#GP(0) 

FI;

IF ( (TMP_HEADER.SECINFO.FLAGS.PT = PT_REG) or (TMP_HEADER.SECINFO.FLAGS.PT = PT_TCS) or 

 (TMP_HEADER.SECINFO.FLAGS.PT = PT_TRIM) )
THEN 

TMP_HEADER.EID  DS:TMP_SECS.EID;

ELSE

(* These pages do not have any parent, and hence no EID binding *)
TMP_HEADER.EID  0;

FI;

(* Copy 4KBytes SRCPGE to secure location *)
DS:RCX[32767: 0] DS:TMP_SRCPGE[32767: 0];
TMP_VER  DS:RDX[63:0];

(* Decrypt and MAC page. AES_GCM_DEC has 2 outputs, {plain text, MAC} *)
(* Parameters for AES_GCM_DEC {Key, Counter, ..} *)
{DS:RCX, TMP_MAC}  AES_GCM_DEC(CR_BASE_PK, TMP_VER << 32, TMP_HEADER, 128, DS:RCX, 4096);

IF ( (TMP_MAC ≠ DS:TMP_PCMD.MAC) )

THEN