1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
#!/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")}
VTPM_NAME="vtpm-test-hashing2"
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
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
source "${TESTDIR}/common"
[ "${SWTPM_INTERFACE}" == cuse ] && source "${TESTDIR}/test_cuse"
rm -f "$STATE_FILE" "$VOLATILE_STATE_FILE" 2>/dev/null
TPM_PATH=$TPM_PATH run_swtpm "${SWTPM_INTERFACE}"
display_processes_by_name "swtpm"
if ! kill_quiet -0 "${SWTPM_PID}"; then
echo "Error: ${SWTPM_INTERFACE} TPM did not start."
exit 1
fi
# Init the TPM
if ! run_swtpm_ioctl "${SWTPM_INTERFACE}" -i; then
echo "Error: ${SWTPM_INTERFACE} TPM initialization failed."
exit 1
fi
sleep 0.5
if ! kill_quiet -0 "${SWTPM_PID}" 2>/dev/null; then
echo "Error: ${SWTPM_INTERFACE} TPM not running anymore after INIT."
exit 1
fi
# Startup the TPM
RES=$(swtpm_cmd_tx "${SWTPM_INTERFACE}" '\x00\xC1\x00\x00\x00\x0C\x00\x00\x00\x99\x00\x01')
exp=' 00 c4 00 00 00 0a 00 00 00 00'
if [ "$RES" != "$exp" ]; then
echo "Error: Did not get expected result from TPM_Startup(ST_Clear)"
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
# Check the TPM Established bit before the hashing
if ! RES=$(run_swtpm_ioctl "${SWTPM_INTERFACE}" -e); then
echo "Error: Could not get the TPM Established flag from the ${SWTPM_INTERFACE} TPM."
exit 1
fi
exp='tpmEstablished is 0'
if [ "$RES" != "$exp" ]; then
echo "Error (1): TPM Established flag has wrong value."
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
if ! run_swtpm_ioctl "${SWTPM_INTERFACE}" -h 1234; then
echo "Error: Hash command did not work."
exit 1
fi
# Read PCR 17
RES=$(swtpm_cmd_tx "${SWTPM_INTERFACE}" '\x00\xC1\x00\x00\x00\x0E\x00\x00\x00\x15\x00\x00\x00\x11')
exp=' 00 c4 00 00 00 1e 00 00 00 00 97 e9 76 e4 f2 2c d6 d2 4a fd 21 20 85 ad 7a 86 64 7f 2a e5'
if [ "$RES" != "$exp" ]; then
echo "Error: (1) Did not get expected result from TPM_PCRRead(17)"
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
# Check the TPM Established bit after the hashing
if ! RES=$(run_swtpm_ioctl "${SWTPM_INTERFACE}" -e); then
echo "Error: Could not get the TPM Established flag from the ${SWTPM_INTERFACE} TPM."
exit 1
fi
exp='tpmEstablished is 1'
if [ "$RES" != "$exp" ]; then
echo "Error (2): TPM Established flag has wrong value."
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
# Reset the establishment bit; we switch to locality 0 and reset via locality 3
if ! run_swtpm_ioctl "${SWTPM_INTERFACE}" -l 0; then
echo "Error: Could not set locality 0"
exit 1
fi
for ((l = 0; l <= 2; l++)); do
# Resetting via locality 2 must fail
if ERR="$(run_swtpm_ioctl "${SWTPM_INTERFACE}" -r "$l" 2>&1)"; then
echo "Error: Could reset the establishment bit via locality $l"
exit 1
fi
exp="TPM result from PTM_RESET_TPMESTABLISHED: 0x3d"
if [ "$ERR" != "$exp" ]; then
echo "Error: Unexpected error message"
echo "Received: $ERR"
echo "Expected: $exp"
exit 1
fi
done
# We expect the same results for the TPM_ResetEstablishment command
for ((l = 0; l <= 2; l++)); do
# Set locality
if ! run_swtpm_ioctl "${SWTPM_INTERFACE}" -l "$l"; then
echo "Error: Could not choose locality $l"
exit 1
fi
# Have to use external echo command
RES=$(swtpm_cmd_tx "${SWTPM_INTERFACE}" '\x00\xC1\x00\x00\x00\x0a\x40\x00\x00\x0b')
exp=' 00 c4 00 00 00 0a 00 00 00 3d'
if [ "$RES" != "$exp" ]; then
echo "Error: Could reset TPM establishment bit in locality $l using command"
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
done
# Resetting via locality 3 must work
if ! run_swtpm_ioctl "${SWTPM_INTERFACE}" -l 3; then
echo "Error: Could not reset the establishment bit via locality 3"
exit 1
fi
RES=$(swtpm_cmd_tx "${SWTPM_INTERFACE}" '\x00\xC1\x00\x00\x00\x0a\x40\x00\x00\x0b')
exp=' 00 c4 00 00 00 0a 00 00 00 00'
if [ "$RES" != "$exp" ]; then
echo "Error: Could reset TPM establishment bit in locality 3 using command"
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
# Check the TPM Established bit after the reset
RES=$(run_swtpm_ioctl "${SWTPM_INTERFACE}" -e)
exp='tpmEstablished is 0'
if [ "$RES" != "$exp" ]; then
echo "Error (3): TPM Established flag has wrong value."
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
# Read from a file
dd if=/dev/zero bs=1024 count=1024 2>/dev/null |\
run_swtpm_ioctl "${SWTPM_INTERFACE}" -h -
# Read PCR 17
RES=$(swtpm_cmd_tx "${SWTPM_INTERFACE}" '\x00\xC1\x00\x00\x00\x0E\x00\x00\x00\x15\x00\x00\x00\x11')
exp=' 00 c4 00 00 00 1e 00 00 00 00 d8 0e 7a 7b 3c 37 88 7d b4 c2 88 08 1d a7 53 f6 4b 11 3a 9c'
if [ "$RES" != "$exp" ]; then
echo "Error: (2) Did not get expected result from TPM_PCRRead(17)"
echo "expected: $exp"
echo "received: $RES"
exit 1
fi
if ! run_swtpm_ioctl "${SWTPM_INTERFACE}" -s; 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
|