swtpm/tests/test_tpm2_chroot_cuse
Stefan Berger a44b642d70 tests: If filesystem is mounted with nodev opt skip CUSE chroot test
The CUSE TPM test will not work if the filesystem the test case runs
on is mounted with the 'nodev' option since the CUSE TPM can then
not use /tmp/.../dev/cuse.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-08-25 13:13:20 -04:00

102 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# For the license, see the LICENSE file in the root directory.
if [ "$(id -u)" -ne 0 ]; then
echo "Need to be root to run this test."
exit 77
fi
if [ "$(uname -s)" != "Linux" ]; then
# Due to using /proc/<pid>/root
echo "This test only runs only Linux."
exit 77
fi
if [ -z "$(type -P df)" ]; then
echo "This test requires the 'df' tool."
exit 77
fi
ROOT=${abs_top_builddir:-$(dirname "$0")/..}
TESTDIR=${abs_top_testdir:-$(dirname "$0")}
SWTPM=swtpm
SWTPM_EXE=${SWTPM_EXE:-$ROOT/src/swtpm/$SWTPM}
PID_FILE=/${SWTPM}.pid
VTPM_NAME="vtpm-test-chroot"
SWTPM_DEV_NAME="/dev/${VTPM_NAME}"
source ${TESTDIR}/common
source ${TESTDIR}/test_common
source ${TESTDIR}/test_cuse
skip_test_no_tpm20 "${SWTPM_EXE}"
trap "cleanup" SIGTERM EXIT
function cleanup()
{
rm -rf $TPMDIR
if [ -n "$PID" ]; then
kill_quiet -SIGTERM $PID 2>/dev/null
fi
}
for OPTION in --chroot -R; do
TPMDIR="$(mktemp -d)" || exit 1
# CUSE TPM will only work if the filesystem does not have 'nodev' option
mnt=$(df $TPMDIR | tail -n 1 | gawk '{print $1" "$6}')
if [ -z "${mnt}" ]; then
echo " Error: Could not determine filesystem and mount point of $TPMDIR"
exit 1
fi
nodev="$(grep -E "^${mnt} " /proc/mounts |
gawk '{print ","$4","}' |
grep ",nodev,")"
if [ -n "${nodev}" ]; then
echo " Error: '${mnt}' is mounted with nodev option. Skipping test."
exit 77
fi
mkdir $TPMDIR/dev
mknod -m 0666 $TPMDIR/dev/urandom c 1 9
mknod -m 0666 $TPMDIR/dev/cuse c 10 203
$SWTPM_EXE cuse \
-n "$SWTPM_DEV_NAME" \
"$OPTION" $TPMDIR \
--tpmstate dir=/ \
--pid file=$PID_FILE \
--tpm2 \
--flags not-need-init \
${SWTPM_TEST_SECCOMP_OPT} &>/dev/null &
if wait_for_file $TPMDIR/$PID_FILE 3; then
echo "Error: CUSE TPM did not write pidfile."
exit 1
fi
PID=$(ps aux |
grep "cuse" |
grep " ${SWTPM_DEV_NAME}" |
grep -v grep |
gawk '{print $2}')
validate_pidfile $PID $TPMDIR/$PID_FILE
if [ "$(readlink /proc/$PID/root)" != $TPMDIR ]; then
echo "Test 1 failed: Unexpected chroot dir"
exit 1
fi
if [ ! -f ${TPMDIR}/tpm2-00.permall ]; then
echo "Missing state file"
exit 1
fi
echo "Test $OPTION passed"
cleanup
done