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>
diff --git a/EncryptDecrypt_fp.h b/EncryptDecrypt_fp.h
index 0407b0e..1bd5a9a 100644
--- a/EncryptDecrypt_fp.h
+++ b/EncryptDecrypt_fp.h
@@ -1,28 +1,58 @@
-/*
- * 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.
- */
+// 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.
 
-#ifndef __TPM2_ENCRYPTDECRYPT_FP_H
-#define __TPM2_ENCRYPTDECRYPT_FP_H
+// THIS CODE IS GENERATED - DO NOT MODIFY!
+
+#ifndef TPM2_ENCRYPTDECRYPT_FP_H
+#define TPM2_ENCRYPTDECRYPT_FP_H
+
+#include "tpm_generated.h"
 
 typedef struct {
   TPMI_DH_OBJECT keyHandle;
-  TPM_ALG_ID mode;
-  TPM2B_IV ivIn;
-  TPM2B_DATA inData;
   TPMI_YES_NO decrypt;
+  TPMI_ALG_SYM_MODE mode;
+  TPM2B_IV ivIn;
+  TPM2B_MAX_BUFFER inData;
 } EncryptDecrypt_In;
 
 typedef struct {
+  TPM2B_MAX_BUFFER outData;
   TPM2B_IV ivOut;
-  TPM2B_DATA outData;
 } EncryptDecrypt_Out;
 
-TPM_RC TPM2_EncryptDecrypt(
-    EncryptDecrypt_In *in,   // IN: input parameter list
-    EncryptDecrypt_Out *out  // OUT: output parameter list
-    );
+// Executes EncryptDecrypt with request handles and parameters from
+// |in| and computes response handles and parameters to |out|.
+TPM_RC TPM2_EncryptDecrypt(EncryptDecrypt_In* in, EncryptDecrypt_Out* out);
 
-#endif  // __TPM2_ENCRYPTDECRYPT_FP_H
+// Initializes handle fields in |target| from |req_handles|. Unmarshals
+// parameter fields in |target| from |buffer|.
+TPM_RC EncryptDecrypt_In_Unmarshal(EncryptDecrypt_In* target,
+                                   TPM_HANDLE req_handles[],
+                                   BYTE** buffer,
+                                   INT32* size);
+
+// Marshals response handles and parameters from |source| to |buffer|. Computes
+// and marshals the size of the parameter area (parameter_size) if |tag| ==
+// TPM_ST_SESSIONS. Returns size of (parameter area + handle area) in bytes.
+// Does not include parameter_size field.
+UINT16 EncryptDecrypt_Out_Marshal(EncryptDecrypt_Out* source,
+                                  TPMI_ST_COMMAND_TAG tag,
+                                  BYTE** buffer,
+                                  INT32* size);
+
+// Unmarshals any request parameters starting at |req_parameter_buffer|.
+// Executes command. Marshals any response handles and parameters to the
+// global response buffer and computes |*res_handle_buffer_size| and
+// |*res_parameter_buffer_size|. If |tag| == TPM_ST_SESSIONS, marshals
+// parameter_size indicating the size of the parameter area. parameter_size
+// field is located between the handle area and parameter area.
+TPM_RC Exec_EncryptDecrypt(TPMI_ST_COMMAND_TAG tag,
+                           BYTE** req_parameter_buffer,
+                           INT32* req_parameter_buffer_size,
+                           TPM_HANDLE req_handles[],
+                           UINT32* res_handle_buffer_size,
+                           UINT32* res_parameter_buffer_size);
+
+#endif  // TPM2_ENCRYPTDECRYPT_FP_H