Merge tpm 2018/10/29 v2
-----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJb2M/IAAoJEHWtZYAqC0IRu5AIAKR7lDJ9nPDqoCOvc4hAY6TV Zd986geEGiwrsFJ/CXbXXMsM7aUP+Qq717wekkZFghjtsfG83S+JWROZo2b8AUsI Atq0T/G6BLWFvdzW6sCtfo8zCrhj3EFJpFWTYCIrNHDB6rs1R9bbuR/Bt2h7tpDh CAmUkbumVUvanG4oklaRrwWfN7GksVhxAqX41PHaJAACww6UkNLzkWDJ5eQswvG6 nzEtWGQU41FqdcL+5E7nH6IEEGb4MnTkAftIab5Phr+lMWnd3mN0/tiY0wgVCDbP OGBxOiPDxRbO4m7EH9iigFL+Xz3eZz3m6mnjmD+Ss29JkROF4Rn1E5FuJIDxiic= =SyrU -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2018-10-29-2' into staging Merge tpm 2018/10/29 v2 # gpg: Signature made Tue 30 Oct 2018 21:40:24 GMT # gpg: using RSA key 75AD65802A0B4211 # gpg: Good signature from "Stefan Berger <stefanb@linux.vnet.ibm.com>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: B818 B9CA DF90 89C2 D5CE C66B 75AD 6580 2A0B 4211 * remotes/stefanberger/tags/pull-tpm-2018-10-29-2: tpm: Zero-init structure to avoid uninitialized variables in valgrind log MAINTAINERS: Change my email address to the new domain docs: tpm: Mention implemented TPM CRB interface emulation and specs tests/tpm: Display if swtpm is not found or --tpm2 not supported tests/tpm: fix tpm_util_swtpm_has_tpm2() Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
8002fa2bf6
@ -1796,7 +1796,7 @@ F: docs/devel/tracing.txt
|
|||||||
T: git git://github.com/stefanha/qemu.git tracing
|
T: git git://github.com/stefanha/qemu.git tracing
|
||||||
|
|
||||||
TPM
|
TPM
|
||||||
M: Stefan Berger <stefanb@linux.vnet.ibm.com>
|
M: Stefan Berger <stefanb@linux.ibm.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: tpm.c
|
F: tpm.c
|
||||||
F: stubs/tpm.c
|
F: stubs/tpm.c
|
||||||
|
@ -20,6 +20,21 @@ QEMU files related to TPM TIS interface:
|
|||||||
- hw/tpm/tpm_tis.h
|
- hw/tpm/tpm_tis.h
|
||||||
|
|
||||||
|
|
||||||
|
QEMU also implements a TPM CRB interface following the Trusted Computing
|
||||||
|
Group's specification "TCG PC Client Platform TPM Profile (PTP)
|
||||||
|
Specification", Family "2.0", Level 00 Revision 01.03 v22, May 22, 2017.
|
||||||
|
This specification, or a later version of it, can be accessed from the
|
||||||
|
following URL:
|
||||||
|
|
||||||
|
https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profile-ptp-specification/
|
||||||
|
|
||||||
|
The CRB interface makes a memory mapped IO region in the area 0xfed40000 -
|
||||||
|
0xfed40fff (1 locality) available to the guest operating system.
|
||||||
|
|
||||||
|
QEMU files related to TPM CRB interface:
|
||||||
|
- hw/tpm/tpm_crb.c
|
||||||
|
|
||||||
|
|
||||||
= ACPI Interface =
|
= ACPI Interface =
|
||||||
|
|
||||||
The TPM device is defined with ACPI ID "PNP0C31". QEMU builds a SSDT and passes
|
The TPM device is defined with ACPI ID "PNP0C31". QEMU builds a SSDT and passes
|
||||||
|
@ -166,6 +166,7 @@ static int tpm_emulator_set_locality(TPMEmulator *tpm_emu, uint8_t locty_number,
|
|||||||
|
|
||||||
trace_tpm_emulator_set_locality(locty_number);
|
trace_tpm_emulator_set_locality(locty_number);
|
||||||
|
|
||||||
|
memset(&loc, 0, sizeof(loc));
|
||||||
loc.u.req.loc = locty_number;
|
loc.u.req.loc = locty_number;
|
||||||
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_SET_LOCALITY, &loc,
|
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_SET_LOCALITY, &loc,
|
||||||
sizeof(loc), sizeof(loc)) < 0) {
|
sizeof(loc), sizeof(loc)) < 0) {
|
||||||
|
@ -18,6 +18,17 @@
|
|||||||
#include "libqtest.h"
|
#include "libqtest.h"
|
||||||
#include "tpm-tests.h"
|
#include "tpm-tests.h"
|
||||||
|
|
||||||
|
static bool
|
||||||
|
tpm_test_swtpm_skip(void)
|
||||||
|
{
|
||||||
|
if (!tpm_util_swtpm_has_tpm2()) {
|
||||||
|
fprintf(stderr, "swtpm not in PATH or missing --tpm2 support; ");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx,
|
void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx,
|
||||||
const char *ifmodel)
|
const char *ifmodel)
|
||||||
{
|
{
|
||||||
@ -28,12 +39,13 @@ void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx,
|
|||||||
GPid swtpm_pid;
|
GPid swtpm_pid;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error);
|
if (tpm_test_swtpm_skip()) {
|
||||||
/* succ may be false if swtpm is not available */
|
|
||||||
if (!succ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error);
|
||||||
|
g_assert_true(succ);
|
||||||
|
|
||||||
args = g_strdup_printf(
|
args = g_strdup_printf(
|
||||||
"-chardev socket,id=chr,path=%s "
|
"-chardev socket,id=chr,path=%s "
|
||||||
"-tpmdev emulator,id=dev,chardev=chr "
|
"-tpmdev emulator,id=dev,chardev=chr "
|
||||||
@ -74,19 +86,17 @@ void tpm_test_swtpm_migration_test(const char *src_tpm_path,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
QTestState *src_qemu, *dst_qemu;
|
QTestState *src_qemu, *dst_qemu;
|
||||||
|
|
||||||
succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid,
|
if (tpm_test_swtpm_skip()) {
|
||||||
&src_tpm_addr, &error);
|
|
||||||
/* succ may be false if swtpm is not available */
|
|
||||||
if (!succ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid,
|
||||||
|
&src_tpm_addr, &error);
|
||||||
|
g_assert_true(succ);
|
||||||
|
|
||||||
succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid,
|
succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid,
|
||||||
&dst_tpm_addr, &error);
|
&dst_tpm_addr, &error);
|
||||||
/* succ may be false if swtpm is not available */
|
g_assert_true(succ);
|
||||||
if (!succ) {
|
|
||||||
goto err_src_tpm_kill;
|
|
||||||
}
|
|
||||||
|
|
||||||
tpm_util_migration_start_qemu(&src_qemu, &dst_qemu,
|
tpm_util_migration_start_qemu(&src_qemu, &dst_qemu,
|
||||||
src_tpm_addr, dst_tpm_addr, uri,
|
src_tpm_addr, dst_tpm_addr, uri,
|
||||||
@ -118,7 +128,6 @@ void tpm_test_swtpm_migration_test(const char *src_tpm_path,
|
|||||||
qapi_free_SocketAddress(dst_tpm_addr);
|
qapi_free_SocketAddress(dst_tpm_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
err_src_tpm_kill:
|
|
||||||
tpm_util_swtpm_kill(src_tpm_pid);
|
tpm_util_swtpm_kill(src_tpm_pid);
|
||||||
if (src_tpm_addr) {
|
if (src_tpm_addr) {
|
||||||
g_unlink(src_tpm_addr->u.q_unix.path);
|
g_unlink(src_tpm_addr->u.q_unix.path);
|
||||||
|
@ -145,39 +145,33 @@ void tpm_util_pcrread(QTestState *s, tx_func *tx,
|
|||||||
g_assert_cmpmem(buffer, exp_resp_size, exp_resp, exp_resp_size);
|
g_assert_cmpmem(buffer, exp_resp_size, exp_resp, exp_resp_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean tpm_util_swtpm_has_tpm2(void)
|
bool tpm_util_swtpm_has_tpm2(void)
|
||||||
{
|
{
|
||||||
gint mystdout;
|
bool has_tpm2 = false;
|
||||||
gboolean succ;
|
char *out = NULL;
|
||||||
unsigned i;
|
static const char *argv[] = {
|
||||||
char buffer[10240];
|
"swtpm", "socket", "--help", NULL
|
||||||
ssize_t n;
|
|
||||||
gchar *swtpm_argv[] = {
|
|
||||||
g_strdup("swtpm"), g_strdup("socket"), g_strdup("--help"), NULL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
succ = g_spawn_async_with_pipes(NULL, swtpm_argv, NULL,
|
if (!g_spawn_sync(NULL /* working_dir */,
|
||||||
G_SPAWN_SEARCH_PATH, NULL, NULL, NULL,
|
(char **)argv,
|
||||||
NULL, &mystdout, NULL, NULL);
|
NULL /* envp */,
|
||||||
if (!succ) {
|
G_SPAWN_SEARCH_PATH,
|
||||||
goto cleanup;
|
NULL /* child_setup */,
|
||||||
|
NULL /* user_data */,
|
||||||
|
&out,
|
||||||
|
NULL /* err */,
|
||||||
|
NULL /* exit_status */,
|
||||||
|
NULL)) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = read(mystdout, buffer, sizeof(buffer) - 1);
|
if (strstr(out, "--tpm2")) {
|
||||||
if (n < 0) {
|
has_tpm2 = true;
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
buffer[n] = 0;
|
|
||||||
if (!strstr(buffer, "--tpm2")) {
|
|
||||||
succ = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
g_free(out);
|
||||||
for (i = 0; swtpm_argv[i]; i++) {
|
return has_tpm2;
|
||||||
g_free(swtpm_argv[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return succ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
||||||
@ -196,11 +190,6 @@ gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
|||||||
gboolean succ;
|
gboolean succ;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
succ = tpm_util_swtpm_has_tpm2();
|
|
||||||
if (!succ) {
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
*addr = g_new0(SocketAddress, 1);
|
*addr = g_new0(SocketAddress, 1);
|
||||||
(*addr)->type = SOCKET_ADDRESS_TYPE_UNIX;
|
(*addr)->type = SOCKET_ADDRESS_TYPE_UNIX;
|
||||||
(*addr)->u.q_unix.path = g_build_filename(path, "sock", NULL);
|
(*addr)->u.q_unix.path = g_build_filename(path, "sock", NULL);
|
||||||
@ -208,7 +197,6 @@ gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
|||||||
succ = g_spawn_async(NULL, swtpm_argv, NULL, G_SPAWN_SEARCH_PATH,
|
succ = g_spawn_async(NULL, swtpm_argv, NULL, G_SPAWN_SEARCH_PATH,
|
||||||
NULL, NULL, pid, error);
|
NULL, NULL, pid, error);
|
||||||
|
|
||||||
cleanup:
|
|
||||||
for (i = 0; swtpm_argv[i]; i++) {
|
for (i = 0; swtpm_argv[i]; i++) {
|
||||||
g_free(swtpm_argv[i]);
|
g_free(swtpm_argv[i]);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,8 @@ void tpm_util_pcrextend(QTestState *s, tx_func *tx);
|
|||||||
void tpm_util_pcrread(QTestState *s, tx_func *tx,
|
void tpm_util_pcrread(QTestState *s, tx_func *tx,
|
||||||
const unsigned char *exp_resp, size_t exp_resp_size);
|
const unsigned char *exp_resp, size_t exp_resp_size);
|
||||||
|
|
||||||
|
bool tpm_util_swtpm_has_tpm2(void);
|
||||||
|
|
||||||
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
||||||
SocketAddress **addr, GError **error);
|
SocketAddress **addr, GError **error);
|
||||||
void tpm_util_swtpm_kill(GPid pid);
|
void tpm_util_swtpm_kill(GPid pid);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user