AESDEC128KL

使用 Key Locker 执行 AES 的十轮解密流程

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 38 DD !(11):rrr:bbbAESDEC128KL xmm, m384A有效有效使用128位的AES 密钥在m384上表示的dle解密xmm,存储结果为xmm.

操作数编码

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

A

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

实测开销

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

涉及的标志位

说明

AESDEC128KL1指令执行十轮AES,使用句柄从第二轮操作数表示的128位密钥解密第一个操作数. 如果操作成功, 它会存储第一个 操作数 的结果( 例如, 不发生 句柄 违反规则 ) 。

行动

AESDEC128KL
Handle := UnalignedLoad of 384 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_AES128);
IF (Illegal Handle) {
    THEN RFLAGS.ZF := 1;
    ELSE
          (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey);
          IF (Authentic == 0)
                THEN RFLAGS.ZF := 1;
                ELSE

                      DEST := AES128Decrypt (DEST, UnwrappedKey) ;
                      RFLAGS.ZF := 0;
          FI;
FI;
RFLAGS.OF, SF, AF, PF, CF := 0;

受影响的旗帜

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

Intel C/C++ 内在编译器

AESDEC128KL unsigned char _mm_aesdec128kl_u8(__m128i* odata, __m128i idata, 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.
#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.
#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.
#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.
#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.
#NM如果 CR0.TS = 1.
#PF如果发生 页面错误 。
#GP(0)如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。
#SS(0)如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。

来源