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 18dd210749SThomas Huth #include "libqtest-single.h" 192b4ccb87SStefan Berger #include "tpm-tests.h" 202b4ccb87SStefan Berger 21e2f246a5SMarc-André Lureau static bool 22e2f246a5SMarc-André Lureau tpm_test_swtpm_skip(void) 23e2f246a5SMarc-André Lureau { 24e2f246a5SMarc-André Lureau if (!tpm_util_swtpm_has_tpm2()) { 258a17fbf6SThomas Huth g_test_skip("swtpm not in PATH or missing --tpm2 support"); 26e2f246a5SMarc-André Lureau return true; 27e2f246a5SMarc-André Lureau } 28e2f246a5SMarc-André Lureau 29e2f246a5SMarc-André Lureau return false; 30e2f246a5SMarc-André Lureau } 31e2f246a5SMarc-André Lureau 32ea71a336SStefan Berger void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx, 33*551cabdfSEric Auger const char *ifmodel, const char *machine_options) 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 42e2f246a5SMarc-André Lureau if (tpm_test_swtpm_skip()) { 432b4ccb87SStefan Berger return; 442b4ccb87SStefan Berger } 452b4ccb87SStefan Berger 46e2f246a5SMarc-André Lureau succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error); 47e2f246a5SMarc-André Lureau g_assert_true(succ); 48e2f246a5SMarc-André Lureau 492b4ccb87SStefan Berger args = g_strdup_printf( 50*551cabdfSEric Auger "%s " 512b4ccb87SStefan Berger "-chardev socket,id=chr,path=%s " 522b4ccb87SStefan Berger "-tpmdev emulator,id=dev,chardev=chr " 53ea71a336SStefan Berger "-device %s,tpmdev=dev", 54*551cabdfSEric Auger machine_options ? : "", addr->u.q_unix.path, ifmodel); 552b4ccb87SStefan Berger 562b4ccb87SStefan Berger s = qtest_start(args); 572b4ccb87SStefan Berger g_free(args); 582b4ccb87SStefan Berger 592b4ccb87SStefan Berger tpm_util_startup(s, tx); 602b4ccb87SStefan Berger tpm_util_pcrextend(s, tx); 612b4ccb87SStefan Berger 622b4ccb87SStefan Berger unsigned char tpm_pcrread_resp[] = 632b4ccb87SStefan Berger "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" 642b4ccb87SStefan Berger "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" 652b4ccb87SStefan Berger "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" 662b4ccb87SStefan Berger "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; 672b4ccb87SStefan Berger tpm_util_pcrread(s, tx, tpm_pcrread_resp, 682b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 692b4ccb87SStefan Berger 702b4ccb87SStefan Berger qtest_end(); 712b4ccb87SStefan Berger tpm_util_swtpm_kill(swtpm_pid); 722b4ccb87SStefan Berger 732b4ccb87SStefan Berger if (addr) { 742b4ccb87SStefan Berger g_unlink(addr->u.q_unix.path); 752b4ccb87SStefan Berger qapi_free_SocketAddress(addr); 762b4ccb87SStefan Berger } 772b4ccb87SStefan Berger } 782b4ccb87SStefan Berger 792b4ccb87SStefan Berger void tpm_test_swtpm_migration_test(const char *src_tpm_path, 802b4ccb87SStefan Berger const char *dst_tpm_path, 81ea71a336SStefan Berger const char *uri, tx_func *tx, 82*551cabdfSEric Auger const char *ifmodel, 83*551cabdfSEric Auger const char *machine_options) 842b4ccb87SStefan Berger { 852b4ccb87SStefan Berger gboolean succ; 862b4ccb87SStefan Berger GPid src_tpm_pid, dst_tpm_pid; 872b4ccb87SStefan Berger SocketAddress *src_tpm_addr = NULL, *dst_tpm_addr = NULL; 882b4ccb87SStefan Berger GError *error = NULL; 892b4ccb87SStefan Berger QTestState *src_qemu, *dst_qemu; 902b4ccb87SStefan Berger 91e2f246a5SMarc-André Lureau if (tpm_test_swtpm_skip()) { 922b4ccb87SStefan Berger return; 932b4ccb87SStefan Berger } 942b4ccb87SStefan Berger 95e2f246a5SMarc-André Lureau succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid, 96e2f246a5SMarc-André Lureau &src_tpm_addr, &error); 97e2f246a5SMarc-André Lureau g_assert_true(succ); 98e2f246a5SMarc-André Lureau 992b4ccb87SStefan Berger succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid, 1002b4ccb87SStefan Berger &dst_tpm_addr, &error); 101e2f246a5SMarc-André Lureau g_assert_true(succ); 1022b4ccb87SStefan Berger 1032b4ccb87SStefan Berger tpm_util_migration_start_qemu(&src_qemu, &dst_qemu, 104ea71a336SStefan Berger src_tpm_addr, dst_tpm_addr, uri, 105*551cabdfSEric Auger ifmodel, machine_options); 1062b4ccb87SStefan Berger 1072b4ccb87SStefan Berger tpm_util_startup(src_qemu, tx); 1082b4ccb87SStefan Berger tpm_util_pcrextend(src_qemu, tx); 1092b4ccb87SStefan Berger 1102b4ccb87SStefan Berger unsigned char tpm_pcrread_resp[] = 1112b4ccb87SStefan Berger "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" 1122b4ccb87SStefan Berger "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" 1132b4ccb87SStefan Berger "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" 1142b4ccb87SStefan Berger "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; 1152b4ccb87SStefan Berger tpm_util_pcrread(src_qemu, tx, tpm_pcrread_resp, 1162b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 1172b4ccb87SStefan Berger 1182b4ccb87SStefan Berger tpm_util_migrate(src_qemu, uri); 1192b4ccb87SStefan Berger tpm_util_wait_for_migration_complete(src_qemu); 1202b4ccb87SStefan Berger 1212b4ccb87SStefan Berger tpm_util_pcrread(dst_qemu, tx, tpm_pcrread_resp, 1222b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 1232b4ccb87SStefan Berger 1242b4ccb87SStefan Berger qtest_quit(dst_qemu); 1252b4ccb87SStefan Berger qtest_quit(src_qemu); 1262b4ccb87SStefan Berger 1272b4ccb87SStefan Berger tpm_util_swtpm_kill(dst_tpm_pid); 1282b4ccb87SStefan Berger if (dst_tpm_addr) { 1292b4ccb87SStefan Berger g_unlink(dst_tpm_addr->u.q_unix.path); 1302b4ccb87SStefan Berger qapi_free_SocketAddress(dst_tpm_addr); 1312b4ccb87SStefan Berger } 1322b4ccb87SStefan Berger 1332b4ccb87SStefan Berger tpm_util_swtpm_kill(src_tpm_pid); 1342b4ccb87SStefan Berger if (src_tpm_addr) { 1352b4ccb87SStefan Berger g_unlink(src_tpm_addr->u.q_unix.path); 1362b4ccb87SStefan Berger qapi_free_SocketAddress(src_tpm_addr); 1372b4ccb87SStefan Berger } 1382b4ccb87SStefan Berger } 139