#!/usr/bin/env bash # For the license, see the LICENSE file in the root directory. if [ "$(uname -s)" != "Linux" ]; then # Due to netstat echo "This test only runs only Linux." exit 77 fi ROOT=${abs_top_builddir:-$(dirname "$0")/..} TESTDIR=${abs_top_testdir:=$(dirname "$0")} # need SWTPM to be set source ${TESTDIR}/common skip_test_no_tpm12 "${SWTPM_EXE}" TPMDIR="$(mktemp -d)" || exit 1 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 } PORT=11234 export TCSD_TCP_DEVICE_HOSTNAME=localhost export TCSD_TCP_DEVICE_PORT=$PORT export TCSD_USE_TCP_DEVICE=1 # Test 1: test port and directory command line parameters; use log level 20 FILEMODE=641 exec 100<>$LOG_FILE $SWTPM_EXE socket \ -p $PORT \ --tpmstate dir=$TPMDIR,mode=$FILEMODE \ --pid file=$PID_FILE \ --log fd=100,level=20 \ --flags not-need-init \ ${SWTPM_TEST_SECCOMP_OPT} & PID=$! exec 100>&- if wait_port_open $PORT $PID 4; then echo "Test 1 failed: TPM did not open port $PORT" exit 1 fi kill_quiet -0 $PID if [ $? -ne 0 ]; then echo "Test 1 failed: TPM process not running" exit 1 fi if wait_for_file $PID_FILE 3; then echo "Error: ${SWTPM_INTERFACE} TPM did not write pidfile." exit 1 fi validate_pidfile $PID $PID_FILE ${SWTPM_BIOS} &>/dev/null if [ $? -ne 0 ]; then echo "Test 1 failed: ${SWTPM_BIOS} did not work" exit 1 fi filemode=$(get_filemode ${TPMDIR}/tpm-00.permall) if [ "$filemode" != "$FILEMODE" ]; then echo "Filemode bits are wrong" echo "Expected: $FILEMODE" echo "Actual : $filemode" exit 1 fi check_logfile_patterns_level_20 $LOG_FILE rm -f $LOG_FILE kill_quiet -SIGTERM $PID &>/dev/null wait_process_gone $PID 2 exec 20<&1-; exec 21<&2- kill_quiet -0 $PID &>/dev/null RES=$? exec 1<&20-; exec 2<&21- if [ $RES -eq 0 ]; then kill_quiet -SIGKILL $PID echo "Test 1 failed: TPM process did not terminate on SIGTERM" exit 1 fi echo "Test 1 passed" cleanup # Test 2: test port, directory and terminate command line parameters (-t) # that causes the swtpm process to exit upon connection close TPMDIR="$(mktemp -d)" || exit 1 $SWTPM_EXE socket \ --flags not-need-init \ -p $PORT \ --tpmstate dir=$TPMDIR \ -t \ ${SWTPM_TEST_SECCOMP_OPT} &>/dev/null & PID=$! if wait_port_open $PORT $PID 4; then echo "Test 1 failed: TPM did not open port $PORT" exit fi exec 20<&1-; exec 21<&2- kill_quiet -0 $PID RES=$? exec 1<&20-; exec 2<&21- if [ $RES -ne 0 ]; then echo "Test 2 failed: TPM process not running" exit 1 fi exec 100<>/dev/tcp/localhost/$PORT if [ $? -ne 0 ]; then echo "Test 2 failed: Could not connect to TPM" exit 1 fi exec 100>&- if wait_port_closed $PORT $PID 8; then echo "Test 2 failed: TPM did not close port" exit 1 fi if wait_process_gone $PID 4; then echo "Test 2 failed: TPM process did not shut down" exit 1 fi exec 20<&1-; exec 21<&2- kill_quiet -0 $PID RES=$? exec 1<&20-; exec 2<&21- if [ $RES -eq 0 ]; then kill_quiet -SIGKILL $PID echo "Test 2 failed: TPM process did not terminate on connection loss" exit 1 fi echo "Test 2 passed" # Test 3: test --fd= and --ctrl type=unxio,clientfd= # The python script execs swtpm with client sockets exec 20<&1-; exec 21<&2- LOG=$(PID_FILE=$TPMDIR/swtpm.pid SWTPM_EXE=$SWTPM_EXE TPMDIR=$TPMDIR exec $TESTDIR/test_clientfds.py) RES=$? exec 1<&20-; exec 2<&21- if [ $RES -ne 0 ]; then echo "Test 3 failed: $LOG" exit 1 fi echo "Test 3 passed" cleanup # Test 4: --tpmstate backend-uri=dir:// parameter test TPMDIR="$(mktemp -d)" || exit 1 PID_FILE=$TPMDIR/${SWTPM}.pid FILEMODE=641 $SWTPM_EXE socket \ -p $PORT \ --tpmstate backend-uri=dir://$TPMDIR,mode=$FILEMODE \ --pid file=$PID_FILE \ --flags not-need-init \ ${SWTPM_TEST_SECCOMP_OPT} & PID=$! if wait_port_open $PORT $PID 4; then echo "Test 4 failed: TPM did not open port $PORT" exit 1 fi kill_quiet -0 $PID if [ $? -ne 0 ]; then echo "Test 4 failed: TPM process not running" exit 1 fi if wait_for_file $PID_FILE 3; then echo "Error: ${SWTPM_INTERFACE} TPM did not write pidfile." exit 1 fi validate_pidfile $PID $PID_FILE ${SWTPM_BIOS} &>/dev/null if [ $? -ne 0 ]; then echo "Test 4 failed: ${SWTPM_BIOS} did not work" exit 1 fi filemode=$(get_filemode ${TPMDIR}/tpm-00.permall) if [ "$filemode" != "$FILEMODE" ]; then echo "Filemode bits are wrong" echo "Expected: $FILEMODE" echo "Actual : $filemode" exit 1 fi kill_quiet -SIGTERM $PID &>/dev/null wait_process_gone $PID 2 exec 20<&1-; exec 21<&2- kill_quiet -0 $PID &>/dev/null RES=$? exec 1<&20-; exec 2<&21- if [ $RES -eq 0 ]; then kill_quiet -SIGKILL $PID echo "Test 4 failed: TPM process did not terminate on SIGTERM" exit 1 fi echo "Test 4 passed" cleanup exit 0