AESDECWIDE128KL
Realizar Diez rondas de AES Decryption Flow Con Key Locker en 8 bloques
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F3 0F 38 D8 !(11):001:bbb | AESDECWIDE128KL m384, <XMM0-7> | A | Valido | Valido | Decrypt XMM0-7 utilizando AES clave de 128 bits indicado por descriptor en m384 y almacenar cada bloque resultante de nuevo a su registro correspondiente. |
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
modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideXMM0-7lectura y escritura
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
La instrucción AESDECWIDE128KL1 realiza diez rondas de AES para descifrar cada uno de los ocho bloques en XMM0-7 utilizando la clave de 128 bits indicado por el descriptor del segundo operando. Reemplaza cada bloque de entrada en XMM0-7 con su bloque descifrado correspondiente si la operación tiene éxito (por ejemplo, no se encuentra en fallo de violación un descriptor).
Operación
AESDECWIDE128KL
Handle := UnalignedLoad of 384 bit (SRC); // Load is not guaranteed to be atomic.
Illegal Handle = (HandleReservedBitSet (Handle) ||
(Handle[0] AND (CPL > 0)) ||
Handle [2] ||
HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES128);
IF (Illegal Handle)
THEN RFLAGS.ZF := 1;
ELSE
(UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey);
IF Authentic == 0 {
THEN RFLAGS.ZF := 1;
ELSE
XMM0 := AES128Decrypt (XMM0, UnwrappedKey) ;
XMM1 := AES128Decrypt (XMM1, UnwrappedKey) ;
XMM2 := AES128Decrypt (XMM2, UnwrappedKey) ;
XMM3 := AES128Decrypt (XMM3, UnwrappedKey) ;
XMM4 := AES128Decrypt (XMM4, UnwrappedKey) ;
XMM5 := AES128Decrypt (XMM5, UnwrappedKey) ;
XMM6 := AES128Decrypt (XMM6, UnwrappedKey) ;
XMM7 := AES128Decrypt (XMM7, UnwrappedKey) ;
RFLAGS.ZF := 0;
FI;
FI;
RFLAGS.OF, SF, AF, PF, CF := 0;Banderas afectadas
ZF se establece a 0 si la operación tuvo éxito y se estableció a 1 si la operación falló debido a la violación de un descriptor. Las otras banderas aritméticas (OF, SF, AF, PF, CF) se limpian a 0.
- 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.
Intel C/C++ compilador intrínseco
AESDECWIDE128KLunsigned char _mm_aesdecwide128kl_u8(__m128i odata[8], const __m128i idata[8], const void* h);Excepciones
Modo real
#UD | Si 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. Si CPUID.19H:EBX.AES_WIDE[2] = 0. |
#NM | Si CR0.TS = 1. |
#PF | Si un fallo de pagina ocurre. |
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. Si la dirección de memoria está en forma no canónica. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si una dirección de memoria referencia del segmento SS está en una forma no canónica. |
Modo protegido
#UD | Si 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. Si CPUID.19H:EBX.AES_WIDE[2] = 0. |
#NM | Si CR0.TS = 1. |
#PF | Si un fallo de pagina ocurre. |
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. Si la dirección de memoria está en forma no canónica. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si una dirección de memoria referencia del segmento SS está en una forma no canónica. |
Modo virtual-8086
#UD | Si 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. Si CPUID.19H:EBX.AES_WIDE[2] = 0. |
#NM | Si CR0.TS = 1. |
#PF | Si un fallo de pagina ocurre. |
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. Si la dirección de memoria está en forma no canónica. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si una dirección de memoria referencia del segmento SS está en una forma no canónica. |
Modo de compatibilidad
#UD | Si 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. Si CPUID.19H:EBX.AES_WIDE[2] = 0. |
#NM | Si CR0.TS = 1. |
#PF | Si un fallo de pagina ocurre. |
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. Si la dirección de memoria está en forma no canónica. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si una dirección de memoria referencia del segmento SS está en una forma no canónica. |
Modo de 64 bits
#UD | Si 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. Si CPUID.19H:EBX.AES_WIDE[2] = 0. |
#NM | Si CR0.TS = 1. |
#PF | Si un fallo de pagina ocurre. |
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. Si la dirección de memoria está en forma no canónica. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si una dirección de memoria referencia del segmento SS está en una forma no canónica. |