#!/usr/bin/env bash

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

cd "$(dirname "$0")" || exit 1

ROOT=${abs_top_builddir:-$(pwd)/..}

export SWTPM_INTERFACE=cuse

VTPM_NAME="vtpm-test-tpm2-partial-reads"
SWTPM_DEV_NAME="/dev/${VTPM_NAME}"
TPM_PATH="$(mktemp -d)" || exit 1
CMD_PATH="${TPM_PATH}/cmd"
STATE_FILE="$TPM_PATH/tpm2-00.permall"

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

function swtpm_read_n_bytes_fd100()
{
	# read n bytes from fd 100 and write to stdout
	python -c "import os; os.write(1, os.read(100, $1))" | \
		od -t x1 -A n
}

trap "cleanup" EXIT

[ "${SWTPM_INTERFACE}" == "cuse" ] && source test_cuse
source common
skip_test_no_tpm20 "${SWTPM_EXE}"

TPM_PATH=$TPM_PATH run_swtpm "${SWTPM_INTERFACE}" --tpm2

kill_quiet -0 "${SWTPM_PID}"
if [ $? -ne 0 ]; then
	echo "Error: ${SWTPM_INTERFACE} TPM did not start."
	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

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

# Prepare the TPM2_Startup
echo -en '\x80\x01\x00\x00\x00\x0c\x00\x00\x01\x44\x00\x00' > "${CMD_PATH}"

swtpm_open_cmddev "${SWTPM_INTERFACE}" 100

# Startup the TPM2
cat "${CMD_PATH}" >&100

# Read 4 and then 6 bytes of the response
res1=$(swtpm_read_n_bytes_fd100 4)
exp1=' 80 01 00 00'
if [ "$res1" != "$exp1" ]; then
	echo "1st Startup: Unexpected 1st response part"
	echo "Expected: $exp1"
	echo "Actual  : $res1"
	exit 1
fi

res2=$(swtpm_read_n_bytes_fd100 6)
exp2=' 00 0a 00 00 00 00'
if [ "$res2" != "$exp2" ]; then
	echo "1st Startup: Unexpected 2nd response part"
	echo "Expected: $exp2"
	echo "Actual  : $res2"
	exit 1
fi

# Startup the TPM2 again (will fail, but that's ok)
cat "${CMD_PATH}" >&100

# Read 4 and then only 4 bytes of the response
res1=$(swtpm_read_n_bytes_fd100 4)
exp1=' 80 01 00 00'
if [ "$res1" != "$exp1" ]; then
	echo "2nd Startup: Unexpected 1st response part"
	echo "Expected: $exp1"
	echo "Actual  : $res1"
	exit 1
fi

res2=$(swtpm_read_n_bytes_fd100 4)
exp2=' 00 0a 00 00'
if [ "$res2" != "$exp2" ]; then
	echo "2nd Startup: Unexpected 2nd part"
	echo "Expected: $exp2"
	echo "Actual  : $res2"
	exit 1
fi

# Startup the TPM2 again (will fail, but that's ok)
cat "${CMD_PATH}" >&100

# Read 4 and then 6 bytes of the response
res1=$(swtpm_read_n_bytes_fd100 4)
exp1=' 80 01 00 00'
if [ "$res1" != "$exp1" ]; then
	echo "3rd Startup: Unexpected 1st response part"
	echo "Expected: $exp1"
	echo "Actual  : $res1"
	exit 1
fi

res2=$(swtpm_read_n_bytes_fd100 6)
exp2=' 00 0a 00 00 01 00'
if [ "$res2" != "$exp2" ]; then
	echo "3rd Startup: Unexpected 2nd part"
	echo "Expected: $exp2"
	echo "Actual  : $res2"
	exit 1
fi
exec 100>&-

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
