// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 3: Commands // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "InternalRoutines.h" #include "SequenceUpdate_fp.h" // // // Error Returns Meaning // // TPM_RC_MODE sequenceHandle does not reference a hash or HMAC sequence // object // TPM_RC TPM2_SequenceUpdate( SequenceUpdate_In *in // IN: input parameter list ) { OBJECT *object; // Input Validation // Get sequence object pointer object = ObjectGet(in->sequenceHandle); // Check that referenced object is a sequence object. if(!ObjectIsSequence(object)) return TPM_RC_MODE + RC_SequenceUpdate_sequenceHandle; // Internal Data Update if(object->attributes.eventSeq == SET) { // Update event sequence object UINT32 i; HASH_OBJECT *hashObject = (HASH_OBJECT *)object; for(i = 0; i < HASH_COUNT; i++) { // Update sequence object CryptUpdateDigest2B(&hashObject->state.hashState[i], &in->buffer.b); } } else { HASH_OBJECT *hashObject = (HASH_OBJECT *)object; // Update hash/HMAC sequence object if(hashObject->attributes.hashSeq == SET) { // Is this the first block of the sequence if(hashObject->attributes.firstBlock == CLEAR) { // If so, indicate that first block was received hashObject->attributes.firstBlock = SET; // Check the first block to see if the first block can contain // the TPM_GENERATED_VALUE. If it does, it is not safe for // a ticket. if(TicketIsSafe(&in->buffer.b)) hashObject->attributes.ticketSafe = SET; } // Update sequence object hash/HMAC stack CryptUpdateDigest2B(&hashObject->state.hashState[0], &in->buffer.b); } else if(object->attributes.hmacSeq == SET) { HASH_OBJECT *hashObject = (HASH_OBJECT *)object; // Update sequence object hash/HMAC stack CryptUpdateDigest2B(&hashObject->state.hmacState, &in->buffer.b); } } return TPM_RC_SUCCESS; }