AESDECWIDE256KL
Realizar 14 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):011:bbb | AESDECWIDE256KL m512, <XMM0-7> | A | Valido | Valido | Decrypt XMM0-7 usando 256-bit AES clave indicado por descriptor en m512 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 AESDECWIDE256KL1 realiza 14 rondas de AES para descifrar cada uno de los ocho bloques en XMM0-7 utilizando la clave de 256 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
AESDECWIDE256KL
Handle := UnalignedLoad of 512 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_AES256);
IF (Illegal Handle) {
THEN RFLAGS.ZF := 1;
ELSE
(UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey);
IF (Authentic == 0)
THEN RFLAGS.ZF := 1;
ELSE
XMM0 := AES256Decrypt (XMM0, UnwrappedKey) ;
XMM1 := AES256Decrypt (XMM1, UnwrappedKey) ;
XMM2 := AES256Decrypt (XMM2, UnwrappedKey) ;
XMM3 := AES256Decrypt (XMM3, UnwrappedKey) ;
XMM4 := AES256Decrypt (XMM4, UnwrappedKey) ;
XMM5 := AES256Decrypt (XMM5, UnwrappedKey) ;
XMM6 := AES256Decrypt (XMM6, UnwrappedKey) ;
XMM7 := AES256Decrypt (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
AESDECWIDE256KLunsigned char _mm_aesdecwide256kl_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. |