AESENCWIDE256KL

执行 AES 的 14 轮加密流, 在 8 块上使用 Key Locker

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 38 D8 !(11):010:bbbAESENCWIDE256KL m512, <XMM0-7>A有效有效使用句柄表示的256位AES 密钥在m512加密XMM0-7,并将每个结果的块存储回相应的寄存器.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  2. XMM0-7 lectura y escritura

实测开销

正在从 arch-data 加载实测数据...

涉及的标志位

说明

AESENCWIDE256KL1指令执行14发AES,以加密XMM0-7中的8个区块中的每个区块

使用第二个操作数的句柄表示的256位密钥. 它取代 XMM0-7 中的每个输入块

如果操作成功, 则使用其相应的加密块( 例如, 不发生 句柄 违约) 。

行动

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.

受影响的旗帜

ZF如果操作成功,则设定为0;如果由于句柄的违反,操作失败,则设定为1. 其他算术旗(OF, SF, AF, PF, CF)清除为0.

Intel C/C++ 内在编译器

AESENCWIDE256KLunsigned char _mm_aesencwide256kl_u8(__m128i odata[8], const __m128i idata[8], const void* h);

异常

实地址模式
#UD若使用LOCK前缀. 若CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 若CR4.KL=0. 若CPUID.19H:EBX.AESKLE[0]=0. 若CR0.EM=1. 若CR4.OSFXSR=0. 若CPUID.19H:EBX.AES_WIDE[2]=0.
#NM如果 CR0.TS = 1.
#PF如果发生 页面错误 。
#GP(0)如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。
#SS(0)如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。
保护模式
#UD若使用LOCK前缀. 若CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 若CR4.KL=0. 若CPUID.19H:EBX.AESKLE[0]=0. 若CR0.EM=1. 若CR4.OSFXSR=0. 若CPUID.19H:EBX.AES_WIDE[2]=0.
#NM如果 CR0.TS = 1.
#PF如果发生 页面错误 。
#GP(0)如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。
#SS(0)如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。
虚拟 8086 模式
#UD若使用LOCK前缀. 若CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 若CR4.KL=0. 若CPUID.19H:EBX.AESKLE[0]=0. 若CR0.EM=1. 若CR4.OSFXSR=0. 若CPUID.19H:EBX.AES_WIDE[2]=0.
#NM如果 CR0.TS = 1.
#PF如果发生 页面错误 。
#GP(0)如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。
#SS(0)如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。
兼容模式
#UD若使用LOCK前缀. 若CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 若CR4.KL=0. 若CPUID.19H:EBX.AESKLE[0]=0. 若CR0.EM=1. 若CR4.OSFXSR=0. 若CPUID.19H:EBX.AES_WIDE[2]=0.
#NM如果 CR0.TS = 1.
#PF如果发生 页面错误 。
#GP(0)如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。
#SS(0)如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。
64 位模式
#UD若使用LOCK前缀. 若CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 若CR4.KL=0. 若CPUID.19H:EBX.AESKLE[0]=0. 若CR0.EM=1. 若CR4.OSFXSR=0. 若CPUID.19H:EBX.AES_WIDE[2]=0.
#NM如果 CR0.TS = 1.
#PF如果发生 页面错误 。
#GP(0)如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。
#SS(0)如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。

来源