12b4ccb87SStefan Berger /* 22b4ccb87SStefan Berger * QTest TPM commont test code 32b4ccb87SStefan Berger * 42b4ccb87SStefan Berger * Copyright (c) 2018 IBM Corporation 52b4ccb87SStefan Berger * Copyright (c) 2018 Red Hat, Inc. 62b4ccb87SStefan Berger * 72b4ccb87SStefan Berger * Authors: 82b4ccb87SStefan Berger * Stefan Berger <stefanb@linux.vnet.ibm.com> 92b4ccb87SStefan Berger * Marc-André Lureau <marcandre.lureau@redhat.com> 102b4ccb87SStefan Berger * 112b4ccb87SStefan Berger * This work is licensed under the terms of the GNU GPL, version 2 or later. 122b4ccb87SStefan Berger * See the COPYING file in the top-level directory. 132b4ccb87SStefan Berger */ 142b4ccb87SStefan Berger 152b4ccb87SStefan Berger #include "qemu/osdep.h" 162b4ccb87SStefan Berger #include <glib/gstdio.h> 172b4ccb87SStefan Berger 182b4ccb87SStefan Berger #include "libqtest.h" 192b4ccb87SStefan Berger #include "tpm-tests.h" 202b4ccb87SStefan Berger 21*e2f246a5SMarc-André Lureau static bool 22*e2f246a5SMarc-André Lureau tpm_test_swtpm_skip(void) 23*e2f246a5SMarc-André Lureau { 24*e2f246a5SMarc-André Lureau if (!tpm_util_swtpm_has_tpm2()) { 25*e2f246a5SMarc-André Lureau fprintf(stderr, "swtpm not in PATH or missing --tpm2 support; "); 26*e2f246a5SMarc-André Lureau return true; 27*e2f246a5SMarc-André Lureau } 28*e2f246a5SMarc-André Lureau 29*e2f246a5SMarc-André Lureau return false; 30*e2f246a5SMarc-André Lureau } 31*e2f246a5SMarc-André Lureau 32ea71a336SStefan Berger void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx, 33ea71a336SStefan Berger const char *ifmodel) 342b4ccb87SStefan Berger { 352b4ccb87SStefan Berger char *args = NULL; 362b4ccb87SStefan Berger QTestState *s; 372b4ccb87SStefan Berger SocketAddress *addr = NULL; 382b4ccb87SStefan Berger gboolean succ; 392b4ccb87SStefan Berger GPid swtpm_pid; 402b4ccb87SStefan Berger GError *error = NULL; 412b4ccb87SStefan Berger 42*e2f246a5SMarc-André Lureau if (tpm_test_swtpm_skip()) { 432b4ccb87SStefan Berger return; 442b4ccb87SStefan Berger } 452b4ccb87SStefan Berger 46*e2f246a5SMarc-André Lureau succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error); 47*e2f246a5SMarc-André Lureau g_assert_true(succ); 48*e2f246a5SMarc-André Lureau 492b4ccb87SStefan Berger args = g_strdup_printf( 502b4ccb87SStefan Berger "-chardev socket,id=chr,path=%s " 512b4ccb87SStefan Berger "-tpmdev emulator,id=dev,chardev=chr " 52ea71a336SStefan Berger "-device %s,tpmdev=dev", 53ea71a336SStefan Berger addr->u.q_unix.path, ifmodel); 542b4ccb87SStefan Berger 552b4ccb87SStefan Berger s = qtest_start(args); 562b4ccb87SStefan Berger g_free(args); 572b4ccb87SStefan Berger 582b4ccb87SStefan Berger tpm_util_startup(s, tx); 592b4ccb87SStefan Berger tpm_util_pcrextend(s, tx); 602b4ccb87SStefan Berger 612b4ccb87SStefan Berger unsigned char tpm_pcrread_resp[] = 622b4ccb87SStefan Berger "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" 632b4ccb87SStefan Berger "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" 642b4ccb87SStefan Berger "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" 652b4ccb87SStefan Berger "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; 662b4ccb87SStefan Berger tpm_util_pcrread(s, tx, tpm_pcrread_resp, 672b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 682b4ccb87SStefan Berger 692b4ccb87SStefan Berger qtest_end(); 702b4ccb87SStefan Berger tpm_util_swtpm_kill(swtpm_pid); 712b4ccb87SStefan Berger 722b4ccb87SStefan Berger if (addr) { 732b4ccb87SStefan Berger g_unlink(addr->u.q_unix.path); 742b4ccb87SStefan Berger qapi_free_SocketAddress(addr); 752b4ccb87SStefan Berger } 762b4ccb87SStefan Berger } 772b4ccb87SStefan Berger 782b4ccb87SStefan Berger void tpm_test_swtpm_migration_test(const char *src_tpm_path, 792b4ccb87SStefan Berger const char *dst_tpm_path, 80ea71a336SStefan Berger const char *uri, tx_func *tx, 81ea71a336SStefan Berger const char *ifmodel) 822b4ccb87SStefan Berger { 832b4ccb87SStefan Berger gboolean succ; 842b4ccb87SStefan Berger GPid src_tpm_pid, dst_tpm_pid; 852b4ccb87SStefan Berger SocketAddress *src_tpm_addr = NULL, *dst_tpm_addr = NULL; 862b4ccb87SStefan Berger GError *error = NULL; 872b4ccb87SStefan Berger QTestState *src_qemu, *dst_qemu; 882b4ccb87SStefan Berger 89*e2f246a5SMarc-André Lureau if (tpm_test_swtpm_skip()) { 902b4ccb87SStefan Berger return; 912b4ccb87SStefan Berger } 922b4ccb87SStefan Berger 93*e2f246a5SMarc-André Lureau succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid, 94*e2f246a5SMarc-André Lureau &src_tpm_addr, &error); 95*e2f246a5SMarc-André Lureau g_assert_true(succ); 96*e2f246a5SMarc-André Lureau 972b4ccb87SStefan Berger succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid, 982b4ccb87SStefan Berger &dst_tpm_addr, &error); 99*e2f246a5SMarc-André Lureau g_assert_true(succ); 1002b4ccb87SStefan Berger 1012b4ccb87SStefan Berger tpm_util_migration_start_qemu(&src_qemu, &dst_qemu, 102ea71a336SStefan Berger src_tpm_addr, dst_tpm_addr, uri, 103ea71a336SStefan Berger ifmodel); 1042b4ccb87SStefan Berger 1052b4ccb87SStefan Berger tpm_util_startup(src_qemu, tx); 1062b4ccb87SStefan Berger tpm_util_pcrextend(src_qemu, tx); 1072b4ccb87SStefan Berger 1082b4ccb87SStefan Berger unsigned char tpm_pcrread_resp[] = 1092b4ccb87SStefan Berger "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" 1102b4ccb87SStefan Berger "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" 1112b4ccb87SStefan Berger "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" 1122b4ccb87SStefan Berger "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; 1132b4ccb87SStefan Berger tpm_util_pcrread(src_qemu, tx, tpm_pcrread_resp, 1142b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 1152b4ccb87SStefan Berger 1162b4ccb87SStefan Berger tpm_util_migrate(src_qemu, uri); 1172b4ccb87SStefan Berger tpm_util_wait_for_migration_complete(src_qemu); 1182b4ccb87SStefan Berger 1192b4ccb87SStefan Berger tpm_util_pcrread(dst_qemu, tx, tpm_pcrread_resp, 1202b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 1212b4ccb87SStefan Berger 1222b4ccb87SStefan Berger qtest_quit(dst_qemu); 1232b4ccb87SStefan Berger qtest_quit(src_qemu); 1242b4ccb87SStefan Berger 1252b4ccb87SStefan Berger tpm_util_swtpm_kill(dst_tpm_pid); 1262b4ccb87SStefan Berger if (dst_tpm_addr) { 1272b4ccb87SStefan Berger g_unlink(dst_tpm_addr->u.q_unix.path); 1282b4ccb87SStefan Berger qapi_free_SocketAddress(dst_tpm_addr); 1292b4ccb87SStefan Berger } 1302b4ccb87SStefan Berger 1312b4ccb87SStefan Berger tpm_util_swtpm_kill(src_tpm_pid); 1322b4ccb87SStefan Berger if (src_tpm_addr) { 1332b4ccb87SStefan Berger g_unlink(src_tpm_addr->u.q_unix.path); 1342b4ccb87SStefan Berger qapi_free_SocketAddress(src_tpm_addr); 1352b4ccb87SStefan Berger } 1362b4ccb87SStefan Berger } 137