@@ -1193,10 +1193,65 @@ if check_tool tpm2_certifycreation; then
11931193 -g sha256 -o " $TEST_TMPDIR /cc_sig.bin" \
11941194 --attestation " $TEST_TMPDIR /cc_attest.bin" \
11951195 -f plain -s rsassa
1196+
1197+ # Negative: tamper with the creation ticket and confirm the TPM rejects
1198+ # it with TPM_RC_TICKET (HMAC verification fails). Flip a byte in the
1199+ # middle of the ticket so headers/sizes stay valid.
1200+ cp " $TEST_TMPDIR /cc_creation.ticket" " $TEST_TMPDIR /cc_creation.ticket.bad"
1201+ # The TPMT_TK_CREATION layout starts with tag(2)+hierarchy(4); tamper
1202+ # at offset 16 which lands inside the digest body.
1203+ printf ' \xAA' | dd of=" $TEST_TMPDIR /cc_creation.ticket.bad" \
1204+ bs=1 count=1 seek=16 conv=notrunc 2> /dev/null
1205+ run_test_fail " certifycreation rejects tampered ticket (TPM_RC_TICKET)" \
1206+ tpm2_certifycreation -C " $TEST_TMPDIR /cc_sign.ctx" \
1207+ -c " $TEST_TMPDIR /cc_primary.ctx" \
1208+ -d " $TEST_TMPDIR /cc_creation.digest" \
1209+ -t " $TEST_TMPDIR /cc_creation.ticket.bad" \
1210+ -g sha256 -o " $TEST_TMPDIR /cc_sig_bad.bin" \
1211+ --attestation " $TEST_TMPDIR /cc_attest_bad.bin" \
1212+ -f plain -s rsassa
11961213else
11971214 skip_test " certifycreation" " tpm2_certifycreation not available"
11981215fi
11991216
1217+ # ----------------------------------------------------------------
1218+ hdr " Hash + Sign (TK_HASHCHECK ticket)"
1219+ # Generate a hash with ticket via TPM2_Hash, then sign the hashed digest
1220+ # using the ticket as proof the TPM produced the hash. Exercises the
1221+ # TK_HASHCHECK ticket generate→consume flow that PolicyAuthorize/Sign rely on.
1222+ flush_transient
1223+
1224+ run_test " createprimary for hash+sign" \
1225+ tpm2_createprimary -C o -c " $TEST_TMPDIR /hs_primary.ctx"
1226+
1227+ run_test " create signing key for hash+sign" \
1228+ tpm2_create -G rsa -C " $TEST_TMPDIR /hs_primary.ctx" \
1229+ -u " $TEST_TMPDIR /hs_sign.pub" -r " $TEST_TMPDIR /hs_sign.priv" \
1230+ -c " $TEST_TMPDIR /hs_sign.ctx"
1231+
1232+ echo -n " ticket-data-to-sign" > " $TEST_TMPDIR /hs_data.bin"
1233+ run_test " tpm2_hash with TK_HASHCHECK output" \
1234+ tpm2_hash -C o -g sha256 \
1235+ -o " $TEST_TMPDIR /hs_digest.bin" \
1236+ -t " $TEST_TMPDIR /hs_ticket.bin" \
1237+ " $TEST_TMPDIR /hs_data.bin"
1238+
1239+ run_test " tpm2_sign consumes TK_HASHCHECK ticket" \
1240+ tpm2_sign -c " $TEST_TMPDIR /hs_sign.ctx" \
1241+ -g sha256 -d -t " $TEST_TMPDIR /hs_ticket.bin" \
1242+ -o " $TEST_TMPDIR /hs_sig.bin" \
1243+ " $TEST_TMPDIR /hs_digest.bin"
1244+
1245+ # Negative: tamper ticket bytes; sign should reject (TPM_RC_TICKET).
1246+ cp " $TEST_TMPDIR /hs_ticket.bin" " $TEST_TMPDIR /hs_ticket.bad"
1247+ printf ' \x55' | dd of=" $TEST_TMPDIR /hs_ticket.bad" \
1248+ bs=1 count=1 seek=16 conv=notrunc 2> /dev/null
1249+ run_test_fail " tpm2_sign rejects tampered TK_HASHCHECK (TPM_RC_TICKET)" \
1250+ tpm2_sign -c " $TEST_TMPDIR /hs_sign.ctx" \
1251+ -g sha256 -d -t " $TEST_TMPDIR /hs_ticket.bad" \
1252+ -o " $TEST_TMPDIR /hs_sig_bad.bin" \
1253+ " $TEST_TMPDIR /hs_digest.bin"
1254+
12001255# ----------------------------------------------------------------
12011256hdr " Duplicate"
12021257# Flush transient objects
0 commit comments