| #!/usr/bin/env bash |
| |
| # For the license, see the LICENSE file in the root directory. |
| |
| # shellcheck disable=SC2097,SC2098 |
| |
| 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:+${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 |
| |
| if ! kill_quiet -0 $PID; 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" |
| |
| if ! ${SWTPM_BIOS} &>/dev/null; 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:+${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 |
| |
| if ! exec 100<>/dev/tcp/localhost/$PORT; 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:+${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 |
| |
| if ! kill_quiet -0 "$PID"; 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" |
| |
| if ! ${SWTPM_BIOS} &>/dev/null; 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 |