AESDECWIDE256KL
执行 AES 14 回合的解密流程,在 8 块上使用 Key Locker
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 38 D8 !(11):011:bbb | AESDECWIDE256KL m512, <XMM0-7> | A | 有效 | 有效 | XMM0-7使用句柄表示的256位AES 密钥在m512解密,并将每个结果的块存储回相应的寄存器. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移XMM0-7lectura y escritura
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
AESDECWIDE256KL1指令执行14发AES,使用第二发操作数的句柄表示的256位密钥,解密XMM0-7中的8个区块中的每个区块. 它将XMM0-7中的每个输入区块替换为相应的解密区块,如果操作成功(例如,不会遇到句柄的违反).
行动
AESDECWIDE256KL
Handle := UnalignedLoad of 512 bit (SRC); // Load is not guaranteed to be atomic.
Illegal Handle = (HandleReservedBitSet (Handle) ||
(Handle[0] AND (CPL > 0)) ||
Handle [2] ||
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 := AES256Decrypt (XMM0, UnwrappedKey) ;
XMM1 := AES256Decrypt (XMM1, UnwrappedKey) ;
XMM2 := AES256Decrypt (XMM2, UnwrappedKey) ;
XMM3 := AES256Decrypt (XMM3, UnwrappedKey) ;
XMM4 := AES256Decrypt (XMM4, UnwrappedKey) ;
XMM5 := AES256Decrypt (XMM5, UnwrappedKey) ;
XMM6 := AES256Decrypt (XMM6, UnwrappedKey) ;
XMM7 := AES256Decrypt (XMM7, UnwrappedKey) ;
RFLAGS.ZF := 0;
FI;
FI;
RFLAGS.OF, SF, AF, PF, CF := 0;受影响的旗帜
ZF如果操作成功,则设定为0;如果由于句柄的违反,操作失败,则设定为1. 其他算术旗(OF, SF, AF, PF, CF)清除为0.
- 联合国 关于Key Locker的进一步详情和该指示的使用,请参见:https://software.intel.com/content/www/us/en/develop/download/intel-密钥-locker-profitation.html。
Intel C/C++ 内在编译器
AESDECWIDE256KLunsigned char _mm_aesdecwide256kl_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 段的内存地址是非冠状的 。 |