You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.3 KiB
79 lines
2.3 KiB
// 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; |
|
}
|
|
|