Skip to content
This repository was archived by the owner on Aug 5, 2022. It is now read-only.

Commit f24883b

Browse files
authored
Merge pull request #326 from pohly/tpm2
support whole-disk encryption with TPM 2.0
2 parents a07f56f + 2fec96c commit f24883b

48 files changed

Lines changed: 3199 additions & 2453 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,6 @@
4040
[submodule "iot-web-layers"]
4141
path = iot-web-layers
4242
url = https://github.com/intel/iot-web-layers.git
43+
[submodule "meta-measured"]
44+
path = meta-measured
45+
url = https://github.com/flihp/meta-measured.git

meta-measured

Submodule meta-measured added at 5f88a6d
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Workaround for https://github.com/intel/tpm2-tss/issues/613
2+
CFLAGS_append_df-refkit-config = " -Wno-error=int-in-bool-context"
3+
CXXFLAGS_append_df-refkit-config = " -Wno-error=int-in-bool-context"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
From a0f8d150794164f41cd7288c9ed059bbf21c95ec Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
3+
Date: Thu, 24 Aug 2017 10:45:58 +0200
4+
Subject: [PATCH 01/12] tpm: Clean up driver registration & lookup
5+
MIME-Version: 1.0
6+
Content-Type: text/plain; charset=UTF-8
7+
Content-Transfer-Encoding: 8bit
8+
9+
We have a strict separation between enum TpmType and be_drivers[]:
10+
11+
* TpmType may have any number of members. It just happens to have one.
12+
13+
* tpm_register_driver() uses the first empty slot in be_drivers[].
14+
15+
If you register more than tpm_models[] has space,
16+
tpm_register_driver() fails. Its caller silently ignores the
17+
failure.
18+
19+
If you register more than one with a given TpmType,
20+
tpm_display_backend_drivers() will shows all of them, but
21+
tpm_driver_find_by_type() and tpm_get_backend_driver() will find
22+
only the one one that registered first.
23+
24+
Since we only ever register one driver, and be_drivers[] has space for
25+
just that one, this contraption even works.
26+
27+
Turn be_drivers[] into a straight map from enum TpmType to driver.
28+
Much simpler, and has a decent chance to actually work should we ever
29+
acquire additional drivers.
30+
31+
While there, use qapi_enum_parse() in tpm_get_backend_driver().
32+
33+
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
34+
Message-Id: <20170822132255.23945-8-marcandre.lureau@redhat.com>
35+
Reviewed-by: Markus Armbruster <armbru@redhat.com>
36+
[Rebased, superfluous initializer dropped, commit message rewritten]
37+
Cc: Stefan Berger <stefanb@us.ibm.com>
38+
Signed-off-by: Markus Armbruster <armbru@redhat.com>
39+
Message-Id: <1503564371-26090-4-git-send-email-armbru@redhat.com>
40+
41+
Upstream-Status: Backport
42+
---
43+
include/sysemu/tpm_backend.h | 2 +-
44+
tpm.c | 45 +++++++++++++-------------------------------
45+
2 files changed, 14 insertions(+), 33 deletions(-)
46+
47+
diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h
48+
index b58f52d39f..1d21c6b19b 100644
49+
--- a/include/sysemu/tpm_backend.h
50+
+++ b/include/sysemu/tpm_backend.h
51+
@@ -227,6 +227,6 @@ TPMBackend *qemu_find_tpm(const char *id);
52+
53+
const TPMDriverOps *tpm_get_backend_driver(const char *type);
54+
int tpm_register_model(enum TpmModel model);
55+
-int tpm_register_driver(const TPMDriverOps *tdo);
56+
+void tpm_register_driver(const TPMDriverOps *tdo);
57+
58+
#endif
59+
diff --git a/tpm.c b/tpm.c
60+
index 9a7c7114d3..bb45d0c08e 100644
61+
--- a/tpm.c
62+
+++ b/tpm.c
63+
@@ -14,6 +14,7 @@
64+
#include "qemu/osdep.h"
65+
66+
#include "qapi/qmp/qerror.h"
67+
+#include "qapi/util.h"
68+
#include "sysemu/tpm_backend.h"
69+
#include "sysemu/tpm.h"
70+
#include "qemu/config-file.h"
71+
@@ -25,11 +26,8 @@ static QLIST_HEAD(, TPMBackend) tpm_backends =
72+
73+
74+
#define TPM_MAX_MODELS 1
75+
-#define TPM_MAX_DRIVERS 1
76+
77+
-static TPMDriverOps const *be_drivers[TPM_MAX_DRIVERS] = {
78+
- NULL,
79+
-};
80+
+static TPMDriverOps const *be_drivers[TPM_TYPE__MAX];
81+
82+
static enum TpmModel tpm_models[TPM_MAX_MODELS] = {
83+
TPM_MODEL__MAX,
84+
@@ -63,31 +61,18 @@ static bool tpm_model_is_registered(enum TpmModel model)
85+
86+
const TPMDriverOps *tpm_get_backend_driver(const char *type)
87+
{
88+
- int i;
89+
-
90+
- for (i = 0; i < TPM_MAX_DRIVERS && be_drivers[i] != NULL; i++) {
91+
- if (!strcmp(TpmType_lookup[be_drivers[i]->type], type)) {
92+
- return be_drivers[i];
93+
- }
94+
- }
95+
+ int i = qapi_enum_parse(TpmType_lookup, type, TPM_TYPE__MAX, -1, NULL);
96+
97+
- return NULL;
98+
+ return i >= 0 ? be_drivers[i] : NULL;
99+
}
100+
101+
#ifdef CONFIG_TPM
102+
103+
-int tpm_register_driver(const TPMDriverOps *tdo)
104+
+void tpm_register_driver(const TPMDriverOps *tdo)
105+
{
106+
- int i;
107+
+ assert(!be_drivers[tdo->type]);
108+
109+
- for (i = 0; i < TPM_MAX_DRIVERS; i++) {
110+
- if (!be_drivers[i]) {
111+
- be_drivers[i] = tdo;
112+
- return 0;
113+
- }
114+
- }
115+
- error_report("Could not register TPM driver");
116+
- return 1;
117+
+ be_drivers[tdo->type] = tdo;
118+
}
119+
120+
/*
121+
@@ -100,9 +85,12 @@ static void tpm_display_backend_drivers(void)
122+
123+
fprintf(stderr, "Supported TPM types (choose only one):\n");
124+
125+
- for (i = 0; i < TPM_MAX_DRIVERS && be_drivers[i] != NULL; i++) {
126+
+ for (i = 0; i < TPM_TYPE__MAX; i++) {
127+
+ if (be_drivers[i] == NULL) {
128+
+ continue;
129+
+ }
130+
fprintf(stderr, "%12s %s\n",
131+
- TpmType_lookup[be_drivers[i]->type], be_drivers[i]->desc());
132+
+ TpmType_lookup[i], be_drivers[i]->desc());
133+
}
134+
fprintf(stderr, "\n");
135+
}
136+
@@ -239,14 +227,7 @@ int tpm_config_parse(QemuOptsList *opts_list, const char *optarg)
137+
138+
static const TPMDriverOps *tpm_driver_find_by_type(enum TpmType type)
139+
{
140+
- int i;
141+
-
142+
- for (i = 0; i < TPM_MAX_DRIVERS && be_drivers[i] != NULL; i++) {
143+
- if (be_drivers[i]->type == type) {
144+
- return be_drivers[i];
145+
- }
146+
- }
147+
- return NULL;
148+
+ return be_drivers[type];
149+
}
150+
151+
static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv)
152+
--
153+
2.11.0
154+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
From 89430c64784484214b3c99562520cdffe79cd801 Mon Sep 17 00:00:00 2001
2+
From: Markus Armbruster <armbru@redhat.com>
3+
Date: Thu, 24 Aug 2017 10:45:59 +0200
4+
Subject: [PATCH 02/12] tpm: Clean up model registration & lookup
5+
MIME-Version: 1.0
6+
Content-Type: text/plain; charset=UTF-8
7+
Content-Transfer-Encoding: 8bit
8+
9+
We have a strict separation between enum TpmModel and tpm_models[]:
10+
11+
* TpmModel may have any number of members. It just happens to have one.
12+
13+
* tpm_register_model() uses the first empty slot in tpm_models[].
14+
15+
If you register more than tpm_models[] has space,
16+
tpn_register_model() fails. Its caller silently ignores the
17+
failure.
18+
19+
Register the same TpmModel more than once has no effect other than
20+
wasting tpm_models[] slots: tpm_model_is_registered() is happy with
21+
the first one it finds.
22+
23+
Since we only ever register one model, and tpm_models[] has space for
24+
just that one, this contraption even works.
25+
26+
Turn tpm_models[] into a straight map from enum TpmType to bool. Much
27+
simpler.
28+
29+
Cc: Stefan Berger <stefanb@us.ibm.com>
30+
Signed-off-by: Markus Armbruster <armbru@redhat.com>
31+
Message-Id: <1503564371-26090-5-git-send-email-armbru@redhat.com>
32+
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
33+
[Commit message typo fixed]
34+
35+
Upstream-Status: Backport
36+
---
37+
include/sysemu/tpm_backend.h | 2 +-
38+
tpm.c | 37 +++++--------------------------------
39+
2 files changed, 6 insertions(+), 33 deletions(-)
40+
41+
diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h
42+
index 1d21c6b19b..b0a9731aee 100644
43+
--- a/include/sysemu/tpm_backend.h
44+
+++ b/include/sysemu/tpm_backend.h
45+
@@ -226,7 +226,7 @@ TPMVersion tpm_backend_get_tpm_version(TPMBackend *s);
46+
TPMBackend *qemu_find_tpm(const char *id);
47+
48+
const TPMDriverOps *tpm_get_backend_driver(const char *type);
49+
-int tpm_register_model(enum TpmModel model);
50+
+void tpm_register_model(enum TpmModel model);
51+
void tpm_register_driver(const TPMDriverOps *tdo);
52+
53+
#endif
54+
diff --git a/tpm.c b/tpm.c
55+
index bb45d0c08e..2dbea70645 100644
56+
--- a/tpm.c
57+
+++ b/tpm.c
58+
@@ -24,39 +24,12 @@
59+
static QLIST_HEAD(, TPMBackend) tpm_backends =
60+
QLIST_HEAD_INITIALIZER(tpm_backends);
61+
62+
-
63+
-#define TPM_MAX_MODELS 1
64+
-
65+
static TPMDriverOps const *be_drivers[TPM_TYPE__MAX];
66+
+static bool tpm_models[TPM_MODEL__MAX];
67+
68+
-static enum TpmModel tpm_models[TPM_MAX_MODELS] = {
69+
- TPM_MODEL__MAX,
70+
-};
71+
-
72+
-int tpm_register_model(enum TpmModel model)
73+
-{
74+
- int i;
75+
-
76+
- for (i = 0; i < TPM_MAX_MODELS; i++) {
77+
- if (tpm_models[i] == TPM_MODEL__MAX) {
78+
- tpm_models[i] = model;
79+
- return 0;
80+
- }
81+
- }
82+
- error_report("Could not register TPM model");
83+
- return 1;
84+
-}
85+
-
86+
-static bool tpm_model_is_registered(enum TpmModel model)
87+
+void tpm_register_model(enum TpmModel model)
88+
{
89+
- int i;
90+
-
91+
- for (i = 0; i < TPM_MAX_MODELS; i++) {
92+
- if (tpm_models[i] == model) {
93+
- return true;
94+
- }
95+
- }
96+
- return false;
97+
+ tpm_models[model] = true;
98+
}
99+
100+
const TPMDriverOps *tpm_get_backend_driver(const char *type)
101+
@@ -270,7 +243,7 @@ TPMInfoList *qmp_query_tpm(Error **errp)
102+
TPMInfoList *info, *head = NULL, *cur_item = NULL;
103+
104+
QLIST_FOREACH(drv, &tpm_backends, list) {
105+
- if (!tpm_model_is_registered(drv->fe_model)) {
106+
+ if (!tpm_models[drv->fe_model]) {
107+
continue;
108+
}
109+
info = g_new0(TPMInfoList, 1);
110+
@@ -317,7 +290,7 @@ TpmModelList *qmp_query_tpm_models(Error **errp)
111+
TpmModelList *head = NULL, *prev = NULL, *cur_item;
112+
113+
for (i = 0; i < TPM_MODEL__MAX; i++) {
114+
- if (!tpm_model_is_registered(i)) {
115+
+ if (!tpm_models[i]) {
116+
continue;
117+
}
118+
cur_item = g_new0(TpmModelList, 1);
119+
--
120+
2.11.0
121+

0 commit comments

Comments
 (0)