#!/usr/bin/env bash # For the license, see the LICENSE file in the root directory. ROOT=${abs_top_builddir:-$(dirname "$0")/..} TESTDIR=${abs_top_testdir:-$(dirname "$0")} TPMDIR="$(mktemp -d)" || exit 1 SWTPM_CTRL_UNIX_PATH=$TPMDIR/sock PID_FILE=$TPMDIR/swtpm.pid LOG_FILE=$TPMDIR/swtpm.log source "${TESTDIR}/test_common" trap "cleanup" SIGTERM EXIT function cleanup() { rm -rf "$TPMDIR" if [ -n "$PID" ]; then kill_quiet -SIGTERM "$PID" 2>/dev/null fi } SWTPM_INTERFACE=socket+unix source "${TESTDIR}/common" skip_test_no_chardev "${SWTPM_EXE}" skip_test_no_tpm12 "${SWTPM_EXE}" # Test 1: test the control channel on the chardev tpm exec 100<>/dev/ptmx $SWTPM_EXE chardev \ --fd 100 \ --tpmstate "dir=$TPMDIR" \ --pid "file=$PID_FILE" \ --ctrl "type=unixio,path=$SWTPM_CTRL_UNIX_PATH" \ --log "file=$LOG_FILE,level=20" \ ${SWTPM_TEST_SECCOMP_OPT:+${SWTPM_TEST_SECCOMP_OPT}} & exec 100>&- if wait_for_file "$PID_FILE" 3; then echo "Error: Chardev TPM did not write pidfile." exit 1 fi PID="$(cat "$PID_FILE")" # Get the capability bits: CMD_GET_CAPABILITY = 0x00 00 00 01 res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\x00\x01')" exp=" 00 00 00 00 00 01 7f ff" if [ "$res" != "$exp" ]; then echo "Error: Unexpected response from CMD_GET_CAPABILITY:" echo " actual : $res" echo " expected: $exp" exit 1 fi # Send TPM_Init to the TPM: CMD_INIT = 0x00 00 00 02 + flags res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\x00\x02\x00\x00\x00\x00')" exp=" 00 00 00 00" if [ "$res" != "$exp" ]; then echo "Error: Unexpected response from CMD_INIT:" echo " actual : $res" echo " expected: $exp" exit 1 fi # Send unknown command to the TPM res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\xff\xff')" exp=" 00 00 00 0a" if [ "$res" != "$exp" ]; then echo "Error: Unexpected response from sending unsupported command:" echo " actual : $res" echo " expected: $exp" exit 1 fi # Save the volatile state: CMD_STORE_VOLATILE = 0x00 00 00 0a res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\x00\x0a')" exp=" 00 00 00 00" if [ "$res" != "$exp" ]; then echo "Error: Unexpected response from CMD_STORE_VOLATILE:" echo " actual : $res" echo " expected: $exp" exit 1 fi if [ ! -r "$TPMDIR/tpm-00.volatilestate" ]; then echo "Error: Socket TPM: Did not write volatile state file" exit 1 fi # Send stop command to the TPM: CMD_STOP = 00 00 00 0e res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\x00\x0e')" exp=" 00 00 00 00" if [ "$res" != "$exp" ]; then echo "Error: Socket TPM: Unexpected response from CMD_STOP:" echo " actual : $res" echo " expected: $exp" exit 1 fi # Send get config command to the TPM: CMD_GET_CONFIG = 00 00 00 0f res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\x00\x0f')" exp=" 00 00 00 00 00 00 00 00" if [ "$res" != "$exp" ]; then echo "Error: Socket TPM: Unexpected response from CMD_GET_CONFIG:" echo " actual : $res" echo " expected: $exp" exit 1 fi # Send shutdown command to the TPM: CMD_SHUTDOWN = 00 00 00 03 res="$(swtpm_ctrl_tx "${SWTPM_INTERFACE}" '\x00\x00\x00\x03')" exp=" 00 00 00 00" if [ "$res" != "$exp" ]; then echo "Error: Unexpected response from CMD_SHUTDOWN:" echo " actual : $res" echo " expected: $exp" exit 1 fi if wait_process_gone "${PID}" 4; then echo "Error: TPM should not be running anymore." exit 1 fi if wait_file_gone "$PID_FILE" 2; then echo "Error: TPM should have removed PID file by now." exit 1 fi check_logfile_patterns_level_20 "$LOG_FILE" rm -f "$LOG_FILE" echo "OK"