• Kuppuswamy Sathyanarayanan's avatar
    virt: tdx-guest: Add Quote generation support using TSM_REPORTS · f4738f56
    Kuppuswamy Sathyanarayanan authored
    In TDX guest, the attestation process is used to verify the TDX guest
    trustworthiness to other entities before provisioning secrets to the
    guest. The first step in the attestation process is TDREPORT
    generation, which involves getting the guest measurement data in the
    format of TDREPORT, which is further used to validate the authenticity
    of the TDX guest. TDREPORT by design is integrity-protected and can
    only be verified on the local machine.
    
    To support remote verification of the TDREPORT in a SGX-based
    attestation, the TDREPORT needs to be sent to the SGX Quoting Enclave
    (QE) to convert it to a remotely verifiable Quote. SGX QE by design can
    only run outside of the TDX guest (i.e. in a host process or in a
    normal VM) and guest can use communication channels like vsock or
    TCP/IP to send the TDREPORT to the QE. But for security concerns, the
    TDX guest may not support these communication channels. To handle such
    cases, TDX defines a GetQuote hypercall which can be used by the guest
    to request the host VMM to communicate with the SGX QE. More details
    about GetQuote hypercall can be found in TDX Guest-Host Communication
    Interface (GHCI) for Intel TDX 1.0, section titled
    "TDG.VP.VMCALL<GetQuote>".
    
    Trusted Security Module (TSM) [1] exposes a common ABI for Confidential
    Computing Guest platforms to get the measurement data via ConfigFS.
    Extend the TSM framework and add support to allow an attestation agent
    to get the TDX Quote data (included usage example below).
    
      report=/sys/kernel/config/tsm/report/report0
      mkdir $report
      dd if=/dev/urandom bs=64 count=1 > $report/inblob
      hexdump -C $report/outblob
      rmdir $report
    
    GetQuote TDVMCALL requires TD guest pass a 4K aligned shared buffer
    with TDREPORT data as input, which is further used by the VMM to copy
    the TD Quote result after successful Quote generation. To create the
    shared buffer, allocate a large enough memory and mark it shared using
    set_memory_decrypted() in tdx_guest_init(). This buffer will be re-used
    for GetQuote requests in the TDX TSM handler.
    
    Although this method reserves a fixed chunk of memory for GetQuote
    requests, such one time allocation can help avoid memory fragmentation
    related allocation failures later in the uptime of the guest.
    
    Since the Quote generation process is not time-critical or frequently
    used, the current version uses a polling model for Quote requests and
    it also does not support parallel GetQuote requests.
    
    Link: https://lore.kernel.org/lkml/169342399185.3934343.3035845348326944519.stgit@dwillia2-xfh.jf.intel.com/ [1]
    Signed-off-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Reviewed-by: default avatarErdem Aktas <erdemaktas@google.com>
    Tested-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Tested-by: default avatarPeter Gonda <pgonda@google.com>
    Reviewed-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    f4738f56
tdx.c 22.6 KB