AESENCWIDE256KL

Realizar 14 rondas de AES Encryption Flow Con Key Locker en 8 bloques

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 38 D8 !(11):010:bbbAESENCWIDE256KL m512, <XMM0-7>AValidoValidoEncrypt 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

  1. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. XMM0-7 lectura y escritura

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

La instrucción AESENCWIDE256KL1 realiza 14 rondas de AES para cifrar cada uno de los ocho bloques en XMM0-7

usando la clave de 256 bits indicado por el descriptor del segundo operando. Reemplaza cada bloque de entrada en XMM0-7

con su bloque encriptado correspondiente si la operación tiene éxito (por ejemplo, no se encuentra en fallo de violación un descriptor).

Operación

AESENCWIDE256KL
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

                      XMM0 := AES256Encrypt (XMM0, UnwrappedKey) ;
                      XMM1 := AES256Encrypt (XMM1, UnwrappedKey) ;
                      XMM2 := AES256Encrypt (XMM2, UnwrappedKey) ;
                      XMM3 := AES256Encrypt (XMM3, UnwrappedKey) ;
                      XMM4 := AES256Encrypt (XMM4, UnwrappedKey) ;
                      XMM5 := AES256Encrypt (XMM5, UnwrappedKey) ;
                      XMM6 := AES256Encrypt (XMM6, UnwrappedKey) ;
                      XMM7 := AES256Encrypt (XMM7, UnwrappedKey) ;
                      RFLAGS.ZF := 0;
          FI;
FI;
RFLAGS.OF, SF, AF, PF, CF := 0;

1. Further details on Key Locker and usage of this instruction can be found here:
     https://software.intel.com/content/www/us/en/develop/download/intel-key-locker-specification.html.

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

AESENCWIDE256KLunsigned char _mm_aesencwide256kl_u8(__m128i odata[8], const __m128i idata[8], 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. Si CPUID.19H:EBX.AES_WIDE[2] = 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. Si CPUID.19H:EBX.AES_WIDE[2] = 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. Si CPUID.19H:EBX.AES_WIDE[2] = 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. Si CPUID.19H:EBX.AES_WIDE[2] = 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. Si CPUID.19H:EBX.AES_WIDE[2] = 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