acrn-hypervisor/hypervisor/arch/x86/guest
Shuo A Liu c11c07e0fe hv: keylocker: Support Key Locker feature for guest VM
KeyLocker is a new security feature available in new Intel CPUs that
protects data-encryption keys for the Advanced Encryption Standard (AES)
algorithm. These keys are more valuable than what they guard. If stolen
once, the key can be repeatedly used even on another system and even
after vulnerability closed.

It also introduces a CPU-internal wrapping key (IWKey), which is a key-
encryption key to wrap AES keys into handles. While the IWKey is
inaccessible to software, randomizing the value during the boot-time
helps its value unpredictable.

Keylocker usage:
 - New “ENCODEKEY” instructions take original key input and returns HANDLE
   crypted by an internal wrap key (IWKey, init by “LOADIWKEY” instruction)
 - Software can then delete the original key from memory
 - Early in boot/software, less likely to have vulnerability that allows
   stealing original key
 - Later encrypt/decrypt can use the HANDLE through new AES KeyLocker
   instructions
 - Note:
      * Software can use original key without knowing it (use HANDLE)
      * HANDLE cannot be used on other systems or after warm/cold reset
      * IWKey cannot be read from CPU after it's loaded (this is the
        nature of this feature) and only 1 copy of IWKey inside CPU.

The virtualization implementation of Key Locker on ACRN is:
 - Each vCPU has a 'struct iwkey' to store its IWKey in struct
   acrn_vcpu_arch.
 - At initilization, every vCPU is created with a random IWKey.
 - Hypervisor traps the execution of LOADIWKEY (by 'LOADIWKEY exiting'
   VM-exectuion control) of vCPU to capture and save the IWKey if guest
   set a new IWKey. Don't support randomization (emulate CPUID to
   disable) of the LOADIWKEY as hypervisor cannot capture and save the
   random IWKey. From keylocker spec:
   "Note that a VMM may wish to enumerate no support for HW random IWKeys
   to the guest (i.e. enumerate CPUID.19H:ECX[1] as 0) as such IWKeys
   cannot be easily context switched. A guest ENCODEKEY will return the
   type of IWKey used (IWKey.KeySource) and thus will notice if a VMM
   virtualized a HW random IWKey with a SW specified IWKey."
 - In context_switch_in() of each vCPU, hypervisor loads that vCPU's
   IWKey into pCPU by LOADIWKEY instruction.
 - There is an assumption that ACRN hypervisor will never use the
   KeyLocker feature itself.

This patch implements the vCPU's IWKey management and the next patch
implements host context save/restore IWKey logic.

Tracked-On: #5695
Signed-off-by: Shuo A Liu <shuo.a.liu@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
2021-02-03 13:54:45 +08:00
..
assign.c hv: ptirq: Shouldn't change sid if intx irq mapping was added 2021-01-12 15:23:44 +08:00
ept.c hv: hypercall: prevent sos can touch hv/pre-launched VM resource 2021-02-02 16:55:40 +08:00
guest_memory.c hv: Add split-lock emulation for xchg 2020-12-31 11:12:33 +08:00
hyperv.c hv: rename the ACRN_DBG_XXX 2020-01-14 10:21:23 +08:00
instr_emul.c hv: Add split-lock emulation for xchg 2020-12-31 11:12:33 +08:00
pm.c hv: pm: avoid duplicate shutdowns on RTVM 2020-11-11 14:05:39 +08:00
splitlock.c hv: remove bitmap_clear_lock of split-lock after completing emulation 2021-01-13 15:32:27 +08:00
trusty.c hv: Disable XSAVE-managed CET state of guest VM 2020-07-23 20:15:57 +08:00
ucode.c remove spin lock for micro code update 2020-06-19 16:13:20 +08:00
vcpu.c hv: keylocker: Support Key Locker feature for guest VM 2021-02-03 13:54:45 +08:00
vcpuid.c hv: keylocker: Simulate CPUID of keylocker caps for guest VM 2021-02-03 13:54:45 +08:00
ve820.c hv: remove the hardcoding of Software SRAM GPA base 2021-01-30 13:41:02 +08:00
virq.c hv: move split-lock logic into dedicated file 2021-01-08 17:37:20 +08:00
virtual_cr.c hv: keylocker: Add CR4 bit CR4_KL as CR4_TRAP_AND_PASSTHRU_BITS 2021-02-03 13:54:45 +08:00
vlapic_priv.h hv: add ops to vlapic structure 2019-07-19 16:47:06 +08:00
vlapic.c hv: refine code style 2020-11-26 12:56:28 +08:00
vm_reset.c hv: pm: avoid duplicate shutdowns on RTVM 2020-11-11 14:05:39 +08:00
vm.c hv: remove the hardcoding of Software SRAM GPA base 2021-01-30 13:41:02 +08:00
vmcall.c hv: rename hypercall for hv-emulated device management 2020-12-07 16:25:17 +08:00
vmcs.c hv: keylocker: Support Key Locker feature for guest VM 2021-02-03 13:54:45 +08:00
vmexit.c hv: keylocker: Support Key Locker feature for guest VM 2021-02-03 13:54:45 +08:00
vmsr.c hv:cpu-caps:refine is_apl_platform func and clean up duplicated code 2020-08-14 10:08:50 +08:00
vmtrr.c hv: vmtrr: remove vcpu structure pointer from vmtrr 2020-03-31 10:57:47 +08:00
vmx_asm.S hv:remove some unnecessary includes 2019-05-07 09:10:13 +08:00
vmx_io.c hv: rename BOOT_CPU_ID to BSP_CPU_ID 2020-02-25 09:08:14 +08:00