blob: 17139cb6226a0a56df3855adaa793f5707c3944f [file] [log] [blame]
#!/usr/bin/env bash
#;**********************************************************************;
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2017 - 2020, Intel Corporation
# Copyright (c) 2018 - 2020, Fraunhofer SIT sponsored by Infineon Technologies AG
#
# All rights reserved.
#;**********************************************************************;
# source the int-log-compiler-common sript
. ${srcdir}/script/int-log-compiler-common.sh
sanity_test
# start simulator if needed
if [[ ${INTEGRATION_TCTI} == "mssim" || ${INTEGRATION_TCTI} == "swtpm" ]]; then
echo "Trying to start simulator ${INTEGRATION_TCTI}"
try_simulator_start
TPM20TEST_SOCKET_PORT="${SIM_PORT_DATA}"
TPM20TEST_TCTI="${INTEGRATION_TCTI}:host=${TPM20TEST_SOCKET_ADDRESS},port=${TPM20TEST_SOCKET_PORT}"
else
# Device will be used.
TPM20TEST_TCTI="${INTEGRATION_TCTI}:${TPM20TEST_DEVICE_FILE}"
fi
while true; do
# Some debug prints
echo "TPM20TEST_TCTI_NAME=${TPM20TEST_TCTI_NAME}"
echo "TPM20TEST_DEVICE_FILE=${TPM20TEST_DEVICE_FILE}"
echo "TPM20TEST_SOCKET_ADDRESS=${TPM20TEST_SOCKET_ADDRESS}"
echo "TPM20TEST_SOCKET_PORT=${TPM20TEST_SOCKET_PORT}"
echo "TPM20TEST_TCTI=${TPM20TEST_TCTI}"
if [ "${TPM20TEST_TCTI_NAME}" != "device" ]; then
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_startup
if [ $? -ne 0 ]; then
echo "TPM_StartUp failed"
ret=99
break
fi
else
env TPM20TEST_TCTI_NAME=${TPM20TEST_TCTI_NAME} \
TPM20TEST_DEVICE_FILE=${TPM20TEST_DEVICE_FILE} \
G_MESSAGES_DEBUG=all ./test/helper/tpm_transientempty
if [ $? -ne 0 ]; then
echo "TPM transient area not empty => skipping"
ret=99
break
fi
fi
# Certificate generation for simulator tests
if [ "${TPM20TEST_TCTI_NAME}" != "device" ]; then
EKPUB_FILE=${TEST_BIN}_ekpub.pem
EKCERT_FILE=${TEST_BIN}_ekcert.crt
EKCERT_PEM_FILE=${TEST_BIN}_ekcert.pem
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_getek ${EKPUB_FILE}
if [ $? -ne 0 ]; then
echo "TPM_getek failed"
ret=99
break
fi
EKECCPUB_FILE=${TEST_BIN}_ekeccpub.pem
EKECCCERT_FILE=${TEST_BIN}_ekecccert.crt
EKECCCERT_PEM_FILE=${TEST_BIN}_ekecccert.pem
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_getek_ecc ${EKECCPUB_FILE}
if [ $? -ne 0 ]; then
echo "TPM_getek_ecc failed"
ret=99
break
fi
INTERMEDCA_FILE=${TEST_BIN}_intermedecc-ca
ROOTCA_FILE=${TEST_BIN}_root-ca
SCRIPTDIR="$(dirname $(realpath $0))/"
${SCRIPTDIR}/ekca/create_ca.sh "${EKPUB_FILE}" "${EKECCPUB_FILE}" "${EKCERT_FILE}" \
"${EKECCCERT_FILE}" "${INTERMEDCA_FILE}" "${ROOTCA_FILE}" >${TEST_BIN}_ca.log 2>&1
if [ $? -ne 0 ]; then
echo "ek-cert ca failed"
ret=99
break
fi
# Determine the fingerprint of the RSA EK public.
FINGERPRINT=$(openssl pkey -pubin -inform PEM -in ${EKPUB_FILE} -outform DER | shasum -a 256 | cut -f 1 -d ' ')
export FAPI_TEST_FINGERPRINT=" { \"hashAlg\" : \"sha256\", \"digest\" : \"${FINGERPRINT}\" }"
openssl x509 -inform DER -in ${EKCERT_FILE} -outform PEM -out ${EKCERT_PEM_FILE}
export FAPI_TEST_CERTIFICATE="file:${EKCERT_PEM_FILE}"
# Determine the fingerprint of the RSA EK public.
FINGERPRINT_ECC=$(openssl pkey -pubin -inform PEM -in ${EKECCPUB_FILE} -outform DER | shasum -a 256 | cut -f 1 -d ' ')
export FAPI_TEST_FINGERPRINT_ECC=" { \"hashAlg\" : \"sha256\", \"digest\" : \"${FINGERPRINT_ECC}\" }"
openssl x509 -inform DER -in ${EKECCCERT_FILE} -outform PEM -out ${EKECCCERT_PEM_FILE}
export FAPI_TEST_CERTIFICATE_ECC="file:${EKECCCERT_PEM_FILE}"
cat $EKCERT_FILE | \
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_writeekcert 1C00002
if [ $? -ne 0 ]; then
echo "TPM_writeekcert failed"
ret=99
break
fi
cat $EKECCCERT_FILE | \
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_writeekcert 1C0000A
if [ $? -ne 0 ]; then
echo "TPM_writeekcert failed"
ret=99
fi
fi # certificate generation
TPMSTATE_FILE1=${TEST_BIN}_state1
TPMSTATE_FILE2=${TEST_BIN}_state2
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_dumpstate>${TPMSTATE_FILE1}
if [ $? -ne 0 ]; then
echo "Error during dumpstate"
ret=99
break
fi
echo "Execute the test script"
if [ "${TPM20TEST_TCTI_NAME}" == "device" ]; then
# No root certificate needed
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ${@: -1}
else
# Run test with generated certificate.
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
FAPI_TEST_ROOT_CERT=${ROOTCA_FILE}.pem \
TPM20TEST_DEVICE_FILE="${TPM20TEST_DEVICE_FILE}" \
G_MESSAGES_DEBUG=all ${@: -1}
fi
ret=$?
echo "Script returned $ret"
#We check the state before a reboot to see if transients and NV were chagned.
env TPM20TEST_TCTI_NAME="${TPM20TEST_TCTI_NAME}" \
TPM20TEST_SOCKET_ADDRESS="${TPM20TEST_SOCKET_ADDRESS}" \
TPM20TEST_SOCKET_PORT="${TPM20TEST_SOCKET_PORT}" \
TPM20TEST_TCTI="${TPM20TEST_TCTI}" \
G_MESSAGES_DEBUG=all ./test/helper/tpm_dumpstate>${TPMSTATE_FILE2}
if [ $? -ne 0 ]; then
echo "Error during dumpstate"
ret=99
break
fi
if [ "$(cat ${TPMSTATE_FILE1})" != "$(cat ${TPMSTATE_FILE2})" ]; then
echo "TPM changed state during test"
echo "State before ($TPMSTATE_FILE1):"
cat ${TPMSTATE_FILE1}
echo "State after ($TPMSTATE_FILE2):"
cat ${TPMSTATE_FILE2}
ret=1
break
fi
#TODO: Add a tpm-restart/reboot here
break
done
if [ "${TPM20TEST_TCTI_NAME}" != "device" ]; then
# This sleep is sadly necessary: If we kill the tabrmd w/o sleeping for a
# second after the test finishes the simulator will die too. Bug in the
# simulator?
sleep 1
# teardown
daemon_stop ${SIM_PID_FILE}
rm -rf ${SIM_TMP_DIR} ${SIM_PID_FILE}
fi
exit $ret