aboutsummaryrefslogtreecommitdiff
path: root/_TPM_Hash_Start.c
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2015-05-20 10:32:25 -0700
committerVadim Bendebury <vbendeb@chromium.org>2015-05-20 22:32:05 -0700
commit5679752bf24c21135884e987c4077e2f71848971 (patch)
tree3e680dd91a7af84c45ea1170ee88225bd4ad32c8 /_TPM_Hash_Start.c
downloadtpm2-5679752bf24c21135884e987c4077e2f71848971.tar.gz
Initial commit to seed TPM2.0 source code directory
LICENSE file text copied from TCG library specification. README describes the procedure used to extract source code from parts 3 and 4 of the specification. The python scripts and part{34}.txt files will be removed in the following commits. Change-Id: Ie281e6e988481831f33483053455e8aff8f3f75f Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Diffstat (limited to '_TPM_Hash_Start.c')
-rw-r--r--_TPM_Hash_Start.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/_TPM_Hash_Start.c b/_TPM_Hash_Start.c
new file mode 100644
index 0000000..1e1d587
--- /dev/null
+++ b/_TPM_Hash_Start.c
@@ -0,0 +1,65 @@
+// 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"
+//
+// This function is called to process a _TPM_Hash_Start() indication.
+//
+void
+_TPM_Hash_Start(
+ void
+ )
+{
+ TPM_RC result;
+ TPMI_DH_OBJECT handle;
+
+ // If a DRTM sequence object exists, free it up
+ if(g_DRTMHandle != TPM_RH_UNASSIGNED)
+ {
+ ObjectFlush(g_DRTMHandle);
+ g_DRTMHandle = TPM_RH_UNASSIGNED;
+ }
+
+ // Create an event sequence object and store the handle in global
+ // g_DRTMHandle. A TPM_RC_OBJECT_MEMORY error may be returned at this point
+ // The null value for the 'auth' parameter will cause the sequence structure to
+ // be allocated without being set as present. This keeps the sequence from
+ // being left behind if the sequence is terminated early.
+ result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
+
+ // If a free slot was not available, then free up a slot.
+ if(result != TPM_RC_SUCCESS)
+ {
+ // An implementation does not need to have a fixed relationship between
+ // slot numbers and handle numbers. To handle the general case, scan for
+ // a handle that is assigned and free it for the DRTM sequence.
+ // In the reference implementation, the relationship between handles and
+ // slots is fixed. So, if the call to ObjectCreateEvenSequence()
+ // failed indicating that all slots are occupied, then the first handle we
+ // are going to check (TRANSIENT_FIRST) will be occupied. It will be freed
+ // so that it can be assigned for use as the DRTM sequence object.
+ for(handle = TRANSIENT_FIRST; handle < TRANSIENT_LAST; handle++)
+ {
+ // try to flush the first object
+ if(ObjectIsPresent(handle))
+ break;
+ }
+ // If the first call to find a slot fails but none of the slots is occupied
+ // then there's a big problem
+ pAssert(handle < TRANSIENT_LAST);
+
+ // Free the slot
+ ObjectFlush(handle);
+
+ // Try to create an event sequence object again. This time, we must
+ // succeed.
+ result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
+ pAssert(result == TPM_RC_SUCCESS);
+ }
+
+ return;
+}