LOADIWKEY

用 Key Locker 装入内部 包装密钥

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 38 DC 11:rrr:bbbLOADIWKEY xmm1, xmm2, <EAX>, <XMM0>A有效有效从xmm1,xmm2,以及ER XMM0装入内部的包装密钥.

操作数编码

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

A

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

实测开销

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

涉及的标志位

说明

LOADIWKEY1指示书写了Key Locker内部的包装密钥,它被称为IWKey. 此 IWKey 被 ENCODEKEY 指令用于将 密钥 包裹到 句柄 中. 相反,AESENC/DECKL指令使用IWKey从句柄中解开这些密钥,并帮助验证句柄的完整性. 出于安全考虑,没有设计指令允许软件直接读取IWKey值.

IWKey包括两个密码密钥以及元数据. 两种密码密钥是从寄存器来源加载的,这样LOADIWKEY就可以执行,而不用密钥永远在记忆中.

密钥输入的操作数是:

隐含的 操作数 EAX 指定了密钥源,是否允许备份 密钥 :

storage.

一个0的键源表示,上面描述的密钥输入的操作数应该作为内部的包装密钥直接存储. 键源为1的LOADIWKEY会从带有源注册号(包括XMM0)的芯片随机数生成器XORed中随机数,这样执行LOADIWKEY的软件就不知道实际的IWKey加密和完整性密钥. 软件可以选择将额外的随机数据放入源登记册,以便其他随机数据来源与所提供的硬件随机数生成器结合. 软件在使用1键源执行LOADIWKEY后,总是应该检查ZF,因为由于无法从芯片随机数生成器获得足够的全切数据,此操作可能失败. 0和1的密钥來源都指定使用AES-GCM-SIV算法的IWKey. CPUID.19H:ECX [1] 列举了对键源 1 的支持. 其他所有密钥源编码均保留.

  1. 联合国 关于Key Locker的进一步详情和该指示的使用,请参见:https://software.intel.com/content/www/us/en/develop/download/intel-密钥-locker-profitation.html。

行动

LOADIWKEY

IF CPL > 0              // LOADKWKEY only allowed at ring 0 (supervisor mode)

     THEN #GP (0); FI;

IF EAX[4:1] > 1         // Reserved KeySource encoding used

     THEN #GP (0); FI;

IF EAX[31:5] != 0       // Reserved bit in EAX is set

     THEN #GP (0); FI;

IF EAX[0] AND (CPUID.19H:ECX[0] == 0) // NoBackup is not supported on this part

     THEN #GP (0); FI;

IF (EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0) // KeySource of 1 is not supported on this part

     THEN #GP (0); FI;

IF (EAX[4:1] == 0) // KeySource of 0

     THEN

     IWKey.Encryption Key[127:0] := SRC2[127:0]:

     IWKey.Encryption Key[255:128] := SRC1[127:0];

     IWKey.IntegrityKey[127:0] := XMM0[127:0];

     IWKey.NoBackup = EAX [0];

     IWKey.KeySource = EAX [4:1];

     RFLAGS.ZF := 0;

     ELSE               // KeySource of 1. See RDSEED definition for details of randomness

     IF HW_NRND_GEN.ready == 1                         // Full-entropy random data from RDSEED hardware block was received

            THEN

                   IWKey.Encryption Key[127:0] := SRC2[127:0] XOR HW_NRND_GEN.data[127:0];

                   IWKey.Encryption Key[255:128] := SRC1[127:0] XOR HW_NRND_GEN.data[255:128];

                   IWKey.IntegrityKey[127:0] := XMM0[127:0] XOR HW_NRND_GEN.data[383:256];

                   IWKey.NoBackup = EAX [0];

                   IWKey.KeySource = EAX [4:1];

                   RFLAGS.ZF := 0;

            ELSE        // Random data was not returned from RDSEED hardware block. IWKey was not loaded

                   RFLAGS.ZF := 1;

     FI;

FI;

RFLAGS.OF, SF, AF, PF, CF := 0;

受影响的旗帜

ZF如果操作成功,则设定为0;如果由于RDSEED未收到全通随机数据,操作失败,则设定为1. 其他算术旗(OF, SF, AF, PF, CF)清除为0.

Intel C/C++ 内在编译器

LOADIWKEY void _mm_loadiwkey(unsigned int ctl, __m128i intkey, __m128i enkey_lo, __m128i enkey_hi);

异常

实地址模式
#GP如果CPL >0. (不适用实地址模式如果EAX[4:1] >1. 如果EAX[31:5] !=0. 如果(EAX[0] == 1) AND (CPUID.19H:ECX[0] ==0) 如果(则EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UD如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0,如果使用 CR4.KL = 0,如果使用 CR0.EM = 1. 如果使用 CR4.OSFXSR = 0.
#NM如果 CR0.TS = 1.
保护模式
#GP如果CPL >0. (不适用实地址模式如果EAX[4:1] >1. 如果EAX[31:5] !=0. 如果(EAX[0] == 1) AND (CPUID.19H:ECX[0] ==0) 如果(则EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UD如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0,如果使用 CR4.KL = 0,如果使用 CR0.EM = 1. 如果使用 CR4.OSFXSR = 0.
#NM如果 CR0.TS = 1.
虚拟 8086 模式
#GP如果CPL >0. (不适用实地址模式如果EAX[4:1] >1. 如果EAX[31:5] !=0. 如果(EAX[0] == 1) AND (CPUID.19H:ECX[0] ==0) 如果(则EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UD如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0,如果使用 CR4.KL = 0,如果使用 CR0.EM = 1. 如果使用 CR4.OSFXSR = 0.
#NM如果 CR0.TS = 1.
兼容模式
#GP如果CPL >0. (不适用实地址模式如果EAX[4:1] >1. 如果EAX[31:5] !=0. 如果(EAX[0] == 1) AND (CPUID.19H:ECX[0] ==0) 如果(则EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UD如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0,如果使用 CR4.KL = 0,如果使用 CR0.EM = 1. 如果使用 CR4.OSFXSR = 0.
#NM如果 CR0.TS = 1.
64 位模式
#GP如果CPL >0. (不适用实地址模式如果EAX[4:1] >1. 如果EAX[31:5] !=0. 如果(EAX[0] == 1) AND (CPUID.19H:ECX[0] ==0) 如果(则EAX[4:1] == 1) AND (CPUID.19H:ECX[1] == 0).
#UD如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23] = 0,如果使用 CR4.KL = 0,如果使用 CR0.EM = 1. 如果使用 CR4.OSFXSR = 0.
#NM如果 CR0.TS = 1.

来源