AESENC256KL

Realizar 14 rondas de AES Encryption Flow Con Key Locker Usando 256-Bit clave

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 38 DE !(11):rrr:bbbAESENC256KL xmm, m512AValidoValidoCifra xmm con 256 bits AES clave indicado por han- dle en m512 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

  1. modrm.reg lectura y 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

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

La instrucción AESENC256KL1 realiza 14 rondas de AES para cifrar el primer operando utilizando la clave de 256 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

AESENC256KL
Handle := UnalignedLoad of 512 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_AES256
                   );
IF (Illegal Handle)
    THEN RFLAGS.ZF := 1;
    ELSE
          (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey);
          IF (Authentic == 0)
                THEN RFLAGS.ZF := 1;
                ELSE

                      DEST := AES256Encrypt (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

AESENC256KL unsigned char _mm_aesenc256kl_u8(__m128i* odata, __m128i idata, const void* h);

Excepciones

Modo real
#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.
#PFSi 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
#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.
#PFSi 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
#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.
#PFSi 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
#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.
#PFSi 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
#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.
#PFSi 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.

Fuentes