aboutsummaryrefslogtreecommitdiff
path: root/Marshal_LoadExternal.c
diff options
context:
space:
mode:
authorJocelyn Bohr <bohr@chromium.org>2015-07-30 10:44:16 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-08-10 20:09:27 +0000
commita4ed3aa64664a1241ea982d685db744caaae3ffa (patch)
tree72d1ff6899d2321ca8f53d9d6665e46c8b6f1196 /Marshal_LoadExternal.c
parentd02d5b7076ec51d855c61a67897286b80ef436c2 (diff)
downloadtpm2-a4ed3aa64664a1241ea982d685db744caaae3ffa.tar.gz
Implementation files for command marshaling.
Generated C source and header files which add functions to unmarshal command requests, execute commands, and marshal command responses. This (tenatively) adds all final missing parts of libtpm2. These files are generated from command_generator.py in CL:290556. TEST=$ sudo emerge tpm2 builds libtpm2.a Locally I was able to call ExecCommand to execute TPM2_Startup with success after software TPM initialization. BUG=chromium:501639 CQ-DEPEND=CL:290556 Change-Id: Ieb3f208795a21a172dea25b35027c5aceba7ee08 Reviewed-on: https://chromium-review.googlesource.com/289813 Tested-by: Jocelyn Bohr <bohr@chromium.org> Reviewed-by: Darren Krahn <dkrahn@chromium.org> Reviewed-by: Vadim Bendebury <vbendeb@chromium.org> Commit-Queue: Jocelyn Bohr <bohr@chromium.org>
Diffstat (limited to 'Marshal_LoadExternal.c')
-rw-r--r--Marshal_LoadExternal.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/Marshal_LoadExternal.c b/Marshal_LoadExternal.c
new file mode 100644
index 0000000..c8daa00
--- /dev/null
+++ b/Marshal_LoadExternal.c
@@ -0,0 +1,99 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// THIS CODE IS GENERATED - DO NOT MODIFY!
+
+#include "MemoryLib_fp.h"
+#include "LoadExternal_fp.h"
+
+UINT16 LoadExternal_Out_Marshal(LoadExternal_Out* source,
+ TPMI_ST_COMMAND_TAG tag,
+ BYTE** buffer,
+ INT32* size) {
+ UINT16 total_size = 0;
+ UINT32 parameter_size = 0;
+ BYTE* parameter_size_location;
+ INT32 parameter_size_size = sizeof(UINT32);
+ UINT32 num_response_handles = 1;
+ // Marshal response handles.
+ total_size += TPM_HANDLE_Marshal(&source->objectHandle, buffer, size);
+ // Add parameter_size=0 to indicate size of the parameter area. Will be
+ // replaced later by computed parameter_size.
+ if (tag == TPM_ST_SESSIONS) {
+ parameter_size_location = *buffer;
+ // Don't add to total_size, but increment *buffer and decrement *size.
+ UINT32_Marshal(&parameter_size, buffer, size);
+ }
+ // Marshal response parameters.
+ total_size += TPM2B_NAME_Marshal(&source->name, buffer, size);
+ // Compute actual parameter_size. Don't add result to total_size.
+ if (tag == TPM_ST_SESSIONS) {
+ parameter_size = total_size - num_response_handles * sizeof(TPM_HANDLE);
+ UINT32_Marshal(&parameter_size, &parameter_size_location,
+ &parameter_size_size);
+ }
+ return total_size;
+}
+
+TPM_RC LoadExternal_In_Unmarshal(LoadExternal_In* target,
+ TPM_HANDLE request_handles[],
+ BYTE** buffer,
+ INT32* size) {
+ TPM_RC result = TPM_RC_SUCCESS;
+ // Get request handles from request_handles array.
+ target->hierarchy = request_handles[0];
+ // Unmarshal request parameters.
+ result = TPM2B_SENSITIVE_Unmarshal(&target->inPrivate, buffer, size);
+ if (result != TPM_RC_SUCCESS) {
+ return result;
+ }
+ result = TPM2B_PUBLIC_Unmarshal(&target->inPublic, buffer, size);
+ if (result != TPM_RC_SUCCESS) {
+ return result;
+ }
+ return result;
+}
+
+TPM_RC Exec_LoadExternal(TPMI_ST_COMMAND_TAG tag,
+ BYTE** request_parameter_buffer,
+ INT32* request_parameter_buffer_size,
+ TPM_HANDLE request_handles[],
+ UINT32* response_handle_buffer_size,
+ UINT32* response_parameter_buffer_size) {
+ TPM_RC result = TPM_RC_SUCCESS;
+ LoadExternal_In in;
+ LoadExternal_Out out;
+#ifdef TPM_CC_LoadExternal
+ BYTE* response_buffer;
+ INT32 response_buffer_size;
+ UINT16 bytes_marshalled;
+ UINT16 num_response_handles = 1;
+#endif
+ *response_handle_buffer_size = 0;
+ *response_parameter_buffer_size = 0;
+ // Unmarshal request parameters to input structure.
+ result =
+ LoadExternal_In_Unmarshal(&in, request_handles, request_parameter_buffer,
+ request_parameter_buffer_size);
+ if (result != TPM_RC_SUCCESS) {
+ return result;
+ }
+ // Execute command.
+ result = TPM2_LoadExternal(&in, &out);
+ if (result != TPM_RC_SUCCESS) {
+ return result;
+ }
+// Marshal output structure to global response buffer.
+#ifdef TPM_CC_LoadExternal
+ response_buffer = MemoryGetResponseBuffer(TPM_CC_LoadExternal) + 10;
+ response_buffer_size = MAX_RESPONSE_SIZE - 10;
+ bytes_marshalled = LoadExternal_Out_Marshal(&out, tag, &response_buffer,
+ &response_buffer_size);
+ *response_handle_buffer_size = num_response_handles * sizeof(TPM_HANDLE);
+ *response_parameter_buffer_size =
+ bytes_marshalled - *response_handle_buffer_size;
+ return TPM_RC_SUCCESS;
+#endif
+ return TPM_RC_COMMAND_CODE;
+}