79 lines
2.3 KiB
C
79 lines
2.3 KiB
C
// 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;
|
|
}
|