ENCODEKEY128

Código 128-Bit clave con Key Locker

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 38 FA 11:rrr:bbbENCODEKEY128 r32, r32, <XMM0-2>, <XMM4-6>AValidoValidoEnvuelve un AES clave de 128 bits de XMM0 a una clave descriptor y salida descriptor en XMM0--2.

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 escriturabyte 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. XMM0 lectura y escritura
  4. XMM1--2 escritura
  5. XMM4--6 escritura

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

La instrucción ENCODEKEY1281 envuelve un AES clave de 128 bits del implícito operando XMM0 a una clave descriptor que se almacena en el implícito operandos de destino XMM0-2.

El operando de origen explícito especifica las restricciones descriptor, si las hay.

El operando de destino explícito se pobla con información sobre la fuente de la clave y sus atributos. XMM4 a través de XMM6 se reservan para usos futuros y el software no debe confiar en que se estén cero.

Operación

ENCODEKEY128
#GP (0) if a reserved bit2 in SRC[31:0] is set

InputKey[127:0] := XMM0;

KeyMetadata[2:0] = SRC[2:0];

KeyMetadata[23:3] = 0;        // Reserved for future usage

KeyMetadata[27:24] = 0;       // KeyType is AES-128 (value of 0)

KeyMetadata[127:28] = 0; // Reserved for future usage

// KeyMetadata is the AAD input and InputKey is the Plaintext input for WrapKey128
Handle[383:0] := WrapKey128(InputKey[127:0], KeyMetadata[127:0], IWKey.Integrity Key[127:0], IWKey.Encryption Key[255:0]);

DEST[0] := IWKey.NoBackup;
DEST[4:1] := IWKey.KeySource[3:0];
DEST[31:5] = 0;
XMM0 := Handle[127:0]; // AAD
XMM1 := Handle[255:128]; // Integrity Tag
XMM2 := Handle[383:256]; // CipherText
XMM4 := 0; // Reserved for future usage
XMM5 := 0; // Reserved for future usage
XMM6 := 0; // Reserved for future usage
RFLAGS.OF, SF, ZF, AF, PF, CF := 0;

Banderas afectadas

Todas las banderas aritméticas (OF, SF, ZF, AF, PF, CF) se limpian a 0. Aunque se han aclarado para las operaciones actualmente definidas, las prórrogas futuras pueden informar de información en las banderas.

  1. Más detalles sobre Key Locker y el uso de esta instrucción se puede encontrar aquí:

https://software.intel.com/content/www/us/en/develop/download/intel-key-locker-specification.html.

  1. SRC[31:3] están actualmente reservados para usos futuros. SRC[2], que indica una restricción de no cifrado, se reserva si CPUID.19H:EAX[2] es 0. SRC[1], que indica una restricción de no cifrado, se reserva si CPUID.19H:EAX[1] es 0. SRC[0], que indica una restricción sólo CPL0, se reserva si CPUID.19H:EAX[0] es 0.

Intel C/C++ compilador intrínseco

ENCODEKEY128 unsigned int _mm_encodekey128_u32(unsigned int htype, __m128i key, void* h);

Excepciones

Modo real
#GPSi el bit reservado se establece en el valor de registro fuente.
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CPUID.19H:EBX.AESKLE[0] = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo protegido
#GPSi el bit reservado se establece en el valor de registro fuente.
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CPUID.19H:EBX.AESKLE[0] = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo virtual-8086
#GPSi el bit reservado se establece en el valor de registro fuente.
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CPUID.19H:EBX.AESKLE[0] = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo de compatibilidad
#GPSi el bit reservado se establece en el valor de registro fuente.
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CPUID.19H:EBX.AESKLE[0] = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.
Modo de 64 bits
#GPSi el bit reservado se establece en el valor de registro fuente.
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0. Si CR4.KL = 0. Si CPUID.19H:EBX.AESKLE[0] = 0. Si CR0.EM = 1. Si CR4.OSFXSR = 0.
#NMSi CR0.TS = 1.

Fuentes