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*ea71a336SStefan Berger void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx, 22*ea71a336SStefan Berger const char *ifmodel) 232b4ccb87SStefan Berger { 242b4ccb87SStefan Berger char *args = NULL; 252b4ccb87SStefan Berger QTestState *s; 262b4ccb87SStefan Berger SocketAddress *addr = NULL; 272b4ccb87SStefan Berger gboolean succ; 282b4ccb87SStefan Berger GPid swtpm_pid; 292b4ccb87SStefan Berger GError *error = NULL; 302b4ccb87SStefan Berger 312b4ccb87SStefan Berger succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error); 322b4ccb87SStefan Berger /* succ may be false if swtpm is not available */ 332b4ccb87SStefan Berger if (!succ) { 342b4ccb87SStefan Berger return; 352b4ccb87SStefan Berger } 362b4ccb87SStefan Berger 372b4ccb87SStefan Berger args = g_strdup_printf( 382b4ccb87SStefan Berger "-chardev socket,id=chr,path=%s " 392b4ccb87SStefan Berger "-tpmdev emulator,id=dev,chardev=chr " 40*ea71a336SStefan Berger "-device %s,tpmdev=dev", 41*ea71a336SStefan Berger addr->u.q_unix.path, ifmodel); 422b4ccb87SStefan Berger 432b4ccb87SStefan Berger s = qtest_start(args); 442b4ccb87SStefan Berger g_free(args); 452b4ccb87SStefan Berger 462b4ccb87SStefan Berger tpm_util_startup(s, tx); 472b4ccb87SStefan Berger tpm_util_pcrextend(s, tx); 482b4ccb87SStefan Berger 492b4ccb87SStefan Berger unsigned char tpm_pcrread_resp[] = 502b4ccb87SStefan Berger "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" 512b4ccb87SStefan Berger "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" 522b4ccb87SStefan Berger "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" 532b4ccb87SStefan Berger "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; 542b4ccb87SStefan Berger tpm_util_pcrread(s, tx, tpm_pcrread_resp, 552b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 562b4ccb87SStefan Berger 572b4ccb87SStefan Berger qtest_end(); 582b4ccb87SStefan Berger tpm_util_swtpm_kill(swtpm_pid); 592b4ccb87SStefan Berger 602b4ccb87SStefan Berger if (addr) { 612b4ccb87SStefan Berger g_unlink(addr->u.q_unix.path); 622b4ccb87SStefan Berger qapi_free_SocketAddress(addr); 632b4ccb87SStefan Berger } 642b4ccb87SStefan Berger } 652b4ccb87SStefan Berger 662b4ccb87SStefan Berger void tpm_test_swtpm_migration_test(const char *src_tpm_path, 672b4ccb87SStefan Berger const char *dst_tpm_path, 68*ea71a336SStefan Berger const char *uri, tx_func *tx, 69*ea71a336SStefan Berger const char *ifmodel) 702b4ccb87SStefan Berger { 712b4ccb87SStefan Berger gboolean succ; 722b4ccb87SStefan Berger GPid src_tpm_pid, dst_tpm_pid; 732b4ccb87SStefan Berger SocketAddress *src_tpm_addr = NULL, *dst_tpm_addr = NULL; 742b4ccb87SStefan Berger GError *error = NULL; 752b4ccb87SStefan Berger QTestState *src_qemu, *dst_qemu; 762b4ccb87SStefan Berger 772b4ccb87SStefan Berger succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid, 782b4ccb87SStefan Berger &src_tpm_addr, &error); 792b4ccb87SStefan Berger /* succ may be false if swtpm is not available */ 802b4ccb87SStefan Berger if (!succ) { 812b4ccb87SStefan Berger return; 822b4ccb87SStefan Berger } 832b4ccb87SStefan Berger 842b4ccb87SStefan Berger succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid, 852b4ccb87SStefan Berger &dst_tpm_addr, &error); 862b4ccb87SStefan Berger /* succ may be false if swtpm is not available */ 872b4ccb87SStefan Berger if (!succ) { 882b4ccb87SStefan Berger goto err_src_tpm_kill; 892b4ccb87SStefan Berger } 902b4ccb87SStefan Berger 912b4ccb87SStefan Berger tpm_util_migration_start_qemu(&src_qemu, &dst_qemu, 92*ea71a336SStefan Berger src_tpm_addr, dst_tpm_addr, uri, 93*ea71a336SStefan Berger ifmodel); 942b4ccb87SStefan Berger 952b4ccb87SStefan Berger tpm_util_startup(src_qemu, tx); 962b4ccb87SStefan Berger tpm_util_pcrextend(src_qemu, tx); 972b4ccb87SStefan Berger 982b4ccb87SStefan Berger unsigned char tpm_pcrread_resp[] = 992b4ccb87SStefan Berger "\x80\x01\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00" 1002b4ccb87SStefan Berger "\x00\x01\x00\x0b\x03\x00\x04\x00\x00\x00\x00\x01\x00\x20\xf6\x85" 1012b4ccb87SStefan Berger "\x98\xe5\x86\x8d\xe6\x8b\x97\x29\x99\x60\xf2\x71\x7d\x17\x67\x89" 1022b4ccb87SStefan Berger "\xa4\x2f\x9a\xae\xa8\xc7\xb7\xaa\x79\xa8\x62\x56\xc1\xde"; 1032b4ccb87SStefan Berger tpm_util_pcrread(src_qemu, tx, tpm_pcrread_resp, 1042b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 1052b4ccb87SStefan Berger 1062b4ccb87SStefan Berger tpm_util_migrate(src_qemu, uri); 1072b4ccb87SStefan Berger tpm_util_wait_for_migration_complete(src_qemu); 1082b4ccb87SStefan Berger 1092b4ccb87SStefan Berger tpm_util_pcrread(dst_qemu, tx, tpm_pcrread_resp, 1102b4ccb87SStefan Berger sizeof(tpm_pcrread_resp)); 1112b4ccb87SStefan Berger 1122b4ccb87SStefan Berger qtest_quit(dst_qemu); 1132b4ccb87SStefan Berger qtest_quit(src_qemu); 1142b4ccb87SStefan Berger 1152b4ccb87SStefan Berger tpm_util_swtpm_kill(dst_tpm_pid); 1162b4ccb87SStefan Berger if (dst_tpm_addr) { 1172b4ccb87SStefan Berger g_unlink(dst_tpm_addr->u.q_unix.path); 1182b4ccb87SStefan Berger qapi_free_SocketAddress(dst_tpm_addr); 1192b4ccb87SStefan Berger } 1202b4ccb87SStefan Berger 1212b4ccb87SStefan Berger err_src_tpm_kill: 1222b4ccb87SStefan Berger tpm_util_swtpm_kill(src_tpm_pid); 1232b4ccb87SStefan Berger if (src_tpm_addr) { 1242b4ccb87SStefan Berger g_unlink(src_tpm_addr->u.q_unix.path); 1252b4ccb87SStefan Berger qapi_free_SocketAddress(src_tpm_addr); 1262b4ccb87SStefan Berger } 1272b4ccb87SStefan Berger } 128