| #!/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 |