Re: [PATCH rfcv3 04/11] conf: add tdx as launch security type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Nov 27, 2023 at 04:55:14PM +0800, Zhenzhong Duan wrote:
> When 'tdx' is used, the VM will launched with Intel TDX feature enabled.
> TDX feature supports running encrypted VM (Trust Domain, TD) under the
> control of KVM. A TD runs in a CPU model which protects the
> confidentiality of its memory and its CPU state from other software
> 
> There is a child element 'policy' and four optional element for tdx type.
> In 'policy', bit 0 is set to enable TDX debug, bit 28 set to enable
> sept-ve-disable, other bits are reserved currently. mrConfigId, mrOwner
> and mrOwnerConfig are hex string of 48 * 2 length each.
> Quote-Generation-Service is string to specify Quote Generation Service(QGS)
> in qemu socket address format. The examples of the supported format are
> "vsock:2:1234", "unix:/run/qgs", "localhost:1234".
> 
> For example:
> 
>  <launchSecurity type='tdx'>
>    <policy>0x1</policy>
>    <mrConfigId>xxx...xxx</mrConfigId>
>    <mrOwner>xxx...xxx</mrOwner>
>    <mrOwnerConfig>xxx...xxx</mrOwnerConfig>
>    <Quote-Generation-Service>xxx</Quote-Generation-Service>
>  </launchSecurity>

On the QEMU side, the quote generateo sevice is defined as

     '*quote-generation-socket': 'SocketAddress'

we need to model 'SocktetAddress' in the XML  properly, not
just as an opaque string.

Also given the naming for the rest of the elements, this
should also use caps, eg  <quoteGenerationService>

> 
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@xxxxxxxxx>
> ---
>  src/conf/domain_conf.c            | 46 +++++++++++++++++++++++++++++++
>  src/conf/domain_conf.h            | 10 +++++++
>  src/conf/schemas/domaincommon.rng | 34 +++++++++++++++++++++++
>  src/conf/virconftypes.h           |  2 ++
>  src/qemu/qemu_command.c           |  2 ++
>  src/qemu/qemu_firmware.c          |  1 +
>  src/qemu/qemu_namespace.c         |  1 +
>  src/qemu/qemu_process.c           |  1 +
>  src/qemu/qemu_validate.c          |  1 +

Schema additions need something added to docs/formatdomain.rst to
document them, as well as example XML added under tests/ to validate
the parsing and formatting logic, and the QEMU command line args
generation.

>  9 files changed, 98 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 80f467ae7a..08e82c5380 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1513,6 +1513,7 @@ VIR_ENUM_IMPL(virDomainLaunchSecurity,
>                "",
>                "sev",
>                "s390-pv",
> +              "tdx",
>  );
>  
>  typedef enum {
> @@ -3808,6 +3809,11 @@ virDomainSecDefFree(virDomainSecDef *def)
>          g_free(def->data.sev.dh_cert);
>          g_free(def->data.sev.session);
>          break;
> +    case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
> +        g_free(def->data.tdx.mrconfigid);
> +        g_free(def->data.tdx.mrowner);
> +        g_free(def->data.tdx.mrownerconfig);
> +        g_free(def->data.tdx.QGS);
>      case VIR_DOMAIN_LAUNCH_SECURITY_PV:
>      case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>      case VIR_DOMAIN_LAUNCH_SECURITY_LAST:
> @@ -13452,6 +13458,25 @@ virDomainSEVDefParseXML(virDomainSEVDef *def,
>  }
>  
>  
> +static int
> +virDomainTDXDefParseXML(virDomainTDXDef *def,
> +                        xmlXPathContextPtr ctxt)
> +{
> +    if (virXPathUIntBase("string(./policy)", ctxt, 16, &def->policy) < 0) {
> +        virReportError(VIR_ERR_XML_ERROR, "%s",
> +                       _("failed to get launch security policy for launch security type TDX"));
> +        return -1;
> +    }
> +
> +    def->mrconfigid = virXPathString("string(./mrConfigId)", ctxt);
> +    def->mrowner = virXPathString("string(./mrOwner)", ctxt);
> +    def->mrownerconfig = virXPathString("string(./mrOwnerConfig)", ctxt);
> +    def->QGS = virXPathString("string(./Quote-Generation-Service)", ctxt);
> +
> +    return 0;
> +}
> +
> +
>  static virDomainSecDef *
>  virDomainSecDefParseXML(xmlNodePtr lsecNode,
>                          xmlXPathContextPtr ctxt)
> @@ -13471,6 +13496,10 @@ virDomainSecDefParseXML(xmlNodePtr lsecNode,
>          if (virDomainSEVDefParseXML(&sec->data.sev, ctxt) < 0)
>              return NULL;
>          break;
> +    case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
> +        if (virDomainTDXDefParseXML(&sec->data.tdx, ctxt) < 0)
> +            return NULL;
> +        break;
>      case VIR_DOMAIN_LAUNCH_SECURITY_PV:
>          break;
>      case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
> @@ -26468,6 +26497,23 @@ virDomainSecDefFormat(virBuffer *buf, virDomainSecDef *sec)
>          break;
>      }
>  
> +    case VIR_DOMAIN_LAUNCH_SECURITY_TDX: {
> +        virDomainTDXDef *tdx = &sec->data.tdx;
> +
> +        virBufferAsprintf(&childBuf, "<policy>0x%04x</policy>\n", tdx->policy);
> +
> +        if (tdx->mrconfigid)
> +            virBufferEscapeString(&childBuf, "<mrConfigId>%s</mrConfigId>\n", tdx->mrconfigid);
> +        if (tdx->mrowner)
> +            virBufferEscapeString(&childBuf, "<mrOwner>%s</mrOwner>\n", tdx->mrowner);
> +        if (tdx->mrownerconfig)
> +            virBufferEscapeString(&childBuf, "<mrOwnerConfig>%s</mrOwnerConfig>\n", tdx->mrownerconfig);
> +        if (tdx->QGS)
> +            virBufferEscapeString(&childBuf, "<Quote-Generation-Service>%s</Quote-Generation-Service>\n", tdx->QGS);
> +
> +        break;
> +    }
> +
>      case VIR_DOMAIN_LAUNCH_SECURITY_PV:
>          break;
>  
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 98f99721f0..3b01850eb4 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2833,6 +2833,7 @@ typedef enum {
>      VIR_DOMAIN_LAUNCH_SECURITY_NONE,
>      VIR_DOMAIN_LAUNCH_SECURITY_SEV,
>      VIR_DOMAIN_LAUNCH_SECURITY_PV,
> +    VIR_DOMAIN_LAUNCH_SECURITY_TDX,
>  
>      VIR_DOMAIN_LAUNCH_SECURITY_LAST,
>  } virDomainLaunchSecurity;
> @@ -2849,10 +2850,19 @@ struct _virDomainSEVDef {
>      virTristateBool kernel_hashes;
>  };
>  
> +struct _virDomainTDXDef {
> +    unsigned int policy;
> +    char *mrconfigid;
> +    char *mrowner;
> +    char *mrownerconfig;
> +    char *QGS;
> +};
> +
>  struct _virDomainSecDef {
>      virDomainLaunchSecurity sectype;
>      union {
>          virDomainSEVDef sev;
> +        virDomainTDXDef tdx;
>      } data;
>  };
>  
> diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
> index a26986b5ce..bf3667d727 100644
> --- a/src/conf/schemas/domaincommon.rng
> +++ b/src/conf/schemas/domaincommon.rng
> @@ -520,6 +520,9 @@
>              <value>s390-pv</value>
>            </attribute>
>          </group>
> +        <group>
> +          <ref name="launchSecurityTDX"/>
> +        </group>
>        </choice>
>      </element>
>    </define>
> @@ -565,6 +568,37 @@
>      </interleave>
>    </define>
>  
> +  <define name="launchSecurityTDX">
> +    <attribute name="type">
> +      <value>tdx</value>
> +    </attribute>
> +    <interleave>
> +      <element name="policy">
> +        <ref name="hexuint"/>
> +      </element>
> +      <optional>
> +        <element name="mrConfigId">
> +          <data type="string"/>
> +        </element>
> +      </optional>
> +      <optional>
> +        <element name="mrOwner">
> +          <data type="string"/>
> +        </element>
> +      </optional>
> +      <optional>
> +        <element name="mrOwnerConfig">
> +          <data type="string"/>
> +        </element>
> +      </optional>
> +      <optional>
> +        <element name="Quote-Generation-Service">
> +          <data type="string"/>
> +        </element>
> +      </optional>
> +    </interleave>
> +  </define>
> +
>    <!--
>        Enable or disable perf events for the domain. For each
>        of the events the following rules apply:
> diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h
> index 26cb966194..5516165bcc 100644
> --- a/src/conf/virconftypes.h
> +++ b/src/conf/virconftypes.h
> @@ -210,6 +210,8 @@ typedef struct _virDomainResourceDef virDomainResourceDef;
>  
>  typedef struct _virDomainSEVDef virDomainSEVDef;
>  
> +typedef struct _virDomainTDXDef virDomainTDXDef;
> +
>  typedef struct _virDomainSecDef virDomainSecDef;
>  
>  typedef struct _virDomainShmemDef virDomainShmemDef;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index fd0f12f304..89905378e4 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7001,6 +7001,7 @@ qemuBuildMachineCommandLine(virCommand *cmd,
>              }
>              break;
>          case VIR_DOMAIN_LAUNCH_SECURITY_PV:
> +        case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>              virBufferAddLit(&buf, ",confidential-guest-support=lsec0");
>              break;
>          case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
> @@ -9658,6 +9659,7 @@ qemuBuildSecCommandLine(virDomainObj *vm, virCommand *cmd,
>      case VIR_DOMAIN_LAUNCH_SECURITY_PV:
>          return qemuBuildPVCommandLine(vm, cmd);
>          break;
> +    case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>      case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>      case VIR_DOMAIN_LAUNCH_SECURITY_LAST:
>          virReportEnumRangeError(virDomainLaunchSecurity, sec->sectype);
> diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
> index d39e61d071..b073a38bfc 100644
> --- a/src/qemu/qemu_firmware.c
> +++ b/src/qemu/qemu_firmware.c
> @@ -1374,6 +1374,7 @@ qemuFirmwareMatchDomain(const virDomainDef *def,
>              }
>              break;
>          case VIR_DOMAIN_LAUNCH_SECURITY_PV:
> +        case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>              break;
>          case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>          case VIR_DOMAIN_LAUNCH_SECURITY_LAST:
> diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c
> index 915d44310f..ac8a4b5c07 100644
> --- a/src/qemu/qemu_namespace.c
> +++ b/src/qemu/qemu_namespace.c
> @@ -660,6 +660,7 @@ qemuDomainSetupLaunchSecurity(virDomainObj *vm,
>          VIR_DEBUG("Set up launch security for SEV");
>          break;
>      case VIR_DOMAIN_LAUNCH_SECURITY_PV:
> +    case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>          break;
>      case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>      case VIR_DOMAIN_LAUNCH_SECURITY_LAST:
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 1ef032dbd2..f27f6653f5 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -6744,6 +6744,7 @@ qemuProcessPrepareLaunchSecurityGuestInput(virDomainObj *vm)
>      case VIR_DOMAIN_LAUNCH_SECURITY_SEV:
>          return qemuProcessPrepareSEVGuestInput(vm);
>      case VIR_DOMAIN_LAUNCH_SECURITY_PV:
> +    case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>          return 0;
>      case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>      case VIR_DOMAIN_LAUNCH_SECURITY_LAST:
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index 93df9e4c8e..af630796cd 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -1322,6 +1322,7 @@ qemuValidateDomainDef(const virDomainDef *def,
>                  return -1;
>              }
>              break;
> +        case VIR_DOMAIN_LAUNCH_SECURITY_TDX:
>          case VIR_DOMAIN_LAUNCH_SECURITY_NONE:
>          case VIR_DOMAIN_LAUNCH_SECURITY_LAST:
>              virReportEnumRangeError(virDomainLaunchSecurity, def->sec->sectype);
> -- 
> 2.34.1
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux