1 // This file was extracted from the TCG Published 2 // Trusted Platform Module Library 3 // Part 3: Commands 4 // Family "2.0" 5 // Level 00 Revision 01.16 6 // October 30, 2014 7 8 #include "InternalRoutines.h" 9 #include "SequenceUpdate_fp.h" 10 // 11 // 12 // Error Returns Meaning 13 // 14 // TPM_RC_MODE sequenceHandle does not reference a hash or HMAC sequence 15 // object 16 // 17 TPM_RC TPM2_SequenceUpdate(SequenceUpdate_In * in)18TPM2_SequenceUpdate( 19 SequenceUpdate_In *in // IN: input parameter list 20 ) 21 { 22 OBJECT *object; 23 24 // Input Validation 25 26 // Get sequence object pointer 27 object = ObjectGet(in->sequenceHandle); 28 29 // Check that referenced object is a sequence object. 30 if(!ObjectIsSequence(object)) 31 return TPM_RC_MODE + RC_SequenceUpdate_sequenceHandle; 32 33 // Internal Data Update 34 35 if(object->attributes.eventSeq == SET) 36 { 37 // Update event sequence object 38 UINT32 i; 39 HASH_OBJECT *hashObject = (HASH_OBJECT *)object; 40 for(i = 0; i < HASH_COUNT; i++) 41 { 42 // Update sequence object 43 CryptUpdateDigest2B(&hashObject->state.hashState[i], &in->buffer.b); 44 } 45 } 46 else 47 { 48 HASH_OBJECT *hashObject = (HASH_OBJECT *)object; 49 50 // Update hash/HMAC sequence object 51 if(hashObject->attributes.hashSeq == SET) 52 { 53 // Is this the first block of the sequence 54 if(hashObject->attributes.firstBlock == CLEAR) 55 { 56 // If so, indicate that first block was received 57 hashObject->attributes.firstBlock = SET; 58 59 // Check the first block to see if the first block can contain 60 // the TPM_GENERATED_VALUE. If it does, it is not safe for 61 // a ticket. 62 if(TicketIsSafe(&in->buffer.b)) 63 hashObject->attributes.ticketSafe = SET; 64 } 65 // Update sequence object hash/HMAC stack 66 CryptUpdateDigest2B(&hashObject->state.hashState[0], &in->buffer.b); 67 68 } 69 else if(object->attributes.hmacSeq == SET) 70 { 71 HASH_OBJECT *hashObject = (HASH_OBJECT *)object; 72 73 // Update sequence object hash/HMAC stack 74 CryptUpdateDigest2B(&hashObject->state.hmacState, &in->buffer.b); 75 } 76 } 77 78 return TPM_RC_SUCCESS; 79 } 80