2929 . /etc/config
3030fi
3131
32- TRACE_FUNC
3332
3433# Busybox xxd lacks -r, and we get hex dumps from TPM1 commands. This converts
3534# a hex dump to binary data using sed and printf
3635hex2bin () {
36+ TRACE_FUNC
3737 sed ' s/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
3838}
3939
@@ -43,6 +43,7 @@ hex2bin() {
4343# as a file still chokes if the password begins with 'hex:', oddly tpm2-tools
4444# accepts 'hex:' in the file content.)
4545tpm2_password_hex () {
46+ TRACE_FUNC
4647 echo " hex:$( echo -n " $1 " | xxd -p | tr -d ' \n' ) "
4748}
4849
@@ -61,7 +62,7 @@ tpm2_pcrread() {
6162
6263 if [ -z " $APPEND " ]; then
6364 # Don't append - truncate file now so real command always
64- # appends
65+ # overwrites
6566 true > " $file "
6667 fi
6768
@@ -79,7 +80,7 @@ tpm1_pcrread() {
7980
8081 if [ -z " $APPEND " ]; then
8182 # Don't append - truncate file now so real command always
82- # appends
83+ # overwrites
8384 true > " $file "
8485 fi
8586
@@ -100,11 +101,12 @@ is_hash() {
100101
101102# extend_pcr_state - extend a PCR state value with more hashes or raw data (which is hashed)
102103# usage:
103- # extend_pcr_state <alg> <initial_state > <files/hashes...>
104+ # extend_pcr_state <alg> <state > <files/hashes...>
104105# alg - either 'sha1' or 'sha256' to specify algorithm
105- # initial_state - a hash value setting the initial state
106+ # state - a hash value setting the initial state
106107# files/hashes... - any number of files or hashes, state is extended once for each item
107108extend_pcr_state () {
109+ TRACE_FUNC
108110 local alg=" $1 "
109111 local state=" $2 "
110112 local next extend
@@ -233,14 +235,20 @@ tpm2_extend() {
233235 while true ; do
234236 case " $1 " in
235237 -ix)
238+ # store index and shift so -ic and -if can be processed
236239 index=" $2 "
237240 shift 2
238241 ;;
239242 -ic)
243+ string=$( echo -n " $2 " )
240244 hash=" $( echo -n " $2 " | sha256sum | cut -d' ' -f1) "
245+ TRACE_FUNC
246+ DEBUG " TPM: Will extend PCR[$index ] with hash of string $string "
241247 shift 2
242248 ;;
243249 -if)
250+ TRACE_FUNC
251+ DEBUG " TPM: Will extend PCR[$index ] with hash of file content $2 "
244252 hash=" $( sha256sum " $2 " | cut -d' ' -f1) "
245253 shift 2
246254 ;;
@@ -250,7 +258,10 @@ tpm2_extend() {
250258 esac
251259 done
252260 tpm2 pcrextend " $index :sha256=$hash "
253- DO_WITH_DEBUG tpm2 pcrread " sha256:$index "
261+ tpm2 pcrread " sha256:$index "
262+
263+ TRACE_FUNC
264+ DEBUG " TPM: Extended PCR[$index ] with hash $hash "
254265}
255266
256267tpm2_counter_read () {
@@ -348,9 +359,9 @@ tpm2_startsession() {
348359 die " tpm2_flushcontext: unable to flush saved session"
349360 tpm2 readpublic -Q -c " $PRIMARY_HANDLE " -t " $PRIMARY_HANDLE_FILE "
350361 # TODO: do the right thing to not have to suppress "WARN: check public portion the tpmkey manually" see https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429
351- tpm2 startauthsession -Q -c " $PRIMARY_HANDLE_FILE " --hmac-session -S " $ENC_SESSION_FILE " 2>&1 > /dev/null
362+ tpm2 startauthsession -Q -c " $PRIMARY_HANDLE_FILE " --hmac-session -S " $ENC_SESSION_FILE " > /dev/null 2>&1
352363 # TODO: do the right thing to not have to suppress "WARN: check public portion the tpmkey manually" see https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429
353- tpm2 startauthsession -Q -c " $PRIMARY_HANDLE_FILE " --hmac-session -S " $DEC_SESSION_FILE " 2>&1 > /dev/null
364+ tpm2 startauthsession -Q -c " $PRIMARY_HANDLE_FILE " --hmac-session -S " $DEC_SESSION_FILE " > /dev/null 2>&1
354365 tpm2 sessionconfig -Q --disable-encrypt " $DEC_SESSION_FILE "
355366}
356367
@@ -381,6 +392,7 @@ cleanup_shred() {
381392# tpm2_destroy: Destroy a sealed file in the TPM. The mechanism differs by
382393# TPM version - TPM2 evicts the file object, so it no longer exists.
383394tpm2_destroy () {
395+ TRACE_FUNC
384396 index=" $1 " # Index of the sealed file
385397 size=" $2 " # Size of zeroes to overwrite for TPM1 (unused in TPM2)
386398
@@ -396,6 +408,7 @@ tpm2_destroy() {
396408# TPM version - TPM1 overwrites the file with zeroes, since this can be done
397409# without authorization. (Deletion requires authorization.)
398410tpm1_destroy () {
411+ TRACE_FUNC
399412 index=" $1 " # Index of the sealed file
400413 size=" $2 " # Size of zeroes to overwrite for TPM1
401414
@@ -761,6 +774,21 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then
761774 shift
762775 tpm1_destroy " $@ "
763776 ;;
777+ extend)
778+ # check if we extend with a hash or a file
779+ if [ " $4 " = " -if" ]; then
780+ DEBUG " TPM: Will extend PCR[$3 ] hash content of file $5 "
781+ hash=" $( sha1sum " $5 " | cut -d' ' -f1) "
782+ elif [ " $4 " = " -ic" ]; then
783+ string=$( echo -n " $5 " )
784+ DEBUG " TPM: Will extend PCR[$3 ] with hash of filename $string "
785+ hash=" $( echo -n " $5 " | sha1sum | cut -d' ' -f1) "
786+ fi
787+
788+ TRACE_FUNC
789+ DEBUG " TPM: Extending PCR[$3 ] with hash $hash "
790+ DO_WITH_DEBUG exec tpm " $@ "
791+ ;;
764792 seal)
765793 shift
766794 tpm1_seal " $@ "
@@ -799,6 +827,8 @@ calcfuturepcr)
799827 replay_pcr " sha256" " $@ "
800828 ;;
801829extend)
830+ TRACE_FUNC
831+ DEBUG " TPM: Extending PCR[$2 ] with $4 "
802832 tpm2_extend " $@ "
803833 ;;
804834counter_read)
0 commit comments