ENCODEKEY128
以 Key Locker 编码 128- Bit 密钥
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 38 FA 11:rrr:bbb | ENCODEKEY128 r32, r32, <XMM0-2>, <XMM4-6> | A | 有效 | 有效 | 从XMM0将一个128位的AES 密钥包成一个密钥 句柄,并在XMM0-2中输出句柄. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移XMM0lectura y escrituraXMM1--2escrituraXMM4--6escritura
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
ENCODEKEY1281指令将一个128位的AES 密钥从隐含的操作数 XMM0包裹成一个密钥 句柄,然后存储在隐含的目标操作数 XMM0-2中.
明确的源操作数具体规定了句柄的限制,如果有的话.
明确 目标操作数 中包含关于 密钥 的来源及其属性的信息. XMM4通过XMM6被保留用于未来的使用,软件不应该依赖它们被零化.
行动
ENCODEKEY128
#GP (0) if a reserved bit2 in SRC[31:0] is set
InputKey[127:0] := XMM0;
KeyMetadata[2:0] = SRC[2:0];
KeyMetadata[23:3] = 0; // Reserved for future usage
KeyMetadata[27:24] = 0; // KeyType is AES-128 (value of 0)
KeyMetadata[127:28] = 0; // Reserved for future usage
// KeyMetadata is the AAD input and InputKey is the Plaintext input for WrapKey128
Handle[383:0] := WrapKey128(InputKey[127:0], KeyMetadata[127:0], IWKey.Integrity Key[127:0], IWKey.Encryption Key[255:0]);
DEST[0] := IWKey.NoBackup;
DEST[4:1] := IWKey.KeySource[3:0];
DEST[31:5] = 0;
XMM0 := Handle[127:0]; // AAD
XMM1 := Handle[255:128]; // Integrity Tag
XMM2 := Handle[383:256]; // CipherText
XMM4 := 0; // Reserved for future usage
XMM5 := 0; // Reserved for future usage
XMM6 := 0; // Reserved for future usage
RFLAGS.OF, SF, ZF, AF, PF, CF := 0;受影响的旗帜
所有算术旗(OF, SF, ZF, AF, PF, CF)清除为0. 虽然它们已获准进行目前定义的行动,但今后的扩展可能会在旗帜中报告信息。
- 联合国 关于Key Locker的进一步详情和该指令的使用,请参见本文:
https://software.intel.com/content/www/us/en/develop/download/intel-key-locker-specification.html.
- 国家 SRC[31:3]目前为未来用途预留. SRC[2],表示无解密限制,如果CPUID.19H:EAX[2]为0. SRC[1],表示无加密限制,如果CPUID.19H:EAX[1]为0. SRC[0],表示只有CPL0的限制,如果CPUID.19H:EAX[0]为0.
Intel C/C++ 内在编译器
ENCODEKEY128 unsigned int _mm_encodekey128_u32(unsigned int htype, __m128i key, void* h);异常
实地址模式
#GP | 如果保留位设置在源寄存器值中 。 |
#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. |
保护模式
#GP | 如果保留位设置在源寄存器值中 。 |
#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. |
虚拟 8086 模式
#GP | 如果保留位设置在源寄存器值中 。 |
#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. |
兼容模式
#GP | 如果保留位设置在源寄存器值中 。 |
#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. |
64 位模式
#GP | 如果保留位设置在源寄存器值中 。 |
#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. |