AESENC128KL
Realizar Diez rondas de AES Encryption Flow Con Key Locker Usando 128-Bit clave
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F3 0F 38 DC !(11):rrr:bbb | AESENC128KL xmm, m384 | A | Valido | Valido | Cifra xmm utilizando AES clave de 128 bits indicado por han- dle en m384 y resultado de la tienda en xmm. |
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.reglectura y escriturabyte ModRM, campo reg (bits 5-3)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
La instrucción AESENC128KL1 realiza diez rondas de AES para cifrar el primer operando utilizando la clave de 128 bits indi-
abastecido por el descriptor del segundo operando. Almacena el resultado en el primer operando si la operación tiene éxito
(por ejemplo, no se encuentra en un fallo de violación de un descriptor).
Operación
AESENC128KL
Handle := UnalignedLoad of 384 bit (SRC); // Load is not guaranteed to be atomic.
Illegal Handle = (
HandleReservedBitSet (Handle) ||
(Handle[0] AND (CPL > 0)) ||
Handle [1] ||
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
DEST := AES128Encrypt (DEST, 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.
Intel C/C++ compilador intrínseco
AESENC128KL unsigned char _mm_aesenc128kl_u8(__m128i* odata, __m128i idata, 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. |
#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. |
#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. |
#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. |
#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. |
#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. |