#!/bin/bash

# For the license, see the LICENSE file in the root directory.
#set -x

ROOT=${abs_top_builddir:-$(pwd)/..}
TESTDIR=${abs_top_testdir:-$(dirname "$0")}

SWTPM_BIOS=$ROOT/src/swtpm_bios/swtpm_bios
VTPM_NAME="vtpm-test-swtpm-bios"
SWTPM_DEV_NAME="/dev/${VTPM_NAME}"
TPM_PATH="$(mktemp -d)" || exit 1
STATE_FILE=$TPM_PATH/tpm-00.permall
VOLATILE_STATE_FILE=$TPM_PATH/tpm-00.volatilestate
PID_FILE=$TPM_PATH/swtpm.pid
SWTPM_CMD_UNIX_PATH=${TPM_PATH}/unix-cmd.sock
SWTPM_CTRL_UNIX_PATH=${TPM_PATH}/unix-ctrl.sock
SWTPM_INTERFACE=${SWTPM_INTERFACE:-cuse}

function cleanup()
{
	pid=${SWTPM_PID}
	if [ -n "$pid" ]; then
		kill_quiet -9 $pid
	fi
	rm -rf $TPM_PATH
}

trap "cleanup" EXIT

[ "${SWTPM_INTERFACE}" == cuse ] && source ${TESTDIR}/test_cuse
source ${TESTDIR}/common

rm -f $STATE_FILE $VOLATILE_STATE_FILE 2>/dev/null

run_swtpm ${SWTPM_INTERFACE} --tpmstate dir=$TPM_PATH --pid file=$PID_FILE

display_processes_by_name "$SWTPM"

kill_quiet -0 ${SWTPM_PID}
if [ $? -ne 0 ]; then
	echo "Error: ${SWTPM_INTERFACE} TPM did not start."
	exit 1
fi

if wait_for_file ${PID_FILE} 4; then
	echo "Error: ${SWTPM_INTERFACE} TPM did not write pidfile."
	exit 1
fi

PIDF="$(cat $PID_FILE)"
if [ "$PIDF" != "${SWTPM_PID}" ]; then
	echo "Error: ${SWTPM_INTERFACE} TPM wrote pid $PIDF, but found ${SWTPM_PID}."
	exit 1
fi

# Init the TPM
run_swtpm_ioctl ${SWTPM_INTERFACE} -i
if [ $? -ne 0 ]; then
	echo "Error: Could not initialize the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

sleep 0.5

kill_quiet -0 ${SWTPM_PID} 2>/dev/null
if [ $? -ne 0 ]; then
	echo "Error: ${SWTPM_INTERFACE} TPM not running anymore after INIT."
	exit 1
fi

# must work
res=$(run_swtpm_bios ${SWTPM_INTERFACE} -o 2>&1)
if [ $? -ne 0 ] || [ -n "$res" ]; then
	echo "Error: Could not startup the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

#  must work
res=$(run_swtpm_bios ${SWTPM_INTERFACE} -n --cs 2>&1)
if [ $? -ne 0 ] || [ -n "$res" ]; then
	echo "Error: Could not self-test the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

#  must work
res=$(run_swtpm_bios ${SWTPM_INTERFACE} -n -u 2>&1)
if [ $? -ne 0 ] || [ -n "$res" ]; then
	echo "Error: Could not give up physical presence on the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

#  will NOT work -- we get error output in $res
res=$(run_swtpm_bios ${SWTPM_INTERFACE} -n -u 2>&1)
ret=$?
if [ $ret -eq 0 ] || [ -z "$res" ]; then
	echo "Error: Could give up physical presence on the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

if [ $ret -ne 128 ]; then
	echo "Error: Wrong return code from swtpm_bios. Should be 128, had $ret."
	exit 1
fi

#  will NOT work (wrong device) -- we get error output in $res
res=$(TPM_DEVICE=/dev/${VTPM_NAME}123 ${SWTPM_BIOS} -n -u 2>&1)
ret=$?
if [ $ret -eq 0 ] || [ -z "$res" ]; then
	echo "Error: Could give up physical presence on wrong device."
	exit 1
fi

if [ $ret -ne 255 ]; then
	echo "Error: Wrong return code from swtpm_bios. Should be 255, had $ret."
	exit 1
fi


# RESET TPM

run_swtpm_ioctl ${SWTPM_INTERFACE} -i
if [ $? -ne 0 ]; then
	echo "Error: Could not initialize the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

# must work
res=$(run_swtpm_bios ${SWTPM_INTERFACE} --cs -u 2>&1)
if [ $? -ne 0 ] || [ -n "$res" ]; then
	echo "Error: Could not startup the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

#  will NOT work -- we get error output in $res
res=$(run_swtpm_bios ${SWTPM_INTERFACE} -n -u 2>&1)
ret=$?
if [ $ret -eq 0 ] || [ -z "$res" ]; then
	echo "Error: Could give up physical presence on the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

if [ $ret -ne 128 ]; then
	echo "Error: Wrong return code from swtpm_bios. Should be 128, had $ret."
	exit 1
fi

run_swtpm_ioctl ${SWTPM_INTERFACE} -s
if [ $? -ne 0 ]; then
	echo "Error: Could not shut down the ${SWTPM_INTERFACE} TPM."
	exit 1
fi

if wait_process_gone ${SWTPM_PID} 4; then
	echo "Error: ${SWTPM_INTERFACE} TPM should not be running anymore."
	exit 1
fi

if [ ! -e $STATE_FILE ]; then
	echo "Error: TPM state file $STATE_FILE does not exist."
	exit 1
fi

echo "OK"

exit 0
