AESENCWIDE256KL
执行 AES 的 14 轮加密流, 在 8 块上使用 Key Locker
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 38 D8 !(11):010:bbb | AESENCWIDE256KL m512, <XMM0-7> | A | 有效 | 有效 | 使用句柄表示的256位AES 密钥在m512加密XMM0-7,并将每个结果的块存储回相应的寄存器. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移XMM0-7lectura y escritura
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
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 段的内存地址是非冠状的 。 |