ENCODEKEY256
用 Key Locker 编码 256- Bit 密钥
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 38 FB 11:rrr:bbb | ENCODEKEY256 r32, r32 <XMM0-6> | A | 有效 | 有效 | 从XMM1将256位的AES 密钥:XMM0包成一个密钥 句柄,并存储在XMM0-3. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移XMM0--1lectura y escrituraXMM2--6escritura
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
ENCODEKEY2561指令从隐含的操作符XMM1:XMM0将256位的AES密钥包成密钥柄,然后存储在隐含的目的地操作符XMM0-3中.
明晰的源操作数是一个通用寄存器,并指定句柄的限制应该包含在句柄中.
明确 目标操作数 中包含关于 密钥 的来源及其属性的信息. XMM4通过XMM6被保留用于未来的使用,软件不应该依赖它们被零化.
行动
ENCODEKEY256
#GP (0) if a reserved bit2 in SRC[31:0] is set
InputKey[255:0] := XMM1:XMM0;
KeyMetadata[2:0] = SRC[2:0];
KeyMetadata[23:3] = 0; // Reserved for future usage
KeyMetadata[27:24] = 1; // KeyType is AES-256 (value of 1)
KeyMetadata[127:28] = 0; // Reserved for future usage
// KeyMetadata is the AAD input and InputKey is the Plaintext input for WrapKey256
Handle[511:0] := WrapKey256(InputKey[255: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[127:0]
XMM3 := Handle[511:384]; // CipherText[255:128]
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;
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.
2. SRC[31:3] are currently reserved for future usages. SRC[2], which indicates a no-decrypt restriction, is reserved if
CPUID.19H:EAX[2] is 0. SRC[1], which indicates a no-encrypt restriction, is reserved if CPUID.19H:EAX[1] is 0. SRC[0], which indicates
a CPL0-only restriction, is reserved if CPUID.19H:EAX[0] is 0.受影响的旗帜
所有算术旗(OF, SF, ZF, AF, PF, CF)清除为0. 虽然它们已获准进行目前定义的行动,但今后的扩展可能会在旗帜中报告信息。
Intel C/C++ 内在编译器
ENCODEKEY256 unsigned int _mm_encodekey256_u32(unsigned int htype, __m128i key_lo, __m128i key_hi, 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. |