Add TPM device validation: - Accept only the external TPM backend supported by bhyve. - Accept only one TPM device as bhyve does not support more than one. - Do not accept UNIX socket paths with commas as commas are used to delimit options in bhyve. - Accept only the CRB model as it's the only one supported by bhyve. Also, explicitly set model to CRB when it's not specified. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_domain.c | 35 +++++++++++++++- .../x86_64/bhyvexml2argv-tpm-comma-path.xml | 16 ++++++++ .../x86_64/bhyvexml2argv-tpm-crb.args | 12 ++++++ .../x86_64/bhyvexml2argv-tpm-crb.ldargs | 4 ++ .../x86_64/bhyvexml2argv-tpm-crb.xml | 28 +++++++++++++ .../bhyvexml2argv-tpm-invalid-model.xml | 16 ++++++++ .../bhyvexml2argv-tpm-multiple-devices.xml | 21 ++++++++++ tests/bhyvexml2argvtest.c | 4 ++ .../x86_64/bhyvexml2xmlout-tpm.xml | 41 +++++++++++++++++++ tests/bhyvexml2xmltest.c | 4 ++ 10 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml create mode 100644 tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 93be75d52d..e0004e6dab 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -311,6 +311,11 @@ bhyveDomainDeviceDefPostParse(virDomainDeviceDef *dev, dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_GOP; } + if (dev->type == VIR_DOMAIN_DEVICE_TPM && + dev->data.tpm->model == VIR_DOMAIN_TPM_MODEL_DEFAULT) { + dev->data.tpm->model = VIR_DOMAIN_TPM_MODEL_CRB; + } + if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->source->type == VIR_DOMAIN_CHR_TYPE_NMDM) { virDomainChrDef *chr = dev->data.chr; @@ -521,11 +526,33 @@ bhyveDomainDeviceDefValidate(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_SMARTCARD: case VIR_DOMAIN_DEVICE_SOUND: - case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_VIDEO: case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_WATCHDOG: break; + + case VIR_DOMAIN_DEVICE_TPM: + if (dev->data.tpm->type != VIR_DOMAIN_TPM_TYPE_EXTERNAL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only 'external' TPM device backend is supported")); + return -1; + } + + if (dev->data.tpm->model != VIR_DOMAIN_TPM_MODEL_DEFAULT && + dev->data.tpm->model != VIR_DOMAIN_TPM_MODEL_CRB) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("TPM model '%1$s' is not supported by bhyve"), + virDomainTPMModelTypeToString(dev->data.tpm->model)); + return -1; + } + + if (virStringHasChars(dev->data.tpm->data.external.source->data.nix.path, + ",")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Commas (',') are not allowed in UNIX socket paths")); + return -1; + } + break; } return 0; @@ -600,6 +627,12 @@ bhyveDomainDefValidate(const virDomainDef *def, } } + if (def->ntpms > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("bhyve only supports a single TPM device")); + return -1; + } + if (def->nhostdevs && !def->mem.locked) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("using passthrough devices requires locking guest memory")); diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml new file mode 100644 index 0000000000..a12466d743 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml @@ -0,0 +1,16 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <tpm> + <backend type='external'> + <source type='unix' mode='connect' path='/var/run/swtpm/tpm,0'/> + </backend> + </tpm> + </devices> +</domain> diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args new file mode 100644 index 0000000000..9b3b639a94 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args @@ -0,0 +1,12 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 1:0,lpc \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 \ +-l tpm,swtpm,/var/run/swtpm/tpm \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs new file mode 100644 index 0000000000..5905f4b3e6 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs @@ -0,0 +1,4 @@ +bhyveload \ +-m 214 \ +-d /tmp/freebsd.img \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml new file mode 100644 index 0000000000..76f690a6d6 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml @@ -0,0 +1,28 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <disk type='file'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='drive' controller='0' bus='0' target='2' unit='0'/> + </disk> + <interface type='bridge'> + <mac address='52:54:00:b9:94:02'/> + <model type='virtio'/> + <source bridge="virbr0"/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </interface> + <tpm model='tpm-crb'> + <backend type='external'> + <source type='unix' mode='connect' path='/var/run/swtpm/tpm'/> + </backend> + </tpm> + </devices> +</domain> diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml new file mode 100644 index 0000000000..634aa4d9f1 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml @@ -0,0 +1,16 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <tpm model='tpm-tis'> + <backend type='external'> + <source type='unix' mode='connect' path='/var/run/swtpm/tpm'/> + </backend> + </tpm> + </devices> +</domain> diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml new file mode 100644 index 0000000000..4a7160b695 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml @@ -0,0 +1,21 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <tpm> + <backend type='external'> + <source type='unix' mode='connect' path='/var/run/swtpm/tpm0'/> + </backend> + </tpm> + <tpm> + <backend type='external'> + <source type='unix' mode='connect' path='/var/run/swtpm/tpm1'/> + </backend> + </tpm> + </devices> +</domain> diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 58e6d11cec..679467fe72 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -311,6 +311,10 @@ mymain(void) DO_TEST_FAILURE("memtune-unsupported-params"); DO_TEST("sysinfo-smbios"); DO_TEST("tpm"); + DO_TEST("tpm-crb"); + DO_TEST_FAILURE("tpm-comma-path"); + DO_TEST_FAILURE("tpm-invalid-model"); + DO_TEST_FAILURE("tpm-multiple-devices"); driver.bhyvecaps &= ~BHYVE_CAP_LPC_TPM; DO_TEST_FAILURE("tpm"); diff --git a/tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml b/tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml new file mode 100644 index 0000000000..2a75a723db --- /dev/null +++ b/tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml @@ -0,0 +1,41 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <disk type='file' device='disk'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='drive' controller='0' bus='0' target='2' unit='0'/> + </disk> + <controller type='pci' index='0' model='pci-root'/> + <controller type='isa' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='sata' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </controller> + <interface type='bridge'> + <mac address='52:54:00:b9:94:02'/> + <source bridge='virbr0'/> + <model type='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </interface> + <tpm model='tpm-crb'> + <backend type='external'> + <source type='unix' mode='connect' path='/var/run/swtpm/tpm'/> + </backend> + </tpm> + </devices> +</domain> diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index 336278ce1c..be3459b200 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -155,6 +155,10 @@ mymain(void) DO_TEST_FAILURE("virtio-console-invalid-name"); DO_TEST_FAILURE("virtio-console-invalid-path"); DO_TEST_FAILURE("sata-disk-invalid-serial"); + DO_TEST_DIFFERENT("tpm"); + DO_TEST_FAILURE("tpm-comma-path"); + DO_TEST_FAILURE("tpm-invalid-model"); + DO_TEST_FAILURE("tpm-multiple-devices"); /* Address allocation tests */ DO_TEST_DIFFERENT("addr-single-sata-disk"); -- 2.55.0