From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989498591810.7365612755407;
Thu, 10 May 2018 14:58:18 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
[10.5.11.11])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id D7E827F7B9;
Thu, 10 May 2018 21:58:16 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id A2A286017C;
Thu, 10 May 2018 21:58:16 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6321E180BACE;
Thu, 10 May 2018 21:58:16 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com
[10.5.11.14])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvsVj028548 for ;
Thu, 10 May 2018 17:57:54 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 3D20A5ED46; Thu, 10 May 2018 21:57:54 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com
[10.5.110.39])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 332F45ED3B
for ; Thu, 10 May 2018 21:57:50 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 52AB184D6
for ; Thu, 10 May 2018 21:57:49 +0000 (UTC)
Received: from pps.filterd (m0098396.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrleE026315
for ; Thu, 10 May 2018 17:57:49 -0400
Received: from e13.ny.us.ibm.com (e13.ny.us.ibm.com [129.33.205.203])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvt382x4g-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:48 -0400
Received: from localhost
by e13.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:42 -0400
Received: from b01cxnp22035.gho.pok.ibm.com (9.57.198.25)
by e13.ny.us.ibm.com (146.89.104.200) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:40 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp22035.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvd0256164582; Thu, 10 May 2018 21:57:39 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 16901AE03C;
Thu, 10 May 2018 17:59:38 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id F2AEFAE034;
Thu, 10 May 2018 17:59:37 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:27 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0008-0000-0000-00000305D2CA
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030432; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:41
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0009-0000-0000-000039347DD9
Message-Id: <1525989457-29715-2-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=43 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.39]); Thu, 10 May 2018 21:57:49 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.39]);
Thu, 10 May 2018 21:57:49 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 01/11] conf: Add support for external swtpm TPM
emulator to domain XML
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]);
Thu, 10 May 2018 21:58:17 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
This patch adds support for an external swtpm TPM emulator. The XML for
this type of TPM looks as follows:
The XML will currently only define a TPM 1.2.
Extend the documentation.
Add a test case testing the XML parser and formatter.
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
docs/formatdomain.html.in | 30 +++++++++++++++++++++++++++
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_audit.c | 2 ++
src/conf/domain_conf.c | 28 +++++++++++++++++++------
src/conf/domain_conf.h | 7 +++++++
src/qemu/qemu_cgroup.c | 1 +
src/qemu/qemu_command.c | 1 +
src/qemu/qemu_domain.c | 1 +
src/security/security_dac.c | 2 ++
src/security/security_selinux.c | 2 ++
tests/qemuxml2argvdata/tpm-emulator.xml | 30 +++++++++++++++++++++++++++
tests/qemuxml2xmloutdata/tpm-emulator.xml | 34 +++++++++++++++++++++++++++=
++++
tests/qemuxml2xmltest.c | 1 +
13 files changed, 138 insertions(+), 6 deletions(-)
create mode 100644 tests/qemuxml2argvdata/tpm-emulator.xml
create mode 100644 tests/qemuxml2xmloutdata/tpm-emulator.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index caeb14e..4f56784 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -7650,6 +7650,26 @@ qemu-kvm -net nic,model=3D? /dev/null
</devices>
...
+
+
+ The emulator device type gives access to a TPM emulator providing
+ TPM functionlity for each VM. QEMU talks to it over a Unix socket. W=
ith
+ the emulator device type each guest gets its own private TPM.
+ 'emulator' since 4.4.0
+
+ For this backend type the 'swtpm' TPM Emulator must be insta=
lled on the
+ host. Libvirt will automatically start an independent TPM em=
ulator
+ for each QEMU guest requesting access to it.
+
+
+
=20
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 0a6b29b..a9a1020 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4137,6 +4137,11 @@
+
+
+ emulator
+
+
diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
index 82868bc..25cccdd 100644
--- a/src/conf/domain_audit.c
+++ b/src/conf/domain_audit.c
@@ -586,6 +586,8 @@ virDomainAuditTPM(virDomainObjPtr vm, virDomainTPMDefPt=
r tpm,
"virt=3D%s resrc=3Ddev reason=3D%s %s uuid=3D%s %s",
virt, reason, vmname, uuidstr, device);
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ break;
case VIR_DOMAIN_TPM_TYPE_LAST:
default:
break;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f678e26..21b66d7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -864,7 +864,8 @@ VIR_ENUM_IMPL(virDomainTPMModel, VIR_DOMAIN_TPM_MODEL_L=
AST,
"tpm-crb")
=20
VIR_ENUM_IMPL(virDomainTPMBackend, VIR_DOMAIN_TPM_TYPE_LAST,
- "passthrough")
+ "passthrough",
+ "emulator")
=20
VIR_ENUM_IMPL(virDomainIOMMUModel, VIR_DOMAIN_IOMMU_MODEL_LAST,
"intel")
@@ -2601,6 +2602,11 @@ void virDomainTPMDefFree(virDomainTPMDefPtr def)
case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
VIR_FREE(def->data.passthrough.source.data.file.path);
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ VIR_FREE(def->data.emulator.source.data.nix.path);
+ VIR_FREE(def->data.emulator.storagepath);
+ VIR_FREE(def->data.emulator.logfile);
+ break;
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
@@ -12585,6 +12591,11 @@ virDomainSmartcardDefParseXML(virDomainXMLOptionPt=
r xmlopt,
*
*
*
+ * or like this:
+ *
+ *
+ *
+ *
*/
static virDomainTPMDefPtr
virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
@@ -12651,6 +12662,8 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlop=
t,
def->data.passthrough.source.type =3D VIR_DOMAIN_CHR_TYPE_DEV;
path =3D NULL;
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ break;
case VIR_DOMAIN_TPM_TYPE_LAST:
goto error;
}
@@ -24818,22 +24831,25 @@ virDomainTPMDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, "\n",
virDomainTPMModelTypeToString(def->model));
virBufferAdjustIndent(buf, 2);
- virBufferAsprintf(buf, "\n",
+ virBufferAsprintf(buf, "type));
- virBufferAdjustIndent(buf, 2);
=20
switch (def->type) {
case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ virBufferAddLit(buf, ">\n");
+ virBufferAdjustIndent(buf, 2);
virBufferEscapeString(buf, "\n",
def->data.passthrough.source.data.file.path);
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "\n");
+ break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ virBufferAddLit(buf, "/>\n");
break;
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
=20
- virBufferAdjustIndent(buf, -2);
- virBufferAddLit(buf, "\n");
-
virDomainDeviceInfoFormat(buf, &def->info, flags);
=20
virBufferAdjustIndent(buf, -2);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 15d228b..c304b08 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1286,6 +1286,7 @@ typedef enum {
=20
typedef enum {
VIR_DOMAIN_TPM_TYPE_PASSTHROUGH,
+ VIR_DOMAIN_TPM_TYPE_EMULATOR,
=20
VIR_DOMAIN_TPM_TYPE_LAST
} virDomainTPMBackendType;
@@ -1300,6 +1301,11 @@ struct _virDomainTPMDef {
struct {
virDomainChrSourceDef source;
} passthrough;
+ struct {
+ virDomainChrSourceDef source;
+ char *storagepath;
+ char *logfile;
+ } emulator;
} data;
};
=20
@@ -2814,6 +2820,7 @@ int virDomainDeviceAddressIsValid(virDomainDeviceInfo=
Ptr info,
int type);
virDomainDeviceInfoPtr virDomainDeviceGetInfo(virDomainDeviceDefPtr device=
);
void virDomainTPMDefFree(virDomainTPMDefPtr def);
+void virDomainTPMDelete(virDomainDefPtr def);
=20
typedef int (*virDomainDeviceInfoCallback)(virDomainDefPtr def,
virDomainDeviceDefPtr dev,
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index d88eb78..1a5adca 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -278,6 +278,7 @@ qemuSetupTPMCgroup(virDomainObjPtr vm)
case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
ret =3D qemuSetupChrSourceCgroup(vm, &dev->data.passthrough.source=
);
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 08f67a4..151f4fc 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9422,6 +9422,7 @@ qemuBuildTPMBackendStr(const virDomainDef *def,
VIR_FREE(cancel_path);
=20
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
goto error;
}
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 9bb6d8a..774a102 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -10365,6 +10365,7 @@ qemuDomainSetupTPM(virQEMUDriverConfigPtr cfg ATTRI=
BUTE_UNUSED,
return -1;
break;
=20
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
/* nada */
break;
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index 8938e2d..3ab2299 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -1372,6 +1372,7 @@ virSecurityDACSetTPMFileLabel(virSecurityManagerPtr m=
gr,
&tpm->data.passthrough.source,
false);
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
@@ -1393,6 +1394,7 @@ virSecurityDACRestoreTPMFileLabel(virSecurityManagerP=
tr mgr,
&tpm->data.passthrough.sou=
rce,
false);
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
diff --git a/src/security/security_selinux.c b/src/security/security_selinu=
x.c
index 5f74ef7..5d20fda 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1472,6 +1472,7 @@ virSecuritySELinuxSetTPMFileLabel(virSecurityManagerP=
tr mgr,
return -1;
}
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
@@ -1505,6 +1506,7 @@ virSecuritySELinuxRestoreTPMFileLabelInt(virSecurityM=
anagerPtr mgr,
VIR_FREE(cancel_path);
}
break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
diff --git a/tests/qemuxml2argvdata/tpm-emulator.xml b/tests/qemuxml2argvda=
ta/tpm-emulator.xml
new file mode 100644
index 0000000..7f1e575
--- /dev/null
+++ b/tests/qemuxml2argvdata/tpm-emulator.xml
@@ -0,0 +1,30 @@
+
+ TPM-VM
+ 11d7cd22-da89-3094-6212-079a48a309a1
+ 2097152
+ 512288
+ 1
+
+ hvm
+
+
+
+
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmloutdata/tpm-emulator.xml b/tests/qemuxml2xmlo=
utdata/tpm-emulator.xml
new file mode 100644
index 0000000..1b66e8b
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/tpm-emulator.xml
@@ -0,0 +1,34 @@
+
+ TPM-VM
+ 11d7cd22-da89-3094-6212-079a48a309a1
+ 2097152
+ 512288
+ 1
+
+ hvm
+
+
+
+
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 53a26a0..9f8f08f 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -673,6 +673,7 @@ mymain(void)
DO_TEST("disk-copy_on_read", NONE);
DO_TEST("tpm-passthrough", NONE);
DO_TEST("tpm-passthrough-crb", NONE);
+ DO_TEST("tpm-emulator", NONE);
=20
DO_TEST("metadata", NONE);
DO_TEST("metadata-duplicate", NONE);
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989475829746.4180300278513;
Thu, 10 May 2018 14:57:55 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
[10.5.11.11])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id F0124C0587F2;
Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id A1B686017C;
Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 742DA180B536;
Thu, 10 May 2018 21:57:51 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com
[10.5.11.25])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvm9m028499 for ;
Thu, 10 May 2018 17:57:49 -0400
Received: by smtp.corp.redhat.com (Postfix)
id EE5BB201A9A2; Thu, 10 May 2018 21:57:48 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx07.extmail.prod.ext.phx2.redhat.com
[10.5.110.31])
by smtp.corp.redhat.com (Postfix) with ESMTPS id E478F201A9A0
for ; Thu, 10 May 2018 21:57:46 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com
[148.163.158.5])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 695D6C04B958
for ; Thu, 10 May 2018 21:57:45 +0000 (UTC)
Received: from pps.filterd (m0098414.ppops.net [127.0.0.1])
by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrlja132909
for ; Thu, 10 May 2018 17:57:44 -0400
Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209])
by mx0b-001b2d01.pphosted.com with ESMTP id 2hvx2w8qx8-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:44 -0400
Received: from localhost
by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:44 -0400
Received: from b01cxnp23034.gho.pok.ibm.com (9.57.198.29)
by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
(version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256)
Thu, 10 May 2018 17:57:41 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp23034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvexr51642450
(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256
verify=FAIL); Thu, 10 May 2018 21:57:41 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 245BEAE03C;
Thu, 10 May 2018 17:59:39 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 0DC6DAE03B;
Thu, 10 May 2018 17:59:39 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:28 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0056-0000-0000-0000044CA935
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030431; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:42
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0057-0000-0000-00000890B884
Message-Id: <1525989457-29715-3-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.31]); Thu, 10 May 2018 21:57:45 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.31]);
Thu, 10 May 2018 21:57:45 +0000 (UTC) for IP:'148.163.158.5'
DOMAIN:'mx0b-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.158.5
mx0b-001b2d01.pphosted.com 148.163.158.5
mx0b-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.31
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 02/11] qemu: Extend QEMU capabilities with
'tpm-emulator'
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]);
Thu, 10 May 2018 21:57:54 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Extend the QEMU capabilities with tpm-emulator support.
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
src/qemu/qemu_capabilities.c | 5 +++++
src/qemu/qemu_capabilities.h | 1 +
tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml | 1 +
tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml | 1 +
tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml | 1 +
7 files changed, 11 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 920a596..961cd2d 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -475,6 +475,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
"disk-write-cache",
"nbd-tls",
"tpm-crb",
+ "tpm-emulator",
);
=20
=20
@@ -2338,6 +2339,10 @@ static const struct tpmTypeToCaps virQEMUCapsTPMType=
sToCaps[] =3D {
.type =3D VIR_DOMAIN_TPM_TYPE_PASSTHROUGH,
.caps =3D QEMU_CAPS_DEVICE_TPM_PASSTHROUGH,
},
+ {
+ .type =3D VIR_DOMAIN_TPM_TYPE_EMULATOR,
+ .caps =3D QEMU_CAPS_DEVICE_TPM_EMULATOR,
+ },
};
=20
const struct tpmTypeToCaps virQEMUCapsTPMModelsToCaps[] =3D {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index b9628b8..7092fbe 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -459,6 +459,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for =
syntax-check */
QEMU_CAPS_DISK_WRITE_CACHE, /* qemu block frontends support write-cach=
e param */
QEMU_CAPS_NBD_TLS, /* NBD server supports TLS transport */
QEMU_CAPS_DEVICE_TPM_CRB, /* -device tpm-crb */
+ QEMU_CAPS_DEVICE_TPM_EMULATOR, /* -tpmdev emulator */
=20
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemuc=
apabilitiesdata/caps_2.11.0.s390x.xml
index 64bd554..fd981f4 100644
--- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
@@ -119,6 +119,7 @@
+ 20110000342058
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml b/tests/qem=
ucapabilitiesdata/caps_2.12.0.aarch64.xml
index 197060a..6349d36 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml
@@ -158,6 +158,7 @@
+ 20110900342346
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml b/tests/qemuc=
apabilitiesdata/caps_2.12.0.ppc64.xml
index b0eb055..743a1aa 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml
@@ -155,6 +155,7 @@
+ 20110900419215
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml b/tests/qemuc=
apabilitiesdata/caps_2.12.0.s390x.xml
index 80f3ec6..bc98d6e 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml
@@ -120,6 +120,7 @@
+ 201109000
diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml b/tests/qemu=
capabilitiesdata/caps_2.12.0.x86_64.xml
index 150fbd2..665959a 100644
--- a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml
@@ -196,6 +196,7 @@
+ 20110900390060
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989476112105.33022797517697;
Thu, 10 May 2018 14:57:56 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com
[10.5.11.25])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 4CDB430C4CC9;
Thu, 10 May 2018 21:57:54 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 1868B201A9A0;
Thu, 10 May 2018 21:57:54 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 0CBB51801218;
Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com
[10.5.11.12])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvoC8028513 for ;
Thu, 10 May 2018 17:57:50 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 3B5A41906D; Thu, 10 May 2018 21:57:50 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx04.extmail.prod.ext.phx2.redhat.com
[10.5.110.28])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 3214F60C9A
for ; Thu, 10 May 2018 21:57:46 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id EE7798049C
for ; Thu, 10 May 2018 21:57:45 +0000 (UTC)
Received: from pps.filterd (m0098404.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrl2o042043
for ; Thu, 10 May 2018 17:57:45 -0400
Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvtxr0uhh-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:45 -0400
Received: from localhost
by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:44 -0400
Received: from b01cxnp22033.gho.pok.ibm.com (9.57.198.23)
by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:42 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp22033.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvg9946596152; Thu, 10 May 2018 21:57:42 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 313BEAE03C;
Thu, 10 May 2018 17:59:40 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 1B67CAE034;
Thu, 10 May 2018 17:59:40 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:29 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0056-0000-0000-0000044CA937
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030431; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:43
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0057-0000-0000-00000890B887
Message-Id: <1525989457-29715-4-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.28]); Thu, 10 May 2018 21:57:46 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.28]);
Thu, 10 May 2018 21:57:46 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.28
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 03/11] util: Implement virFileChownFiles()
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]);
Thu, 10 May 2018 21:57:54 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Implement virFileChownFiles() which changes file ownership of all
files in a given directory.
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
src/libvirt_private.syms | 1 +
src/util/virfile.c | 55 ++++++++++++++++++++++++++++++++++++++++++++=
++++
src/util/virfile.h | 3 +++
3 files changed, 59 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index f8883dc..75b8932 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1761,6 +1761,7 @@ virFileActivateDirOverride;
virFileBindMountDevice;
virFileBuildPath;
virFileCanonicalizePath;
+virFileChownFiles;
virFileClose;
virFileComparePaths;
virFileCopyACLs;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 523241f..629aa67 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -2990,6 +2990,61 @@ void virDirClose(DIR **dirp)
*dirp =3D NULL;
}
=20
+
+/*
+ * virFileChownFiles:
+ * @name: name of the directory
+ * @uid: uid
+ * @gid: gid
+ *
+ * Change ownership of all regular files in a directory.
+ *
+ * Returns -1 on error, with error already reported, 0 on success.
+ */
+int virFileChownFiles(const char *name,
+ uid_t uid,
+ gid_t gid)
+{
+ struct dirent *ent;
+ int ret =3D -1;
+ int direrr;
+ DIR *dir;
+ char *path =3D NULL;
+
+ if (virDirOpen(&dir, name) < 0)
+ return -1;
+
+ while ((direrr =3D virDirRead(dir, &ent, name)) > 0) {
+ if (ent->d_type !=3D DT_REG)
+ continue;
+
+ if (virAsprintf(&path, "%s/%s", name, ent->d_name) < 0)
+ goto cleanup;
+
+ if (chown(path, uid, gid) < 0) {
+ virReportSystemError(errno,
+ _("cannot chown '%s' to (%u, %u)"),
+ ent->d_name, (unsigned int) uid,
+ (unsigned int) gid);
+ goto cleanup;
+ }
+ VIR_FREE(path);
+ }
+
+ if (direrr < 0)
+ goto cleanup;
+
+ ret =3D 0;
+
+ cleanup:
+ VIR_FREE(path);
+
+ virDirClose(&dir);
+
+ return ret;
+}
+
+
static int
virFileMakePathHelper(char *path, mode_t mode)
{
diff --git a/src/util/virfile.h b/src/util/virfile.h
index 6b0cbad..c7a32c3 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -238,6 +238,9 @@ int virFileOpenAs(const char *path, int openflags, mode=
_t mode,
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
int virFileRemove(const char *path, uid_t uid, gid_t gid);
=20
+int virFileChownFiles(const char *name, uid_t uid, gid_t gid)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
enum {
VIR_DIR_CREATE_NONE =3D 0,
VIR_DIR_CREATE_AS_UID =3D (1 << 0),
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989476388368.4638232420698;
Thu, 10 May 2018 14:57:56 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com
[10.5.11.15])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 3B3D9800A4;
Thu, 10 May 2018 21:57:54 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id DDEEA5D6B5;
Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id A39BE1801241;
Thu, 10 May 2018 21:57:52 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com
[10.5.11.27])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvnUR028505 for ;
Thu, 10 May 2018 17:57:49 -0400
Received: by smtp.corp.redhat.com (Postfix)
id A10889E8A2; Thu, 10 May 2018 21:57:49 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx20.extmail.prod.ext.phx2.redhat.com
[10.5.110.49])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 978B29E8AD
for ; Thu, 10 May 2018 21:57:47 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 2CCFB30B9308
for ; Thu, 10 May 2018 21:57:47 +0000 (UTC)
Received: from pps.filterd (m0098399.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrtU2106705
for ; Thu, 10 May 2018 17:57:46 -0400
Received: from e12.ny.us.ibm.com (e12.ny.us.ibm.com [129.33.205.202])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvttt95h1-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:46 -0400
Received: from localhost
by e12.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:45 -0400
Received: from b01cxnp22036.gho.pok.ibm.com (9.57.198.26)
by e12.ny.us.ibm.com (146.89.104.199) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:43 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp22036.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvhVJ49610810; Thu, 10 May 2018 21:57:43 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 3516AAE03B;
Thu, 10 May 2018 17:59:41 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 28577AE034;
Thu, 10 May 2018 17:59:41 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:30 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0048-0000-0000-0000026B583A
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030431; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:44
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0049-0000-0000-00004513AC5D
Message-Id: <1525989457-29715-5-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.49]); Thu, 10 May 2018 21:57:47 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.49]);
Thu, 10 May 2018 21:57:47 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.110.49
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.27
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 04/11] security: Add DAC and SELinux security
for tpm-emulator
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]);
Thu, 10 May 2018 21:57:54 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Extend the DAC and SELinux modules with support for the tpm-emulator.
We label the Unix socket that QEMU connects to after starting swtmp
with DAC and SELinux labels. We do not have to restore the labels in
this case since the tpm-emulator will remove the Unix socket when it
terminates.
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
src/security/security_dac.c | 5 +++++
src/security/security_selinux.c | 6 ++++++
2 files changed, 11 insertions(+)
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index 3ab2299..4b623dc 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -1373,6 +1373,10 @@ virSecurityDACSetTPMFileLabel(virSecurityManagerPtr =
mgr,
false);
break;
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ ret =3D virSecurityDACSetChardevLabel(mgr, def,
+ &tpm->data.emulator.source,
+ false);
+ break;
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
@@ -1395,6 +1399,7 @@ virSecurityDACRestoreTPMFileLabel(virSecurityManagerP=
tr mgr,
false);
break;
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ /* swtpm will have removed the Unix socket upon termination */
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
diff --git a/src/security/security_selinux.c b/src/security/security_selinu=
x.c
index 5d20fda..92e8415 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1473,6 +1473,11 @@ virSecuritySELinuxSetTPMFileLabel(virSecurityManager=
Ptr mgr,
}
break;
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ tpmdev =3D tpm->data.emulator.source.data.nix.path;
+ rc =3D virSecuritySELinuxSetFilecon(mgr, tpmdev, seclabel->imagela=
bel);
+ if (rc < 0)
+ return -1;
+ break;
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
@@ -1507,6 +1512,7 @@ virSecuritySELinuxRestoreTPMFileLabelInt(virSecurityM=
anagerPtr mgr,
}
break;
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ /* swtpm will have removed the Unix socket upon termination */
case VIR_DOMAIN_TPM_TYPE_LAST:
break;
}
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989501346693.0438020264605;
Thu, 10 May 2018 14:58:21 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
[10.5.11.11])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 05A5A3E2B3;
Thu, 10 May 2018 21:58:20 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id CBE386017C;
Thu, 10 May 2018 21:58:19 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 820C7180CB21;
Thu, 10 May 2018 21:58:19 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com
[10.5.11.12])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvtAs028565 for ;
Thu, 10 May 2018 17:57:55 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 731661906D; Thu, 10 May 2018 21:57:55 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx16.extmail.prod.ext.phx2.redhat.com
[10.5.110.45])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 69F5160C9A
for ; Thu, 10 May 2018 21:57:55 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 914F230C0940
for ; Thu, 10 May 2018 21:57:48 +0000 (UTC)
Received: from pps.filterd (m0098393.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrql3120888
for ; Thu, 10 May 2018 17:57:48 -0400
Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvu0n8jtj-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:48 -0400
Received: from localhost
by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:46 -0400
Received: from b01cxnp22035.gho.pok.ibm.com (9.57.198.25)
by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:44 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp22035.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvicL56623232; Thu, 10 May 2018 21:57:44 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 4386EAE03C;
Thu, 10 May 2018 17:59:42 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 2C238AE043;
Thu, 10 May 2018 17:59:42 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:31 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0056-0000-0000-0000044CA93A
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030431; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:45
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0057-0000-0000-00000890B88B
Message-Id: <1525989457-29715-6-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=43 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.45]); Thu, 10 May 2018 21:57:48 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.45]);
Thu, 10 May 2018 21:57:48 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.110.45
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 05/11] qemu: Extend qemu_conf with tpm-emulator
support
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]);
Thu, 10 May 2018 21:58:20 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Extend qemu_conf with user and group for running the tpm-emulator
and add directories to the configuration for the locations of the
log, state, and socket of the tpm-emulator.
Also add these new directories to the QEMU Makefile.inc.am and
the RPM spec file libvirt.spec.in.
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
libvirt.spec.in | 2 ++
src/qemu/Makefile.inc.am | 6 ++++++
src/qemu/libvirtd_qemu.aug | 5 +++++
src/qemu/qemu.conf | 8 +++++++
src/qemu/qemu_conf.c | 43 ++++++++++++++++++++++++++++++++++=
++++
src/qemu/qemu_conf.h | 6 ++++++
src/qemu/test_libvirtd_qemu.aug.in | 2 ++
7 files changed, 72 insertions(+)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 9ea5e6b..cd24453 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1900,6 +1900,8 @@ exit 0
%{_datadir}/augeas/lenses/libvirtd_qemu.aug
%{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug
%{_libdir}/%{name}/connection-driver/libvirt_driver_qemu.so
+%dir %attr(0711, root, root) %{_localstatedir}/lib/libvirt/swtpm/
+%dir %attr(0711, root, root) %{_localstatedir}/log/swtpm/libvirt/qemu/
%endif
=20
%if %{with_lxc}
diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am
index 63e7c87..7f50501 100644
--- a/src/qemu/Makefile.inc.am
+++ b/src/qemu/Makefile.inc.am
@@ -129,12 +129,18 @@ install-data-qemu:
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/run/libvirt/qemu"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/libvirt/qemu"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/log/libvirt/qemu"
+ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/swtpm"
+ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/run/libvirt/qemu/swtpm"
+ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/log/swtpm/libvirt/qemu"
=20
uninstall-data-qemu:
rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/qemu" ||:
rmdir "$(DESTDIR)$(localstatedir)/run/libvirt/qemu" ||:
rmdir "$(DESTDIR)$(localstatedir)/cache/libvirt/qemu" ||:
rmdir "$(DESTDIR)$(localstatedir)/log/libvirt/qemu" ||:
+ rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/swtpm"
+ rmdir "$(DESTDIR)$(localstatedir)/run/libvirt/qemu/swtpm" ||:
+ rmdir "$(DESTDIR)$(localstatedir)/log/swtpm/libvirt/qemu" ||:
=20
endif WITH_QEMU
=20
diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
index c19bf3a..23bfe67 100644
--- a/src/qemu/libvirtd_qemu.aug
+++ b/src/qemu/libvirtd_qemu.aug
@@ -118,6 +118,9 @@ module Libvirtd_qemu =3D
let vxhs_entry =3D bool_entry "vxhs_tls"
| str_entry "vxhs_tls_x509_cert_dir"
=20
+ let swtpm_user_entry =3D str_entry "swtpm_user"
+ let swtpm_group_entry =3D str_entry "swtpm_group"
+
(* Each entry in the config is one of the following ... *)
let entry =3D default_tls_entry
| vnc_entry
@@ -137,6 +140,8 @@ module Libvirtd_qemu =3D
| gluster_debug_level_entry
| memory_entry
| vxhs_entry
+ | swtpm_user_entry
+ | swtpm_group_entry
=20
let comment =3D [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \=
t\n][^\n]*)?/ . del /\n/ "\n" ]
let empty =3D [ label "#empty" . eol ]
diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
index 3444185..26a6dc7 100644
--- a/src/qemu/qemu.conf
+++ b/src/qemu/qemu.conf
@@ -779,3 +779,11 @@
# This directory is used for memoryBacking source if configured as file.
# NOTE: big files will be stored here
#memory_backing_dir =3D "/var/lib/libvirt/qemu/ram"
+
+# User for the swtpm TPM Emulator
+#
+# Default is 'tss'; this is the same user that tcsd (TrouSerS) installs
+# and uses; alternative is 'root'
+#
+#swtpm_user =3D "tss"
+#swtpm_group =3D "tss"
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index bfbb572..5383fd2 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -159,6 +159,10 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool pri=
vileged)
"%s/log/libvirt/qemu", LOCALSTATEDIR) < 0)
goto error;
=20
+ if (virAsprintf(&cfg->swtpmLogDir,
+ "%s/log/swtpm/libvirt/qemu", LOCALSTATEDIR) < 0)
+ goto error;
+
if (VIR_STRDUP(cfg->configBaseDir, SYSCONFDIR "/libvirt") < 0)
goto error;
=20
@@ -166,6 +170,10 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool pri=
vileged)
"%s/run/libvirt/qemu", LOCALSTATEDIR) < 0)
goto error;
=20
+ if (virAsprintf(&cfg->swtpmStateDir,
+ "%s/run/libvirt/qemu/swtpm", LOCALSTATEDIR) < 0)
+ goto error;
+
if (virAsprintf(&cfg->cacheDir,
"%s/cache/libvirt/qemu", LOCALSTATEDIR) < 0)
goto error;
@@ -186,6 +194,13 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool pri=
vileged)
goto error;
if (virAsprintf(&cfg->memoryBackingDir, "%s/ram", cfg->libDir) < 0)
goto error;
+ if (virAsprintf(&cfg->swtpmStorageDir, "%s/lib/libvirt/swtpm",
+ LOCALSTATEDIR) < 0)
+ goto error;
+ if (virGetUserID("tss", &cfg->swtpm_user) < 0)
+ cfg->swtpm_user =3D 0; /* fall back to root */
+ if (virGetGroupID("tss", &cfg->swtpm_group) < 0)
+ cfg->swtpm_group =3D 0; /* fall back to root */
} else {
char *rundir;
char *cachedir;
@@ -199,6 +214,11 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool pri=
vileged)
VIR_FREE(cachedir);
goto error;
}
+ if (virAsprintf(&cfg->swtpmLogDir,
+ "%s/qemu/log", cachedir) < 0) {
+ VIR_FREE(cachedir);
+ goto error;
+ }
if (virAsprintf(&cfg->cacheDir, "%s/qemu/cache", cachedir) < 0) {
VIR_FREE(cachedir);
goto error;
@@ -214,6 +234,9 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool priv=
ileged)
}
VIR_FREE(rundir);
=20
+ if (virAsprintf(&cfg->swtpmStateDir, "%s/swtpm", cfg->stateDir) < =
0)
+ goto error;
+
if (!(cfg->configBaseDir =3D virGetUserConfigDirectory()))
goto error;
=20
@@ -233,6 +256,10 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool pri=
vileged)
goto error;
if (virAsprintf(&cfg->memoryBackingDir, "%s/qemu/ram", cfg->config=
BaseDir) < 0)
goto error;
+ if (virAsprintf(&cfg->swtpmStorageDir, "%s/qemu/swtpm", cfg->confi=
gBaseDir) < 0)
+ goto error;
+ cfg->swtpm_user =3D (uid_t)-1;
+ cfg->swtpm_group =3D (gid_t)-1;
}
=20
if (virAsprintf(&cfg->configDir, "%s/qemu", cfg->configBaseDir) < 0)
@@ -351,7 +378,9 @@ static void virQEMUDriverConfigDispose(void *obj)
VIR_FREE(cfg->configDir);
VIR_FREE(cfg->autostartDir);
VIR_FREE(cfg->logDir);
+ VIR_FREE(cfg->swtpmLogDir);
VIR_FREE(cfg->stateDir);
+ VIR_FREE(cfg->swtpmStateDir);
=20
VIR_FREE(cfg->libDir);
VIR_FREE(cfg->cacheDir);
@@ -400,6 +429,7 @@ static void virQEMUDriverConfigDispose(void *obj)
virFirmwareFreeList(cfg->firmwares, cfg->nfirmwares);
=20
VIR_FREE(cfg->memoryBackingDir);
+ VIR_FREE(cfg->swtpmStorageDir);
}
=20
=20
@@ -471,6 +501,7 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr =
cfg,
size_t i, j;
char *stdioHandler =3D NULL;
char *user =3D NULL, *group =3D NULL;
+ char *swtpm_user =3D NULL, *swtpm_group =3D NULL;
char **controllers =3D NULL;
char **hugetlbfs =3D NULL;
char **nvram =3D NULL;
@@ -907,6 +938,16 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr=
cfg,
if (virConfGetValueString(conf, "memory_backing_dir", &cfg->memoryBack=
ingDir) < 0)
goto cleanup;
=20
+ if (virConfGetValueString(conf, "swtpm_user", &swtpm_user) < 0)
+ goto cleanup;
+ if (swtpm_user && virGetUserID(swtpm_user, &cfg->swtpm_user) < 0)
+ goto cleanup;
+
+ if (virConfGetValueString(conf, "swtpm_group", &swtpm_group) < 0)
+ goto cleanup;
+ if (swtpm_group && virGetGroupID(swtpm_group, &cfg->swtpm_group) < 0)
+ goto cleanup;
+
ret =3D 0;
=20
cleanup:
@@ -917,6 +958,8 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr =
cfg,
VIR_FREE(corestr);
VIR_FREE(user);
VIR_FREE(group);
+ VIR_FREE(swtpm_user);
+ VIR_FREE(swtpm_group);
virConfFree(conf);
return ret;
}
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index e1ad546..19dc0bc 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -102,7 +102,9 @@ struct _virQEMUDriverConfig {
char *configDir;
char *autostartDir;
char *logDir;
+ char *swtpmLogDir;
char *stateDir;
+ char *swtpmStateDir;
/* These two directories are ones QEMU processes use (so must match
* the QEMU user/group */
char *libDir;
@@ -111,6 +113,7 @@ struct _virQEMUDriverConfig {
char *snapshotDir;
char *channelTargetDir;
char *nvramDir;
+ char *swtpmStorageDir;
=20
char *defaultTLSx509certdir;
bool checkdefaultTLSx509certdir;
@@ -206,6 +209,9 @@ struct _virQEMUDriverConfig {
=20
bool vxhsTLS;
char *vxhsTLSx509certdir;
+
+ uid_t swtpm_user;
+ gid_t swtpm_group;
};
=20
/* Main driver state */
diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qe=
mu.aug.in
index 688e5b9..6d6e1d4 100644
--- a/src/qemu/test_libvirtd_qemu.aug.in
+++ b/src/qemu/test_libvirtd_qemu.aug.in
@@ -100,3 +100,5 @@ module Test_libvirtd_qemu =3D
{ "1" =3D "mount" }
}
{ "memory_backing_dir" =3D "/var/lib/libvirt/qemu/ram" }
+{ "swtpm_user" =3D "tss" }
+{ "swtpm_group" =3D "tss" }
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989494103529.9409329770243;
Thu, 10 May 2018 14:58:14 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com
[10.5.11.15])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 5EC8030025E1;
Thu, 10 May 2018 21:58:12 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 2FC805D6B5;
Thu, 10 May 2018 21:58:12 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id E3A1B180B5B4;
Thu, 10 May 2018 21:58:11 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com
[10.5.11.12])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvqoq028533 for ;
Thu, 10 May 2018 17:57:52 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 8561D1906D; Thu, 10 May 2018 21:57:52 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx02.extmail.prod.ext.phx2.redhat.com
[10.5.110.26])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 7A53960C9A
for ; Thu, 10 May 2018 21:57:52 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id E6492820E0
for ; Thu, 10 May 2018 21:57:49 +0000 (UTC)
Received: from pps.filterd (m0098404.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrl5k042074
for ; Thu, 10 May 2018 17:57:49 -0400
Received: from e18.ny.us.ibm.com (e18.ny.us.ibm.com [129.33.205.208])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvtxr0uk4-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:49 -0400
Received: from localhost
by e18.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:47 -0400
Received: from b01cxnp22036.gho.pok.ibm.com (9.57.198.26)
by e18.ny.us.ibm.com (146.89.104.205) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:45 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp22036.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvjki58130562; Thu, 10 May 2018 21:57:45 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 52DC3AE034;
Thu, 10 May 2018 17:59:43 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 3A93BAE03B;
Thu, 10 May 2018 17:59:43 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:32 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0044-0000-0000-00000412A52A
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030432; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:46
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0045-0000-0000-00000844B494
Message-Id: <1525989457-29715-7-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=4 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.26]); Thu, 10 May 2018 21:57:50 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.26]);
Thu, 10 May 2018 21:57:50 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.26
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 06/11] qemu: Extend QEMU with external TPM
support
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]);
Thu, 10 May 2018 21:58:12 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
Implement functions for managing the storage of the external swtpm as well
as starting and stopping it. Also implement functions to use swtpm_setup,
which simulates the manufacturing of a TPM, which includes creation of
certificates for the device.
Further, the external TPM needs storage on the host that we need to set
up before it can be run. We can clean up the host once the domain is
undefined.
This patch also implements a small layer for external device support that
calls into the TPM device layer if a domain has an attached TPM. This is
the layer we will wire up later on.
Signed-off-by: Stefan Berger
---
src/qemu/Makefile.inc.am | 4 +
src/qemu/qemu_domain.c | 2 +
src/qemu/qemu_driver.c | 5 +
src/qemu/qemu_extdevice.c | 154 ++++++++++
src/qemu/qemu_extdevice.h | 53 ++++
src/qemu/qemu_migration.c | 3 +
src/qemu/qemu_process.c | 12 +
src/qemu/qemu_tpm.c | 753 ++++++++++++++++++++++++++++++++++++++++++=
++++
src/qemu/qemu_tpm.h | 50 +++
9 files changed, 1036 insertions(+)
create mode 100644 src/qemu/qemu_extdevice.c
create mode 100644 src/qemu/qemu_extdevice.h
create mode 100644 src/qemu/qemu_tpm.c
create mode 100644 src/qemu/qemu_tpm.h
diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am
index 7f50501..46797af 100644
--- a/src/qemu/Makefile.inc.am
+++ b/src/qemu/Makefile.inc.am
@@ -19,6 +19,8 @@ QEMU_DRIVER_SOURCES =3D \
qemu/qemu_domain_address.h \
qemu/qemu_cgroup.c \
qemu/qemu_cgroup.h \
+ qemu/qemu_extdevice.c \
+ qemu/qemu_extdevice.h \
qemu/qemu_hostdev.c \
qemu/qemu_hostdev.h \
qemu/qemu_hotplug.c \
@@ -51,6 +53,8 @@ QEMU_DRIVER_SOURCES =3D \
qemu/qemu_security.h \
qemu/qemu_qapi.c \
qemu/qemu_qapi.h \
+ qemu/qemu_tpm.c \
+ qemu/qemu_tpm.h \
$(NULL)
=20
=20
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 774a102..e2d2a24 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -34,6 +34,7 @@
#include "qemu_migration.h"
#include "qemu_migration_params.h"
#include "qemu_security.h"
+#include "qemu_extdevice.h"
#include "viralloc.h"
#include "virlog.h"
#include "virerror.h"
@@ -7174,6 +7175,7 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver,
VIR_WARN("unable to remove snapshot directory %s", snapDir);
VIR_FREE(snapDir);
}
+ qemuExtDevicesCleanupHost(driver, vm->def);
=20
virDomainObjListRemove(driver->domains, vm);
=20
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b03eb30..b576a4d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -60,6 +60,7 @@
#include "qemu_migration_params.h"
#include "qemu_blockjob.h"
#include "qemu_security.h"
+#include "qemu_extdevice.h"
=20
#include "virerror.h"
#include "virlog.h"
@@ -7558,6 +7559,10 @@ qemuDomainUndefineFlags(virDomainPtr dom,
if (virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm) < 0)
goto endjob;
=20
+ /* in case domain is NOT running, remove any TPM storage */
+ if (!vm->persistent)
+ qemuExtDevicesCleanupHost(driver, vm->def);
+
event =3D virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_UNDEFINED,
VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);
diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c
new file mode 100644
index 0000000..790b19b
--- /dev/null
+++ b/src/qemu/qemu_extdevice.c
@@ -0,0 +1,154 @@
+/*
+ * qemu_extdevice.c: QEMU external devices support
+ *
+ * Copyright (C) 2014, 2018 IBM Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ * Author: Stefan Berger
+ */
+
+#include
+
+#include "qemu_extdevice.h"
+#include "qemu_domain.h"
+#include "qemu_tpm.h"
+
+#include "viralloc.h"
+#include "virlog.h"
+#include "virstring.h"
+#include "virtime.h"
+
+#define VIR_FROM_THIS VIR_FROM_QEMU
+
+VIR_LOG_INIT("qemu.qemu_extdevice")
+
+int
+qemuExtDeviceLogCommand(qemuDomainLogContextPtr logCtxt,
+ virCommandPtr cmd,
+ const char *info)
+{
+ int ret =3D -1;
+ char *timestamp =3D NULL;
+ char *logline =3D NULL;
+ int logFD;
+
+ logFD =3D qemuDomainLogContextGetWriteFD(logCtxt);
+
+ if ((timestamp =3D virTimeStringNow()) =3D=3D NULL)
+ goto cleanup;
+
+ if (virAsprintf(&logline, "%s: Starting external device: %s\n",
+ timestamp, info) < 0)
+ goto cleanup;
+
+ if (safewrite(logFD, logline, strlen(logline)) < 0)
+ goto cleanup;
+
+ virCommandWriteArgLog(cmd, logFD);
+
+ ret =3D 0;
+
+ cleanup:
+ VIR_FREE(timestamp);
+ VIR_FREE(logline);
+
+ return ret;
+}
+
+
+/*
+ * qemuExtDevicesInitPaths:
+ *
+ * @driver: QEMU driver
+ * @def: domain definition
+ *
+ * Initialize paths of external devices so that it is known where state is
+ * stored and we can remove directories and files in case of domain XML
+ * changes.
+ */
+static int
+qemuExtDevicesInitPaths(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ int ret =3D 0;
+
+ if (def->tpm)
+ ret =3D qemuExtTPMInitPaths(driver, def);
+
+ return ret;
+}
+
+
+/*
+ * qemuExtDevicesPrepareHost:
+ *
+ * @driver: QEMU driver
+ * @def: domain definition
+ *
+ * Prepare host storage paths for external devices.
+ */
+int
+qemuExtDevicesPrepareHost(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ int ret =3D 0;
+
+ if (def->tpm)
+ ret =3D qemuExtTPMPrepareHost(driver, def);
+
+ return ret;
+}
+
+
+void
+qemuExtDevicesCleanupHost(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ if (qemuExtDevicesInitPaths(driver, def) < 0)
+ return;
+
+ if (def->tpm)
+ qemuExtTPMCleanupHost(def);
+}
+
+
+int
+qemuExtDevicesStart(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ qemuDomainLogContextPtr logCtxt)
+{
+ int ret =3D 0;
+
+ if (qemuExtDevicesInitPaths(driver, def) < 0)
+ return -1;
+
+ if (def->tpm)
+ ret =3D qemuExtTPMStart(driver, def, logCtxt);
+
+ return ret;
+}
+
+
+void
+qemuExtDevicesStop(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ if (qemuExtDevicesInitPaths(driver, def) < 0)
+ return;
+
+ if (def->tpm)
+ qemuExtTPMStop(driver, def);
+}
diff --git a/src/qemu/qemu_extdevice.h b/src/qemu/qemu_extdevice.h
new file mode 100644
index 0000000..6de858b
--- /dev/null
+++ b/src/qemu/qemu_extdevice.h
@@ -0,0 +1,53 @@
+/*
+ * qemu_extdevice.h: QEMU external devices support
+ *
+ * Copyright (C) 2018 IBM Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ * Author: Stefan Berger
+ */
+#ifndef __QEMU_EXTDEVICE_H__
+# define __QEMU_EXTDEVICE_H__
+
+# include "qemu_conf.h"
+# include "qemu_domain.h"
+
+int qemuExtDeviceLogCommand(qemuDomainLogContextPtr logCtxt,
+ virCommandPtr cmd,
+ const char *info)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
+ ATTRIBUTE_RETURN_CHECK;
+
+int qemuExtDevicesPrepareHost(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
+ ATTRIBUTE_RETURN_CHECK;
+
+void qemuExtDevicesCleanupHost(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
+int qemuExtDevicesStart(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ qemuDomainLogContextPtr logCtxt)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
+ ATTRIBUTE_RETURN_CHECK;
+
+void qemuExtDevicesStop(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
+#endif /* __QEMU_EXTDEVICE_H__ */
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index f01bb64..6827aea 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -39,6 +39,7 @@
#include "qemu_hotplug.h"
#include "qemu_blockjob.h"
#include "qemu_security.h"
+#include "qemu_extdevice.h"
=20
#include "domain_audit.h"
#include "virlog.h"
@@ -2920,6 +2921,7 @@ qemuMigrationSrcConfirm(virQEMUDriverPtr driver,
if (!virDomainObjIsActive(vm)) {
if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) {
virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
+ qemuExtDevicesCleanupHost(driver, vm->def);
vm->persistent =3D 0;
}
qemuDomainRemoveInactiveJob(driver, vm);
@@ -4521,6 +4523,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
if (!virDomainObjIsActive(vm) && ret =3D=3D 0) {
if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) {
virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
+ qemuExtDevicesCleanupHost(driver, vm->def);
vm->persistent =3D 0;
}
qemuDomainRemoveInactiveJob(driver, vm);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 37876b8..9370de3 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -48,6 +48,7 @@
#include "qemu_migration_params.h"
#include "qemu_interface.h"
#include "qemu_security.h"
+#include "qemu_extdevice.h"
=20
#include "cpu/cpu.h"
#include "datatypes.h"
@@ -5872,6 +5873,10 @@ qemuProcessPrepareHost(virQEMUDriverPtr driver,
if (qemuProcessPrepareHostStorage(driver, vm, flags) < 0)
goto cleanup;
=20
+ VIR_DEBUG("Preparing external devices");
+ if (qemuExtDevicesPrepareHost(driver, vm->def) < 0)
+ goto cleanup;
+
ret =3D 0;
cleanup:
virObjectUnref(cfg);
@@ -5955,6 +5960,9 @@ qemuProcessLaunch(virConnectPtr conn,
goto cleanup;
logfile =3D qemuDomainLogContextGetWriteFD(logCtxt);
=20
+ if (qemuExtDevicesStart(driver, vm->def, logCtxt) < 0)
+ goto cleanup;
+
VIR_DEBUG("Building emulator command line");
if (!(cmd =3D qemuBuildCommandLine(driver,
qemuDomainLogContextGetManager(logCtx=
t),
@@ -6194,6 +6202,8 @@ qemuProcessLaunch(virConnectPtr conn,
ret =3D 0;
=20
cleanup:
+ if (ret)
+ qemuExtDevicesStop(driver, vm->def);
qemuDomainSecretDestroy(vm);
virCommandFree(cmd);
virObjectUnref(logCtxt);
@@ -6614,6 +6624,8 @@ void qemuProcessStop(virQEMUDriverPtr driver,
=20
qemuDomainCleanupRun(driver, vm);
=20
+ qemuExtDevicesStop(driver, vm->def);
+
/* Stop autodestroy in case guest is restarted */
qemuProcessAutoDestroyRemove(driver, vm);
=20
diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
new file mode 100644
index 0000000..024d24d
--- /dev/null
+++ b/src/qemu/qemu_tpm.c
@@ -0,0 +1,753 @@
+/*
+ * qemu_tpm.c: QEMU TPM support
+ *
+ * Copyright (C) 2018 IBM Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ * Author: Stefan Berger
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include "qemu_extdevice.h"
+#include "qemu_domain.h"
+
+#include "conf/domain_conf.h"
+#include "vircommand.h"
+#include "viralloc.h"
+#include "virkmod.h"
+#include "virlog.h"
+#include "virutil.h"
+#include "viruuid.h"
+#include "virfile.h"
+#include "virstring.h"
+#include "configmake.h"
+#include "qemu_tpm.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+VIR_LOG_INIT("qemu.tpm")
+
+/*
+ * executables for the swtpm; to be found on the host
+ */
+static char *swtpm_path;
+static char *swtpm_setup;
+static char *swtpm_ioctl;
+
+/*
+ * qemuTPMEmulatorInit
+ *
+ * Initialize the Emulator functions by searching for necessary
+ * executables that we will use to start and setup the swtpm
+ */
+static int
+qemuTPMEmulatorInit(void)
+{
+ if (!swtpm_path) {
+ swtpm_path =3D virFindFileInPath("swtpm");
+ if (!swtpm_path) {
+ virReportSystemError(ENOENT, "%s",
+ _("Unable to find 'swtpm' binary in $PATH=
"));
+ return -1;
+ }
+ if (!virFileIsExecutable(swtpm_path)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("TPM emulator %s is not an executable"),
+ swtpm_path);
+ VIR_FREE(swtpm_path);
+ return -1;
+ }
+ }
+
+ if (!swtpm_setup) {
+ swtpm_setup =3D virFindFileInPath("swtpm_setup");
+ if (!swtpm_setup) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Could not find 'swtpm_setup' in PATH"));
+ return -1;
+ }
+ if (!virFileIsExecutable(swtpm_setup)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("'%s' is not an executable"),
+ swtpm_setup);
+ VIR_FREE(swtpm_setup);
+ return -1;
+ }
+ }
+
+ if (!swtpm_ioctl) {
+ swtpm_ioctl =3D virFindFileInPath("swtpm_ioctl");
+ if (!swtpm_ioctl) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Could not find swtpm_ioctl in PATH"));
+ return -1;
+ }
+ if (!virFileIsExecutable(swtpm_ioctl)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("swtpm_ioctl program %s is not an executable"=
),
+ swtpm_ioctl);
+ VIR_FREE(swtpm_ioctl);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+/*
+ * qemuTPMCreateEmulatorStoragePath
+ *
+ * @swtpmStorageDir: directory for swtpm persistent state
+ * @vmname: The name of the VM for which to create the storage
+ *
+ * Create the swtpm's storage path
+ */
+static char *
+qemuTPMCreateEmulatorStoragePath(const char *swtpmStorageDir,
+ const char *vmname)
+{
+ char *path =3D NULL;
+
+ ignore_value(virAsprintf(&path, "%s/%s/tpm1.2", swtpmStorageDir, vmnam=
e));
+
+ return path;
+}
+
+
+/*
+ * virtTPMGetTPMStorageDir:
+ *
+ * @storagepath: directory for swtpm's persistent state
+ *
+ * Derive the 'TPMStorageDir' from the storagepath by searching
+ * for the last '/'.
+ */
+static char *
+qemuTPMGetTPMStorageDir(const char *storagepath)
+{
+ const char *tail =3D strrchr(storagepath, '/');
+ char *path =3D NULL;
+
+ if (!tail) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not get tail of storagedir %s"),
+ storagepath);
+ return NULL;
+ }
+ ignore_value(VIR_STRNDUP(path, storagepath, tail - storagepath));
+
+ return path;
+}
+
+
+/*
+ * qemuTPMEmulatorInitStorage
+ *
+ * Initialize the TPM Emulator storage by creating its root directory,
+ * which is typically found in /var/lib/libvirt/tpm.
+ *
+ */
+static int
+qemuTPMEmulatorInitStorage(const char *swtpmStorageDir)
+{
+ int rc =3D 0;
+
+ /* allow others to cd into this dir */
+ if (virFileMakePathWithMode(swtpmStorageDir, 0711) < 0) {
+ virReportSystemError(errno,
+ _("Could not create TPM directory %s"),
+ swtpmStorageDir);
+ rc =3D -1;
+ }
+
+ return rc;
+}
+
+
+/*
+ * qemuTPMCreateEmulatorStorage
+ *
+ * @storagepath: directory for swtpm's pesistent state
+ * @created: a pointer to a bool that will be set to true if the
+ * storage was created because it did not exist yet
+ * @swtpm_user: The uid that needs to be able to access the directory
+ * @swtpm_group: The gid that needs to be able to access the directory
+ *
+ * Unless the storage path for the swtpm for the given VM
+ * already exists, create it and make it accessible for the given userid.
+ * Adapt ownership of the directory and all swtpm's state files there.
+ */
+static int
+qemuTPMCreateEmulatorStorage(const char *storagepath,
+ bool *created,
+ uid_t swtpm_user,
+ gid_t swtpm_group)
+{
+ int ret =3D -1;
+ char *swtpmStorageDir =3D qemuTPMGetTPMStorageDir(storagepath);
+
+ if (!swtpmStorageDir)
+ return -1;
+
+ if (qemuTPMEmulatorInitStorage(swtpmStorageDir) < 0)
+ goto cleanup;
+
+ *created =3D false;
+
+ if (!virFileExists(storagepath))
+ *created =3D true;
+
+ if (virDirCreate(storagepath, 0700, swtpm_user, swtpm_group,
+ VIR_DIR_CREATE_ALLOW_EXIST) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not create directory %s as %u:%d"),
+ storagepath, swtpm_user, swtpm_group);
+ goto cleanup;
+ }
+
+ if (virFileChownFiles(storagepath, swtpm_user, swtpm_group) < 0)
+ goto cleanup;
+
+ ret =3D 0;
+
+ cleanup:
+ VIR_FREE(swtpmStorageDir);
+
+ return ret;
+}
+
+
+static void
+qemuTPMDeleteEmulatorStorage(virDomainTPMDefPtr tpm)
+{
+ char *path =3D qemuTPMGetTPMStorageDir(tpm->data.emulator.storagepath);
+
+ if (path) {
+ ignore_value(virFileDeleteTree(path));
+ VIR_FREE(path);
+ }
+}
+
+
+/*
+ * qemuTPMCreateEmulatorSocket:
+ *
+ * @swtpmStateDir: the directory where to create the socket in
+ * @shortName: short and unique name of the domain
+ *
+ * Create the Unix socket path from the given parameters
+ */
+static char *
+qemuTPMCreateEmulatorSocket(const char *swtpmStateDir,
+ const char *shortName)
+{
+ char *path =3D NULL;
+
+ ignore_value(virAsprintf(&path, "%s/%s-swtpm.sock", swtpmStateDir,
+ shortName));
+
+ return path;
+}
+
+
+/*
+ * qemuTPMEmulatorInitPaths:
+ *
+ * @tpm: TPM definition for an emulator type
+ * @swtpmStorageDir: the general swtpm storage dir which is used as a base
+ * directory for creating VM specific directories
+ * @uuid: the UUID of the VM
+ */
+static int
+qemuTPMEmulatorInitPaths(virDomainTPMDefPtr tpm,
+ const char *swtpmStorageDir,
+ const unsigned char *uuid)
+{
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ virUUIDFormat(uuid, uuidstr);
+
+ if (!tpm->data.emulator.storagepath &&
+ !(tpm->data.emulator.storagepath =3D
+ qemuTPMCreateEmulatorStoragePath(swtpmStorageDir, uuidstr)))
+ return -1;
+
+ return 0;
+}
+
+
+/*
+ * qemuTPMEmulatorPrepareHost:
+ *
+ * @tpm: tpm definition
+ * @logDir: directory where swtpm writes its logs into
+ * @vmname: name of the VM
+ * @swtpm_user: uid to run the swtpm with
+ * @swtpm_group: gid to run the swtpm with
+ * @swtpmStateDir: directory for swtpm's persistent state
+ * @qemu_user: uid that qemu will run with; we share the socket file with =
it
+ * @shortName: short and unique name of the domain
+ *
+ * Prepare the log directory for the swtpm and adjust ownership of it and =
the
+ * log file we will be using. Prepare the state directory where we will sh=
are
+ * the socket between tss and qemu users.
+ */
+static int
+qemuTPMEmulatorPrepareHost(virDomainTPMDefPtr tpm,
+ const char *logDir,
+ const char *vmname,
+ uid_t swtpm_user,
+ gid_t swtpm_group,
+ const char *swtpmStateDir,
+ uid_t qemu_user,
+ const char *shortName)
+{
+ int ret =3D -1;
+
+ if (qemuTPMEmulatorInit() < 0)
+ return -1;
+
+ /* create log dir ... */
+ if (virFileMakePathWithMode(logDir, 0730) < 0)
+ return -1;
+
+ /* ... and adjust ownership */
+ if (virDirCreate(logDir, 0730, swtpm_user, swtpm_group,
+ VIR_DIR_CREATE_ALLOW_EXIST) < 0)
+ goto cleanup;
+
+ /* create logfile name ... */
+ if (!tpm->data.emulator.logfile &&
+ virAsprintf(&tpm->data.emulator.logfile, "%s/%s-swtpm.log",
+ logDir, vmname) < 0)
+ goto cleanup;
+
+ /* ... and make sure it can be accessed by swtpm_user */
+ if (virFileExists(tpm->data.emulator.logfile) &&
+ chown(tpm->data.emulator.logfile, swtpm_user, swtpm_group) < 0) {
+ virReportSystemError(errno,
+ _("Could not chown on swtpm logfile %s"),
+ tpm->data.emulator.logfile);
+ goto cleanup;
+ }
+
+ /*
+ create our swtpm state dir ...
+ - QEMU user needs to be able to access the socket there
+ - swtpm group needs to be able to create files there
+ - in privileged mode 0570 would be enough, for non-privileged mode
+ we need 0770
+ */
+ if (virDirCreate(swtpmStateDir, 0770, qemu_user, swtpm_group,
+ VIR_DIR_CREATE_ALLOW_EXIST) < 0)
+ goto cleanup;
+
+ /* create the socket filename */
+ if (!tpm->data.emulator.source.data.nix.path &&
+ !(tpm->data.emulator.source.data.nix.path =3D
+ qemuTPMCreateEmulatorSocket(swtpmStateDir, shortName)))
+ goto cleanup;
+ tpm->data.emulator.source.type =3D VIR_DOMAIN_CHR_TYPE_UNIX;
+
+ ret =3D 0;
+
+ cleanup:
+
+ return ret;
+}
+
+
+/*
+ * qemuTPMEmulatorRunSetup
+ *
+ * @storagepath: path to the directory for TPM state
+ * @vmname: the name of the VM
+ * @vmuuid: the UUID of the VM
+ * @privileged: whether we are running in privileged mode
+ * @swtpm_user: The userid to switch to when setting up the TPM;
+ * typically this should be the uid of 'tss' or 'root'
+ * @swtpm_group: The group id to switch to
+ * @logfile: The file to write the log into; it must be writable
+ * for the user given by userid or 'tss'
+ *
+ * Setup the external swtpm by creating endorsement key and
+ * certificates for it.
+ */
+static int
+qemuTPMEmulatorRunSetup(const char *storagepath,
+ const char *vmname,
+ const unsigned char *vmuuid,
+ bool privileged,
+ uid_t swtpm_user,
+ gid_t swtpm_group,
+ const char *logfile)
+{
+ virCommandPtr cmd =3D NULL;
+ int exitstatus;
+ int ret =3D -1;
+ char uuid[VIR_UUID_STRING_BUFLEN];
+ char *vmid =3D NULL;
+
+ if (!privileged)
+ return virFileWriteStr(logfile,
+ _("Did not create EK and certificates since=
"
+ "this requires privileged mode\n"),
+ 0600);
+
+ cmd =3D virCommandNew(swtpm_setup);
+ if (!cmd)
+ goto cleanup;
+
+ virUUIDFormat(vmuuid, uuid);
+ if (virAsprintf(&vmid, "%s:%s", vmname, uuid) < 0)
+ goto cleanup;
+
+ virCommandSetUID(cmd, swtpm_user);
+ virCommandSetGID(cmd, swtpm_group);
+
+ virCommandAddArgList(cmd,
+ "--tpm-state", storagepath,
+ "--vmid", vmid,
+ "--logfile", logfile,
+ "--createek",
+ "--create-ek-cert",
+ "--create-platform-cert",
+ "--lock-nvram",
+ "--not-overwrite",
+ NULL);
+
+ virCommandClearCaps(cmd);
+
+ if (virCommandRun(cmd, &exitstatus) < 0 || exitstatus !=3D 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not run '%s'. exitstatus: %d; "
+ "Check error log '%s' for details."),
+ swtpm_setup, exitstatus, logfile);
+ goto cleanup;
+ }
+
+ ret =3D 0;
+
+ cleanup:
+ VIR_FREE(vmid);
+ virCommandFree(cmd);
+
+ return ret;
+}
+
+
+/*
+ * qemuTPMEmulatorBuildCommand:
+ *
+ * @tpm: TPM definition
+ * @vmname: The name of the VM
+ * @vmuuid: The UUID of the VM
+ * @privileged: whether we are running in privileged mode
+ * @swtpm_user: The uid for the swtpm to run as (drop privileges to from r=
oot)
+ * @swtpm_group: The gid for the swtpm to run as
+ *
+ * Create the virCommand use for starting the emulator
+ * Do some initializations on the way, such as creation of storage
+ * and emulator setup.
+ */
+static virCommandPtr
+qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm,
+ const char *vmname,
+ const unsigned char *vmuuid,
+ bool privileged,
+ uid_t swtpm_user,
+ gid_t swtpm_group)
+{
+ virCommandPtr cmd =3D NULL;
+ bool created =3D false;
+
+ if (qemuTPMCreateEmulatorStorage(tpm->data.emulator.storagepath,
+ &created, swtpm_user, swtpm_group) < =
0)
+ return NULL;
+
+ if (created &&
+ qemuTPMEmulatorRunSetup(tpm->data.emulator.storagepath, vmname, vm=
uuid,
+ privileged, swtpm_user, swtpm_group,
+ tpm->data.emulator.logfile) < 0)
+ goto error;
+
+ unlink(tpm->data.emulator.source.data.nix.path);
+
+ cmd =3D virCommandNew(swtpm_path);
+ if (!cmd)
+ goto error;
+
+ virCommandClearCaps(cmd);
+
+ virCommandAddArgList(cmd, "socket", "--daemon", "--ctrl", NULL);
+ virCommandAddArgFormat(cmd, "type=3Dunixio,path=3D%s,mode=3D0600",
+ tpm->data.emulator.source.data.nix.path);
+
+ virCommandAddArg(cmd, "--tpmstate");
+ virCommandAddArgFormat(cmd, "dir=3D%s,mode=3D0600",
+ tpm->data.emulator.storagepath);
+
+ virCommandAddArg(cmd, "--log");
+ virCommandAddArgFormat(cmd, "file=3D%s", tpm->data.emulator.logfile);
+
+ virCommandSetUID(cmd, swtpm_user);
+ virCommandSetGID(cmd, swtpm_group);
+
+ return cmd;
+
+ error:
+ if (created)
+ qemuTPMDeleteEmulatorStorage(tpm);
+
+ virCommandFree(cmd);
+
+ return NULL;
+}
+
+
+/*
+ * qemuTPMEmulatorStop
+ * @swtpmStateDir: A directory where the socket is located
+ * @shortName: short and unique name of the domain
+ *
+ * Gracefully stop the swptm
+ */
+static void
+qemuTPMEmulatorStop(const char *swtpmStateDir,
+ const char *shortName)
+{
+ virCommandPtr cmd;
+ char *pathname;
+ char *errbuf =3D NULL;
+
+ if (qemuTPMEmulatorInit() < 0)
+ return;
+
+ if (!(pathname =3D qemuTPMCreateEmulatorSocket(swtpmStateDir, shortNam=
e)))
+ return;
+
+ if (!virFileExists(pathname))
+ goto cleanup;
+
+ cmd =3D virCommandNew(swtpm_ioctl);
+ if (!cmd)
+ goto cleanup;
+
+ virCommandAddArgList(cmd, "--unix", pathname, "-s", NULL);
+
+ virCommandSetErrorBuffer(cmd, &errbuf);
+
+ ignore_value(virCommandRun(cmd, NULL));
+
+ virCommandFree(cmd);
+
+ /* clean up the socket */
+ unlink(pathname);
+
+ cleanup:
+ VIR_FREE(pathname);
+ VIR_FREE(errbuf);
+}
+
+
+int
+qemuExtTPMInitPaths(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver);
+ int ret =3D 0;
+
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ ret =3D qemuTPMEmulatorInitPaths(def->tpm, cfg->swtpmStorageDir,
+ def->uuid);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ virObjectUnref(cfg);
+
+ return ret;
+}
+
+
+int
+qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver);
+ int ret =3D 0;
+ char *shortName =3D NULL;
+
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ shortName =3D virDomainDefGetShortName(def);
+ if (!shortName)
+ goto cleanup;
+
+ ret =3D qemuTPMEmulatorPrepareHost(def->tpm, cfg->swtpmLogDir,
+ def->name, cfg->swtpm_user,
+ cfg->swtpm_group,
+ cfg->swtpmStateDir, cfg->user,
+ shortName);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ cleanup:
+ VIR_FREE(shortName);
+ virObjectUnref(cfg);
+
+ return ret;
+}
+
+
+void
+qemuExtTPMCleanupHost(virDomainDefPtr def)
+{
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ qemuTPMDeleteEmulatorStorage(def->tpm);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ /* nothing to do */
+ break;
+ }
+}
+
+
+/*
+ * qemuExtTPMStartEmulator:
+ *
+ * @driver: QEMU driver
+ * @def: domain definition
+ * @logCtxt: log context
+ *
+ * Start the external TPM Emulator:
+ * - have the command line built
+ * - start the external TPM Emulator and sync with it before QEMU start
+ */
+static int
+qemuExtTPMStartEmulator(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ qemuDomainLogContextPtr logCtxt)
+{
+ int ret =3D -1;
+ virCommandPtr cmd =3D NULL;
+ int exitstatus;
+ char *errbuf =3D NULL;
+ virQEMUDriverConfigPtr cfg;
+ virDomainTPMDefPtr tpm =3D def->tpm;
+ char *shortName =3D virDomainDefGetShortName(def);
+
+ if (!shortName)
+ return -1;
+
+ cfg =3D virQEMUDriverGetConfig(driver);
+
+ /* stop any left-over TPM emulator for this VM */
+ qemuTPMEmulatorStop(cfg->swtpmStateDir, shortName);
+
+ if (!(cmd =3D qemuTPMEmulatorBuildCommand(tpm, def->name, def->uuid,
+ driver->privileged,
+ cfg->swtpm_user,
+ cfg->swtpm_group)))
+ goto cleanup;
+
+ if (qemuExtDeviceLogCommand(logCtxt, cmd, "TPM Emulator") < 0)
+ goto cleanup;
+
+ virCommandSetErrorBuffer(cmd, &errbuf);
+
+ if (virCommandRun(cmd, &exitstatus) < 0 || exitstatus !=3D 0) {
+ VIR_ERROR(_("Could not start 'swtpm'. exitstatus: %d "
+ "stderr: %s"), exitstatus, errbuf);
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not start 'swtpm'. exitstatus: %d, "
+ "error: %s"), exitstatus, errbuf);
+ goto cleanup;
+ }
+
+ ret =3D 0;
+
+ cleanup:
+ VIR_FREE(shortName);
+ VIR_FREE(errbuf);
+ virCommandFree(cmd);
+
+ virObjectUnref(cfg);
+
+ return ret;
+}
+
+
+int
+qemuExtTPMStart(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ qemuDomainLogContextPtr logCtxt)
+{
+ int ret =3D 0;
+ virDomainTPMDefPtr tpm =3D def->tpm;
+
+ switch (tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ ret =3D qemuExtTPMStartEmulator(driver, def, logCtxt);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ return ret;
+}
+
+
+void
+qemuExtTPMStop(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver);
+ char *shortName =3D NULL;
+
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ shortName =3D virDomainDefGetShortName(def);
+ if (!shortName)
+ goto cleanup;
+
+ qemuTPMEmulatorStop(cfg->swtpmStateDir, shortName);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ cleanup:
+ VIR_FREE(shortName);
+ virObjectUnref(cfg);
+}
diff --git a/src/qemu/qemu_tpm.h b/src/qemu/qemu_tpm.h
new file mode 100644
index 0000000..20f3a9c
--- /dev/null
+++ b/src/qemu/qemu_tpm.h
@@ -0,0 +1,50 @@
+/*
+ * qemu_tpm.h: QEMU TPM support
+ *
+ * Copyright (C) 2018 IBM Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ * Author: Stefan Berger
+ */
+#ifndef __QEMU_TPM_H__
+# define __QEMU_TPM_H__
+
+# include "vircommand.h"
+
+int qemuExtTPMInitPaths(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
+ ATTRIBUTE_RETURN_CHECK;
+
+int qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
+ ATTRIBUTE_RETURN_CHECK;
+
+void qemuExtTPMCleanupHost(virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1);
+
+int qemuExtTPMStart(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ qemuDomainLogContextPtr logCtxt)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
+ ATTRIBUTE_RETURN_CHECK;
+
+void qemuExtTPMStop(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
+#endif /* __QEMU_TPM_H__ */
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989496834308.19233943084475;
Thu, 10 May 2018 14:58:16 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com
[10.5.11.24])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 29F4530C76D2;
Thu, 10 May 2018 21:58:15 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id ED5D630B7445;
Thu, 10 May 2018 21:58:14 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id AD191180B5B3;
Thu, 10 May 2018 21:58:14 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com
[10.5.11.13])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvrio028540 for ;
Thu, 10 May 2018 17:57:53 -0400
Received: by smtp.corp.redhat.com (Postfix)
id 07E196091D; Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx11.extmail.prod.ext.phx2.redhat.com
[10.5.110.40])
by smtp.corp.redhat.com (Postfix) with ESMTPS id F236960923
for ; Thu, 10 May 2018 21:57:50 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id C56A83005178
for ; Thu, 10 May 2018 21:57:49 +0000 (UTC)
Received: from pps.filterd (m0098410.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrksx144230
for ; Thu, 10 May 2018 17:57:49 -0400
Received: from e15.ny.us.ibm.com (e15.ny.us.ibm.com [129.33.205.205])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvuyp5tm7-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:49 -0400
Received: from localhost
by e15.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:48 -0400
Received: from b01cxnp22035.gho.pok.ibm.com (9.57.198.25)
by e15.ny.us.ibm.com (146.89.104.202) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:46 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp22035.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvk4A57016528; Thu, 10 May 2018 21:57:46 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 613C8AE043;
Thu, 10 May 2018 17:59:44 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 49A3DAE03B;
Thu, 10 May 2018 17:59:44 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:33 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0036-0000-0000-000002F305A4
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030432; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:47
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0037-0000-0000-0000444A40CD
Message-Id: <1525989457-29715-8-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.40]); Thu, 10 May 2018 21:57:49 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.40]);
Thu, 10 May 2018 21:57:49 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.110.40
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 07/11] qemu: Add support for external swtpm TPM
emulator
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.24
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]);
Thu, 10 May 2018 21:58:15 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
This patch adds support for an external swtpm TPM emulator. The XML for
this type of TPM looks as follows:
The XML will currently only start a TPM 1.2.
Upon first start, libvirt will run `swtpm_setup`, which will simulate the
manufacturing of a TPM and create certificates for it and write them into
NVRAM locations of the emulated TPM.
After that libvirt starts the swtpm TPM emulator using the `swtpm` executab=
le.
Once the VM terminates, libvirt uses the swtpm_ioctl executable to graceful=
ly
shut down the `swtpm` in case it is still running (QEMU did not send shutdo=
wn)
or clean up the socket file.
The above mentioned executables must be found in the PATH.
The executables can either be run as root or started as root and switch to
the tss user. The requirement for the tss user comes through 'tcsd', which
is used for the simulation of the manufacturing. Which user is used can be
configured through qemu.conf. By default 'tss' is used.
The swtpm writes out state into files. The state is kept in /var/lib/libvir=
t/swtpm:
[root@localhost libvirt]# ls -lZ | grep swtpm
drwx--x--x. 7 root root unconfined_u:object_r:virt_var_lib_t:s0 4096 Apr 5=
16:22 swtpm
The directory /var/lib/libvirt/swtpm maintains per-TPM state directories.
(Using the uuid of the VM for that since the name can change per VM renamin=
g but
we need a stable directory name.)
[root@localhost swtpm]# ls -lZ
total 4
drwx------. 2 tss tss system_u:object_r:virt_var_lib_t:s0 4096 A=
pr 5 16:46 485d0004-a48f-436a-8457-8a3b73e28568
[root@localhost 485d0004-a48f-436a-8457-8a3b73e28568]# ls -lZ
total 4
drwx------. 2 tss tss system_u:object_r:virt_var_lib_t:s0 4096 Apr 10 21:34=
tpm1.2
[root@localhost tpm1.2]# ls -lZ
total 8
-rw-r--r--. 1 tss tss system_u:object_r:virt_var_lib_t:s0 3648 Apr 5 16:46=
tpm-00.permall
The directory /var/run/libvirt/qemu/swtpm/ hosts the swtpm.sock that
QEMU uses to communicate with the swtpm:
root@localhost domain-1-testvm]# ls -lZ
total 0
srw-------. 1 qemu qemu system_u:object_r:svirt_image_t:s0:c597,c632 0 Apr=
6 10:24 1-testvm-swtpm.sock
The logfile for the swtpm is in /var/log/swtpm/libvirt/qemu:
[root@localhost-3 qemu]# ls -lZ
total 4
-rw-------. 1 tss tss unconfined_u:object_r:var_log_t:s0 2199 Apr 6 14:01 =
testvm-swtpm.log
The processes are labeled as follows:
[root@localhost 485d0004-a48f-436a-8457-8a3b73e28567]# ps auxZ | grep swtpm=
| grep socket | grep -v grep
system_u:system_r:virtd_t:s0-s0:c0.c1023 tss 18697 0.0 0.0 28172 3892 ? =
Ss 16:46 0:00 /usr/bin/swtpm socket --daemon --ctrl type=3Dunixio,p=
ath=3D/var/run/libvirt/qemu/swtpm/1-testvm-swtpm.sock,mode=3D0600 --tpmstat=
e dir=3D/var/lib/libvirt/swtpm/485d0004-a48f-436a-8457-8a3b73e28568/tpm1.2 =
--log file=3D/var/log/swtpm/libvirt/qemu/testvm-swtpm.log
[root@localhost 485d0004-a48f-436a-8457-8a3b73e28567]# ps auxZ | grep qemu =
| grep tpm | grep -v grep
system_u:system_r:svirt_t:s0:c413,c430 qemu 18702 2.5 0.0 3036052 48676 ? =
Sl 16:46 0:08 /bin/qemu-system-x86_64 [...]
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
src/qemu/qemu_command.c | 33 ++++++++++++++++++++++++++++++---
1 file changed, 30 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 151f4fc..0e3ef99 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9361,17 +9361,27 @@ qemuBuildTPMBackendStr(const virDomainDef *def,
virCommandPtr cmd,
virQEMUCapsPtr qemuCaps,
int *tpmfd,
- int *cancelfd)
+ int *cancelfd,
+ char **chardev)
{
const virDomainTPMDef *tpm =3D def->tpm;
virBuffer buf =3D VIR_BUFFER_INITIALIZER;
- const char *type =3D virDomainTPMBackendTypeToString(tpm->type);
+ const char *type =3D NULL;
char *cancel_path =3D NULL, *devset =3D NULL;
const char *tpmdev;
=20
*tpmfd =3D -1;
*cancelfd =3D -1;
=20
+ switch (tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ type =3D virDomainTPMBackendTypeToString(tpm->type);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ goto error;
+ }
+
virBufferAsprintf(&buf, "%s,id=3Dtpm-%s", type, tpm->info.alias);
=20
switch (tpm->type) {
@@ -9423,6 +9433,16 @@ qemuBuildTPMBackendStr(const virDomainDef *def,
=20
break;
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR))
+ goto no_support;
+
+ virBufferAddLit(&buf, ",chardev=3Dchrtpm");
+
+ if (virAsprintf(chardev, "socket,id=3Dchrtpm,path=3D%s",
+ tpm->data.emulator.source.data.nix.path) < 0)
+ goto error;
+
+ break;
case VIR_DOMAIN_TPM_TYPE_LAST:
goto error;
}
@@ -9453,6 +9473,7 @@ qemuBuildTPMCommandLine(virCommandPtr cmd,
virQEMUCapsPtr qemuCaps)
{
char *optstr;
+ char *chardev =3D NULL;
int tpmfd =3D -1;
int cancelfd =3D -1;
char *fdset;
@@ -9461,12 +9482,18 @@ qemuBuildTPMCommandLine(virCommandPtr cmd,
return 0;
=20
if (!(optstr =3D qemuBuildTPMBackendStr(def, cmd, qemuCaps,
- &tpmfd, &cancelfd)))
+ &tpmfd, &cancelfd,
+ &chardev)))
return -1;
=20
virCommandAddArgList(cmd, "-tpmdev", optstr, NULL);
VIR_FREE(optstr);
=20
+ if (chardev) {
+ virCommandAddArgList(cmd, "-chardev", chardev, NULL);
+ VIR_FREE(chardev);
+ }
+
if (tpmfd >=3D 0) {
fdset =3D qemuVirCommandGetFDSet(cmd, tpmfd);
if (!fdset)
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 152598950261991.24235050860898;
Thu, 10 May 2018 14:58:22 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com
[10.5.11.14])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 67CD930025E8;
Thu, 10 May 2018 21:58:21 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 29E685ED4F;
Thu, 10 May 2018 21:58:21 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id BA2A54BB79;
Thu, 10 May 2018 21:58:20 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
[10.5.11.11])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvtnA028570 for ;
Thu, 10 May 2018 17:57:55 -0400
Received: by smtp.corp.redhat.com (Postfix)
id AF0BD6017D; Thu, 10 May 2018 21:57:55 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com
[10.5.110.32])
by smtp.corp.redhat.com (Postfix) with ESMTPS id A74C66017C
for ; Thu, 10 May 2018 21:57:52 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id AF010C0587C6
for ; Thu, 10 May 2018 21:57:51 +0000 (UTC)
Received: from pps.filterd (m0098409.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrl7T106044
for ; Thu, 10 May 2018 17:57:51 -0400
Received: from e17.ny.us.ibm.com (e17.ny.us.ibm.com [129.33.205.207])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvvft4qag-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:51 -0400
Received: from localhost
by e17.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:49 -0400
Received: from b01cxnp23032.gho.pok.ibm.com (9.57.198.27)
by e17.ny.us.ibm.com (146.89.104.204) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:47 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp23032.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvlrf45482120; Thu, 10 May 2018 21:57:47 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 6DAFAAE03B;
Thu, 10 May 2018 17:59:45 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 582BFAE03C;
Thu, 10 May 2018 17:59:45 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:34 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0040-0000-0000-00000429A9AD
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030431; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:49
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0041-0000-0000-0000082FB93A
Message-Id: <1525989457-29715-9-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.32]); Thu, 10 May 2018 21:57:51 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.32]);
Thu, 10 May 2018 21:57:51 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 08/11] tests: Add test cases for external swtpm
TPM emulator
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]);
Thu, 10 May 2018 21:58:21 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
This patch adds extensions to existing test cases and specific test cases
for the tpm-emulator.
Signed-off-by: Stefan Berger
Reviewed-by: John Ferlan
---
.../tpm-emulator.x86_64-latest.args | 33 ++++++++++++++++++=
++++
tests/qemuxml2argvtest.c | 15 +++++++++-
2 files changed, 47 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args
diff --git a/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args b/tests=
/qemuxml2argvdata/tpm-emulator.x86_64-latest.args
new file mode 100644
index 0000000..82b676f
--- /dev/null
+++ b/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args
@@ -0,0 +1,33 @@
+LC_ALL=3DC \
+PATH=3D/bin \
+HOME=3D/home/test \
+USER=3Dtest \
+LOGNAME=3Dtest \
+QEMU_AUDIO_DRV=3Dnone \
+/usr/bin/qemu-system-x86_64 \
+-name guest=3DTPM-VM,debug-threads=3Don \
+-S \
+-object secret,id=3DmasterKey0,format=3Draw,\
+file=3D/tmp/lib/domain--1-TPM-VM/master-key.aes \
+-machine pc-i440fx-2.12,accel=3Dtcg,usb=3Doff,dump-guest-core=3Doff \
+-m 2048 \
+-realtime mlock=3Doff \
+-smp 1,sockets=3D1,cores=3D1,threads=3D1 \
+-uuid 11d7cd22-da89-3094-6212-079a48a309a1 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=3Dcharmonitor,path=3D/tmp/lib/domain--1-TPM-VM/monitor.=
sock,\
+server,nowait \
+-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \
+-rtc base=3Dutc \
+-no-shutdown \
+-boot menu=3Don,strict=3Don \
+-device piix3-usb-uhci,id=3Dusb,bus=3Dpci.0,addr=3D0x1.0x2 \
+-tpmdev emulator,id=3Dtpm-tpm0,chardev=3Dchrtpm \
+-chardev socket,id=3Dchrtpm,path=3D/dev/test \
+-device tpm-tis,tpmdev=3Dtpm-tpm0,id=3Dtpm0 \
+-device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x2 \
+-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,\
+resourcecontrol=3Ddeny \
+-msg timestamp=3Don
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index ddf567b..26f9d70 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -532,6 +532,19 @@ testCompareXMLToArgv(const void *data)
}
}
=20
+ if (vm->def->tpm) {
+ switch (vm->def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ if (VIR_STRDUP(vm->def->tpm->data.emulator.source.data.file.pat=
h,
+ "/dev/test") < 0)
+ goto cleanup;
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+ }
+
if (!(cmd =3D qemuProcessCreatePretendCmd(&driver, vm, migrateURI,
(flags & FLAG_FIPS), false,
VIR_QEMU_PROCESS_START_COLD)))=
{
@@ -1989,7 +2002,7 @@ mymain(void)
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH, QEMU_CAPS_DEVICE_TPM_CRB);
DO_TEST_PARSE_ERROR("tpm-no-backend-invalid",
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH, QEMU_CAPS_DEVICE=
_TPM_TIS);
-
+ DO_TEST_CAPS_LATEST("tpm-emulator");
=20
DO_TEST_PARSE_ERROR("pci-domain-invalid", NONE);
DO_TEST_PARSE_ERROR("pci-bus-invalid", NONE);
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989510188653.3797349377235;
Thu, 10 May 2018 14:58:30 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com
[10.5.11.14])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id C31D0267F8;
Thu, 10 May 2018 21:58:28 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 83DCD5ED48;
Thu, 10 May 2018 21:58:28 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3BA3A180B5AA;
Thu, 10 May 2018 21:58:28 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com
[10.5.11.23])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvusT028587 for ;
Thu, 10 May 2018 17:57:56 -0400
Received: by smtp.corp.redhat.com (Postfix)
id BDF3127BA0; Thu, 10 May 2018 21:57:56 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx03.extmail.prod.ext.phx2.redhat.com
[10.5.110.27])
by smtp.corp.redhat.com (Postfix) with ESMTPS id B518E16EF1
for ; Thu, 10 May 2018 21:57:55 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com
[148.163.158.5])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 8FB027EBAB
for ; Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from pps.filterd (m0098414.ppops.net [127.0.0.1])
by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrkwG132738
for ; Thu, 10 May 2018 17:57:53 -0400
Received: from e18.ny.us.ibm.com (e18.ny.us.ibm.com [129.33.205.208])
by mx0b-001b2d01.pphosted.com with ESMTP id 2hvx2w8r1q-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:52 -0400
Received: from localhost
by e18.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:52 -0400
Received: from b01cxnp23034.gho.pok.ibm.com (9.57.198.29)
by e18.ny.us.ibm.com (146.89.104.205) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
(version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256)
Thu, 10 May 2018 17:57:49 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp23034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvm7S51511512
(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256
verify=FAIL); Thu, 10 May 2018 21:57:48 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 7CD22AE043;
Thu, 10 May 2018 17:59:46 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 64D3DAE034;
Thu, 10 May 2018 17:59:46 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:35 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-0044-0000-0000-00000412A52C
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030432; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:50
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-0045-0000-0000-00000844B495
Message-Id: <1525989457-29715-10-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.27]); Thu, 10 May 2018 21:57:53 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.27]);
Thu, 10 May 2018 21:57:53 +0000 (UTC) for IP:'148.163.158.5'
DOMAIN:'mx0b-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.158.5
mx0b-001b2d01.pphosted.com 148.163.158.5
mx0b-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.27
X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 09/11] security: Label the external swtpm with
SELinux labels
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]);
Thu, 10 May 2018 21:58:29 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
In this patch we label the swtpm process with SELinux labels. We give it the
same label as the QEMU process has. We label its state directory and files
as well. We restore the old security labels once the swtpm has terminated.
The file and process labels now look as follows:
Directory: /var/lib/libvirt/swtpm
[root@localhost swtpm]# ls -lZ
total 4
rwx------. 2 tss tss system_u:object_r:svirt_image_t:s0:c254,c932 4096 Ap=
r 5 16:46 testvm
[root@localhost testvm]# ls -lZ
total 8
-rw-r--r--. 1 tss tss system_u:object_r:svirt_image_t:s0:c254,c932 3648 Apr=
5 16:46 tpm-00.permall
The log in /var/log/swtpm/libvirt/qemu is labeled as follows:
-rw-r--r--. 1 tss tss system_u:object_r:svirt_image_t:s0:c254,c932 2237 Apr=
5 16:46 vtpm.log
[root@localhost 485d0004-a48f-436a-8457-8a3b73e28567]# ps auxZ | grep swtpm=
| grep ctrl | grep -v grep
system_u:system_r:svirt_t:s0:c254,c932 tss 25664 0.0 0.0 28172 3892 ? =
Ss 16:57 0:00 /usr/bin/swtpm socket --daemon --ctrl type=3Dunixio,p=
ath=3D/var/run/libvirt/qemu/swtpm/testvm-swtpm.sock,mode=3D0660 --tpmstate =
dir=3D/var/lib/libvirt/swtpm/testvm/tpm1.2 --log file=3D/var/log/swtpm/libv=
irt/qemu/testvm-swtpm.log
[root@localhost 485d0004-a48f-436a-8457-8a3b73e28567]# ps auxZ | grep qemu =
| grep tpm | grep -v grep
system_u:system_r:svirt_t:s0:c254,c932 qemu 25669 99.0 0.0 3096704 48500 ?=
Sl 16:57 3:28 /bin/qemu-system-x86_64 [..]
Signed-off-by: Stefan Berger
---
src/libvirt_private.syms | 2 +
src/qemu/qemu_tpm.c | 24 +++++-
src/security/security_driver.h | 7 ++
src/security/security_manager.c | 36 +++++++++
src/security/security_manager.h | 6 ++
src/security/security_selinux.c | 164 ++++++++++++++++++++++++++++++++++++=
++++
src/security/security_stack.c | 40 ++++++++++
7 files changed, 278 insertions(+), 1 deletion(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 75b8932..2ce67e7 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1319,6 +1319,7 @@ virSecurityManagerRestoreImageLabel;
virSecurityManagerRestoreInputLabel;
virSecurityManagerRestoreMemoryLabel;
virSecurityManagerRestoreSavedStateLabel;
+virSecurityManagerRestoreTPMLabels;
virSecurityManagerSetAllLabel;
virSecurityManagerSetChardevLabel;
virSecurityManagerSetChildProcessLabel;
@@ -1333,6 +1334,7 @@ virSecurityManagerSetProcessLabel;
virSecurityManagerSetSavedStateLabel;
virSecurityManagerSetSocketLabel;
virSecurityManagerSetTapFDLabel;
+virSecurityManagerSetTPMLabels;
virSecurityManagerStackAddNested;
virSecurityManagerTransactionAbort;
virSecurityManagerTransactionCommit;
diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index 024d24d..62f0146 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -684,7 +684,26 @@ qemuExtTPMStartEmulator(virQEMUDriverPtr driver,
=20
virCommandSetErrorBuffer(cmd, &errbuf);
=20
- if (virCommandRun(cmd, &exitstatus) < 0 || exitstatus !=3D 0) {
+ if (virSecurityManagerSetTPMLabels(driver->securityManager,
+ def) < 0)
+ goto cleanup;
+
+ if (virSecurityManagerSetChildProcessLabel(driver->securityManager,
+ def, cmd) < 0)
+ goto cleanup;
+
+ if (virSecurityManagerPreFork(driver->securityManager) < 0)
+ goto cleanup;
+
+ /* make sure we run this with the appropriate user */
+ virCommandSetUID(cmd, cfg->swtpm_user);
+ virCommandSetGID(cmd, cfg->swtpm_group);
+
+ ret =3D virCommandRun(cmd, &exitstatus);
+
+ virSecurityManagerPostFork(driver->securityManager);
+
+ if (ret < 0 || exitstatus !=3D 0) {
VIR_ERROR(_("Could not start 'swtpm'. exitstatus: %d "
"stderr: %s"), exitstatus, errbuf);
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -696,6 +715,8 @@ qemuExtTPMStartEmulator(virQEMUDriverPtr driver,
ret =3D 0;
=20
cleanup:
+ if (ret < 0)
+ virSecurityManagerRestoreTPMLabels(driver->securityManager, def);
VIR_FREE(shortName);
VIR_FREE(errbuf);
virCommandFree(cmd);
@@ -741,6 +762,7 @@ qemuExtTPMStop(virQEMUDriverPtr driver,
goto cleanup;
=20
qemuTPMEmulatorStop(cfg->swtpmStateDir, shortName);
+ virSecurityManagerRestoreTPMLabels(driver->securityManager, def);
break;
case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
case VIR_DOMAIN_TPM_TYPE_LAST:
diff --git a/src/security/security_driver.h b/src/security/security_driver.h
index 95e7c4d..cbf0ecf 100644
--- a/src/security/security_driver.h
+++ b/src/security/security_driver.h
@@ -149,6 +149,10 @@ typedef int (*virSecurityDomainRestoreChardevLabel) (v=
irSecurityManagerPtr mgr,
virDomainDefPtr def,
virDomainChrSourceDef=
Ptr dev_source,
bool chardevStdioLogd=
);
+typedef int (*virSecurityDomainSetTPMLabels) (virSecurityManagerPtr mgr,
+ virDomainDefPtr def);
+typedef int (*virSecurityDomainRestoreTPMLabels) (virSecurityManagerPtr mg=
r,
+ virDomainDefPtr def);
=20
=20
struct _virSecurityDriver {
@@ -213,6 +217,9 @@ struct _virSecurityDriver {
=20
virSecurityDomainSetChardevLabel domainSetSecurityChardevLabel;
virSecurityDomainRestoreChardevLabel domainRestoreSecurityChardevLabel;
+
+ virSecurityDomainSetTPMLabels domainSetSecurityTPMLabels;
+ virSecurityDomainRestoreTPMLabels domainRestoreSecurityTPMLabels;
};
=20
virSecurityDriverPtr virSecurityDriverLookup(const char *name,
diff --git a/src/security/security_manager.c b/src/security/security_manage=
r.c
index 71f7f59..8683ad7 100644
--- a/src/security/security_manager.c
+++ b/src/security/security_manager.c
@@ -1204,3 +1204,39 @@ virSecurityManagerRestoreChardevLabel(virSecurityMan=
agerPtr mgr,
virReportUnsupportedError();
return -1;
}
+
+
+int
+virSecurityManagerSetTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm)
+{
+ int ret;
+
+ if (mgr->drv->domainSetSecurityTPMLabels) {
+ virObjectLock(mgr);
+ ret =3D mgr->drv->domainSetSecurityTPMLabels(mgr, vm);
+ virObjectUnlock(mgr);
+
+ return ret;
+ }
+
+ return 0;
+}
+
+
+int
+virSecurityManagerRestoreTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm)
+{
+ int ret;
+
+ if (mgr->drv->domainRestoreSecurityTPMLabels) {
+ virObjectLock(mgr);
+ ret =3D mgr->drv->domainRestoreSecurityTPMLabels(mgr, vm);
+ virObjectUnlock(mgr);
+
+ return ret;
+ }
+
+ return 0;
+}
diff --git a/src/security/security_manager.h b/src/security/security_manage=
r.h
index c36a8b4..e772b61 100644
--- a/src/security/security_manager.h
+++ b/src/security/security_manager.h
@@ -194,4 +194,10 @@ int virSecurityManagerRestoreChardevLabel(virSecurityM=
anagerPtr mgr,
virDomainChrSourceDefPtr dev_sou=
rce,
bool chardevStdioLogd);
=20
+int virSecurityManagerSetTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm);
+
+int virSecurityManagerRestoreTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm);
+
#endif /* VIR_SECURITY_MANAGER_H__ */
diff --git a/src/security/security_selinux.c b/src/security/security_selinu=
x.c
index 92e8415..6377fb7 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -3048,6 +3048,167 @@ virSecuritySELinuxDomainSetPathLabel(virSecurityMan=
agerPtr mgr,
return virSecuritySELinuxSetFilecon(mgr, path, seclabel->imagelabel);
}
=20
+
+/*
+ * _virSecuritySELinuxSetFileLabels:
+ *
+ * @mgr: the virSecurityManager
+ * @path: path to a directory or a file
+ * @seclabel: the security label
+ *
+ * Set the file labels on the given path; if the path is a directory
+ * we label all files found there, including the directory itself,
+ * otherwise we just label the file.
+ */
+static int
+_virSecuritySELinuxSetFileLabels(virSecurityManagerPtr mgr,
+ const char *path,
+ virSecurityLabelDefPtr seclabel)
+{
+ int ret =3D 0;
+ struct dirent *ent;
+ char *filename =3D NULL;
+ DIR *dir;
+
+ if ((ret =3D virSecuritySELinuxSetFilecon(mgr, path, seclabel->imagela=
bel)))
+ return ret;
+
+ if (!virFileIsDir(path))
+ return 0;
+
+ if (virDirOpen(&dir, path) < 0)
+ return -1;
+
+ while ((ret =3D virDirRead(dir, &ent, path)) > 0) {
+ if (ent->d_type !=3D DT_REG)
+ continue;
+
+ if (virAsprintf(&filename, "%s/%s", path, ent->d_name) < 0) {
+ ret =3D -1;
+ break;
+ }
+ ret =3D virSecuritySELinuxSetFilecon(mgr, filename,
+ seclabel->imagelabel);
+ VIR_FREE(filename);
+ if (ret < 0)
+ break;
+ }
+ if (ret < 0)
+ virReportSystemError(errno, _("Unable to label files under %s"),
+ path);
+
+ virDirClose(&dir);
+
+ return ret;
+}
+
+
+/*
+ * _virSecuritySELinuxRestoreFileLabels:
+ *
+ * @mgr: the virSecurityManager
+ * @path: path to a directory or a file
+ *
+ * Restore the file labels on the given path; if the path is a directory
+ * we restore all file labels found there, including the label of the
+ * directory itself, otherwise we just restore the label on the file.
+ */
+static int
+_virSecuritySELinuxRestoreFileLabels(virSecurityManagerPtr mgr,
+ const char *path)
+{
+ int ret =3D 0;
+ struct dirent *ent;
+ char *filename =3D NULL;
+ DIR *dir;
+
+ if ((ret =3D virSecuritySELinuxRestoreFileLabel(mgr, path)))
+ return ret;
+
+ if (!virFileIsDir(path))
+ return 0;
+
+ if (virDirOpen(&dir, path) < 0)
+ return -1;
+
+ while ((ret =3D virDirRead(dir, &ent, path)) > 0) {
+ if (ent->d_type !=3D DT_REG)
+ continue;
+
+ if (virAsprintf(&filename, "%s/%s", path, ent->d_name) < 0) {
+ ret =3D -1;
+ break;
+ }
+ ret =3D virSecuritySELinuxRestoreFileLabel(mgr, filename);
+ VIR_FREE(filename);
+ if (ret < 0)
+ break;
+ }
+ if (ret < 0)
+ virReportSystemError(errno, _("Unable to restore file labels under=
%s"),
+ path);
+
+ virDirClose(&dir);
+
+ return ret;
+}
+
+
+static int
+virSecuritySELinuxSetTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr def)
+{
+ int ret =3D 0;
+ virSecurityLabelDefPtr seclabel;
+
+ seclabel =3D virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAM=
E);
+ if (seclabel =3D=3D NULL)
+ return 0;
+
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ ret =3D _virSecuritySELinuxSetFileLabels(
+ mgr, def->tpm->data.emulator.storagepath,
+ seclabel);
+ if (ret =3D=3D 0 && def->tpm->data.emulator.logfile)
+ ret =3D _virSecuritySELinuxSetFileLabels(
+ mgr, def->tpm->data.emulator.logfile,
+ seclabel);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ return ret;
+}
+
+
+static int
+virSecuritySELinuxRestoreTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr def)
+{
+ int ret =3D 0;
+
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ break;
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ ret =3D _virSecuritySELinuxRestoreFileLabels(
+ mgr, def->tpm->data.emulator.storagepath);
+ if (ret =3D=3D 0 && def->tpm->data.emulator.logfile)
+ ret =3D _virSecuritySELinuxRestoreFileLabels(
+ mgr, def->tpm->data.emulator.logfile);
+ break;
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ return ret;
+}
+
+
virSecurityDriver virSecurityDriverSELinux =3D {
.privateDataLen =3D sizeof(virSecuritySELinuxData),
.name =3D SECURITY_SELINUX_NAME,
@@ -3107,4 +3268,7 @@ virSecurityDriver virSecurityDriverSELinux =3D {
=20
.domainSetSecurityChardevLabel =3D virSecuritySELinuxSetChardevLa=
bel,
.domainRestoreSecurityChardevLabel =3D virSecuritySELinuxRestoreChard=
evLabel,
+
+ .domainSetSecurityTPMLabels =3D virSecuritySELinuxSetTPMLabels,
+ .domainRestoreSecurityTPMLabels =3D virSecuritySELinuxRestoreTPMLa=
bels,
};
diff --git a/src/security/security_stack.c b/src/security/security_stack.c
index 9615f9f..e37a681 100644
--- a/src/security/security_stack.c
+++ b/src/security/security_stack.c
@@ -760,6 +760,43 @@ virSecurityStackDomainRestoreChardevLabel(virSecurityM=
anagerPtr mgr,
return rc;
}
=20
+
+static int
+virSecurityStackSetTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm)
+{
+ virSecurityStackDataPtr priv =3D virSecurityManagerGetPrivateData(mgr);
+ virSecurityStackItemPtr item =3D priv->itemsHead;
+ int rc =3D 0;
+
+ for (; item; item =3D item->next) {
+ if (virSecurityManagerSetTPMLabels(item->securityManager,
+ vm) < 0)
+ rc =3D -1;
+ }
+
+ return rc;
+}
+
+
+static int
+virSecurityStackRestoreTPMLabels(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm)
+{
+ virSecurityStackDataPtr priv =3D virSecurityManagerGetPrivateData(mgr);
+ virSecurityStackItemPtr item =3D priv->itemsHead;
+ int rc =3D 0;
+
+ for (; item; item =3D item->next) {
+ if (virSecurityManagerRestoreTPMLabels(item->securityManager,
+ vm) < 0)
+ rc =3D -1;
+ }
+
+ return rc;
+}
+
+
virSecurityDriver virSecurityDriverStack =3D {
.privateDataLen =3D sizeof(virSecurityStackData),
.name =3D "stack",
@@ -822,4 +859,7 @@ virSecurityDriver virSecurityDriverStack =3D {
=20
.domainSetSecurityChardevLabel =3D virSecurityStackDomainSetChard=
evLabel,
.domainRestoreSecurityChardevLabel =3D virSecurityStackDomainRestoreC=
hardevLabel,
+
+ .domainSetSecurityTPMLabels =3D virSecurityStackSetTPMLabels,
+ .domainRestoreSecurityTPMLabels =3D virSecurityStackRestoreTPMLabe=
ls,
};
--=20
2.5.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
From nobody Wed May 14 01:36:54 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28
as permitted sender) client-ip=209.132.183.28;
envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com
Return-Path:
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by
mx.zohomail.com
with SMTPS id 1525989507914289.72878472623404;
Thu, 10 May 2018 14:58:27 -0700 (PDT)
Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com
[10.5.11.13])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 78E9661BB4;
Thu, 10 May 2018 21:58:26 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 37C7560924;
Thu, 10 May 2018 21:58:26 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id C86F54BB78;
Thu, 10 May 2018 21:58:25 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com
[10.5.11.16])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id w4ALvvDL028599 for ;
Thu, 10 May 2018 17:57:57 -0400
Received: by smtp.corp.redhat.com (Postfix)
id B22C05C886; Thu, 10 May 2018 21:57:57 +0000 (UTC)
Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com
[10.5.110.38])
by smtp.corp.redhat.com (Postfix) with ESMTPS id A51D766829
for ; Thu, 10 May 2018 21:57:54 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com
[148.163.156.1])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by mx1.redhat.com (Postfix) with ESMTPS id 111654DD58
for ; Thu, 10 May 2018 21:57:53 +0000 (UTC)
Received: from pps.filterd (m0098396.ppops.net [127.0.0.1])
by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id
w4ALrlnt026297
for ; Thu, 10 May 2018 17:57:52 -0400
Received: from e11.ny.us.ibm.com (e11.ny.us.ibm.com [129.33.205.201])
by mx0a-001b2d01.pphosted.com with ESMTP id 2hvt382x9p-1
(version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT)
for ; Thu, 10 May 2018 17:57:52 -0400
Received: from localhost
by e11.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
Violators will be prosecuted
for from ;
Thu, 10 May 2018 17:57:51 -0400
Received: from b01cxnp23032.gho.pok.ibm.com (9.57.198.27)
by e11.ny.us.ibm.com (146.89.104.198) with IBM ESMTP SMTP Gateway:
Authorized Use Only! Violators will be prosecuted;
Thu, 10 May 2018 17:57:49 -0400
Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com
[9.57.199.110])
by b01cxnp23032.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id
w4ALvnfM43843704; Thu, 10 May 2018 21:57:49 GMT
Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 8E4A2AE03B;
Thu, 10 May 2018 17:59:47 -0400 (EDT)
Received: from sbct-3.watson.ibm.com (unknown [9.47.158.153])
by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 743AAAE034;
Thu, 10 May 2018 17:59:47 -0400 (EDT)
From: Stefan Berger
To: libvir-list@redhat.com
Date: Thu, 10 May 2018 17:57:36 -0400
In-Reply-To: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
References: <1525989457-29715-1-git-send-email-stefanb@linux.vnet.ibm.com>
X-TM-AS-GCONF: 00
x-cbid: 18051021-2213-0000-0000-000002A277EE
X-IBM-SpamModules-Scores:
X-IBM-SpamModules-Versions: BY=3.00009002; HX=3.00000241; KW=3.00000007;
PH=3.00000004; SC=3.00000259; SDB=6.01030432; UDB=6.00526618;
IPR=6.00809563;
MB=3.00021037; MTD=3.00000008; XFM=3.00000015; UTC=2018-05-10 21:57:51
X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused
x-cbparentid: 18051021-2214-0000-0000-00005A125A91
Message-Id: <1525989457-29715-11-git-send-email-stefanb@linux.vnet.ibm.com>
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
definitions=2018-05-10_06:, , signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
priorityscore=1501
malwarescore=0 suspectscore=43 phishscore=0 bulkscore=0 spamscore=0
clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0
classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000
definitions=main-1805100201
X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207
matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.38]); Thu, 10 May 2018 21:57:53 +0000 (UTC)
X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com
[10.5.110.38]);
Thu, 10 May 2018 21:57:53 +0000 (UTC) for IP:'148.163.156.1'
DOMAIN:'mx0a-001b2d01.pphosted.com'
HELO:'mx0a-001b2d01.pphosted.com'
FROM:'stefanb@linux.vnet.ibm.com' RCPT:''
X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.156.1
mx0a-001b2d01.pphosted.com 148.163.156.1
mx0a-001b2d01.pphosted.com
X-Scanned-By: MIMEDefang 2.78 on 10.5.110.38
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16
X-loop: libvir-list@redhat.com
Subject: [libvirt] [PATCH v4 10/11] tpm: Add support for choosing emulation
of a TPM 2
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13
X-Greylist: Sender IP whitelisted,
not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]);
Thu, 10 May 2018 21:58:27 +0000 (UTC)
X-ZohoMail: RSF_0 Z_629925259 SPT_0
Content-Type: text/plain; charset="utf-8"
This patch extends the TPM's device XML with TPM 2 support. This only works
for the emulator type backend and looks as follows:
The swtpm process now has --tpm2 as an additional parameter:
system_u:system_r:svirt_t:s0:c597,c632 tss 18477 11.8 0.0 28364 3868 ? =
Rs 11:13 13:50 /usr/bin/swtpm socket --daemon --ctrl type=3Dunixio,=
path=3D/var/run/libvirt/qemu/swtpm/testvm-swtpm.sock,mode=3D0660 --tpmstate=
dir=3D/var/lib/libvirt/swtpm/testvm/tpm2,mode=3D0640 --log file=3D/var/log=
/swtpm/libvirt/qemu/testvm-swtpm.log --tpm2 --pid file=3D/var/run/libvirt/q=
emu/swtpm/testvm-swtpm.pid
The version of the TPM can be changed and the state of the TPM is preserved.
Signed-off-by: Stefan Berger
---
docs/formatdomain.html.in | 15 +++++-
docs/schemas/domaincommon.rng | 12 +++++
src/conf/domain_conf.c | 27 +++++++++-
src/conf/domain_conf.h | 6 +++
src/qemu/qemu_tpm.c | 63 ++++++++++++++++++=
++--
.../tpm-emulator-tpm2.x86_64-latest.args | 33 ++++++++++++
tests/qemuxml2argvdata/tpm-emulator-tpm2.xml | 30 +++++++++++
tests/qemuxml2argvtest.c | 1 +
tests/qemuxml2xmloutdata/tpm-emulator-tpm2.xml | 34 ++++++++++++
9 files changed, 216 insertions(+), 5 deletions(-)
create mode 100644 tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.=
args
create mode 100644 tests/qemuxml2argvdata/tpm-emulator-tpm2.xml
create mode 100644 tests/qemuxml2xmloutdata/tpm-emulator-tpm2.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 4f56784..28ae92f 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -7664,7 +7664,7 @@ qemu-kvm -net nic,model=3D? /dev/null
...
<devices>
<tpm model=3D'tpm-tis'>
- <backend type=3D'emulator'>
+ <backend type=3D'emulator' version=3D'2'>
</backend>
</tpm>
</devices>
@@ -7714,6 +7714,19 @@ qemu-kvm -net nic,model=3D? /dev/null
+
version
+
+
+ The version attribute indicates the version
+ of the TPM. By default a TPM 1.2 is created. This attribute
+ only works with the emulator backend. The following
+ versions are supported:
+