LOADIWKEY

Carga interna clave de envoltura con Key Locker

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 38 DC 11:rrr:bbbLOADIWKEY xmm1, xmm2, <EAX>, <XMM0>AValidoValidoCarga interna clave de envoltura de xmm1, xmm2 y ER XMM0.

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

A

  1. modrm.reg lecturabyte ModRM, campo reg (bits 5-3)
  2. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  3. EAX lectura
  4. XMM0 lectura

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

La instrucción LOADIWKEY1 escribe el Key Locker interno clave de envoltura, que se llama IWKey. Este IWKey es utilizado por las instrucciones ENCODEKEY para envolver claves en descriptores. Por el contrario, las instrucciones AESENC/DECKL utilizan IWKey para desenvolver las claves de los descriptores y ayudar a verificar la integridad el descriptor. Por razones de seguridad, ninguna instrucción está diseñada para permitir que el software lea directamente el valor IWKey.

IWKey incluye dos criptográficos claves así como metadatos. Los dos criptográficos claves están cargados de fuentes de registro para que LOADIWKEY pueda ser ejecutado sin las claves estar en memoria.

La clave entrada operandos son:

El implícito operando EAX especifica el KeySource y si se permite apoyar a la clave:

storage.

Un KeySource de 0 indica que la entrada la clave operandos descrita anteriormente debe almacenarse directamente como las claves de envoltura interno. LOADIWKEY con un KeySource de 1 tendrá números aleatorios del generador de números aleatorios en chip XORed con los registros fuente (incluyendo XMM0) para que el software que ejecuta el LOADIWKEY no sepa el cifrado e integridad IWKey real claves. El software puede elegir poner datos aleatorios adicionales en los registros de fuentes para que otras fuentes de datos aleatorios se combinen con el valor suministrado por el generador de números aleatorios del hardware. El software siempre debe comprobar ZF después de ejecutar LOADIWKEY con KeySource de 1 ya que esta operación puede fallar debido a que no puede obtener suficientes datos completos del generador de números aleatorios en chip. Ambos KeySource de 0 y 1 especifican que IWKey se utiliza con el algoritmo AES-GCM-SIV. CPUID.19H:ECX[1] enumera soporte para KeySource de 1. Todas las demás codificación KeySource están reservadas.

  1. Más detalles sobre Key Locker y el uso de esta instrucción pueden encontrarse aquí: https://software.intel.com/content/www/us/en/develop/download/intel-clave-locker-specification.html.

Operación

LOADIWKEY

IF CPL > 0              // LOADKWKEY only allowed at ring 0 (supervisor mode)

     THEN #GP (0); FI;

IF EAX[4:1] > 1         // Reserved KeySource encoding used

     THEN #GP (0); FI;

IF EAX[31:5] != 0       // Reserved bit in EAX is set

     THEN #GP (0); FI;

IF EAX[0] AND (CPUID.19H:ECX[0] == 0) // NoBackup is not supported on this part

     THEN #GP (0); FI;

IF (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0) // KeySource of 1 is not supported on this part

     THEN #GP (0); FI;

IF (EAX[4:1] == 0) // KeySource of 0

     THEN

     IWKey.Encryption Key[127:0] := SRC2[127:0]:

     IWKey.Encryption Key[255:128] := SRC1[127:0];

     IWKey.IntegrityKey[127:0] := XMM0[127:0];

     IWKey.NoBackup = EAX [0];

     IWKey.KeySource = EAX [4:1];

     RFLAGS.ZF := 0;

     ELSE               // KeySource of 1. See RDSEED definition for details of randomness

     IF HW_NRND_GEN.ready == 1                         // Full-entropy random data from RDSEED hardware block was received

            THEN

                   IWKey.Encryption Key[127:0] := SRC2[127:0] XOR HW_NRND_GEN.data[127:0];

                   IWKey.Encryption Key[255:128] := SRC1[127:0] XOR HW_NRND_GEN.data[255:128];

                   IWKey.IntegrityKey[127:0] := XMM0[127:0] XOR HW_NRND_GEN.data[383:256];

                   IWKey.NoBackup = EAX [0];

                   IWKey.KeySource = EAX [4:1];

                   RFLAGS.ZF := 0;

            ELSE        // Random data was not returned from RDSEED hardware block. IWKey was not loaded

                   RFLAGS.ZF := 1;

     FI;

FI;

RFLAGS.OF, SF, AF, PF, CF := 0;

Banderas afectadas

ZF se establece a 0 si la operación tuvo éxito y se fijó a 1 si la operación falló debido a los datos aleatorios completos entropía que no se reciben de RDSEED. Las otras banderas aritméticas (OF, SF, AF, PF, CF) se limpian a 0.

Intel C/C++ compilador intrínseco

LOADIWKEY void _mm_loadiwkey(unsigned int ctl, __m128i intkey, __m128i enkey_lo, __m128i enkey_hi);

Excepciones

Modo real
#GPSiCPL >0. (No se aplica enmodo de direccion realSiEAX[4:1] >1. SiEAX[31:5] !=0. SiEAX[0] == 1) AND (CPUID.19H:ECX[0] ==0). Si (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo protegido
#GPSiCPL >0. (No se aplica enmodo de direccion realSiEAX[4:1] >1. SiEAX[31:5] !=0. SiEAX[0] == 1) AND (CPUID.19H:ECX[0] ==0). Si (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo virtual-8086
#GPSiCPL >0. (No se aplica enmodo de direccion realSiEAX[4:1] >1. SiEAX[31:5] !=0. SiEAX[0] == 1) AND (CPUID.19H:ECX[0] ==0). Si (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo de compatibilidad
#GPSiCPL >0. (No se aplica enmodo de direccion realSiEAX[4:1] >1. SiEAX[31:5] !=0. SiEAX[0] == 1) AND (CPUID.19H:ECX[0] ==0). Si (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo de 64 bits
#GPSiCPL >0. (No se aplica enmodo de direccion realSiEAX[4:1] >1. SiEAX[31:5] !=0. SiEAX[0] == 1) AND (CPUID.19H:ECX[0] ==0). Si (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.

Fuentes