]> git.proxmox.com Git - swtpm.git/blobdiff - tests/_test_save_load_state
packaging: track dbgsym package for swtpm-libs and swtpm-tools
[swtpm.git] / tests / _test_save_load_state
index 2eacf696c0177af367bcfbd51d9768fa0f2b0126..69ac93f7b8c0955f0b72c3de33ce534e5148c6d6 100755 (executable)
@@ -8,22 +8,29 @@ TESTDIR=${abs_top_testdir:-$(dirname "$0")}
 
 VTPM_NAME="${VTPM_NAME:-vtpm-test-save-load-state}"
 SWTPM_DEV_NAME="/dev/${VTPM_NAME}"
-export TPM_PATH=$(mktemp -d)
+export TPM_PATH="$(mktemp -d)" || exit 1
 STATE_FILE=$TPM_PATH/tpm-00.permall
 VOLATILE_STATE_FILE=$TPM_PATH/tpm-00.volatilestate
 MY_VOLATILE_STATE_FILE=$TPM_PATH/my.volatilestate
 MY_PERMANENT_STATE_FILE=$TPM_PATH/my.permanent
+MY_SAVESTATE_STATE_FILE=$TPM_PATH/my.savestate
 SWTPM_CMD_UNIX_PATH=${TPM_PATH}/unix-cmd.sock
 SWTPM_CTRL_UNIX_PATH=${TPM_PATH}/unix-ctrl.sock
 SWTPM_INTERFACE=${SWTPM_INTERFACE:-cuse}
+LINEAR_STATE_FILE=$TPM_PATH/linear-state
+BACKEND_PARAM=""
 
-logfile=$(mktemp)
+if [ ${SWTPM_TEST_LINEAR_FILE:-0} -ne 0 ]; then
+       BACKEND_PARAM="--tpmstate backend-uri=file://$LINEAR_STATE_FILE"
+fi
+
+logfile="$(mktemp)" || exit 1
 
 function cleanup()
 {
        pid=${SWTPM_PID}
        if [ -n "$pid" ]; then
-               kill -9 $pid
+               kill_quiet -9 $pid
        fi
        rm -f $logfile
        rm -rf $TPM_PATH
@@ -37,11 +44,12 @@ source ${TESTDIR}/common
 rm -f $STATE_FILE $VOLATILE_STATE_FILE 2>/dev/null
 
 run_swtpm ${SWTPM_INTERFACE} \
+       ${BACKEND_PARAM} \
        --log file=$logfile
 
-ps aux | grep $SWTPM | grep -v grep
+display_processes_by_name "$SWTPM"
 
-kill -0 ${SWTPM_PID}
+kill_quiet -0 ${SWTPM_PID}
 if [ $? -ne 0 ]; then
        echo "Error: ${SWTPM_INTERFACE} TPM did not start."
        echo "TPM Logfile:"
@@ -58,7 +66,7 @@ if [ $? -ne 0 ]; then
        exit 1
 fi
 
-kill -0 ${SWTPM_PID} 2>/dev/null
+kill_quiet -0 ${SWTPM_PID} 2>/dev/null
 if [ $? -ne 0 ]; then
        echo "Error: ${SWTPM_INTERFACE} TPM not running anymore after INIT."
        echo "TPM Logfile:"
@@ -67,7 +75,6 @@ if [ $? -ne 0 ]; then
 fi
 
 # Startup the TPM
-swtpm_open_cmddev ${SWTPM_INTERFACE} 100
 RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} '\x00\xC1\x00\x00\x00\x0C\x00\x00\x00\x99\x00\x01')
 exp=' 00 c4 00 00 00 0a 00 00 00 00'
 if [ "$RES" != "$exp" ]; then
@@ -86,7 +93,6 @@ if [ $? -ne 0 ]; then
 fi
 
 # Read PCR 17
-swtpm_open_cmddev ${SWTPM_INTERFACE} 100
 RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} '\x00\xC1\x00\x00\x00\x0E\x00\x00\x00\x15\x00\x00\x00\x11')
 exp=' 00 c4 00 00 00 1e 00 00 00 00 97 e9 76 e4 f2 2c d6 d2 4a fd 21 20 85 ad 7a 86 64 7f 2a e5'
 if [ "$RES" != "$exp" ]; then
@@ -97,7 +103,6 @@ if [ "$RES" != "$exp" ]; then
 fi
 
 # Assert physical presence
-swtpm_open_cmddev ${SWTPM_INTERFACE} 100
 RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} '\x00\xC1\x00\x00\x00\x0C\x40\x00\x00\x0A\x00\x20')
 exp=' 00 c4 00 00 00 0a 00 00 00 00'
 if [ "$RES" != "$exp" ]; then
@@ -115,7 +120,6 @@ tmp+='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
 tmp+='\x00\x00\x00\x00\x00\x17\x00\x01\x00\x01\x00\x00\x00\x00\x00\x0f'
 tmp+='\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
 tmp+='\x00\x00\x00\x00\x00'
-swtpm_open_cmddev ${SWTPM_INTERFACE} 100
 RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} $tmp)
 exp=' 00 c4 00 00 00 0a 00 00 00 00'
 if [ "$RES" != "$exp" ]; then
@@ -125,6 +129,16 @@ if [ "$RES" != "$exp" ]; then
        exit 1
 fi
 
+# Send SaveState command
+RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} '\x00\xC1\x00\x00\x00\x0a\x00\x00\x00\x98')
+exp=' 00 c4 00 00 00 0a 00 00 00 00'
+if [ "$RES" != "$exp" ]; then
+       echo "Error: (1) Did not get expected result from TPM_SaveState()"
+       echo "expected: $exp"
+       echo "received: $RES"
+       exit 1
+fi
+
 run_swtpm_ioctl ${SWTPM_INTERFACE} --save permanent $MY_PERMANENT_STATE_FILE
 if [ $? -ne 0 ]; then
        echo "Error: Could not write permanent state file $MY_PERMANENT_STATE_FILE."
@@ -155,6 +169,21 @@ if [ ! -r $MY_VOLATILE_STATE_FILE ]; then
 fi
 echo "Saved volatile state."
 
+run_swtpm_ioctl ${SWTPM_INTERFACE} --save savestate $MY_SAVESTATE_STATE_FILE
+if [ $? -ne 0 ]; then
+       echo "Error: Could not write savestate state file $MY_SAVESTATE_STATE_FILE."
+       echo "TPM Logfile:"
+       cat $logfile
+       exit 1
+fi
+if [ ! -r $MY_SAVESTATE_STATE_FILE ]; then
+       echo "Error: Savestate state file $MY_SAVESTATE_STATE_FILE does not exist."
+       echo "TPM Logfile:"
+       cat $logfile
+       exit 1
+fi
+echo "Saved savestate state."
+
 #ls -l $(dirname $MY_VOLATILE_STATE_FILE)/*
 #sha1sum $(dirname $MY_VOLATILE_STATE_FILE)/*
 
@@ -171,7 +200,7 @@ if [ $? -ne 0 ]; then
        exit 1
 fi
 
-kill -0 ${SWTPM_PID}
+kill_quiet -0 ${SWTPM_PID}
 if [ $? -ne 0 ]; then
        echo "Error (2): ${SWTPM_INTERFACE} TPM is not running anymore."
        echo "TPM Logfile:"
@@ -198,6 +227,15 @@ if [ $? -ne 0 ]; then
 fi
 echo "Loaded volatile state."
 
+run_swtpm_ioctl ${SWTPM_INTERFACE} --load savestate $MY_SAVESTATE_STATE_FILE
+if [ $? -ne 0 ]; then
+       echo "Could not load savestate state into vTPM"
+       echo "TPM Logfile:"
+       cat $logfile
+       exit 1
+fi
+echo "Loaded savestate state."
+
 #ls -l $(dirname $MY_VOLATILE_STATE_FILE)/*
 #sha1sum $(dirname $MY_VOLATILE_STATE_FILE)/*
 
@@ -219,7 +257,6 @@ if [ -r $VOLATILE_STATE_FILE ]; then
 fi
 
 # Read the PCR again ...
-swtpm_open_cmddev ${SWTPM_INTERFACE} 100
 RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} '\x00\xC1\x00\x00\x00\x0E\x00\x00\x00\x15\x00\x00\x00\x11')
 exp=' 00 c4 00 00 00 1e 00 00 00 00 97 e9 76 e4 f2 2c d6 d2 4a fd 21 20 85 ad 7a 86 64 7f 2a e5'
 if [ "$RES" != "$exp" ]; then
@@ -238,7 +275,7 @@ if [ $? -ne 0 ]; then
        exit 1
 fi
 
-if [ ! -r $VOLATILE_STATE_FILE ]; then
+if [ ${SWTPM_TEST_LINEAR_FILE:-0} -eq 0 ] && [ ! -r $VOLATILE_STATE_FILE ]; then
        echo "Error: Volatile state file $VOLATILE_STATE_FILE does not exist."
        echo "TPM Logfile:"
        cat $logfile
@@ -263,7 +300,6 @@ if [ -r $VOLATILE_STATE_FILE ]; then
 fi
 
 # Read the PCR again ...
-swtpm_open_cmddev ${SWTPM_INTERFACE} 100
 RES=$(swtpm_cmd_tx ${SWTPM_INTERFACE} '\x00\xC1\x00\x00\x00\x0E\x00\x00\x00\x15\x00\x00\x00\x11')
 exp=' 00 c4 00 00 00 1e 00 00 00 00 97 e9 76 e4 f2 2c d6 d2 4a fd 21 20 85 ad 7a 86 64 7f 2a e5'
 if [ "$RES" != "$exp" ]; then
@@ -283,18 +319,27 @@ if [ $? -ne 0 ]; then
        exit 1
 fi
 
-if wait_process_gone ${SWTPM_PID} 1; then
+if wait_process_gone ${SWTPM_PID} 4; then
        echo "Error: ${SWTPM_INTERFACE} TPM should not be running anymore."
        echo "TPM Logfile:"
        cat $logfile
        exit 1
 fi
 
-if [ ! -e $STATE_FILE ]; then
-       echo "Error: TPM state file $STATE_FILE does not exist."
-       echo "TPM Logfile:"
-       cat $logfile
-       exit 1
+if [ ${SWTPM_TEST_LINEAR_FILE:-0} -ne 0 ]; then
+       if [ ! -e $LINEAR_STATE_FILE ]; then
+               echo "Error: TPM state file $LINEAR_STATE_FILE does not exist."
+               echo "TPM Logfile:"
+               cat $logfile
+               exit 1
+       fi
+else
+       if [ ! -e $STATE_FILE ]; then
+               echo "Error: TPM state file $STATE_FILE does not exist."
+               echo "TPM Logfile:"
+               cat $logfile
+               exit 1
+       fi
 fi
 
 echo "OK"