]>
Commit | Line | Data |
---|---|---|
2b4ccb87 SB |
1 | /* |
2 | * QTest TPM commont test code | |
3 | * | |
4 | * Copyright (c) 2018 IBM Corporation | |
5 | * Copyright (c) 2018 Red Hat, Inc. | |
6 | * | |
7 | * Authors: | |
8 | * Stefan Berger <[email protected]> | |
9 | * Marc-André Lureau <[email protected]> | |
10 | * | |
11 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
12 | * See the COPYING file in the top-level directory. | |
13 | */ | |
14 | ||
15 | #include "qemu/osdep.h" | |
16 | #include <glib/gstdio.h> | |
17 | ||
18 | #include "libqtest.h" | |
19 | #include "tpm-tests.h" | |
20 | ||
e2f246a5 MAL |
21 | static bool |
22 | tpm_test_swtpm_skip(void) | |
23 | { | |
24 | if (!tpm_util_swtpm_has_tpm2()) { | |
5e58b58c | 25 | g_test_message("swtpm not in PATH or missing --tpm2 support"); |
e2f246a5 MAL |
26 | return true; |
27 | } | |
28 | ||
29 | return false; | |
30 | } | |
31 | ||
ea71a336 SB |
32 | void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx, |
33 | const char *ifmodel) | |
2b4ccb87 SB |
34 | { |
35 | char *args = NULL; | |
36 | QTestState *s; | |
37 | SocketAddress *addr = NULL; | |
38 | gboolean succ; | |
39 | GPid swtpm_pid; | |
40 | GError *error = NULL; | |
41 | ||
e2f246a5 | 42 | if (tpm_test_swtpm_skip()) { |
2b4ccb87 SB |
43 | return; |
44 | } | |
45 | ||
e2f246a5 MAL |
46 | succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error); |
47 | g_assert_true(succ); | |
48 | ||
2b4ccb87 SB |
49 | args = g_strdup_printf( |
50 | "-chardev socket,id=chr,path=%s " | |
51 | "-tpmdev emulator,id=dev,chardev=chr " | |
ea71a336 SB |
52 | "-device %s,tpmdev=dev", |
53 | addr->u.q_unix.path, ifmodel); | |
2b4ccb87 SB |
54 | |
55 | s = qtest_start(args); | |
56 | g_free(args); | |
57 | ||
58 | tpm_util_startup(s, tx); | |
59 | tpm_util_pcrextend(s, tx); | |
60 | ||
61 | unsigned char tpm_pcrread_resp[] = | |
62 | "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" | |
63 | "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" | |
64 | "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" | |
65 | "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; | |
66 | tpm_util_pcrread(s, tx, tpm_pcrread_resp, | |
67 | sizeof(tpm_pcrread_resp)); | |
68 | ||
69 | qtest_end(); | |
70 | tpm_util_swtpm_kill(swtpm_pid); | |
71 | ||
72 | if (addr) { | |
73 | g_unlink(addr->u.q_unix.path); | |
74 | qapi_free_SocketAddress(addr); | |
75 | } | |
76 | } | |
77 | ||
78 | void tpm_test_swtpm_migration_test(const char *src_tpm_path, | |
79 | const char *dst_tpm_path, | |
ea71a336 SB |
80 | const char *uri, tx_func *tx, |
81 | const char *ifmodel) | |
2b4ccb87 SB |
82 | { |
83 | gboolean succ; | |
84 | GPid src_tpm_pid, dst_tpm_pid; | |
85 | SocketAddress *src_tpm_addr = NULL, *dst_tpm_addr = NULL; | |
86 | GError *error = NULL; | |
87 | QTestState *src_qemu, *dst_qemu; | |
88 | ||
e2f246a5 | 89 | if (tpm_test_swtpm_skip()) { |
2b4ccb87 SB |
90 | return; |
91 | } | |
92 | ||
e2f246a5 MAL |
93 | succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid, |
94 | &src_tpm_addr, &error); | |
95 | g_assert_true(succ); | |
96 | ||
2b4ccb87 SB |
97 | succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid, |
98 | &dst_tpm_addr, &error); | |
e2f246a5 | 99 | g_assert_true(succ); |
2b4ccb87 SB |
100 | |
101 | tpm_util_migration_start_qemu(&src_qemu, &dst_qemu, | |
ea71a336 SB |
102 | src_tpm_addr, dst_tpm_addr, uri, |
103 | ifmodel); | |
2b4ccb87 SB |
104 | |
105 | tpm_util_startup(src_qemu, tx); | |
106 | tpm_util_pcrextend(src_qemu, tx); | |
107 | ||
108 | unsigned char tpm_pcrread_resp[] = | |
109 | "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" | |
110 | "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" | |
111 | "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" | |
112 | "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; | |
113 | tpm_util_pcrread(src_qemu, tx, tpm_pcrread_resp, | |
114 | sizeof(tpm_pcrread_resp)); | |
115 | ||
116 | tpm_util_migrate(src_qemu, uri); | |
117 | tpm_util_wait_for_migration_complete(src_qemu); | |
118 | ||
119 | tpm_util_pcrread(dst_qemu, tx, tpm_pcrread_resp, | |
120 | sizeof(tpm_pcrread_resp)); | |
121 | ||
122 | qtest_quit(dst_qemu); | |
123 | qtest_quit(src_qemu); | |
124 | ||
125 | tpm_util_swtpm_kill(dst_tpm_pid); | |
126 | if (dst_tpm_addr) { | |
127 | g_unlink(dst_tpm_addr->u.q_unix.path); | |
128 | qapi_free_SocketAddress(dst_tpm_addr); | |
129 | } | |
130 | ||
2b4ccb87 SB |
131 | tpm_util_swtpm_kill(src_tpm_pid); |
132 | if (src_tpm_addr) { | |
133 | g_unlink(src_tpm_addr->u.q_unix.path); | |
134 | qapi_free_SocketAddress(src_tpm_addr); | |
135 | } | |
136 | } |