Utility to Import external RSA pem key into TPM 47/40447/2
authorArun kumar Sekar <arunkumarsit@gmail.com>
Fri, 30 Mar 2018 18:20:30 +0000 (11:20 -0700)
committerArun kumar sekar <arunkumarsit@gmail.com>
Tue, 3 Apr 2018 21:14:48 +0000 (21:14 +0000)
Duplicate tool - Takes RSA private key in
pem format as input and generates
TPM structured buffers as expected by tpm Import

Import tool - Takes input buffers from
Duplicate tool and results in pub/priv blobs
which can be used to load the key in tpm
storage heirarchy's as child to primary key

Change-Id: I0af6676895ce0cc22c70e5546908e905b78bb71e
Issue-ID: AAF-207
Signed-off-by: Arun kumar Sekar <arunkumarsit@gmail.com>
17 files changed:
tpm-util/INSTALL
tpm-util/duplicate/crypto_aux.c [new file with mode: 0644]
tpm-util/duplicate/include/crypto_aux.h [new file with mode: 0644]
tpm-util/duplicate/include/marshal.h [new file with mode: 0644]
tpm-util/duplicate/include/tpm_duplication_aux.h [new file with mode: 0644]
tpm-util/duplicate/include/util.h [new file with mode: 0644]
tpm-util/duplicate/main.c [new file with mode: 0644]
tpm-util/duplicate/marshal.c [new file with mode: 0644]
tpm-util/duplicate/sampleMakefile [new file with mode: 0644]
tpm-util/duplicate/tpm_duplication_aux.c [new file with mode: 0644]
tpm-util/duplicate/util.c [new file with mode: 0644]
tpm-util/import/include/tpm_wrapper.h [new file with mode: 0644]
tpm-util/import/include/util.h [new file with mode: 0644]
tpm-util/import/main.c [new file with mode: 0644]
tpm-util/import/sampleMakefile [new file with mode: 0644]
tpm-util/import/tpm_wrapper.c [new file with mode: 0644]
tpm-util/import/util.c [new file with mode: 0644]

index a33bc6b..09cb5d4 100644 (file)
@@ -1,4 +1,5 @@
-1.  Download TPM emulator - ibmtpm974.tar.gz
+1.  Download TPM emulator - ibmtpm974.tar.gz 
+(Note: Optional. No need to execute this step if the system has real TPM device on it)
     a.  cd src/
     b.  make
     c.  Run tpm_server binary -  ./tpm_server –rm
@@ -35,6 +36,7 @@
     iii.    make && make install
 
 5.  Now configure Initialize TPM, configure with Primary key and then save it in TPM’s NV ram
+(Equivalent of script - initandverify/Init_and_create_tpm_primary.sh, you can run that script)
     a.  Initialize TPM
         i.  tpm2_startup -clear -T tabrmd –V
     b.  Take ownership
@@ -47,7 +49,9 @@
         i.  tpm2_readpublic -H 0x81000011 --opu out_primary_public -T tabrmd –V
     f.  If all the above commands are successful then TPM emulator, TPM resource manager and TPM tools are working fine
 
-6.  Now compile the TPM duplication tool with "make" command and run it as per instructions. use "./ossl_tpm_util --help" for usage.
+6.  Now compile the TPM duplication and import tools with "make" command (after creation of Makefile) and run it as per instructions.
+    use "./ossl_tpm_duplicate --help" for usage.
+    use "./ossl_tpm_import --help" for usage.
 
 7.  Note: If you restart tpm_server, then you have to restart TPM resource manager too. And the repeat from step 5.
 
diff --git a/tpm-util/duplicate/crypto_aux.c b/tpm-util/duplicate/crypto_aux.c
new file mode 100644 (file)
index 0000000..2737ded
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#include "crypto_aux.h"
+#include "util.h"
+
+UINT32 (*HmacFunctionPtr)( TPMI_ALG_HASH hashAlg, TPM2B *key,TPM2B **bufferList, TPM2B_DIGEST *result ) = OpenSslHmac;
+
+
+int RSA_OAEP_Enc(TPM2B_PUBLIC_KEY_RSA *plain, // plain text to encrypt
+                                                                                       //Size of plain (0 <= pl <= kl - (2 * hashLen + 2)
+                               TPM2B_PUBLIC_KEY_RSA *cipher,           // must be same size as key in bytes
+                               TPM2B_PUBLIC_KEY_RSA *key,                      // Key in big endian byte array
+                               TPM2B_DATA *encoding_params // Null terminated string like
+                                                                                               // ((unsigned char*)"DUPLICATE")
+                                                                                               // length of encoding parameter includes \0
+                                                                                               // (10 in DUPLICATE case..)
+                               )
+{
+       RSA *rsa = NULL;
+       unsigned char   encoded[256];
+       int     RC;
+       BIGNUM* bne;
+       BIGNUM* n;
+
+       //Encoding
+       RC = RSA_padding_add_PKCS1_OAEP_mgf1(encoded, key->b.size, plain->b.buffer, plain->b.size,
+                       encoding_params->b.buffer, encoding_params->b.size, EVP_sha256(), NULL);
+
+       if(RC!=1)goto cleanup;
+
+       // Creating OpenSSL structure with the supplied TPM public:
+       bne = BN_new();
+       RC = BN_set_word(bne,RSA_F4); // the TPM's public exponent (2^16 + 1)
+       if(RC!=1)goto cleanup;
+
+       rsa = RSA_new();
+       RC = RSA_generate_key_ex(rsa, 2048, bne, NULL); // could be done in better way i guess... just for filling up fields..
+       if(RC!=1)goto cleanup;
+
+       // Over-writing the public N:
+       //rsa->n = BN_bin2bn(key->b.buffer, key->b.size, rsa->n);
+       n = BN_bin2bn(key->b.buffer, key->b.size, NULL);
+       RSA_set0_key(rsa,n,NULL, NULL);
+
+       //if(rsa->n == NULL) goto cleanup;
+       if(n == NULL) goto cleanup;
+
+       // Encrypting
+       RC = RSA_public_encrypt(key->b.size, encoded, cipher->b.buffer, rsa, RSA_NO_PADDING);
+
+       //if(RC<0)goto cleanup;
+       cipher->b.size = key->b.size;
+
+cleanup:
+       RSA_free(rsa);
+       BN_free(bne);
+       return RC;
+}
+
+
+
+void AES_128_CFB_enc_dec(
+               TPM2B *in,
+               TPM2B *out,
+               const TPM2B *const key,
+               const TPM2B *const ivIn,
+               TPM2B *ivOut,
+               const TPMI_YES_NO enc)
+{
+       TPM2B_SYM_KEY ivTemp = {{0}};
+       ivTemp.b.size = 16;
+
+       if(ivOut == NULL)
+               ivOut = &(ivTemp.b);
+
+       memccpy(ivOut->buffer, ivIn->buffer, 0, ivIn->size);
+       AES_KEY aes;
+       AES_set_encrypt_key(key->buffer, 128, &aes);
+       int block, j;
+       for(block=0; block < (in->size) ;block+=16)
+       {
+               unsigned char encIV[16];
+               AES_encrypt(ivOut->buffer, encIV, &aes);
+
+               for(j=0;j<16;j++)
+               {
+                       if(j+block >= (in->size))
+                               ivOut->buffer[j]=0;
+                       else if(enc)
+                               ivOut->buffer[j] = out->buffer[block+j] = encIV[j]^(in->buffer[block+j]);
+                       else
+                       {
+                               ivOut->buffer[j] = in->buffer[block+j];
+                               out->buffer[block+j] = encIV[j]^(in->buffer[block+j]);
+                       }
+               }
+       }
+       out->size = in->size;
+
+}
+
+
+UINT32 ChangeEndianDword( UINT32 p )
+{
+    return( ((const UINT32)(((p)& 0xFF) << 24))    | \
+          ((const UINT32)(((p)& 0xFF00) << 8))   | \
+          ((const UINT32)(((p)& 0xFF0000) >> 8)) | \
+          ((const UINT32)(((p)& 0xFF000000) >> 24)));
+}
+
+
+TPM_RC KDFa( TPMI_ALG_HASH hashAlg, TPM2B *key, char *label,
+    TPM2B *contextU, TPM2B *contextV, UINT16 bits, TPM2B_MAX_BUFFER  *resultKey )
+{
+
+       TPM2B_DIGEST tmpResult;
+    TPM2B_DIGEST tpm2bLabel, tpm2bBits, tpm2b_i_2;
+    UINT8 *tpm2bBitsPtr = &tpm2bBits.t.buffer[0];
+    UINT8 *tpm2b_i_2Ptr = &tpm2b_i_2.t.buffer[0];
+    TPM2B_DIGEST *bufferList[8];
+    UINT32 bitsSwizzled, i_Swizzled;
+    TPM_RC rval;
+    int i, j;
+    UINT16 bytes = bits / 8;
+
+#ifdef DEBUG
+    DebugPrintf( 0, "KDFA, hashAlg = %4.4x\n", hashAlg );
+    DebugPrintf( 0, "\n\nKDFA, key = \n" );
+    PrintSizedBuffer( key );
+#endif
+
+    resultKey->t .size = 0;
+
+    tpm2b_i_2.t.size = 4;
+
+    tpm2bBits.t.size = 4;
+    bitsSwizzled = ChangeEndianDword( bits );
+    *(UINT32 *)tpm2bBitsPtr = bitsSwizzled;
+
+    for(i = 0; label[i] != 0 ;i++ );
+
+    tpm2bLabel.t.size = i+1;
+    for( i = 0; i < tpm2bLabel.t.size; i++ )
+    {
+        tpm2bLabel.t.buffer[i] = label[i];
+    }
+
+#ifdef DEBUG
+    DebugPrintf( 0, "\n\nKDFA, tpm2bLabel = \n" );
+    PrintSizedBuffer( (TPM2B *)&tpm2bLabel );
+
+    DebugPrintf( 0, "\n\nKDFA, contextU = \n" );
+    PrintSizedBuffer( contextU );
+
+    DebugPrintf( 0, "\n\nKDFA, contextV = \n" );
+    PrintSizedBuffer( contextV );
+#endif
+
+    resultKey->t.size = 0;
+
+    i = 1;
+
+    while( resultKey->t.size < bytes )
+    {
+        // Inner loop
+
+        i_Swizzled = ChangeEndianDword( i );
+        *(UINT32 *)tpm2b_i_2Ptr = i_Swizzled;
+
+        j = 0;
+        bufferList[j++] = (TPM2B_DIGEST *)&(tpm2b_i_2.b);
+        bufferList[j++] = (TPM2B_DIGEST *)&(tpm2bLabel.b);
+        bufferList[j++] = (TPM2B_DIGEST *)contextU;
+        bufferList[j++] = (TPM2B_DIGEST *)contextV;
+        bufferList[j++] = (TPM2B_DIGEST *)&(tpm2bBits.b);
+        bufferList[j++] = (TPM2B_DIGEST *)0;
+#ifdef DEBUG
+        for( j = 0; bufferList[j] != 0; j++ )
+        {
+            DebugPrintf( 0, "\n\nbufferlist[%d]:\n", j );
+            PrintSizedBuffer( &( bufferList[j]->b ) );
+        }
+#endif
+        rval = (*HmacFunctionPtr )( hashAlg, key, (TPM2B **)&( bufferList[0] ), &tmpResult );
+        if( rval != TPM_RC_SUCCESS )
+        {
+            return( rval );
+        }
+
+        ConcatSizedByteBuffer( resultKey, &(tmpResult.b) );
+    }
+
+    // Truncate the result to the desired size.
+    resultKey->t.size = bytes;
+
+#ifdef DEBUG
+    DebugPrintf( 0, "\n\nKDFA, resultKey = \n" );
+    PrintSizedBuffer( &( resultKey->b ) );
+#endif
+
+    return TPM_RC_SUCCESS;
+}
+
+
+UINT32 OpenSslHmac( TPMI_ALG_HASH hashAlg, TPM2B *key,TPM2B **bufferList, TPM2B_DIGEST *result )
+{
+       if(hashAlg != TPM_ALG_SHA256)return -1;
+
+       UINT32 RC = 0;
+       HMAC_CTX *hmac = HMAC_CTX_new();
+       UINT32 resLen=0;
+
+       int i=0;
+
+       HMAC_Init_ex(hmac, key->buffer, key->size, EVP_sha256(), NULL);
+
+       for(i=0;bufferList[i];i++) 
+       {
+               HMAC_Update(hmac, bufferList[i]->buffer, bufferList[i]->size);
+       }
+
+       HMAC_Final(hmac, result->b.buffer, &resLen);
+       result->b.size = resLen;
+
+       HMAC_CTX_free(hmac);
+
+       return RC;
+}
+
+void print_buff(char * data, int len, const PBYTE buff)
+{
+    printf("%s \n",data);
+    int i = 0;
+    for(;i<len;i++)
+        printf("0x%02X, ", buff[i]);
+    printf("\n");
+
+}
+
diff --git a/tpm-util/duplicate/include/crypto_aux.h b/tpm-util/duplicate/include/crypto_aux.h
new file mode 100644 (file)
index 0000000..272cc39
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#ifndef     CRYPTO_AUX
+#define     CRYPTO_AUX
+
+#include <string.h>
+#include <sapi/tpm20.h>
+#include <openssl/rsa.h>
+#include <openssl/aes.h>
+#include <openssl/rsa.h>
+#include <openssl/sha.h>
+#include <openssl/hmac.h>
+#include <openssl/evp.h>
+
+typedef BYTE* PBYTE;
+
+int RSA_OAEP_Enc(TPM2B_PUBLIC_KEY_RSA *plain, // plain text to encrypt
+                                                                                       //Size of plain (0 <= pl <= kl - (2 * hashLen + 2)
+                               TPM2B_PUBLIC_KEY_RSA *cipher,           // must be same size as key in bytes
+                               TPM2B_PUBLIC_KEY_RSA *key,                      // Key in big endian byte array
+                               TPM2B_DATA *encoding_params // Null terminated string like
+                                                                                               // ((unsigned char*)"DUPLICATE")
+                                                                                               // length of encoding parameter includes \0
+                                                                                               // (10 in DUPLICATE case..)
+                               );
+
+void AES_128_CFB_enc_dec(
+               TPM2B *in,
+               TPM2B *out,
+               const TPM2B *const key,
+               const TPM2B *const ivIn,
+               TPM2B *ivOut,
+               const TPMI_YES_NO enc);
+
+
+
+TPM_RC KDFa( TPMI_ALG_HASH hashAlg, TPM2B *key, char *label,
+    TPM2B *contextU, TPM2B *contextV, UINT16 bits, TPM2B_MAX_BUFFER  *resultKey );
+
+UINT32 OpenSslHmac( TPMI_ALG_HASH hashAlg, TPM2B *key,TPM2B **bufferList, TPM2B_DIGEST *result );
+
+void print_buff(char * data, int len, const PBYTE buff);
+
+#endif
+
diff --git a/tpm-util/duplicate/include/marshal.h b/tpm-util/duplicate/include/marshal.h
new file mode 100644 (file)
index 0000000..09d4aed
--- /dev/null
@@ -0,0 +1,1686 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+
+#ifndef __MARSHAL_H__
+#define __MARSHAL_H__
+
+#include <sapi/tpm20.h>
+#include <sapi/implementation.h>
+#define pAssert(a)  ((void)0)
+#define UNREFERENCED(a) ((void)(a))
+
+#if NO_AUTO_ALIGN == YES || LITTLE_ENDIAN_TPM == YES
+#define BYTE_ARRAY_TO_UINT8(b)   (UINT8)((b)[0])
+
+#define BYTE_ARRAY_TO_UINT16(b)  (UINT16)(  ((b)[0] <<  8) \
+                                          +  (b)[1])
+
+#define BYTE_ARRAY_TO_UINT32(b)  (UINT32)(  ((b)[0] << 24) \
+                                          + ((b)[1] << 16) \
+                                          + ((b)[2] << 8 ) \
+                                          +  (b)[3])
+
+#define BYTE_ARRAY_TO_UINT64(b)  (UINT64)(  ((UINT64)(b)[0] << 56) \
+                                          + ((UINT64)(b)[1] << 48) \
+                                          + ((UINT64)(b)[2] << 40) \
+                                          + ((UINT64)(b)[3] << 32) \
+                                          + ((UINT64)(b)[4] << 24) \
+                                          + ((UINT64)(b)[5] << 16) \
+                                          + ((UINT64)(b)[6] <<  8) \
+                                          +  (UINT64)(b)[7])
+
+// Disaggregate a UINT into a byte array
+#define UINT8_TO_BYTE_ARRAY(i, b)     ((b)[0] = (BYTE)(i), i)
+
+#define UINT16_TO_BYTE_ARRAY(i, b)    ((b)[0] = (BYTE)((i) >>  8), \
+                                       (b)[1] = (BYTE) (i),        \
+                                       (i))
+
+#define UINT32_TO_BYTE_ARRAY(i, b)    ((b)[0] = (BYTE)((i) >> 24), \
+                                       (b)[1] = (BYTE)((i) >> 16), \
+                                       (b)[2] = (BYTE)((i) >>  8), \
+                                       (b)[3] = (BYTE) (i),        \
+                                       (i))
+
+#define UINT64_TO_BYTE_ARRAY(i, b)    ((b)[0] = (BYTE)((i) >> 56), \
+                                       (b)[1] = (BYTE)((i) >> 48), \
+                                       (b)[2] = (BYTE)((i) >> 40), \
+                                       (b)[3] = (BYTE)((i) >> 32), \
+                                       (b)[4] = (BYTE)((i) >> 24), \
+                                       (b)[5] = (BYTE)((i) >> 16), \
+                                       (b)[6] = (BYTE)((i) >>  8), \
+                                       (b)[7] = (BYTE) (i),        \
+                                       (i))
+
+#else
+
+// the big-endian macros for machines that allow unaligned memory access
+// Aggregate a byte array into a UINT
+#define BYTE_ARRAY_TO_UINT8(b)        *((UINT8  *)(b))
+#define BYTE_ARRAY_TO_UINT16(b)       *((UINT16 *)(b))
+#define BYTE_ARRAY_TO_UINT32(b)       *((UINT32 *)(b))
+#define BYTE_ARRAY_TO_UINT64(b)       *((UINT64 *)(b))
+
+// Disaggregate a UINT into a byte array
+
+
+#define UINT8_TO_BYTE_ARRAY(i, b)   (*((UINT8  *)(b)) = (i))
+#define UINT16_TO_BYTE_ARRAY(i, b)  (*((UINT16 *)(b)) = (i))
+#define UINT32_TO_BYTE_ARRAY(i, b)  (*((UINT32 *)(b)) = (i))
+#define UINT64_TO_BYTE_ARRAY(i, b)  (*((UINT64 *)(b)) = (i))
+
+
+#endif  // NO_AUTO_ALIGN == YES
+
+
+
+
+// Table 2:3 - Definition of Base Types (BaseTypes)
+//   UINT8 definition from table 2:3
+TPM_RC
+UINT8_Unmarshal(UINT8 *target, BYTE **buffer, INT32 *size);
+UINT16
+UINT8_Marshal(UINT8 *source, BYTE **buffer, INT32 *size);
+
+//   BYTE definition from table 2:3
+#define BYTE_Unmarshal(target, buffer, size) \
+            UINT8_Unmarshal((UINT8 *)(target), buffer, size)
+#define BYTE_Marshal(source, buffer, size) \
+            UINT8_Marshal((UINT8 *)(source), buffer, size)
+//   INT8 definition from table 2:3
+#define INT8_Unmarshal(target, buffer, size) \
+            UINT8_Unmarshal((UINT8 *)(target), buffer, size)
+//     INT8_Marshal not referenced
+//   UINT16 definition from table 2:3
+TPM_RC
+UINT16_Unmarshal(UINT16 *target, BYTE **buffer, INT32 *size);
+UINT16
+UINT16_Marshal(UINT16 *source, BYTE **buffer, INT32 *size);
+
+//   INT16 definition from table 2:3
+//     INT16_Unmarshal not referenced
+//     INT16_Marshal not referenced
+//   UINT32 definition from table 2:3
+TPM_RC
+UINT32_Unmarshal(UINT32 *target, BYTE **buffer, INT32 *size);
+UINT16
+UINT32_Marshal(UINT32 *source, BYTE **buffer, INT32 *size);
+
+//   INT32 definition from table 2:3
+#define INT32_Unmarshal(target, buffer, size) \
+            UINT32_Unmarshal((UINT32 *)(target), buffer, size)
+//     INT32_Marshal not referenced
+//   UINT64 definition from table 2:3
+TPM_RC
+UINT64_Unmarshal(UINT64 *target, BYTE **buffer, INT32 *size);
+UINT16
+UINT64_Marshal(UINT64 *source, BYTE **buffer, INT32 *size);
+
+//   INT64 definition from table 2:3
+//     INT64_Unmarshal not referenced
+//     INT64_Marshal not referenced
+
+
+// Table 2:4 - Defines for Logic Values (DefinesTable)
+
+
+// Table 2:5 - Definition of Types for Documentation Clarity (TypesTable)
+//   UINT32 definition from table 2:5
+//     TPM_ALGORITHM_ID_Unmarshal not referenced
+//     TPM_ALGORITHM_ID_Marshal not referenced
+//   UINT32 definition from table 2:5
+//     TPM_MODIFIER_INDICATOR_Unmarshal not referenced
+//     TPM_MODIFIER_INDICATOR_Marshal not referenced
+//   UINT32 definition from table 2:5
+//     TPM_AUTHORIZATION_SIZE_Unmarshal not referenced
+//     TPM_AUTHORIZATION_SIZE_Marshal not referenced
+//   UINT32 definition from table 2:5
+//     TPM_PARAMETER_SIZE_Unmarshal not referenced
+//     TPM_PARAMETER_SIZE_Marshal not referenced
+//   UINT16 definition from table 2:5
+//     TPM_KEY_SIZE_Unmarshal not referenced
+//     TPM_KEY_SIZE_Marshal not referenced
+//   UINT16 definition from table 2:5
+#define TPM_KEY_BITS_Unmarshal(target, buffer, size) \
+            UINT16_Unmarshal((UINT16 *)(target), buffer, size)
+#define TPM_KEY_BITS_Marshal(source, buffer, size) \
+            UINT16_Marshal((UINT16 *)(source), buffer, size)
+
+
+// Table 2:6 - Definition of TPM_SPEC Constants  (ConstantsTable)
+//     TPM_SPEC_Unmarshal not referenced
+//     TPM_SPEC_Marshal not referenced
+
+
+// Table 2:7 - Definition of TPM_GENERATED Constants  (ConstantsTable)
+//     TPM_GENERATED_Unmarshal not referenced
+#define TPM_GENERATED_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:9 - Definition of TPM_ALG_ID Constants  (ConstantsTable)
+#define TPM_ALG_ID_Unmarshal(target, buffer, size) \
+            UINT16_Unmarshal((UINT16 *)(target), buffer, size)
+#define TPM_ALG_ID_Marshal(source, buffer, size) \
+            UINT16_Marshal((UINT16 *)(source), buffer, size)
+
+
+// Table 2:10 - Definition of TPM_ECC_CURVE Constants  (ConstantsTable)
+#ifdef    TPM_ALG_ECC
+#define TPM_ECC_CURVE_Unmarshal(target, buffer, size) \
+            UINT16_Unmarshal((UINT16 *)(target), buffer, size)
+#define TPM_ECC_CURVE_Marshal(source, buffer, size) \
+            UINT16_Marshal((UINT16 *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+
+
+// Table 2:13 - Definition of TPM_CC Constants  (ConstantsTable)
+#define TPM_CC_Unmarshal(target, buffer, size) \
+            UINT32_Unmarshal((UINT32 *)(target), buffer, size)
+#define TPM_CC_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:17 - Definition of TPM_RC Constants  (ConstantsTable)
+//     TPM_RC_Unmarshal not referenced
+#define TPM_RC_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:18 - Definition of TPM_CLOCK_ADJUST Constants  (ConstantsTable)
+TPM_RC
+TPM_CLOCK_ADJUST_Unmarshal(TPM_CLOCK_ADJUST *target, BYTE **buffer, INT32 *size);
+
+//     TPM_CLOCK_ADJUST_Marshal not referenced
+
+
+// Table 2:19 - Definition of TPM_EO Constants  (ConstantsTable)
+TPM_RC
+TPM_EO_Unmarshal(TPM_EO *target, BYTE **buffer, INT32 *size);
+
+//     TPM_EO_Marshal not referenced
+
+
+// Table 2:20 - Definition of TPM_ST Constants  (ConstantsTable)
+#define TPM_ST_Unmarshal(target, buffer, size) \
+            UINT16_Unmarshal((UINT16 *)(target), buffer, size)
+#define TPM_ST_Marshal(source, buffer, size) \
+            UINT16_Marshal((UINT16 *)(source), buffer, size)
+
+
+// Table 2:21 - Definition of TPM_SU Constants  (ConstantsTable)
+TPM_RC
+TPM_SU_Unmarshal(TPM_SU *target, BYTE **buffer, INT32 *size);
+
+//     TPM_SU_Marshal not referenced
+
+
+// Table 2:22 - Definition of TPM_SE Constants  (ConstantsTable)
+TPM_RC
+TPM_SE_Unmarshal(TPM_SE *target, BYTE **buffer, INT32 *size);
+
+//     TPM_SE_Marshal not referenced
+
+
+// Table 2:23 - Definition of TPM_CAP Constants (ConstantsTable)
+TPM_RC
+TPM_CAP_Unmarshal(TPM_CAP *target, BYTE **buffer, INT32 *size);
+
+#define TPM_CAP_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:24 - Definition of TPM_PT Constants  (ConstantsTable)
+//     TPM_PT_Unmarshal not referenced
+#define TPM_PT_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:25 - Definition of TPM_PT_PCR Constants  (ConstantsTable)
+//     TPM_PT_PCR_Unmarshal not referenced
+//     TPM_PT_PCR_Marshal not referenced
+
+
+// Table 2:26 - Definition of TPM_PS Constants  (ConstantsTable)
+//     TPM_PS_Unmarshal not referenced
+//     TPM_PS_Marshal not referenced
+
+
+// Table 2:27 - Definition of Types for Handles (TypesTable)
+//   UINT32 definition from table 2:27
+#define TPM_HANDLE_Unmarshal(target, buffer, size) \
+            UINT32_Unmarshal((UINT32 *)(target), buffer, size)
+#define TPM_HANDLE_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:28 - Definition of TPM_HT Constants  (ConstantsTable)
+//     TPM_HT_Unmarshal not referenced
+//     TPM_HT_Marshal not referenced
+
+
+// Table 2:29 - Definition of TPM_RH Constants  (ConstantsTable)
+//     TPM_RH_Unmarshal not referenced
+//     TPM_RH_Marshal not referenced
+
+
+// Table 2:30 - Definition of TPM_HC Constants  (ConstantsTable)
+//     TPM_HC_Unmarshal not referenced
+//     TPM_HC_Marshal not referenced
+
+
+// Table 2:31 - Definition of TPMA_ALGORITHM Bits (BitsTable)
+//     TPMA_ALGORITHM_Unmarshal not referenced
+#define TPMA_ALGORITHM_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:32 - Definition of TPMA_OBJECT Bits (BitsTable)
+TPM_RC
+TPMA_OBJECT_Unmarshal(TPMA_OBJECT *target, BYTE **buffer, INT32 *size);
+
+#define TPMA_OBJECT_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:33 - Definition of TPMA_SESSION Bits  (BitsTable)
+TPM_RC
+TPMA_SESSION_Unmarshal(TPMA_SESSION *target, BYTE **buffer, INT32 *size);
+
+#define TPMA_SESSION_Marshal(source, buffer, size) \
+            UINT8_Marshal((UINT8 *)(source), buffer, size)
+
+
+// Table 2:34 - Definition of TPMA_LOCALITY Bits  (BitsTable)
+#define TPMA_LOCALITY_Unmarshal(target, buffer, size) \
+            UINT8_Unmarshal((UINT8 *)(target), buffer, size)
+#define TPMA_LOCALITY_Marshal(source, buffer, size) \
+            UINT8_Marshal((UINT8 *)(source), buffer, size)
+
+
+// Table 2:35 - Definition of TPMA_PERMANENT Bits  (BitsTable)
+//     TPMA_PERMANENT_Unmarshal not referenced
+//     TPMA_PERMANENT_Marshal not referenced
+
+
+// Table 2:36 - Definition of TPMA_STARTUP_CLEAR Bits  (BitsTable)
+//     TPMA_STARTUP_CLEAR_Unmarshal not referenced
+//     TPMA_STARTUP_CLEAR_Marshal not referenced
+
+
+// Table 2:37 - Definition of TPMA_MEMORY Bits  (BitsTable)
+//     TPMA_MEMORY_Unmarshal not referenced
+//     TPMA_MEMORY_Marshal not referenced
+
+
+// Table 2:38 - Definition of TPMA_CC Bits  (BitsTable)
+//     TPMA_CC_Unmarshal not referenced
+#define TPMA_CC_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:39 - Definition of TPMI_YES_NO Type (TypeTable)
+TPM_RC
+TPMI_YES_NO_Unmarshal(TPMI_YES_NO *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_YES_NO_Marshal(source, buffer, size) \
+            BYTE_Marshal((BYTE *)(source), buffer, size)
+
+
+// Table 2:40 - Definition of TPMI_DH_OBJECT Type  (TypeTable)
+TPM_RC
+TPMI_DH_OBJECT_Unmarshal(TPMI_DH_OBJECT *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_DH_OBJECT_Marshal(source, buffer, size) \
+            TPM_HANDLE_Marshal((TPM_HANDLE *)(source), buffer, size)
+
+
+// Table 2:41 - Definition of TPMI_DH_PERSISTENT Type  (TypeTable)
+TPM_RC
+TPMI_DH_PERSISTENT_Unmarshal(TPMI_DH_PERSISTENT *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_DH_PERSISTENT_Marshal not referenced
+
+
+// Table 2:42 - Definition of TPMI_DH_ENTITY Type  (TypeTable)
+TPM_RC
+TPMI_DH_ENTITY_Unmarshal(TPMI_DH_ENTITY *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_DH_ENTITY_Marshal not referenced
+
+
+// Table 2:43 - Definition of TPMI_DH_PCR Type  (TypeTable)
+TPM_RC
+TPMI_DH_PCR_Unmarshal(TPMI_DH_PCR *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_DH_PCR_Marshal not referenced
+
+
+// Table 2:44 - Definition of TPMI_SH_AUTH_SESSION Type  (TypeTable)
+TPM_RC
+TPMI_SH_AUTH_SESSION_Unmarshal(TPMI_SH_AUTH_SESSION *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_SH_AUTH_SESSION_Marshal(source, buffer, size) \
+            TPM_HANDLE_Marshal((TPM_HANDLE *)(source), buffer, size)
+
+
+// Table 2:45 - Definition of TPMI_SH_HMAC Type  (TypeTable)
+TPM_RC
+TPMI_SH_HMAC_Unmarshal(TPMI_SH_HMAC *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_SH_HMAC_Marshal not referenced
+
+
+// Table 2:46 - Definition of TPMI_SH_POLICY Type  (TypeTable)
+TPM_RC
+TPMI_SH_POLICY_Unmarshal(TPMI_SH_POLICY *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_SH_POLICY_Marshal not referenced
+
+
+// Table 2:47 - Definition of TPMI_DH_CONTEXT Type  (TypeTable)
+TPM_RC
+TPMI_DH_CONTEXT_Unmarshal(TPMI_DH_CONTEXT *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_DH_CONTEXT_Marshal(source, buffer, size) \
+            TPM_HANDLE_Marshal((TPM_HANDLE *)(source), buffer, size)
+
+
+// Table 2:48 - Definition of TPMI_RH_HIERARCHY Type  (TypeTable)
+TPM_RC
+TPMI_RH_HIERARCHY_Unmarshal(TPMI_RH_HIERARCHY *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_RH_HIERARCHY_Marshal(source, buffer, size) \
+            TPM_HANDLE_Marshal((TPM_HANDLE *)(source), buffer, size)
+
+
+// Table 2:49 - Definition of TPMI_RH_ENABLES Type  (TypeTable)
+TPM_RC
+TPMI_RH_ENABLES_Unmarshal(TPMI_RH_ENABLES *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_RH_ENABLES_Marshal not referenced
+
+
+// Table 2:50 - Definition of TPMI_RH_HIERARCHY_AUTH Type  (TypeTable)
+TPM_RC
+TPMI_RH_HIERARCHY_AUTH_Unmarshal(TPMI_RH_HIERARCHY_AUTH *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_RH_HIERARCHY_AUTH_Marshal not referenced
+
+
+// Table 2:51 - Definition of TPMI_RH_PLATFORM Type  (TypeTable)
+TPM_RC
+TPMI_RH_PLATFORM_Unmarshal(TPMI_RH_PLATFORM *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_RH_PLATFORM_Marshal not referenced
+
+
+// Table 2:52 - Definition of TPMI_RH_OWNER Type  (TypeTable)
+//     TPMI_RH_OWNER_Unmarshal not referenced
+//     TPMI_RH_OWNER_Marshal not referenced
+
+
+// Table 2:53 - Definition of TPMI_RH_ENDORSEMENT Type  (TypeTable)
+TPM_RC
+TPMI_RH_ENDORSEMENT_Unmarshal(TPMI_RH_ENDORSEMENT *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_RH_ENDORSEMENT_Marshal not referenced
+
+
+// Table 2:54 - Definition of TPMI_RH_PROVISION Type  (TypeTable)
+TPM_RC
+TPMI_RH_PROVISION_Unmarshal(TPMI_RH_PROVISION *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_RH_PROVISION_Marshal not referenced
+
+
+// Table 2:55 - Definition of TPMI_RH_CLEAR Type  (TypeTable)
+TPM_RC
+TPMI_RH_CLEAR_Unmarshal(TPMI_RH_CLEAR *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_RH_CLEAR_Marshal not referenced
+
+
+// Table 2:56 - Definition of TPMI_RH_NV_AUTH Type  (TypeTable)
+TPM_RC
+TPMI_RH_NV_AUTH_Unmarshal(TPMI_RH_NV_AUTH *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_RH_NV_AUTH_Marshal not referenced
+
+
+// Table 2:57 - Definition of TPMI_RH_LOCKOUT Type  (TypeTable)
+TPM_RC
+TPMI_RH_LOCKOUT_Unmarshal(TPMI_RH_LOCKOUT *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_RH_LOCKOUT_Marshal not referenced
+
+
+// Table 2:58 - Definition of TPMI_RH_NV_INDEX Type  (TypeTable)
+TPM_RC
+TPMI_RH_NV_INDEX_Unmarshal(TPMI_RH_NV_INDEX *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_RH_NV_INDEX_Marshal(source, buffer, size) \
+            TPM_HANDLE_Marshal((TPM_HANDLE *)(source), buffer, size)
+
+
+// Table 2:59 - Definition of TPMI_ALG_HASH Type  (TypeTable)
+TPM_RC
+TPMI_ALG_HASH_Unmarshal(TPMI_ALG_HASH *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_HASH_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:60 - Definition of TPMI_ALG_ASYM Type (TypeTable)
+//     TPMI_ALG_ASYM_Unmarshal not referenced
+//     TPMI_ALG_ASYM_Marshal not referenced
+
+
+// Table 2:61 - Definition of TPMI_ALG_SYM Type (TypeTable)
+TPM_RC
+TPMI_ALG_SYM_Unmarshal(TPMI_ALG_SYM *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_ALG_SYM_Marshal not referenced
+
+
+// Table 2:62 - Definition of TPMI_ALG_SYM_OBJECT Type (TypeTable)
+TPM_RC
+TPMI_ALG_SYM_OBJECT_Unmarshal(TPMI_ALG_SYM_OBJECT *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_SYM_OBJECT_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:63 - Definition of TPMI_ALG_SYM_MODE Type (TypeTable)
+TPM_RC
+TPMI_ALG_SYM_MODE_Unmarshal(TPMI_ALG_SYM_MODE *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_SYM_MODE_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:64 - Definition of TPMI_ALG_KDF Type (TypeTable)
+TPM_RC
+TPMI_ALG_KDF_Unmarshal(TPMI_ALG_KDF *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_KDF_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:65 - Definition of TPMI_ALG_SIG_SCHEME Type (TypeTable)
+TPM_RC
+TPMI_ALG_SIG_SCHEME_Unmarshal(TPMI_ALG_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_SIG_SCHEME_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:66 - Definition of TPMI_ECC_KEY_EXCHANGE Type (TypeTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMI_ECC_KEY_EXCHANGE_Unmarshal(TPMI_ECC_KEY_EXCHANGE *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_ECC_KEY_EXCHANGE_Marshal not referenced
+#endif // TPM_ALG_ECC
+
+
+// Table 2:67 - Definition of TPMI_ST_COMMAND_TAG Type (TypeTable)
+TPM_RC
+TPMI_ST_COMMAND_TAG_Unmarshal(TPMI_ST_COMMAND_TAG *target, BYTE **buffer, INT32 *size);
+
+//     TPMI_ST_COMMAND_TAG_Marshal not referenced
+TPM_RC
+TPMS_EMPTY_Unmarshal(TPMS_EMPTY *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_EMPTY_Marshal(TPMS_EMPTY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:69 - Definition of TPMS_ALGORITHM_DESCRIPTION Structure  (StructureTable)
+//     TPMS_ALGORITHM_DESCRIPTION_Unmarshal not referenced
+//     TPMS_ALGORITHM_DESCRIPTION_Marshal not referenced
+
+
+// Table 2:70 - Definition of TPMU_HA Union  (UnionTable)
+TPM_RC
+TPMU_HA_Unmarshal(TPMU_HA *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_HA_Marshal(TPMU_HA *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:71 - Definition of TPMT_HA Structure  (StructureTable)
+TPM_RC
+TPMT_HA_Unmarshal(TPMT_HA *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_HA_Marshal(TPMT_HA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:72 - Definition of TPM2B_DIGEST Structure (StructureTable)
+TPM_RC
+TPM2B_DIGEST_Unmarshal(TPM2B_DIGEST *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_DIGEST_Marshal(TPM2B_DIGEST *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:73 - Definition of TPM2B_DATA Structure (StructureTable)
+TPM_RC
+TPM2B_DATA_Unmarshal(TPM2B_DATA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_DATA_Marshal(TPM2B_DATA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:74 - Definition of Types for TPM2B_NONCE (TypesTable)
+//   TPM2B_DIGEST definition from table 2:74
+#define TPM2B_NONCE_Unmarshal(target, buffer, size) \
+            TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)(target), buffer, size)
+#define TPM2B_NONCE_Marshal(source, buffer, size) \
+            TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)(source), buffer, size)
+
+
+// Table 2:75 - Definition of Types for TPM2B_AUTH (TypesTable)
+//   TPM2B_DIGEST definition from table 2:75
+#define TPM2B_AUTH_Unmarshal(target, buffer, size) \
+            TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)(target), buffer, size)
+#define TPM2B_AUTH_Marshal(source, buffer, size) \
+            TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)(source), buffer, size)
+
+
+// Table 2:76 - Definition of Types for TPM2B_OPERAND (TypesTable)
+//   TPM2B_DIGEST definition from table 2:76
+#define TPM2B_OPERAND_Unmarshal(target, buffer, size) \
+            TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)(target), buffer, size)
+//     TPM2B_OPERAND_Marshal not referenced
+
+
+// Table 2:77 - Definition of TPM2B_EVENT Structure (StructureTable)
+TPM_RC
+TPM2B_EVENT_Unmarshal(TPM2B_EVENT *target, BYTE **buffer, INT32 *size);
+
+//     TPM2B_EVENT_Marshal not referenced
+
+
+// Table 2:78 - Definition of TPM2B_MAX_BUFFER Structure (StructureTable)
+TPM_RC
+TPM2B_MAX_BUFFER_Unmarshal(TPM2B_MAX_BUFFER *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_MAX_BUFFER_Marshal(TPM2B_MAX_BUFFER *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:79 - Definition of TPM2B_MAX_NV_BUFFER Structure (StructureTable)
+TPM_RC
+TPM2B_MAX_NV_BUFFER_Unmarshal(TPM2B_MAX_NV_BUFFER *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_MAX_NV_BUFFER_Marshal(TPM2B_MAX_NV_BUFFER *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:80 - Definition of TPM2B_TIMEOUT Structure  (StructureTable)
+TPM_RC
+TPM2B_TIMEOUT_Unmarshal(TPM2B_TIMEOUT *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_TIMEOUT_Marshal(TPM2B_TIMEOUT *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:81 - Definition of TPM2B_IV Structure  (StructureTable)
+TPM_RC
+TPM2B_IV_Unmarshal(TPM2B_IV *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_IV_Marshal(TPM2B_IV *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:82 - Definition of TPMU_NAME Union  (UnionTable)
+
+
+// Table 2:83 - Definition of TPM2B_NAME Structure (StructureTable)
+TPM_RC
+TPM2B_NAME_Unmarshal(TPM2B_NAME *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_NAME_Marshal(TPM2B_NAME *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:84 - Definition of TPMS_PCR_SELECT Structure (StructureTable)
+//     TPMS_PCR_SELECT_Unmarshal not referenced
+//     TPMS_PCR_SELECT_Marshal not referenced
+
+
+// Table 2:85 - Definition of TPMS_PCR_SELECTION Structure (StructureTable)
+TPM_RC
+TPMS_PCR_SELECTION_Unmarshal(TPMS_PCR_SELECTION *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_PCR_SELECTION_Marshal(TPMS_PCR_SELECTION *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:88 - Definition of TPMT_TK_CREATION Structure (StructureTable)
+TPM_RC
+TPMT_TK_CREATION_Unmarshal(TPMT_TK_CREATION *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMT_TK_CREATION_Marshal(TPMT_TK_CREATION *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:89 - Definition of TPMT_TK_VERIFIED Structure (StructureTable)
+TPM_RC
+TPMT_TK_VERIFIED_Unmarshal(TPMT_TK_VERIFIED *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMT_TK_VERIFIED_Marshal(TPMT_TK_VERIFIED *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:90 - Definition of TPMT_TK_AUTH Structure (StructureTable)
+TPM_RC
+TPMT_TK_AUTH_Unmarshal(TPMT_TK_AUTH *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMT_TK_AUTH_Marshal(TPMT_TK_AUTH *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:91 - Definition of TPMT_TK_HASHCHECK Structure (StructureTable)
+TPM_RC
+TPMT_TK_HASHCHECK_Unmarshal(TPMT_TK_HASHCHECK *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMT_TK_HASHCHECK_Marshal(TPMT_TK_HASHCHECK *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:92 - Definition of TPMS_ALG_PROPERTY Structure  (StructureTable)
+//     TPMS_ALG_PROPERTY_Unmarshal not referenced
+UINT16
+TPMS_ALG_PROPERTY_Marshal(TPMS_ALG_PROPERTY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:93 - Definition of TPMS_TAGGED_PROPERTY Structure  (StructureTable)
+//     TPMS_TAGGED_PROPERTY_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PROPERTY_Marshal(TPMS_TAGGED_PROPERTY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:94 - Definition of TPMS_TAGGED_PCR_SELECT Structure  (StructureTable)
+//     TPMS_TAGGED_PCR_SELECT_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PCR_SELECT_Marshal(TPMS_TAGGED_PCR_SELECT *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:95 - Definition of TPML_CC Structure (StructureTable)
+TPM_RC
+TPML_CC_Unmarshal(TPML_CC *target, BYTE **buffer, INT32 *size);
+UINT16
+TPML_CC_Marshal(TPML_CC *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:96 - Definition of TPML_CCA Structure  (StructureTable)
+//     TPML_CCA_Unmarshal not referenced
+UINT16
+TPML_CCA_Marshal(TPML_CCA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:97 - Definition of TPML_ALG Structure (StructureTable)
+TPM_RC
+TPML_ALG_Unmarshal(TPML_ALG *target, BYTE **buffer, INT32 *size);
+UINT16
+TPML_ALG_Marshal(TPML_ALG *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:98 - Definition of TPML_HANDLE Structure  (StructureTable)
+//     TPML_HANDLE_Unmarshal not referenced
+UINT16
+TPML_HANDLE_Marshal(TPML_HANDLE *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:99 - Definition of TPML_DIGEST Structure (StructureTable)
+TPM_RC
+TPML_DIGEST_Unmarshal(TPML_DIGEST *target, BYTE **buffer, INT32 *size);
+UINT16
+TPML_DIGEST_Marshal(TPML_DIGEST *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:100 - Definition of TPML_DIGEST_VALUES Structure (StructureTable)
+TPM_RC
+TPML_DIGEST_VALUES_Unmarshal(TPML_DIGEST_VALUES *target, BYTE **buffer, INT32 *size);
+UINT16
+TPML_DIGEST_VALUES_Marshal(TPML_DIGEST_VALUES *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:101 - Definition of TPM2B_DIGEST_VALUES Structure (StructureTable)
+//     TPM2B_DIGEST_VALUES_Unmarshal not referenced
+//     TPM2B_DIGEST_VALUES_Marshal not referenced
+
+
+// Table 2:102 - Definition of TPML_PCR_SELECTION Structure (StructureTable)
+TPM_RC
+TPML_PCR_SELECTION_Unmarshal(TPML_PCR_SELECTION *target, BYTE **buffer, INT32 *size);
+UINT16
+TPML_PCR_SELECTION_Marshal(TPML_PCR_SELECTION *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:103 - Definition of TPML_ALG_PROPERTY Structure  (StructureTable)
+//     TPML_ALG_PROPERTY_Unmarshal not referenced
+UINT16
+TPML_ALG_PROPERTY_Marshal(TPML_ALG_PROPERTY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:104 - Definition of TPML_TAGGED_TPM_PROPERTY Structure  (StructureTable)
+//     TPML_TAGGED_TPM_PROPERTY_Unmarshal not referenced
+UINT16
+TPML_TAGGED_TPM_PROPERTY_Marshal(TPML_TAGGED_TPM_PROPERTY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:105 - Definition of TPML_TAGGED_PCR_PROPERTY Structure  (StructureTable)
+//     TPML_TAGGED_PCR_PROPERTY_Unmarshal not referenced
+UINT16
+TPML_TAGGED_PCR_PROPERTY_Marshal(TPML_TAGGED_PCR_PROPERTY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:106 - Definition of TPML_ECC_CURVE Structure  (StructureTable)
+#ifdef    TPM_ALG_ECC
+//     TPML_ECC_CURVE_Unmarshal not referenced
+UINT16
+TPML_ECC_CURVE_Marshal(TPML_ECC_CURVE *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:107 - Definition of TPMU_CAPABILITIES Union  (UnionTable)
+//     TPMU_CAPABILITIES_Unmarshal not referenced
+UINT16
+TPMU_CAPABILITIES_Marshal(TPMU_CAPABILITIES *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:108 - Definition of TPMS_CAPABILITY_DATA Structure  (StructureTable)
+//     TPMS_CAPABILITY_DATA_Unmarshal not referenced
+UINT16
+TPMS_CAPABILITY_DATA_Marshal(TPMS_CAPABILITY_DATA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:109 - Definition of TPMS_CLOCK_INFO Structure (StructureTable)
+//     TPMS_CLOCK_INFO_Unmarshal not referenced
+UINT16
+TPMS_CLOCK_INFO_Marshal(TPMS_CLOCK_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:110 - Definition of TPMS_TIME_INFO Structure (StructureTable)
+//     TPMS_TIME_INFO_Unmarshal not referenced
+UINT16
+TPMS_TIME_INFO_Marshal(TPMS_TIME_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:111 - Definition of TPMS_TIME_ATTEST_INFO Structure  (StructureTable)
+//     TPMS_TIME_ATTEST_INFO_Unmarshal not referenced
+UINT16
+TPMS_TIME_ATTEST_INFO_Marshal(TPMS_TIME_ATTEST_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:112 - Definition of TPMS_CERTIFY_INFO Structure  (StructureTable)
+//     TPMS_CERTIFY_INFO_Unmarshal not referenced
+UINT16
+TPMS_CERTIFY_INFO_Marshal(TPMS_CERTIFY_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:113 - Definition of TPMS_QUOTE_INFO Structure  (StructureTable)
+//     TPMS_QUOTE_INFO_Unmarshal not referenced
+UINT16
+TPMS_QUOTE_INFO_Marshal(TPMS_QUOTE_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:114 - Definition of TPMS_COMMAND_AUDIT_INFO Structure  (StructureTable)
+//     TPMS_COMMAND_AUDIT_INFO_Unmarshal not referenced
+UINT16
+TPMS_COMMAND_AUDIT_INFO_Marshal(TPMS_COMMAND_AUDIT_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:115 - Definition of TPMS_SESSION_AUDIT_INFO Structure  (StructureTable)
+//     TPMS_SESSION_AUDIT_INFO_Unmarshal not referenced
+UINT16
+TPMS_SESSION_AUDIT_INFO_Marshal(TPMS_SESSION_AUDIT_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:116 - Definition of TPMS_CREATION_INFO Structure  (StructureTable)
+//     TPMS_CREATION_INFO_Unmarshal not referenced
+UINT16
+TPMS_CREATION_INFO_Marshal(TPMS_CREATION_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:117 - Definition of TPMS_NV_CERTIFY_INFO Structure  (StructureTable)
+//     TPMS_NV_CERTIFY_INFO_Unmarshal not referenced
+UINT16
+TPMS_NV_CERTIFY_INFO_Marshal(TPMS_NV_CERTIFY_INFO *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:118 - Definition of TPMI_ST_ATTEST Type  (TypeTable)
+//     TPMI_ST_ATTEST_Unmarshal not referenced
+#define TPMI_ST_ATTEST_Marshal(source, buffer, size) \
+            TPM_ST_Marshal((TPM_ST *)(source), buffer, size)
+
+
+// Table 2:119 - Definition of TPMU_ATTEST Union  (UnionTable)
+//     TPMU_ATTEST_Unmarshal not referenced
+UINT16
+TPMU_ATTEST_Marshal(TPMU_ATTEST *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:120 - Definition of TPMS_ATTEST Structure  (StructureTable)
+//     TPMS_ATTEST_Unmarshal not referenced
+UINT16
+TPMS_ATTEST_Marshal(TPMS_ATTEST *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:121 - Definition of TPM2B_ATTEST Structure  (StructureTable)
+//     TPM2B_ATTEST_Unmarshal not referenced
+UINT16
+TPM2B_ATTEST_Marshal(TPM2B_ATTEST *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:122 - Definition of TPMS_AUTH_COMMAND Structure  (StructureTable)
+//     TPMS_AUTH_COMMAND_Unmarshal not referenced
+//     TPMS_AUTH_COMMAND_Marshal not referenced
+
+
+// Table 2:123 - Definition of TPMS_AUTH_RESPONSE Structure  (StructureTable)
+//     TPMS_AUTH_RESPONSE_Unmarshal not referenced
+//     TPMS_AUTH_RESPONSE_Marshal not referenced
+
+
+// Table 2:124 - Definition of TPMI_AES_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_AES
+TPM_RC
+TPMI_AES_KEY_BITS_Unmarshal(TPMI_AES_KEY_BITS *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_AES_KEY_BITS_Marshal(source, buffer, size) \
+            TPM_KEY_BITS_Marshal((TPM_KEY_BITS *)(source), buffer, size)
+#endif // TPM_ALG_AES
+
+
+// Table 2:124 - Definition of TPMI_SM4_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_SM4
+TPM_RC
+TPMI_SM4_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_SM4_KEY_BITS_Marshal(source, buffer, size) \
+            TPM_KEY_BITS_Marshal((TPM_KEY_BITS *)(source), buffer, size)
+#endif // TPM_ALG_SM4
+
+
+// Table 2:124 - Definition of TPMI_CAMELLIA_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_CAMELLIA
+TPM_RC
+TPMI_CAMELLIA_KEY_BITS_Unmarshal(TPMI_CAMELLIA_KEY_BITS *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_CAMELLIA_KEY_BITS_Marshal(source, buffer, size) \
+            TPM_KEY_BITS_Marshal((TPM_KEY_BITS *)(source), buffer, size)
+#endif // TPM_ALG_CAMELLIA
+
+
+// Table 2:125 - Definition of TPMU_SYM_KEY_BITS Union (UnionTable)
+TPM_RC
+TPMU_SYM_KEY_BITS_Unmarshal(TPMU_SYM_KEY_BITS *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_SYM_KEY_BITS_Marshal(TPMU_SYM_KEY_BITS *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:126 - Definition of TPMU_SYM_MODE Union (UnionTable)
+TPM_RC
+TPMU_SYM_MODE_Unmarshal(TPMU_SYM_MODE *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_SYM_MODE_Marshal(TPMU_SYM_MODE *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:128 - Definition of TPMT_SYM_DEF Structure (StructureTable)
+TPM_RC
+TPMT_SYM_DEF_Unmarshal(TPMT_SYM_DEF *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMT_SYM_DEF_Marshal not referenced
+
+
+// Table 2:129 - Definition of TPMT_SYM_DEF_OBJECT Structure (StructureTable)
+TPM_RC
+TPMT_SYM_DEF_OBJECT_Unmarshal(TPMT_SYM_DEF_OBJECT *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_SYM_DEF_OBJECT_Marshal(TPMT_SYM_DEF_OBJECT *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:130 - Definition of TPM2B_SYM_KEY Structure (StructureTable)
+TPM_RC
+TPM2B_SYM_KEY_Unmarshal(TPM2B_SYM_KEY *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_SYM_KEY_Marshal(TPM2B_SYM_KEY *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:131 - Definition of TPMS_SYMCIPHER_PARMS Structure (StructureTable)
+#define TPMS_SYMCIPHER_PARMS_Unmarshal(target, buffer, size) \
+            TPMT_SYM_DEF_OBJECT_Unmarshal((TPMT_SYM_DEF_OBJECT *)&((target)->sym), buffer, size, 0)
+#define TPMS_SYMCIPHER_PARMS_Marshal(source, buffer, size) \
+            TPMT_SYM_DEF_OBJECT_Marshal((TPMT_SYM_DEF_OBJECT *)&((source)->sym), buffer, size)
+
+
+// Table 2:132 - Definition of TPM2B_SENSITIVE_DATA Structure (StructureTable)
+TPM_RC
+TPM2B_SENSITIVE_DATA_Unmarshal(TPM2B_SENSITIVE_DATA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_SENSITIVE_DATA_Marshal(TPM2B_SENSITIVE_DATA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:133 - Definition of TPMS_SENSITIVE_CREATE Structure  (StructureTable)
+TPM_RC
+TPMS_SENSITIVE_CREATE_Unmarshal(TPMS_SENSITIVE_CREATE *target, BYTE **buffer, INT32 *size);
+
+//     TPMS_SENSITIVE_CREATE_Marshal not referenced
+
+
+// Table 2:134 - Definition of TPM2B_SENSITIVE_CREATE Structure  (StructureTable)
+TPM_RC
+TPM2B_SENSITIVE_CREATE_Unmarshal(TPM2B_SENSITIVE_CREATE *target, BYTE **buffer, INT32 *size);
+
+//     TPM2B_SENSITIVE_CREATE_Marshal not referenced
+
+
+// Table 2:135 - Definition of TPMS_SCHEME_HASH Structure (StructureTable)
+#define TPMS_SCHEME_HASH_Unmarshal(target, buffer, size) \
+            TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&((target)->hashAlg), buffer, size, 0)
+#define TPMS_SCHEME_HASH_Marshal(source, buffer, size) \
+            TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&((source)->hashAlg), buffer, size)
+
+
+// Table 2:136 - Definition of TPMS_SCHEME_ECDAA Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_SCHEME_ECDAA_Unmarshal(TPMS_SCHEME_ECDAA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_SCHEME_ECDAA_Marshal(TPMS_SCHEME_ECDAA *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:137 - Definition of TPMI_ALG_KEYEDHASH_SCHEME Type (TypeTable)
+TPM_RC
+TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal(TPMI_ALG_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_KEYEDHASH_SCHEME_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:138 - Definition of Types for HMAC_SIG_SCHEME (TypesTable)
+//   TPMS_SCHEME_HASH definition from table 2:138
+#define TPMS_SCHEME_HMAC_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SCHEME_HMAC_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+
+
+// Table 2:139 - Definition of TPMS_SCHEME_XOR Structure (StructureTable)
+TPM_RC
+TPMS_SCHEME_XOR_Unmarshal(TPMS_SCHEME_XOR *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMS_SCHEME_XOR_Marshal(TPMS_SCHEME_XOR *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:140 - Definition of TPMU_SCHEME_KEYEDHASH Union  (UnionTable)
+TPM_RC
+TPMU_SCHEME_KEYEDHASH_Unmarshal(TPMU_SCHEME_KEYEDHASH *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_SCHEME_KEYEDHASH_Marshal(TPMU_SCHEME_KEYEDHASH *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:141 - Definition of TPMT_KEYEDHASH_SCHEME Structure (StructureTable)
+TPM_RC
+TPMT_KEYEDHASH_SCHEME_Unmarshal(TPMT_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_KEYEDHASH_SCHEME_Marshal(TPMT_KEYEDHASH_SCHEME *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:142 - Definition of Types for RSA Signature Schemes  (TypesTable)
+#ifdef    TPM_ALG_RSA
+//   TPMS_SCHEME_HASH definition from table 2:142
+#ifdef    TPM_ALG_RSA
+#define TPMS_SIG_SCHEME_RSASSA_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SIG_SCHEME_RSASSA_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+//   TPMS_SCHEME_HASH definition from table 2:142
+#ifdef    TPM_ALG_RSA
+#define TPMS_SIG_SCHEME_RSAPSS_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SIG_SCHEME_RSAPSS_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+#endif // TPM_ALG_RSA
+
+
+// Table 2:143 - Definition of Types for ECC Signature Schemes  (TypesTable)
+#ifdef    TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:143
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIG_SCHEME_ECDSA_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SIG_SCHEME_ECDSA_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:143
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIG_SCHEME_SM2_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SIG_SCHEME_SM2_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:143
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SIG_SCHEME_ECSCHNORR_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_ECDAA definition from table 2:143
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIG_SCHEME_ECDAA_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_ECDAA_Unmarshal((TPMS_SCHEME_ECDAA *)(target), buffer, size)
+#define TPMS_SIG_SCHEME_ECDAA_Marshal(source, buffer, size) \
+            TPMS_SCHEME_ECDAA_Marshal((TPMS_SCHEME_ECDAA *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+#endif // TPM_ALG_ECC
+
+
+// Table 2:144 - Definition of TPMU_SIG_SCHEME Union  (UnionTable)
+TPM_RC
+TPMU_SIG_SCHEME_Unmarshal(TPMU_SIG_SCHEME *target, BYTE **buffer, INT32 *size, UINT32 selector);
+
+//     TPMU_SIG_SCHEME_Marshal not referenced
+
+
+// Table 2:145 - Definition of TPMT_SIG_SCHEME Structure (StructureTable)
+TPM_RC
+TPMT_SIG_SCHEME_Unmarshal(TPMT_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMT_SIG_SCHEME_Marshal not referenced
+
+
+// Table 2:146 - Definition of Types for Encryption Schemes (TypesTable)
+#ifdef    TPM_ALG_RSA
+//   TPMS_SCHEME_HASH definition from table 2:146
+#ifdef    TPM_ALG_RSA
+#define TPMS_ENC_SCHEME_OAEP_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_ENC_SCHEME_OAEP_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+//   TPMS_EMPTY definition from table 2:146
+#ifdef    TPM_ALG_RSA
+#define TPMS_ENC_SCHEME_RSAES_Unmarshal(target, buffer, size) \
+            TPMS_EMPTY_Unmarshal((TPMS_EMPTY *)(target), buffer, size)
+#define TPMS_ENC_SCHEME_RSAES_Marshal(source, buffer, size) \
+            TPMS_EMPTY_Marshal((TPMS_EMPTY *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+#endif // TPM_ALG_RSA
+
+
+// Table 2:147 - Definition of Types for ECC Key Exchange (TypesTable)
+#ifdef    TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:147
+#ifdef    TPM_ALG_ECC
+#define TPMS_KEY_SCHEME_ECDH_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_KEY_SCHEME_ECDH_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:147
+#ifdef    TPM_ALG_ECC
+#define TPMS_KEY_SCHEME_ECMQV_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_KEY_SCHEME_ECMQV_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+#endif // TPM_ALG_ECC
+
+
+// Table 2:148 - Definition of Types for KDF Schemes (TypesTable)
+//   TPMS_SCHEME_HASH definition from table 2:148
+#define TPMS_SCHEME_MGF1_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SCHEME_MGF1_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+//   TPMS_SCHEME_HASH definition from table 2:148
+#define TPMS_SCHEME_KDF1_SP800_56A_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SCHEME_KDF1_SP800_56A_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+//   TPMS_SCHEME_HASH definition from table 2:148
+#define TPMS_SCHEME_KDF2_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SCHEME_KDF2_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+//   TPMS_SCHEME_HASH definition from table 2:148
+#define TPMS_SCHEME_KDF1_SP800_108_Unmarshal(target, buffer, size) \
+            TPMS_SCHEME_HASH_Unmarshal((TPMS_SCHEME_HASH *)(target), buffer, size)
+#define TPMS_SCHEME_KDF1_SP800_108_Marshal(source, buffer, size) \
+            TPMS_SCHEME_HASH_Marshal((TPMS_SCHEME_HASH *)(source), buffer, size)
+
+
+// Table 2:149 - Definition of TPMU_KDF_SCHEME Union  (UnionTable)
+TPM_RC
+TPMU_KDF_SCHEME_Unmarshal(TPMU_KDF_SCHEME *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_KDF_SCHEME_Marshal(TPMU_KDF_SCHEME *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:150 - Definition of TPMT_KDF_SCHEME Structure (StructureTable)
+TPM_RC
+TPMT_KDF_SCHEME_Unmarshal(TPMT_KDF_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_KDF_SCHEME_Marshal(TPMT_KDF_SCHEME *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:151 - Definition of TPMI_ALG_ASYM_SCHEME Type  (TypeTable)
+//     TPMI_ALG_ASYM_SCHEME_Unmarshal not referenced
+//     TPMI_ALG_ASYM_SCHEME_Marshal not referenced
+
+
+// Table 2:152 - Definition of TPMU_ASYM_SCHEME Union (UnionTable)
+TPM_RC
+TPMU_ASYM_SCHEME_Unmarshal(TPMU_ASYM_SCHEME *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_ASYM_SCHEME_Marshal(TPMU_ASYM_SCHEME *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:153 - Definition of TPMT_ASYM_SCHEME Structure  (StructureTable)
+//     TPMT_ASYM_SCHEME_Unmarshal not referenced
+//     TPMT_ASYM_SCHEME_Marshal not referenced
+
+
+// Table 2:154 - Definition of TPMI_ALG_RSA_SCHEME Type (TypeTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMI_ALG_RSA_SCHEME_Unmarshal(TPMI_ALG_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_RSA_SCHEME_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+
+
+// Table 2:155 - Definition of TPMT_RSA_SCHEME Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMT_RSA_SCHEME_Unmarshal(TPMT_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_RSA_SCHEME_Marshal(TPMT_RSA_SCHEME *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:156 - Definition of TPMI_ALG_RSA_DECRYPT Type (TypeTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMI_ALG_RSA_DECRYPT_Unmarshal(TPMI_ALG_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMI_ALG_RSA_DECRYPT_Marshal not referenced
+#endif // TPM_ALG_RSA
+
+
+// Table 2:157 - Definition of TPMT_RSA_DECRYPT Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMT_RSA_DECRYPT_Unmarshal(TPMT_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+//     TPMT_RSA_DECRYPT_Marshal not referenced
+#endif // TPM_ALG_RSA
+
+
+// Table 2:158 - Definition of TPM2B_PUBLIC_KEY_RSA Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPM2B_PUBLIC_KEY_RSA_Unmarshal(TPM2B_PUBLIC_KEY_RSA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_PUBLIC_KEY_RSA_Marshal(TPM2B_PUBLIC_KEY_RSA *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:159 - Definition of TPMI_RSA_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMI_RSA_KEY_BITS_Unmarshal(TPMI_RSA_KEY_BITS *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_RSA_KEY_BITS_Marshal(source, buffer, size) \
+            TPM_KEY_BITS_Marshal((TPM_KEY_BITS *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+
+
+// Table 2:160 - Definition of TPM2B_PRIVATE_KEY_RSA Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPM2B_PRIVATE_KEY_RSA_Unmarshal(TPM2B_PRIVATE_KEY_RSA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_PRIVATE_KEY_RSA_Marshal(TPM2B_PRIVATE_KEY_RSA *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:161 - Definition of TPM2B_ECC_PARAMETER Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPM2B_ECC_PARAMETER_Unmarshal(TPM2B_ECC_PARAMETER *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_ECC_PARAMETER_Marshal(TPM2B_ECC_PARAMETER *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:162 - Definition of TPMS_ECC_POINT Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_ECC_POINT_Unmarshal(TPMS_ECC_POINT *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_ECC_POINT_Marshal(TPMS_ECC_POINT *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:163 - Definition of TPM2B_ECC_POINT Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPM2B_ECC_POINT_Unmarshal(TPM2B_ECC_POINT *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_ECC_POINT_Marshal(TPM2B_ECC_POINT *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:164 - Definition of TPMI_ALG_ECC_SCHEME Type (TypeTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMI_ALG_ECC_SCHEME_Unmarshal(TPMI_ALG_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+
+#define TPMI_ALG_ECC_SCHEME_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+
+
+// Table 2:165 - Definition of TPMI_ECC_CURVE Type (TypeTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMI_ECC_CURVE_Unmarshal(TPMI_ECC_CURVE *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_ECC_CURVE_Marshal(source, buffer, size) \
+            TPM_ECC_CURVE_Marshal((TPM_ECC_CURVE *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+
+
+// Table 2:166 - Definition of TPMT_ECC_SCHEME Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMT_ECC_SCHEME_Unmarshal(TPMT_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_ECC_SCHEME_Marshal(TPMT_ECC_SCHEME *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:167 - Definition of TPMS_ALGORITHM_DETAIL_ECC Structure  (StructureTable)
+#ifdef    TPM_ALG_ECC
+//     TPMS_ALGORITHM_DETAIL_ECC_Unmarshal not referenced
+UINT16
+TPMS_ALGORITHM_DETAIL_ECC_Marshal(TPMS_ALGORITHM_DETAIL_ECC *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:168 - Definition of TPMS_SIGNATURE_RSA Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMS_SIGNATURE_RSA_Unmarshal(TPMS_SIGNATURE_RSA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_SIGNATURE_RSA_Marshal(TPMS_SIGNATURE_RSA *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:169 - Definition of Types for Signature  (TypesTable)
+#ifdef    TPM_ALG_RSA
+//   TPMS_SIGNATURE_RSA definition from table 2:169
+#ifdef    TPM_ALG_RSA
+#define TPMS_SIGNATURE_RSASSA_Unmarshal(target, buffer, size) \
+            TPMS_SIGNATURE_RSA_Unmarshal((TPMS_SIGNATURE_RSA *)(target), buffer, size)
+#define TPMS_SIGNATURE_RSASSA_Marshal(source, buffer, size) \
+            TPMS_SIGNATURE_RSA_Marshal((TPMS_SIGNATURE_RSA *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+//   TPMS_SIGNATURE_RSA definition from table 2:169
+#ifdef    TPM_ALG_RSA
+#define TPMS_SIGNATURE_RSAPSS_Unmarshal(target, buffer, size) \
+            TPMS_SIGNATURE_RSA_Unmarshal((TPMS_SIGNATURE_RSA *)(target), buffer, size)
+#define TPMS_SIGNATURE_RSAPSS_Marshal(source, buffer, size) \
+            TPMS_SIGNATURE_RSA_Marshal((TPMS_SIGNATURE_RSA *)(source), buffer, size)
+#endif // TPM_ALG_RSA
+#endif // TPM_ALG_RSA
+
+
+// Table 2:170 - Definition of TPMS_SIGNATURE_ECC Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_SIGNATURE_ECC_Unmarshal(TPMS_SIGNATURE_ECC *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_SIGNATURE_ECC_Marshal(TPMS_SIGNATURE_ECC *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:171 - Definition of Types for TPMS_SIGNATUE_ECC (TypesTable)
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIGNATURE_ECDSA_Unmarshal(target, buffer, size) \
+            TPMS_SIGNATURE_ECC_Unmarshal((TPMS_SIGNATURE_ECC *)(target), buffer, size)
+#define TPMS_SIGNATURE_ECDSA_Marshal(source, buffer, size) \
+            TPMS_SIGNATURE_ECC_Marshal((TPMS_SIGNATURE_ECC *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIGNATURE_SM2_Unmarshal(target, buffer, size) \
+            TPMS_SIGNATURE_ECC_Unmarshal((TPMS_SIGNATURE_ECC *)(target), buffer, size)
+#define TPMS_SIGNATURE_SM2_Marshal(source, buffer, size) \
+            TPMS_SIGNATURE_ECC_Marshal((TPMS_SIGNATURE_ECC *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIGNATURE_ECSCHNORR_Unmarshal(target, buffer, size) \
+            TPMS_SIGNATURE_ECC_Unmarshal((TPMS_SIGNATURE_ECC *)(target), buffer, size)
+#define TPMS_SIGNATURE_ECSCHNORR_Marshal(source, buffer, size) \
+            TPMS_SIGNATURE_ECC_Marshal((TPMS_SIGNATURE_ECC *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+#define TPMS_SIGNATURE_ECDAA_Unmarshal(target, buffer, size) \
+            TPMS_SIGNATURE_ECC_Unmarshal((TPMS_SIGNATURE_ECC *)(target), buffer, size)
+#define TPMS_SIGNATURE_ECDAA_Marshal(source, buffer, size) \
+            TPMS_SIGNATURE_ECC_Marshal((TPMS_SIGNATURE_ECC *)(source), buffer, size)
+#endif // TPM_ALG_ECC
+#endif // TPM_ALG_ECC
+
+
+// Table 2:172 - Definition of TPMU_SIGNATURE Union  (UnionTable)
+TPM_RC
+TPMU_SIGNATURE_Unmarshal(TPMU_SIGNATURE *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_SIGNATURE_Marshal(TPMU_SIGNATURE *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:173 - Definition of TPMT_SIGNATURE Structure (StructureTable)
+TPM_RC
+TPMT_SIGNATURE_Unmarshal(TPMT_SIGNATURE *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_SIGNATURE_Marshal(TPMT_SIGNATURE *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:174 - Definition of TPMU_ENCRYPTED_SECRET Union  (UnionTable)
+//     TPMU_ENCRYPTED_SECRET_Unmarshal not referenced
+//     TPMU_ENCRYPTED_SECRET_Marshal not referenced
+
+
+// Table 2:175 - Definition of TPM2B_ENCRYPTED_SECRET Structure (StructureTable)
+TPM_RC
+TPM2B_ENCRYPTED_SECRET_Unmarshal(TPM2B_ENCRYPTED_SECRET *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_ENCRYPTED_SECRET_Marshal(TPM2B_ENCRYPTED_SECRET *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:176 - Definition of TPMI_ALG_PUBLIC Type (TypeTable)
+TPM_RC
+TPMI_ALG_PUBLIC_Unmarshal(TPMI_ALG_PUBLIC *target, BYTE **buffer, INT32 *size);
+
+#define TPMI_ALG_PUBLIC_Marshal(source, buffer, size) \
+            TPM_ALG_ID_Marshal((TPM_ALG_ID *)(source), buffer, size)
+
+
+// Table 2:177 - Definition of TPMU_PUBLIC_ID Union  (UnionTable)
+TPM_RC
+TPMU_PUBLIC_ID_Unmarshal(TPMU_PUBLIC_ID *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_PUBLIC_ID_Marshal(TPMU_PUBLIC_ID *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:178 - Definition of TPMS_KEYEDHASH_PARMS Structure (StructureTable)
+#define TPMS_KEYEDHASH_PARMS_Unmarshal(target, buffer, size) \
+            TPMT_KEYEDHASH_SCHEME_Unmarshal((TPMT_KEYEDHASH_SCHEME *)&((target)->scheme), buffer, size, 1)
+#define TPMS_KEYEDHASH_PARMS_Marshal(source, buffer, size) \
+            TPMT_KEYEDHASH_SCHEME_Marshal((TPMT_KEYEDHASH_SCHEME *)&((source)->scheme), buffer, size)
+
+
+// Table 2:179 - Definition of TPMS_ASYM_PARMS Structure  (StructureTable)
+//     TPMS_ASYM_PARMS_Unmarshal not referenced
+//     TPMS_ASYM_PARMS_Marshal not referenced
+
+
+// Table 2:180 - Definition of TPMS_RSA_PARMS Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMS_RSA_PARMS_Unmarshal(TPMS_RSA_PARMS *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_RSA_PARMS_Marshal(TPMS_RSA_PARMS *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:181 - Definition of TPMS_ECC_PARMS Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_ECC_PARMS_Unmarshal(TPMS_ECC_PARMS *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_ECC_PARMS_Marshal(TPMS_ECC_PARMS *source, BYTE **buffer, INT32 *size);
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:182 - Definition of TPMU_PUBLIC_PARMS Union  (UnionTable)
+TPM_RC
+TPMU_PUBLIC_PARMS_Unmarshal(TPMU_PUBLIC_PARMS *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_PUBLIC_PARMS_Marshal(TPMU_PUBLIC_PARMS *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:183 - Definition of TPMT_PUBLIC_PARMS Structure (StructureTable)
+TPM_RC
+TPMT_PUBLIC_PARMS_Unmarshal(TPMT_PUBLIC_PARMS *target, BYTE **buffer, INT32 *size);
+
+//     TPMT_PUBLIC_PARMS_Marshal not referenced
+
+
+// Table 2:184 - Definition of TPMT_PUBLIC Structure (StructureTable)
+TPM_RC
+TPMT_PUBLIC_Unmarshal(TPMT_PUBLIC *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPMT_PUBLIC_Marshal(TPMT_PUBLIC *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:185 - Definition of TPM2B_PUBLIC Structure (StructureTable)
+TPM_RC
+TPM2B_PUBLIC_Unmarshal(TPM2B_PUBLIC *target, BYTE **buffer, INT32 *size, BOOL flag);
+UINT16
+TPM2B_PUBLIC_Marshal(TPM2B_PUBLIC *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:186 - Definition of TPM2B_PRIVATE_VENDOR_SPECIFIC Structure (StructureTable)
+//     TPM2B_PRIVATE_VENDOR_SPECIFIC_Unmarshal not referenced
+//     TPM2B_PRIVATE_VENDOR_SPECIFIC_Marshal not referenced
+
+
+// Table 2:187 - Definition of TPMU_SENSITIVE_COMPOSITE Union  (UnionTable)
+TPM_RC
+TPMU_SENSITIVE_COMPOSITE_Unmarshal(TPMU_SENSITIVE_COMPOSITE *target, BYTE **buffer, INT32 *size, UINT32 selector);
+UINT16
+TPMU_SENSITIVE_COMPOSITE_Marshal(TPMU_SENSITIVE_COMPOSITE *source, BYTE **buffer, INT32 *size, UINT32 selector);
+
+
+// Table 2:188 - Definition of TPMT_SENSITIVE Structure (StructureTable)
+TPM_RC
+TPMT_SENSITIVE_Unmarshal(TPMT_SENSITIVE *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMT_SENSITIVE_Marshal(TPMT_SENSITIVE *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:189 - Definition of TPM2B_SENSITIVE Structure  (StructureTable)
+TPM_RC
+TPM2B_SENSITIVE_Unmarshal(TPM2B_SENSITIVE *target, BYTE **buffer, INT32 *size);
+
+//     TPM2B_SENSITIVE_Marshal not referenced
+
+
+// Table 2:190 - Definition of _PRIVATE Structure  (StructureTable)
+//     _PRIVATE_Unmarshal not referenced
+//     _PRIVATE_Marshal not referenced
+
+
+// Table 2:191 - Definition of TPM2B_PRIVATE Structure  (StructureTable)
+TPM_RC
+TPM2B_PRIVATE_Unmarshal(TPM2B_PRIVATE *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_PRIVATE_Marshal(TPM2B_PRIVATE *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:192 - Definition of _ID_OBJECT Structure  (StructureTable)
+//     _ID_OBJECT_Unmarshal not referenced
+//     _ID_OBJECT_Marshal not referenced
+
+
+// Table 2:193 - Definition of TPM2B_ID_OBJECT Structure  (StructureTable)
+TPM_RC
+TPM2B_ID_OBJECT_Unmarshal(TPM2B_ID_OBJECT *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_ID_OBJECT_Marshal(TPM2B_ID_OBJECT *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:194 - Definition of TPM_NV_INDEX Bits  (BitsTable)
+//     TPM_NV_INDEX_Unmarshal not referenced
+//     TPM_NV_INDEX_Marshal not referenced
+
+
+// Table 2:195 - Definition of TPMA_NV Bits (BitsTable)
+TPM_RC
+TPMA_NV_Unmarshal(TPMA_NV *target, BYTE **buffer, INT32 *size);
+
+#define TPMA_NV_Marshal(source, buffer, size) \
+            UINT32_Marshal((UINT32 *)(source), buffer, size)
+
+
+// Table 2:196 - Definition of TPMS_NV_PUBLIC Structure (StructureTable)
+TPM_RC
+TPMS_NV_PUBLIC_Unmarshal(TPMS_NV_PUBLIC *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_NV_PUBLIC_Marshal(TPMS_NV_PUBLIC *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:197 - Definition of TPM2B_NV_PUBLIC Structure (StructureTable)
+TPM_RC
+TPM2B_NV_PUBLIC_Unmarshal(TPM2B_NV_PUBLIC *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_NV_PUBLIC_Marshal(TPM2B_NV_PUBLIC *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:198 - Definition of TPM2B_CONTEXT_SENSITIVE Structure  (StructureTable)
+//     TPM2B_CONTEXT_SENSITIVE_Unmarshal not referenced
+//     TPM2B_CONTEXT_SENSITIVE_Marshal not referenced
+
+
+// Table 2:199 - Definition of TPMS_CONTEXT_DATA Structure  (StructureTable)
+//     TPMS_CONTEXT_DATA_Unmarshal not referenced
+//     TPMS_CONTEXT_DATA_Marshal not referenced
+
+
+// Table 2:200 - Definition of TPM2B_CONTEXT_DATA Structure  (StructureTable)
+TPM_RC
+TPM2B_CONTEXT_DATA_Unmarshal(TPM2B_CONTEXT_DATA *target, BYTE **buffer, INT32 *size);
+UINT16
+TPM2B_CONTEXT_DATA_Marshal(TPM2B_CONTEXT_DATA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:201 - Definition of TPMS_CONTEXT Structure (StructureTable)
+TPM_RC
+TPMS_CONTEXT_Unmarshal(TPMS_CONTEXT *target, BYTE **buffer, INT32 *size);
+UINT16
+TPMS_CONTEXT_Marshal(TPMS_CONTEXT *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:203 - Definition of TPMS_CREATION_DATA Structure  (StructureTable)
+//     TPMS_CREATION_DATA_Unmarshal not referenced
+UINT16
+TPMS_CREATION_DATA_Marshal(TPMS_CREATION_DATA *source, BYTE **buffer, INT32 *size);
+
+
+// Table 2:204 - Definition of TPM2B_CREATION_DATA Structure  (StructureTable)
+//     TPM2B_CREATION_DATA_Unmarshal not referenced
+UINT16
+TPM2B_CREATION_DATA_Marshal(TPM2B_CREATION_DATA *source, BYTE **buffer, INT32 *size);
+
+// Array Marshal/Unmarshal for TPMS_TAGGED_PROPERTY
+//     TPMS_TAGGED_PROPERTY_Array_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PROPERTY_Array_Marshal(TPMS_TAGGED_PROPERTY *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPMS_ALG_PROPERTY
+//     TPMS_ALG_PROPERTY_Array_Unmarshal not referenced
+UINT16
+TPMS_ALG_PROPERTY_Array_Marshal(TPMS_ALG_PROPERTY *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPMS_PCR_SELECTION
+TPM_RC
+TPMS_PCR_SELECTION_Array_Unmarshal(TPMS_PCR_SELECTION *target, BYTE **buffer, INT32 *size, INT32 count);
+UINT16
+TPMS_PCR_SELECTION_Array_Marshal(TPMS_PCR_SELECTION *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPMT_HA
+TPM_RC
+TPMT_HA_Array_Unmarshal(TPMT_HA *target, BYTE **buffer, INT32 *size, BOOL flag, INT32 count);
+UINT16
+TPMT_HA_Array_Marshal(TPMT_HA *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for BYTE
+TPM_RC
+BYTE_Array_Unmarshal(BYTE *target, BYTE **buffer, INT32 *size, INT32 count);
+UINT16
+BYTE_Array_Marshal(BYTE *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPM_HANDLE
+//     TPM_HANDLE_Array_Unmarshal not referenced
+UINT16
+TPM_HANDLE_Array_Marshal(TPM_HANDLE *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPMA_CC
+//     TPMA_CC_Array_Unmarshal not referenced
+UINT16
+TPMA_CC_Array_Marshal(TPMA_CC *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPMS_TAGGED_PCR_SELECT
+//     TPMS_TAGGED_PCR_SELECT_Array_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PCR_SELECT_Array_Marshal(TPMS_TAGGED_PCR_SELECT *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPM_ECC_CURVE
+#ifdef    TPM_ALG_ECC
+//     TPM_ECC_CURVE_Array_Unmarshal not referenced
+UINT16
+TPM_ECC_CURVE_Array_Marshal(TPM_ECC_CURVE *source, BYTE **buffer, INT32 *size, INT32 count);
+
+#endif // TPM_ALG_ECC
+// Array Marshal/Unmarshal for TPM2B_DIGEST
+TPM_RC
+TPM2B_DIGEST_Array_Unmarshal(TPM2B_DIGEST *target, BYTE **buffer, INT32 *size, INT32 count);
+UINT16
+TPM2B_DIGEST_Array_Marshal(TPM2B_DIGEST *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPM_CC
+TPM_RC
+TPM_CC_Array_Unmarshal(TPM_CC *target, BYTE **buffer, INT32 *size, INT32 count);
+UINT16
+TPM_CC_Array_Marshal(TPM_CC *source, BYTE **buffer, INT32 *size, INT32 count);
+
+// Array Marshal/Unmarshal for TPM_ALG_ID
+TPM_RC
+TPM_ALG_ID_Array_Unmarshal(TPM_ALG_ID *target, BYTE **buffer, INT32 *size, INT32 count);
+UINT16
+TPM_ALG_ID_Array_Marshal(TPM_ALG_ID *source, BYTE **buffer, INT32 *size, INT32 count);
+
+#endif // _MARSHAL_FP_H
diff --git a/tpm-util/duplicate/include/tpm_duplication_aux.h b/tpm-util/duplicate/include/tpm_duplication_aux.h
new file mode 100644 (file)
index 0000000..f32655b
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#ifndef     TPM_DUP_AUX
+#define     TPM_DUP_AUX
+
+#include <sapi/tpm20.h>
+#include <openssl/rand.h>
+#include <openssl/hmac.h>
+#include "crypto_aux.h"
+
+#define BYTES_TO_BITS(val) (val * 8) 
+
+#define INIT_SIMPLE_TPM2B_SIZE( type ) (type).t.size = sizeof( type ) - 2;
+
+TPM2B_NAME * GetName(TPMI_ALG_HASH hashAlg, TPM2B_PUBLIC *obj, TPM2B_NAME *outName);
+
+TSS2_RC swKeyDuplicate(
+      /* IN */
+      RSA* rsaKey, TPM2B_PUBLIC* parentKeyPublicPortion, UINT8* policyDigest, int digestSize,
+      /* OUT */
+      TPM2B_DATA* encryptionKey, TPM2B_PUBLIC *swKeyPublic, TPM2B_PRIVATE *swKeyPrivate,  TPM2B_ENCRYPTED_SECRET *encSymSeed);
+
+void CreateDuplicationBlob(
+               //IN
+               TPM2B_PUBLIC_KEY_RSA *protector,
+               TPMT_PUBLIC * publicPortion,
+               TPMT_SENSITIVE *sens,
+               TPM2B_ENCRYPTED_SECRET *plainSymSeed, TPMI_YES_NO generateInSymSeed,
+               TPM2B_DATA *encryptionKey, TPMI_YES_NO generateEncryptionKey,
+
+               //OUT
+               TPM2B_PRIVATE *outDuplicate,
+               TPM2B_ENCRYPTED_SECRET *encSymSeed);
+
+
+void CreateSwDataObject(
+               BYTE* auth, UINT16 authSize,
+               RSA * rsakey,
+               BYTE * dataToSeal, UINT16 dataSize,
+               BYTE * policyDigest, UINT16 policyDigestSize,
+               TPMT_PUBLIC * outPublic, 
+        TPMT_SENSITIVE *outSens);
+
+void CreateDuplicationBlob2B(
+               //IN
+               TPM2B_PUBLIC_KEY_RSA *protector,
+               TPM2B_PUBLIC * publicPortion,
+               TPM2B_SENSITIVE *sens,
+               TPM2B_ENCRYPTED_SECRET *plainSymSeed, TPMI_YES_NO generateInSymSeed,
+               TPM2B_DATA *encryptionKey, TPMI_YES_NO generateEncryptionKey,
+               //OUT
+               TPM2B_PRIVATE *outDuplicate,
+               TPM2B_ENCRYPTED_SECRET *encSymSeed);
+
+void CreateSwDataObject2B(
+               //IN
+               BYTE* auth, UINT16 authSize,
+               RSA * rsaKey,
+               BYTE * policyDigest, UINT16 policyDigestSize,
+               //OUT
+               TPM2B_PUBLIC * outPublic, 
+        TPM2B_SENSITIVE *outSens);
+
+
+#endif //TPM_DUP_AUX
+
diff --git a/tpm-util/duplicate/include/util.h b/tpm-util/duplicate/include/util.h
new file mode 100644 (file)
index 0000000..1033b5f
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#ifndef __UTIL_H__
+#define __UTIL_H__
+
+#include <sapi/tpm20.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include <getopt.h>
+
+
+void hex_log(UINT8 *pData, UINT32 numBytes, const char* caption);
+
+TPM_RC ConcatSizedByteBuffer( TPM2B_MAX_BUFFER *result, TPM2B *addBuffer );
+
+int saveDataToFile(const char *fileName, UINT8 *buf, UINT16 size);
+
+int loadDataFromFile(const char *fileName, UINT8 *buf, UINT16 *size);
+
+#endif
diff --git a/tpm-util/duplicate/main.c b/tpm-util/duplicate/main.c
new file mode 100644 (file)
index 0000000..662b984
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+//
+// main.c : Tool to import Openssl RSA key into TPM. Generates TPM duplication data
+// Author: Arun Kumar Sekar
+//
+
+#include <stdio.h>
+#include <stdlib.h>   
+#include <string.h>
+#include <unistd.h>  
+
+#include <openssl/pem.h>
+
+#include <pthread.h>
+
+#include <sapi/tpm20.h>
+#include <tcti/tcti_socket.h>
+
+#include "tpm_duplication_aux.h"
+#include "util.h"
+
+
+void PrintHelp();
+char version[] = "0.1";
+
+void PrintHelp()
+{
+    printf(
+            "OSSL key to tpm import tool, Version %s\nUsage:" 
+            "./ossl_tpm_duplicate [-pemfile InputPemFile] [-pempwd inputPemPwd (optional)] [-parentPub inputParentPubFile]" 
+            "[-dupPub out_dupPubFile] [-dupPriv out_dupPrivFile] [-dupSymSeed out_dupSymSeedFile] [-dupEncKey out_dupEncKeyFile] \n" 
+                       "\n"
+                        , version);
+}
+
+static TPM_RC convert_PEM_To_EVP(EVP_PKEY **evpPkey,                /* freed by caller */
+                              const char *pem_Filename,
+                              const char *pem_pwd)
+{
+    TPM_RC      rc = 0;
+    FILE        *fp_pemfile = NULL;
+
+    if (rc == 0) 
+    {
+        fp_pemfile = fopen(pem_Filename, "rb");  /* closed @2 */
+        if(fp_pemfile == NULL) {
+            rc = EXIT_FAILURE;
+        }
+    }
+
+    if (rc == 0) 
+    {
+        *evpPkey = PEM_read_PrivateKey(fp_pemfile, NULL, NULL, (void *)pem_pwd);
+        if (*evpPkey == NULL) 
+        {
+            printf("convert_PEM_To_EVP: Error reading key file %s\n", pem_Filename);
+            rc = EXIT_FAILURE;
+        }
+        printf("PEM_read_PrivateKey success for file: %s \n", pem_Filename);
+    }
+
+end: 
+   if (fp_pemfile != NULL) 
+    {
+        fclose(fp_pemfile);
+    }
+
+    return rc;
+}
+
+static TPM_RC convert_EVP_to_RSA(RSA **rsaKey,              /* freed by caller */
+                              EVP_PKEY *evpPkey)
+{
+    TPM_RC      rc = 0;
+
+    if (rc == 0) 
+    {
+        *rsaKey = EVP_PKEY_get1_RSA(evpPkey);
+        if (*rsaKey == NULL) 
+        {
+            printf("convert_EVP_to_RSA: EVP_PKEY_get1_RSA failed\n");
+            rc = EXIT_FAILURE;
+        }
+        printf("convert_EVP_to_RSA success! \n");
+    }
+
+    return rc;
+}
+
+
+int main(int argc, char* argv[])
+{
+    TPM_RC rval = 0;
+    int count=0;
+
+    char pem_Filename[256];
+    int pemfile_flag = 0;
+    const char *pem_pwd = "";   /* default empty password */
+    int pempwd_flag = 0;
+
+    // SW Key Duplicate I/P variables
+    char parent_pub_Filename[256];
+    int parent_pub_flag = 0;
+
+    // SW Key Duplicate O/P variables
+    char dupPub_Filename[256];
+    int dupPub_flag = 0;
+    char dupPriv_Filename[256];
+    int dupPriv_flag = 0;
+    char dupSymSeed_Filename[256];
+    int dupSymSeed_flag = 0;
+    char dupEncKey_Filename[256];
+    int dupEncKey_flag = 0;
+    TPM2B_DATA encryptionKey; 
+    TPM2B_PUBLIC swKeyPublic; 
+    TPM2B_PRIVATE swKeyPrivate; 
+    TPM2B_ENCRYPTED_SECRET encSymSeed; 
+    unsigned short file_size = 0;
+    UINT8 policyDigest[32] = {0};
+    UINT32 digestSize = 0;
+
+    TPM2B_PUBLIC parentKeyPublicPortion;
+    int pubKeysize = 0;
+
+    // RSA key structures
+    EVP_PKEY    *evpPkey = NULL;
+    RSA         *rsaKey = NULL;
+
+    setbuf(stdout, NULL);
+    setvbuf (stdout, NULL, _IONBF, BUFSIZ);
+    if( (argc < 2) )
+    {
+        printf("Arguments count does not match \n");
+        PrintHelp();
+        return 1;
+    }
+    else
+    {
+        /* Get the argument values and evaluate it */
+        for( count = 1; count < argc; count++ )
+        {
+            if( 0 == strcmp( argv[count], "-pemfile" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", pem_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                pemfile_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-pempwd" ) ) {
+                count++;
+                pem_pwd = argv[count];
+                pempwd_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-parentPub" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", parent_pub_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                parent_pub_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupPub" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupPub_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupPub_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupPriv" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupPriv_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupPriv_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupSymSeed" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupSymSeed_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupSymSeed_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupEncKey" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupEncKey_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupEncKey_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "--help" ) ) {
+                PrintHelp();
+                exit(1);
+            }
+            else {
+                PrintHelp();
+                exit(1);
+            }
+        }
+    }
+
+    // For Duplicate functionality, check all input params are present
+    if( (!pemfile_flag) || 
+                (!parent_pub_flag) ||
+                (!dupPub_flag) ||
+                (!dupPriv_flag) ||
+                (!dupSymSeed_flag) ||
+                (!dupEncKey_flag)
+            ) 
+    {
+        printf("Error: One or more Inputs for Duplicate are not passed as input \n");
+        return -1;
+    }
+
+    printf("Input PEM file name: %s \n", pem_Filename);
+
+    if (rval == 0) {
+        rval = convert_PEM_To_EVP(&evpPkey, pem_Filename, pem_pwd);
+    }
+    if (rval == 0) {
+        rval = convert_EVP_to_RSA(&rsaKey, evpPkey);
+    }
+
+    if ( rval == 0 )  {
+        file_size = sizeof(TPM2B_PUBLIC);
+        rval = loadDataFromFile(parent_pub_Filename, (UINT8 *) &parentKeyPublicPortion, &file_size);
+    }
+
+    /* SW key duplicate operation started */
+    if ( rval == 0 )  {
+        rval = swKeyDuplicate(rsaKey, &parentKeyPublicPortion, policyDigest, digestSize, 
+                &encryptionKey, &swKeyPublic, &swKeyPrivate, &encSymSeed);
+        if(rval != 0) {
+            printf("\nswKeyDuplicate failed: 0x%x ! \n", rval);
+            goto end;
+        }
+        else {
+            printf("\nswKeyDuplicate success: 0x%x ! \n", rval);
+            rval = saveDataToFile(dupPub_Filename, (UINT8 *) &swKeyPublic, sizeof(TPM2B_PUBLIC));
+            rval = saveDataToFile(dupPriv_Filename, (UINT8 *) &swKeyPrivate, sizeof(TPM2B_PRIVATE));
+            rval = saveDataToFile(dupSymSeed_Filename, (UINT8 *) &encSymSeed, sizeof(TPM2B_ENCRYPTED_SECRET));
+            rval = saveDataToFile(dupEncKey_Filename, (UINT8 *) &encryptionKey, sizeof(TPM2B_DATA));
+            printf("\nOutput files are written successfully ! \n");
+        }
+    }
+
+end:
+    if (rsaKey != NULL) {
+        RSA_free(rsaKey);
+    }
+    if (evpPkey != NULL) {
+        EVP_PKEY_free(evpPkey);
+    }
+
+    return rval;
+}
+
diff --git a/tpm-util/duplicate/marshal.c b/tpm-util/duplicate/marshal.c
new file mode 100644 (file)
index 0000000..27933ba
--- /dev/null
@@ -0,0 +1,4870 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+
+#include "marshal.h"
+
+TPM_RC
+UINT8_Unmarshal(
+    UINT8 *target, BYTE **buffer, INT32     *size
+    )
+{
+    if((*size -= 1) < 0)
+        return TPM_RC_INSUFFICIENT;
+    *target = BYTE_ARRAY_TO_UINT8(*buffer);
+    *buffer += 1;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+UINT8_Marshal(
+    UINT8 *source, BYTE **buffer, INT32     *size
+    )
+{
+    if (buffer != 0)
+    {
+        if ((size == 0) || ((*size -= 1) >= 0))
+        {
+            UINT8_TO_BYTE_ARRAY(*source, *buffer);
+            *buffer += 1;
+        }
+        pAssert(size == 0 || (*size >= 0));
+    }
+    return (1);
+}
+
+//   BYTE definition from table 2:3
+//   BYTE_Unmarshal changed to #define
+//   BYTE_Marshal changed to #define
+//   INT8 definition from table 2:3
+//   INT8_Unmarshal changed to #define
+//     INT8_Marshal not referenced
+//   UINT16 definition from table 2:3
+TPM_RC
+UINT16_Unmarshal(
+    UINT16 *target, BYTE **buffer, INT32    *size
+    )
+{
+    if((*size -= 2) < 0)
+        return TPM_RC_INSUFFICIENT;
+    *target = BYTE_ARRAY_TO_UINT16(*buffer);
+    *buffer += 2;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+UINT16_Marshal(
+    UINT16 *source, BYTE **buffer, INT32    *size
+    )
+{
+    if (buffer != 0)
+    {
+        if ((size == 0) || ((*size -= 2) >= 0))
+        {
+            UINT16_TO_BYTE_ARRAY(*source, *buffer);
+            *buffer += 2;
+        }
+        pAssert(size == 0 || (*size >= 0));
+    }
+    return (2);
+}
+
+//   INT16 definition from table 2:3
+//     INT16_Unmarshal not referenced
+//     INT16_Marshal not referenced
+//   UINT32 definition from table 2:3
+TPM_RC
+UINT32_Unmarshal(
+    UINT32 *target, BYTE **buffer, INT32    *size
+    )
+{
+    if((*size -= 4) < 0)
+        return TPM_RC_INSUFFICIENT;
+    *target = BYTE_ARRAY_TO_UINT32(*buffer);
+    *buffer += 4;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+UINT32_Marshal(
+    UINT32 *source, BYTE **buffer, INT32    *size
+    )
+{
+    if (buffer != 0)
+    {
+        if ((size == 0) || ((*size -= 4) >= 0))
+        {
+            UINT32_TO_BYTE_ARRAY(*source, *buffer);
+            *buffer += 4;
+        }
+        pAssert(size == 0 || (*size >= 0));
+    }
+    return (4);
+}
+
+//   INT32 definition from table 2:3
+//   INT32_Unmarshal changed to #define
+//     INT32_Marshal not referenced
+//   UINT64 definition from table 2:3
+TPM_RC
+UINT64_Unmarshal(
+    UINT64 *target, BYTE **buffer, INT32    *size
+    )
+{
+    if((*size -= 8) < 0)
+        return TPM_RC_INSUFFICIENT;
+    *target = BYTE_ARRAY_TO_UINT64(*buffer);
+    *buffer += 8;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+UINT64_Marshal(
+    UINT64 *source, BYTE **buffer, INT32    *size
+    )
+{
+    if (buffer != 0)
+    {
+        if ((size == 0) || ((*size -= 8) >= 0))
+        {
+            UINT64_TO_BYTE_ARRAY(*source, *buffer);
+            *buffer += 8;
+        }
+        pAssert(size == 0 || (*size >= 0));
+    }
+    return (8);
+}
+
+//   INT64 definition from table 2:3
+//     INT64_Unmarshal not referenced
+//     INT64_Marshal not referenced
+
+
+// Table 2:4 - Defines for Logic Values (DefinesTable)
+
+
+// Table 2:5 - Definition of Types for Documentation Clarity (TypesTable)
+//   UINT32 definition from table 2:5
+//     TPM_ALGORITHM_ID_Unmarshal not referenced
+//     TPM_ALGORITHM_ID_Marshal not referenced
+//   UINT32 definition from table 2:5
+//     TPM_MODIFIER_INDICATOR_Unmarshal not referenced
+//     TPM_MODIFIER_INDICATOR_Marshal not referenced
+//   UINT32 definition from table 2:5
+//     TPM_AUTHORIZATION_SIZE_Unmarshal not referenced
+//     TPM_AUTHORIZATION_SIZE_Marshal not referenced
+//   UINT32 definition from table 2:5
+//     TPM_PARAMETER_SIZE_Unmarshal not referenced
+//     TPM_PARAMETER_SIZE_Marshal not referenced
+//   UINT16 definition from table 2:5
+//     TPM_KEY_SIZE_Unmarshal not referenced
+//     TPM_KEY_SIZE_Marshal not referenced
+//   UINT16 definition from table 2:5
+//   TPM_KEY_BITS_Unmarshal changed to #define
+//   TPM_KEY_BITS_Marshal changed to #define
+
+
+// Table 2:6 - Definition of TPM_SPEC Constants  (ConstantsTable)
+//     TPM_SPEC_Unmarshal not referenced
+//     TPM_SPEC_Marshal not referenced
+
+
+// Table 2:7 - Definition of TPM_GENERATED Constants  (ConstantsTable)
+//     TPM_GENERATED_Unmarshal not referenced
+//   TPM_GENERATED_Marshal changed to #define
+
+
+// Table 2:9 - Definition of TPM_ALG_ID Constants  (ConstantsTable)
+//   TPM_ALG_ID_Unmarshal changed to #define
+//   TPM_ALG_ID_Marshal changed to #define
+
+
+// Table 2:10 - Definition of TPM_ECC_CURVE Constants  (ConstantsTable)
+#ifdef    TPM_ALG_ECC
+//   TPM_ECC_CURVE_Unmarshal changed to #define
+//   TPM_ECC_CURVE_Marshal changed to #define
+#endif // TPM_ALG_ECC
+
+
+// Table 2:13 - Definition of TPM_CC Constants  (ConstantsTable)
+//   TPM_CC_Unmarshal changed to #define
+//   TPM_CC_Marshal changed to #define
+
+
+// Table 2:17 - Definition of TPM_RC Constants  (ConstantsTable)
+//     TPM_RC_Unmarshal not referenced
+//   TPM_RC_Marshal changed to #define
+
+
+// Table 2:18 - Definition of TPM_CLOCK_ADJUST Constants  (ConstantsTable)
+TPM_RC
+TPM_CLOCK_ADJUST_Unmarshal(
+    TPM_CLOCK_ADJUST *target, BYTE **buffer, INT32  *size
+    )
+{
+    return TPM_RC_SUCCESS;
+}
+
+//     TPM_CLOCK_ADJUST_Marshal not referenced
+
+
+// Table 2:19 - Definition of TPM_EO Constants  (ConstantsTable)
+TPM_RC
+TPM_EO_Unmarshal(
+    TPM_EO *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch(*target) {
+        case TPM_EO_EQ :
+        case TPM_EO_NEQ :
+        case TPM_EO_SIGNED_GT :
+        case TPM_EO_UNSIGNED_GT :
+        case TPM_EO_SIGNED_LT :
+        case TPM_EO_UNSIGNED_LT :
+        case TPM_EO_SIGNED_GE :
+        case TPM_EO_UNSIGNED_GE :
+        case TPM_EO_SIGNED_LE :
+        case TPM_EO_UNSIGNED_LE :
+        case TPM_EO_BITSET :
+        case TPM_EO_BITCLEAR :
+            break;
+       default :
+            return TPM_RC_VALUE;
+            break;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPM_EO_Marshal not referenced
+
+
+// Table 2:20 - Definition of TPM_ST Constants  (ConstantsTable)
+//   TPM_ST_Unmarshal changed to #define
+//   TPM_ST_Marshal changed to #define
+
+
+// Table 2:21 - Definition of TPM_SU Constants  (ConstantsTable)
+TPM_RC
+TPM_SU_Unmarshal(
+    TPM_SU *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch(*target) {
+        case TPM_SU_CLEAR :
+        case TPM_SU_STATE :
+            break;
+       default :
+            return TPM_RC_VALUE;
+            break;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPM_SU_Marshal not referenced
+
+
+// Table 2:22 - Definition of TPM_SE Constants  (ConstantsTable)
+TPM_RC
+TPM_SE_Unmarshal(
+    TPM_SE *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT8_Unmarshal((UINT8 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch(*target) {
+        case TPM_SE_HMAC :
+        case TPM_SE_POLICY :
+        case TPM_SE_TRIAL :
+            break;
+       default :
+            return TPM_RC_VALUE;
+            break;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPM_SE_Marshal not referenced
+
+
+// Table 2:23 - Definition of TPM_CAP Constants (ConstantsTable)
+TPM_RC
+TPM_CAP_Unmarshal(
+    TPM_CAP *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch(*target) {
+        case TPM_CAP_ALGS :
+        case TPM_CAP_HANDLES :
+        case TPM_CAP_COMMANDS :
+        case TPM_CAP_PP_COMMANDS :
+        case TPM_CAP_AUDIT_COMMANDS :
+        case TPM_CAP_PCRS :
+        case TPM_CAP_TPM_PROPERTIES :
+        case TPM_CAP_PCR_PROPERTIES :
+        case TPM_CAP_ECC_CURVES :
+        case TPM_CAP_VENDOR_PROPERTY :
+            break;
+       default :
+            return TPM_RC_VALUE;
+            break;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPM_CAP_Marshal changed to #define
+
+
+// Table 2:24 - Definition of TPM_PT Constants  (ConstantsTable)
+//     TPM_PT_Unmarshal not referenced
+//   TPM_PT_Marshal changed to #define
+
+
+// Table 2:25 - Definition of TPM_PT_PCR Constants  (ConstantsTable)
+//     TPM_PT_PCR_Unmarshal not referenced
+//     TPM_PT_PCR_Marshal not referenced
+
+
+// Table 2:26 - Definition of TPM_PS Constants  (ConstantsTable)
+//     TPM_PS_Unmarshal not referenced
+//     TPM_PS_Marshal not referenced
+
+
+// Table 2:27 - Definition of Types for Handles (TypesTable)
+//   UINT32 definition from table 2:27
+//   TPM_HANDLE_Unmarshal changed to #define
+//   TPM_HANDLE_Marshal changed to #define
+
+
+// Table 2:28 - Definition of TPM_HT Constants  (ConstantsTable)
+//     TPM_HT_Unmarshal not referenced
+//     TPM_HT_Marshal not referenced
+
+
+// Table 2:29 - Definition of TPM_RH Constants  (ConstantsTable)
+//     TPM_RH_Unmarshal not referenced
+//     TPM_RH_Marshal not referenced
+
+
+// Table 2:30 - Definition of TPM_HC Constants  (ConstantsTable)
+//     TPM_HC_Unmarshal not referenced
+//     TPM_HC_Marshal not referenced
+
+
+// Table 2:31 - Definition of TPMA_ALGORITHM Bits (BitsTable)
+//     TPMA_ALGORITHM_Unmarshal not referenced
+//   TPMA_ALGORITHM_Marshal changed to #define
+
+
+// Table 2:32 - Definition of TPMA_OBJECT Bits (BitsTable)
+TPM_RC
+TPMA_OBJECT_Unmarshal(
+    TPMA_OBJECT *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(*((UINT32 *)target) & (UINT32)0xfff8f309)
+        return TPM_RC_RESERVED_BITS;
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMA_OBJECT_Marshal changed to #define
+
+
+// Table 2:33 - Definition of TPMA_SESSION Bits  (BitsTable)
+TPM_RC
+TPMA_SESSION_Unmarshal(
+    TPMA_SESSION *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT8_Unmarshal((UINT8 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(*((UINT8 *)target) & (UINT8)0x18)
+        return TPM_RC_RESERVED_BITS;
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMA_SESSION_Marshal changed to #define
+
+
+// Table 2:34 - Definition of TPMA_LOCALITY Bits  (BitsTable)
+//   TPMA_LOCALITY_Unmarshal changed to #define
+//   TPMA_LOCALITY_Marshal changed to #define
+
+
+// Table 2:35 - Definition of TPMA_PERMANENT Bits  (BitsTable)
+//     TPMA_PERMANENT_Unmarshal not referenced
+//     TPMA_PERMANENT_Marshal not referenced
+
+
+// Table 2:36 - Definition of TPMA_STARTUP_CLEAR Bits  (BitsTable)
+//     TPMA_STARTUP_CLEAR_Unmarshal not referenced
+//     TPMA_STARTUP_CLEAR_Marshal not referenced
+
+
+// Table 2:37 - Definition of TPMA_MEMORY Bits  (BitsTable)
+//     TPMA_MEMORY_Unmarshal not referenced
+//     TPMA_MEMORY_Marshal not referenced
+
+
+// Table 2:38 - Definition of TPMA_CC Bits  (BitsTable)
+//     TPMA_CC_Unmarshal not referenced
+//   TPMA_CC_Marshal changed to #define
+
+
+// Table 2:39 - Definition of TPMI_YES_NO Type (TypeTable)
+TPM_RC
+TPMI_YES_NO_Unmarshal(
+    TPMI_YES_NO *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = BYTE_Unmarshal((BYTE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case NO:
+        case YES:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_YES_NO_Marshal changed to #define
+
+
+// Table 2:40 - Definition of TPMI_DH_OBJECT Type  (TypeTable)
+TPM_RC
+TPMI_DH_OBJECT_Unmarshal(
+    TPMI_DH_OBJECT *target, BYTE **buffer, INT32 *size, BOOL     flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+   if (*target == TPM_RH_NULL) {
+        if(flag)
+            return TPM_RC_SUCCESS;
+        else
+            return TPM_RC_VALUE;
+    }
+
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_DH_OBJECT_Marshal changed to #define
+
+
+// Table 2:41 - Definition of TPMI_DH_PERSISTENT Type  (TypeTable)
+TPM_RC
+TPMI_DH_PERSISTENT_Unmarshal(
+    TPMI_DH_PERSISTENT *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if((*target < PERSISTENT_FIRST) || (*target > PERSISTENT_LAST))
+        return TPM_RC_VALUE;
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_DH_PERSISTENT_Marshal not referenced
+
+
+// Table 2:42 - Definition of TPMI_DH_ENTITY Type  (TypeTable)
+TPM_RC
+TPMI_DH_ENTITY_Unmarshal(
+    TPMI_DH_ENTITY *target, BYTE **buffer, INT32 *size, BOOL     flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_DH_ENTITY_Marshal not referenced
+
+
+// Table 2:43 - Definition of TPMI_DH_PCR Type  (TypeTable)
+TPM_RC
+TPMI_DH_PCR_Unmarshal(
+    TPMI_DH_PCR *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+   if (*target == TPM_RH_NULL) {
+        if(flag)
+            return TPM_RC_SUCCESS;
+        else
+            return TPM_RC_VALUE;
+    }
+
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_DH_PCR_Marshal not referenced
+
+
+// Table 2:44 - Definition of TPMI_SH_AUTH_SESSION Type  (TypeTable)
+TPM_RC
+TPMI_SH_AUTH_SESSION_Unmarshal(
+    TPMI_SH_AUTH_SESSION *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+   if (*target == TPM_RS_PW) {
+        if(flag)
+            return TPM_RC_SUCCESS;
+        else
+            return TPM_RC_VALUE;
+    }
+
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_SH_AUTH_SESSION_Marshal changed to #define
+
+
+// Table 2:45 - Definition of TPMI_SH_HMAC Type  (TypeTable)
+TPM_RC
+TPMI_SH_HMAC_Unmarshal(
+    TPMI_SH_HMAC *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_SH_HMAC_Marshal not referenced
+
+
+// Table 2:46 - Definition of TPMI_SH_POLICY Type  (TypeTable)
+TPM_RC
+TPMI_SH_POLICY_Unmarshal(
+    TPMI_SH_POLICY *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_SH_POLICY_Marshal not referenced
+
+
+// Table 2:47 - Definition of TPMI_DH_CONTEXT Type  (TypeTable)
+TPM_RC
+TPMI_DH_CONTEXT_Unmarshal(
+    TPMI_DH_CONTEXT *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_DH_CONTEXT_Marshal changed to #define
+
+
+// Table 2:48 - Definition of TPMI_RH_HIERARCHY Type  (TypeTable)
+TPM_RC
+TPMI_RH_HIERARCHY_Unmarshal(
+    TPMI_RH_HIERARCHY *target, BYTE **buffer, INT32 *size, BOOL      flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_OWNER:
+        case TPM_RH_PLATFORM:
+        case TPM_RH_ENDORSEMENT:
+            break;
+        case TPM_RH_NULL:
+        if (flag)
+            break;
+        return TPM_RC_VALUE;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_RH_HIERARCHY_Marshal changed to #define
+
+
+// Table 2:49 - Definition of TPMI_RH_ENABLES Type  (TypeTable)
+TPM_RC
+TPMI_RH_ENABLES_Unmarshal(
+    TPMI_RH_ENABLES *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_OWNER:
+        case TPM_RH_PLATFORM:
+        case TPM_RH_ENDORSEMENT:
+        case TPM_RH_PLATFORM_NV:
+            break;
+        case TPM_RH_NULL:
+        if (flag)
+            break;
+        return TPM_RC_VALUE;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_ENABLES_Marshal not referenced
+
+
+// Table 2:50 - Definition of TPMI_RH_HIERARCHY_AUTH Type  (TypeTable)
+TPM_RC
+TPMI_RH_HIERARCHY_AUTH_Unmarshal(
+    TPMI_RH_HIERARCHY_AUTH *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_OWNER:
+        case TPM_RH_PLATFORM:
+        case TPM_RH_ENDORSEMENT:
+        case TPM_RH_LOCKOUT:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_HIERARCHY_AUTH_Marshal not referenced
+
+
+// Table 2:51 - Definition of TPMI_RH_PLATFORM Type  (TypeTable)
+TPM_RC
+TPMI_RH_PLATFORM_Unmarshal(
+    TPMI_RH_PLATFORM *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_PLATFORM:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_PLATFORM_Marshal not referenced
+
+
+// Table 2:52 - Definition of TPMI_RH_OWNER Type  (TypeTable)
+//     TPMI_RH_OWNER_Unmarshal not referenced
+//     TPMI_RH_OWNER_Marshal not referenced
+
+
+// Table 2:53 - Definition of TPMI_RH_ENDORSEMENT Type  (TypeTable)
+TPM_RC
+TPMI_RH_ENDORSEMENT_Unmarshal(
+    TPMI_RH_ENDORSEMENT *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_ENDORSEMENT:
+            break;
+        case TPM_RH_NULL:
+        if (flag)
+            break;
+        return TPM_RC_VALUE;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_ENDORSEMENT_Marshal not referenced
+
+
+// Table 2:54 - Definition of TPMI_RH_PROVISION Type  (TypeTable)
+TPM_RC
+TPMI_RH_PROVISION_Unmarshal(
+    TPMI_RH_PROVISION *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_OWNER:
+        case TPM_RH_PLATFORM:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_PROVISION_Marshal not referenced
+
+
+// Table 2:55 - Definition of TPMI_RH_CLEAR Type  (TypeTable)
+TPM_RC
+TPMI_RH_CLEAR_Unmarshal(
+    TPMI_RH_CLEAR *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_LOCKOUT:
+        case TPM_RH_PLATFORM:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_CLEAR_Marshal not referenced
+
+
+// Table 2:56 - Definition of TPMI_RH_NV_AUTH Type  (TypeTable)
+TPM_RC
+TPMI_RH_NV_AUTH_Unmarshal(
+    TPMI_RH_NV_AUTH *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_PLATFORM:
+        case TPM_RH_OWNER:
+            break;
+        default:
+            if((*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST))
+                return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_NV_AUTH_Marshal not referenced
+
+
+// Table 2:57 - Definition of TPMI_RH_LOCKOUT Type  (TypeTable)
+TPM_RC
+TPMI_RH_LOCKOUT_Unmarshal(
+    TPMI_RH_LOCKOUT *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_RH_LOCKOUT:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_RH_LOCKOUT_Marshal not referenced
+
+
+// Table 2:58 - Definition of TPMI_RH_NV_INDEX Type  (TypeTable)
+TPM_RC
+TPMI_RH_NV_INDEX_Unmarshal(
+    TPMI_RH_NV_INDEX *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_HANDLE_Unmarshal((TPM_HANDLE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if((*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST))
+        return TPM_RC_VALUE;
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_RH_NV_INDEX_Marshal changed to #define
+
+
+// Table 2:59 - Definition of TPMI_ALG_HASH Type  (TypeTable)
+TPM_RC
+TPMI_ALG_HASH_Unmarshal(
+    TPMI_ALG_HASH *target, BYTE **buffer, INT32 *size, BOOL      flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_SHA1
+        case TPM_ALG_SHA1:
+#endif // TPM_ALG_SHA1
+#ifdef    TPM_ALG_SHA256
+        case TPM_ALG_SHA256:
+#endif // TPM_ALG_SHA256
+#ifdef    TPM_ALG_SHA384
+        case TPM_ALG_SHA384:
+#endif // TPM_ALG_SHA384
+#ifdef    TPM_ALG_SHA512
+        case TPM_ALG_SHA512:
+#endif // TPM_ALG_SHA512
+#ifdef    TPM_ALG_SM3_256
+        case TPM_ALG_SM3_256:
+#endif // TPM_ALG_SM3_256
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_HASH;
+        default:
+            return TPM_RC_HASH;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_HASH_Marshal changed to #define
+
+
+// Table 2:60 - Definition of TPMI_ALG_ASYM Type (TypeTable)
+//     TPMI_ALG_ASYM_Unmarshal not referenced
+//     TPMI_ALG_ASYM_Marshal not referenced
+
+
+// Table 2:61 - Definition of TPMI_ALG_SYM Type (TypeTable)
+TPM_RC
+TPMI_ALG_SYM_Unmarshal(
+    TPMI_ALG_SYM *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_AES
+        case TPM_ALG_AES:
+#endif // TPM_ALG_AES
+#ifdef    TPM_ALG_SM4
+        case TPM_ALG_SM4:
+#endif // TPM_ALG_SM4
+#ifdef    TPM_ALG_CAMELLIA
+        case TPM_ALG_CAMELLIA:
+#endif // TPM_ALG_CAMELLIA
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+#endif // TPM_ALG_XOR
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_SYMMETRIC;
+        default:
+            return TPM_RC_SYMMETRIC;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_ALG_SYM_Marshal not referenced
+
+
+// Table 2:62 - Definition of TPMI_ALG_SYM_OBJECT Type (TypeTable)
+TPM_RC
+TPMI_ALG_SYM_OBJECT_Unmarshal(
+    TPMI_ALG_SYM_OBJECT *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_AES
+        case TPM_ALG_AES:
+#endif // TPM_ALG_AES
+#ifdef    TPM_ALG_SM4
+        case TPM_ALG_SM4:
+#endif // TPM_ALG_SM4
+#ifdef    TPM_ALG_CAMELLIA
+        case TPM_ALG_CAMELLIA:
+#endif // TPM_ALG_CAMELLIA
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_SYMMETRIC;
+        default:
+            return TPM_RC_SYMMETRIC;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_SYM_OBJECT_Marshal changed to #define
+
+
+// Table 2:63 - Definition of TPMI_ALG_SYM_MODE Type (TypeTable)
+TPM_RC
+TPMI_ALG_SYM_MODE_Unmarshal(
+    TPMI_ALG_SYM_MODE *target, BYTE **buffer, INT32 *size, BOOL      flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_CTR
+        case TPM_ALG_CTR:
+#endif // TPM_ALG_CTR
+#ifdef    TPM_ALG_OFB
+        case TPM_ALG_OFB:
+#endif // TPM_ALG_OFB
+#ifdef    TPM_ALG_CBC
+        case TPM_ALG_CBC:
+#endif // TPM_ALG_CBC
+#ifdef    TPM_ALG_CFB
+        case TPM_ALG_CFB:
+#endif // TPM_ALG_CFB
+#ifdef    TPM_ALG_ECB
+        case TPM_ALG_ECB:
+#endif // TPM_ALG_ECB
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_MODE;
+        default:
+            return TPM_RC_MODE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_SYM_MODE_Marshal changed to #define
+
+
+// Table 2:64 - Definition of TPMI_ALG_KDF Type (TypeTable)
+TPM_RC
+TPMI_ALG_KDF_Unmarshal(
+    TPMI_ALG_KDF *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_MGF1
+        case TPM_ALG_MGF1:
+#endif // TPM_ALG_MGF1
+#ifdef    TPM_ALG_KDF1_SP800_56A
+        case TPM_ALG_KDF1_SP800_56A:
+#endif // TPM_ALG_KDF1_SP800_56A
+#ifdef    TPM_ALG_KDF2
+        case TPM_ALG_KDF2:
+#endif // TPM_ALG_KDF2
+#ifdef    TPM_ALG_KDF1_SP800_108
+        case TPM_ALG_KDF1_SP800_108:
+#endif // TPM_ALG_KDF1_SP800_108
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_KDF;
+        default:
+            return TPM_RC_KDF;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_KDF_Marshal changed to #define
+
+
+// Table 2:65 - Definition of TPMI_ALG_SIG_SCHEME Type (TypeTable)
+TPM_RC
+TPMI_ALG_SIG_SCHEME_Unmarshal(
+    TPMI_ALG_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+#endif // TPM_ALG_HMAC
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_SCHEME;
+        default:
+            return TPM_RC_SCHEME;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_SIG_SCHEME_Marshal changed to #define
+
+
+// Table 2:66 - Definition of TPMI_ECC_KEY_EXCHANGE Type (TypeTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMI_ECC_KEY_EXCHANGE_Unmarshal(
+    TPMI_ECC_KEY_EXCHANGE *target, BYTE **buffer, INT32 *size, BOOL      flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_ECDH
+        case TPM_ALG_ECDH:
+#endif // TPM_ALG_ECDH
+#ifdef    TPM_ALG_ECMQV
+        case TPM_ALG_ECMQV:
+#endif // TPM_ALG_ECMQV
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+#endif // TPM_ALG_SM2
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_SCHEME;
+        default:
+            return TPM_RC_SCHEME;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_ECC_KEY_EXCHANGE_Marshal not referenced
+#endif // TPM_ALG_ECC
+
+
+// Table 2:67 - Definition of TPMI_ST_COMMAND_TAG Type (TypeTable)
+TPM_RC
+TPMI_ST_COMMAND_TAG_Unmarshal(
+    TPMI_ST_COMMAND_TAG *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ST_Unmarshal((TPM_ST *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_ST_NO_SESSIONS:
+        case TPM_ST_SESSIONS:
+            break;
+        default:
+            return TPM_RC_BAD_TAG;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_ST_COMMAND_TAG_Marshal not referenced
+TPM_RC
+TPMS_EMPTY_Unmarshal(
+    TPMS_EMPTY *target, BYTE **buffer, INT32    *size
+    )
+{
+    // to prevent the compiler from complaining
+    UNREFERENCED(target);
+    UNREFERENCED(buffer);
+    UNREFERENCED(size);
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPMS_EMPTY_Marshal(
+    TPMS_EMPTY *source, BYTE **buffer, INT32    *size
+    )
+{
+    // to prevent the compiler from complaining
+    UNREFERENCED(source);
+    UNREFERENCED(buffer);
+    UNREFERENCED(size);
+    return 0;
+}
+
+
+// Table 2:69 - Definition of TPMS_ALGORITHM_DESCRIPTION Structure  (StructureTable)
+//     TPMS_ALGORITHM_DESCRIPTION_Unmarshal not referenced
+//     TPMS_ALGORITHM_DESCRIPTION_Marshal not referenced
+
+
+// Table 2:70 - Definition of TPMU_HA Union  (UnionTable)
+TPM_RC
+TPMU_HA_Unmarshal(
+    TPMU_HA *target, BYTE **buffer, INT32 *size, UINT32      selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_SHA1
+        case TPM_ALG_SHA1:
+            return BYTE_Array_Unmarshal((BYTE *)(target->sha1), buffer, size, (INT32)SHA1_DIGEST_SIZE);
+#endif // TPM_ALG_SHA1
+#ifdef    TPM_ALG_SHA256
+        case TPM_ALG_SHA256:
+            return BYTE_Array_Unmarshal((BYTE *)(target->sha256), buffer, size, (INT32)SHA256_DIGEST_SIZE);
+#endif // TPM_ALG_SHA256
+#ifdef    TPM_ALG_SHA384
+        case TPM_ALG_SHA384:
+            return BYTE_Array_Unmarshal((BYTE *)(target->sha384), buffer, size, (INT32)SHA384_DIGEST_SIZE);
+#endif // TPM_ALG_SHA384
+#ifdef    TPM_ALG_SHA512
+        case TPM_ALG_SHA512:
+            return BYTE_Array_Unmarshal((BYTE *)(target->sha512), buffer, size, (INT32)SHA512_DIGEST_SIZE);
+#endif // TPM_ALG_SHA512
+#ifdef    TPM_ALG_SM3_256
+        case TPM_ALG_SM3_256:
+            return BYTE_Array_Unmarshal((BYTE *)(target->sm3_256), buffer, size, (INT32)SM3_256_DIGEST_SIZE);
+#endif // TPM_ALG_SM3_256
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_HA_Marshal(
+    TPMU_HA *source, BYTE **buffer, INT32 *size, UINT32      selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_SHA1
+        case TPM_ALG_SHA1:
+            return BYTE_Array_Marshal((BYTE *)(source->sha1), buffer, size, (INT32)SHA1_DIGEST_SIZE);
+#endif // TPM_ALG_SHA1
+#ifdef    TPM_ALG_SHA256
+        case TPM_ALG_SHA256:
+            return BYTE_Array_Marshal((BYTE *)(source->sha256), buffer, size, (INT32)SHA256_DIGEST_SIZE);
+#endif // TPM_ALG_SHA256
+#ifdef    TPM_ALG_SHA384
+        case TPM_ALG_SHA384:
+            return BYTE_Array_Marshal((BYTE *)(source->sha384), buffer, size, (INT32)SHA384_DIGEST_SIZE);
+#endif // TPM_ALG_SHA384
+#ifdef    TPM_ALG_SHA512
+        case TPM_ALG_SHA512:
+            return BYTE_Array_Marshal((BYTE *)(source->sha512), buffer, size, (INT32)SHA512_DIGEST_SIZE);
+#endif // TPM_ALG_SHA512
+#ifdef    TPM_ALG_SM3_256
+        case TPM_ALG_SM3_256:
+            return BYTE_Array_Marshal((BYTE *)(source->sm3_256), buffer, size, (INT32)SM3_256_DIGEST_SIZE);
+#endif // TPM_ALG_SM3_256
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:71 - Definition of TPMT_HA Structure  (StructureTable)
+TPM_RC
+TPMT_HA_Unmarshal(
+    TPMT_HA *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->hashAlg), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_HA_Unmarshal((TPMU_HA *)&(target->digest), buffer, size, (UINT32)target->hashAlg);
+    return result;
+}
+
+UINT16
+TPMT_HA_Marshal(
+    TPMT_HA *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->hashAlg), buffer, size));
+    result = (UINT16)(result + TPMU_HA_Marshal((TPMU_HA *)&(source->digest), buffer, size, (UINT32)source->hashAlg));
+    return result;
+}
+
+
+// Table 2:72 - Definition of TPM2B_DIGEST Structure (StructureTable)
+TPM_RC
+TPM2B_DIGEST_Unmarshal(
+    TPM2B_DIGEST *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(TPMU_HA))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_DIGEST_Marshal(
+    TPM2B_DIGEST *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:73 - Definition of TPM2B_DATA Structure (StructureTable)
+TPM_RC
+TPM2B_DATA_Unmarshal(
+    TPM2B_DATA *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(TPMT_HA))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_DATA_Marshal(
+    TPM2B_DATA *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:74 - Definition of Types for TPM2B_NONCE (TypesTable)
+//   TPM2B_DIGEST definition from table 2:74
+//   TPM2B_NONCE_Unmarshal changed to #define
+//   TPM2B_NONCE_Marshal changed to #define
+
+
+// Table 2:75 - Definition of Types for TPM2B_AUTH (TypesTable)
+//   TPM2B_DIGEST definition from table 2:75
+//   TPM2B_AUTH_Unmarshal changed to #define
+//   TPM2B_AUTH_Marshal changed to #define
+
+
+// Table 2:76 - Definition of Types for TPM2B_OPERAND (TypesTable)
+//   TPM2B_DIGEST definition from table 2:76
+//   TPM2B_OPERAND_Unmarshal changed to #define
+//     TPM2B_OPERAND_Marshal not referenced
+
+
+// Table 2:77 - Definition of TPM2B_EVENT Structure (StructureTable)
+TPM_RC
+TPM2B_EVENT_Unmarshal(
+    TPM2B_EVENT *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > 1024)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+//     TPM2B_EVENT_Marshal not referenced
+
+
+// Table 2:78 - Definition of TPM2B_MAX_BUFFER Structure (StructureTable)
+TPM_RC
+TPM2B_MAX_BUFFER_Unmarshal(
+    TPM2B_MAX_BUFFER *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_DIGEST_BUFFER)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_MAX_BUFFER_Marshal(
+    TPM2B_MAX_BUFFER *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:79 - Definition of TPM2B_MAX_NV_BUFFER Structure (StructureTable)
+TPM_RC
+TPM2B_MAX_NV_BUFFER_Unmarshal(
+    TPM2B_MAX_NV_BUFFER *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_NV_BUFFER_SIZE)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_MAX_NV_BUFFER_Marshal(
+    TPM2B_MAX_NV_BUFFER *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:80 - Definition of TPM2B_TIMEOUT Structure  (StructureTable)
+TPM_RC
+TPM2B_TIMEOUT_Unmarshal(
+    TPM2B_TIMEOUT *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(UINT64))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_TIMEOUT_Marshal(
+    TPM2B_TIMEOUT *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:81 - Definition of TPM2B_IV Structure  (StructureTable)
+TPM_RC
+TPM2B_IV_Unmarshal(
+    TPM2B_IV *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_SYM_BLOCK_SIZE)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_IV_Marshal(
+    TPM2B_IV *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:82 - Definition of TPMU_NAME Union  (UnionTable)
+
+
+// Table 2:83 - Definition of TPM2B_NAME Structure (StructureTable)
+TPM_RC
+TPM2B_NAME_Unmarshal(
+    TPM2B_NAME *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(TPMU_NAME))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.name), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_NAME_Marshal(
+    TPM2B_NAME *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.name), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:84 - Definition of TPMS_PCR_SELECT Structure (StructureTable)
+//     TPMS_PCR_SELECT_Unmarshal not referenced
+//     TPMS_PCR_SELECT_Marshal not referenced
+
+
+// Table 2:85 - Definition of TPMS_PCR_SELECTION Structure (StructureTable)
+TPM_RC
+TPMS_PCR_SELECTION_Unmarshal(
+    TPMS_PCR_SELECTION *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->hash), buffer, size, 0);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = UINT8_Unmarshal((UINT8 *)&(target->sizeofSelect), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( (target->sizeofSelect < PCR_SELECT_MIN))
+        return TPM_RC_VALUE;
+    if((target->sizeofSelect) > PCR_SELECT_MAX)
+        return TPM_RC_VALUE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->pcrSelect), buffer, size, (INT32)(target->sizeofSelect));
+    return result;
+}
+
+UINT16
+TPMS_PCR_SELECTION_Marshal(
+    TPMS_PCR_SELECTION *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->hash), buffer, size));
+    result = (UINT16)(result + UINT8_Marshal((UINT8 *)&(source->sizeofSelect), buffer, size));
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->pcrSelect), buffer, size, (INT32)(source->sizeofSelect)));
+    return result;
+}
+
+
+// Table 2:88 - Definition of TPMT_TK_CREATION Structure (StructureTable)
+TPM_RC
+TPMT_TK_CREATION_Unmarshal(
+    TPMT_TK_CREATION *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ST_Unmarshal((TPM_ST *)&(target->tag), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( ((target->tag) != TPM_ST_CREATION))
+        return TPM_RC_TAG;
+    result = TPMI_RH_HIERARCHY_Unmarshal((TPMI_RH_HIERARCHY *)&(target->hierarchy), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->digest), buffer, size);
+    return result;
+}
+
+UINT16
+TPMT_TK_CREATION_Marshal(
+    TPMT_TK_CREATION *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_ST_Marshal((TPM_ST *)&(source->tag), buffer, size));
+    result = (UINT16)(result + TPMI_RH_HIERARCHY_Marshal((TPMI_RH_HIERARCHY *)&(source->hierarchy), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->digest), buffer, size));
+    return result;
+}
+
+
+// Table 2:89 - Definition of TPMT_TK_VERIFIED Structure (StructureTable)
+TPM_RC
+TPMT_TK_VERIFIED_Unmarshal(
+    TPMT_TK_VERIFIED *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ST_Unmarshal((TPM_ST *)&(target->tag), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( ((target->tag) != TPM_ST_VERIFIED))
+        return TPM_RC_TAG;
+    result = TPMI_RH_HIERARCHY_Unmarshal((TPMI_RH_HIERARCHY *)&(target->hierarchy), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->digest), buffer, size);
+    return result;
+}
+
+UINT16
+TPMT_TK_VERIFIED_Marshal(
+    TPMT_TK_VERIFIED *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_ST_Marshal((TPM_ST *)&(source->tag), buffer, size));
+    result = (UINT16)(result + TPMI_RH_HIERARCHY_Marshal((TPMI_RH_HIERARCHY *)&(source->hierarchy), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->digest), buffer, size));
+    return result;
+}
+
+
+// Table 2:90 - Definition of TPMT_TK_AUTH Structure (StructureTable)
+TPM_RC
+TPMT_TK_AUTH_Unmarshal(
+    TPMT_TK_AUTH *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ST_Unmarshal((TPM_ST *)&(target->tag), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( ((target->tag) != TPM_ST_AUTH_SIGNED)
+     && ((target->tag) != TPM_ST_AUTH_SECRET))
+        return TPM_RC_TAG;
+    result = TPMI_RH_HIERARCHY_Unmarshal((TPMI_RH_HIERARCHY *)&(target->hierarchy), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->digest), buffer, size);
+    return result;
+}
+
+UINT16
+TPMT_TK_AUTH_Marshal(
+    TPMT_TK_AUTH *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_ST_Marshal((TPM_ST *)&(source->tag), buffer, size));
+    result = (UINT16)(result + TPMI_RH_HIERARCHY_Marshal((TPMI_RH_HIERARCHY *)&(source->hierarchy), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->digest), buffer, size));
+    return result;
+}
+
+
+// Table 2:91 - Definition of TPMT_TK_HASHCHECK Structure (StructureTable)
+TPM_RC
+TPMT_TK_HASHCHECK_Unmarshal(
+    TPMT_TK_HASHCHECK *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ST_Unmarshal((TPM_ST *)&(target->tag), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( ((target->tag) != TPM_ST_HASHCHECK))
+        return TPM_RC_TAG;
+    result = TPMI_RH_HIERARCHY_Unmarshal((TPMI_RH_HIERARCHY *)&(target->hierarchy), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->digest), buffer, size);
+    return result;
+}
+
+UINT16
+TPMT_TK_HASHCHECK_Marshal(
+    TPMT_TK_HASHCHECK *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_ST_Marshal((TPM_ST *)&(source->tag), buffer, size));
+    result = (UINT16)(result + TPMI_RH_HIERARCHY_Marshal((TPMI_RH_HIERARCHY *)&(source->hierarchy), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->digest), buffer, size));
+    return result;
+}
+
+
+// Table 2:92 - Definition of TPMS_ALG_PROPERTY Structure  (StructureTable)
+//     TPMS_ALG_PROPERTY_Unmarshal not referenced
+UINT16
+TPMS_ALG_PROPERTY_Marshal(
+    TPMS_ALG_PROPERTY *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_ALG_ID_Marshal((TPM_ALG_ID *)&(source->alg), buffer, size));
+    result = (UINT16)(result + TPMA_ALGORITHM_Marshal((TPMA_ALGORITHM *)&(source->algProperties), buffer, size));
+    return result;
+}
+
+
+// Table 2:93 - Definition of TPMS_TAGGED_PROPERTY Structure  (StructureTable)
+//     TPMS_TAGGED_PROPERTY_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PROPERTY_Marshal(
+    TPMS_TAGGED_PROPERTY *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_PT_Marshal((TPM_PT *)&(source->property), buffer, size));
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->value), buffer, size));
+    return result;
+}
+
+
+// Table 2:94 - Definition of TPMS_TAGGED_PCR_SELECT Structure  (StructureTable)
+//     TPMS_TAGGED_PCR_SELECT_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PCR_SELECT_Marshal(
+    TPMS_TAGGED_PCR_SELECT *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_PT_Marshal((TPM_PT *)&(source->tag), buffer, size));
+    result = (UINT16)(result + UINT8_Marshal((UINT8 *)&(source->sizeofSelect), buffer, size));
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->pcrSelect), buffer, size, (INT32)(source->sizeofSelect)));
+    return result;
+}
+
+
+// Table 2:95 - Definition of TPML_CC Structure (StructureTable)
+TPM_RC
+TPML_CC_Unmarshal(
+    TPML_CC *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)&(target->count), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if((target->count) > MAX_CAP_CC)
+        return TPM_RC_SIZE;
+    result = TPM_CC_Array_Unmarshal((TPM_CC *)(target->commandCodes), buffer, size, (INT32)(target->count));
+    return result;
+}
+
+UINT16
+TPML_CC_Marshal(
+    TPML_CC *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPM_CC_Array_Marshal((TPM_CC *)(source->commandCodes), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:96 - Definition of TPML_CCA Structure  (StructureTable)
+//     TPML_CCA_Unmarshal not referenced
+UINT16
+TPML_CCA_Marshal(
+    TPML_CCA *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPMA_CC_Array_Marshal((TPMA_CC *)(source->commandAttributes), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:97 - Definition of TPML_ALG Structure (StructureTable)
+TPM_RC
+TPML_ALG_Unmarshal(
+    TPML_ALG *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)&(target->count), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if((target->count) > MAX_ALG_LIST_SIZE)
+        return TPM_RC_SIZE;
+    result = TPM_ALG_ID_Array_Unmarshal((TPM_ALG_ID *)(target->algorithms), buffer, size, (INT32)(target->count));
+    return result;
+}
+
+UINT16
+TPML_ALG_Marshal(
+    TPML_ALG *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPM_ALG_ID_Array_Marshal((TPM_ALG_ID *)(source->algorithms), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:98 - Definition of TPML_HANDLE Structure  (StructureTable)
+//     TPML_HANDLE_Unmarshal not referenced
+UINT16
+TPML_HANDLE_Marshal(
+    TPML_HANDLE *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPM_HANDLE_Array_Marshal((TPM_HANDLE *)(source->handle), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:99 - Definition of TPML_DIGEST Structure (StructureTable)
+TPM_RC
+TPML_DIGEST_Unmarshal(
+    TPML_DIGEST *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)&(target->count), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( (target->count < 2))
+        return TPM_RC_SIZE;
+    if((target->count) > 8)
+        return TPM_RC_SIZE;
+    result = TPM2B_DIGEST_Array_Unmarshal((TPM2B_DIGEST *)(target->digests), buffer, size, (INT32)(target->count));
+    return result;
+}
+
+UINT16
+TPML_DIGEST_Marshal(
+    TPML_DIGEST *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Array_Marshal((TPM2B_DIGEST *)(source->digests), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:100 - Definition of TPML_DIGEST_VALUES Structure (StructureTable)
+TPM_RC
+TPML_DIGEST_VALUES_Unmarshal(
+    TPML_DIGEST_VALUES *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)&(target->count), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if((target->count) > HASH_COUNT)
+        return TPM_RC_SIZE;
+    result = TPMT_HA_Array_Unmarshal((TPMT_HA *)(target->digests), buffer, size, 0, (INT32)(target->count));
+    return result;
+}
+
+UINT16
+TPML_DIGEST_VALUES_Marshal(
+    TPML_DIGEST_VALUES *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPMT_HA_Array_Marshal((TPMT_HA *)(source->digests), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:101 - Definition of TPM2B_DIGEST_VALUES Structure (StructureTable)
+//     TPM2B_DIGEST_VALUES_Unmarshal not referenced
+//     TPM2B_DIGEST_VALUES_Marshal not referenced
+
+
+// Table 2:102 - Definition of TPML_PCR_SELECTION Structure (StructureTable)
+TPM_RC
+TPML_PCR_SELECTION_Unmarshal(
+    TPML_PCR_SELECTION *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)&(target->count), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if((target->count) > HASH_COUNT)
+        return TPM_RC_SIZE;
+    result = TPMS_PCR_SELECTION_Array_Unmarshal((TPMS_PCR_SELECTION *)(target->pcrSelections), buffer, size, (INT32)(target->count));
+    return result;
+}
+
+UINT16
+TPML_PCR_SELECTION_Marshal(
+    TPML_PCR_SELECTION *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPMS_PCR_SELECTION_Array_Marshal((TPMS_PCR_SELECTION *)(source->pcrSelections), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:103 - Definition of TPML_ALG_PROPERTY Structure  (StructureTable)
+//     TPML_ALG_PROPERTY_Unmarshal not referenced
+UINT16
+TPML_ALG_PROPERTY_Marshal(
+    TPML_ALG_PROPERTY *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPMS_ALG_PROPERTY_Array_Marshal((TPMS_ALG_PROPERTY *)(source->algProperties), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:104 - Definition of TPML_TAGGED_TPM_PROPERTY Structure  (StructureTable)
+//     TPML_TAGGED_TPM_PROPERTY_Unmarshal not referenced
+UINT16
+TPML_TAGGED_TPM_PROPERTY_Marshal(
+    TPML_TAGGED_TPM_PROPERTY *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPMS_TAGGED_PROPERTY_Array_Marshal((TPMS_TAGGED_PROPERTY *)(source->tpmProperty), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:105 - Definition of TPML_TAGGED_PCR_PROPERTY Structure  (StructureTable)
+//     TPML_TAGGED_PCR_PROPERTY_Unmarshal not referenced
+UINT16
+TPML_TAGGED_PCR_PROPERTY_Marshal(
+    TPML_TAGGED_PCR_PROPERTY *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPMS_TAGGED_PCR_SELECT_Array_Marshal((TPMS_TAGGED_PCR_SELECT *)(source->pcrProperty), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+
+// Table 2:106 - Definition of TPML_ECC_CURVE Structure  (StructureTable)
+#ifdef    TPM_ALG_ECC
+//     TPML_ECC_CURVE_Unmarshal not referenced
+UINT16
+TPML_ECC_CURVE_Marshal(
+    TPML_ECC_CURVE *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+    result = (UINT16)(result + TPM_ECC_CURVE_Array_Marshal((TPM_ECC_CURVE *)(source->eccCurves), buffer, size, (INT32)(source->count)));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+#ifdef ME11_SIM
+UINT16
+INTEL_PROP_VALUE_Marshal(INTEL_PROP_VALUE *source, BYTE **buffer, INT32 *size)
+{
+       UINT16    result = 0;
+       result = (UINT16)(result + UINT32_Marshal((UINT32 *)source, buffer, size));
+       return result;
+}
+
+UINT16
+INTEL_PROPERTY_Marshal(INTEL_PROPERTY *source, BYTE **buffer, INT32 *size)
+{
+       UINT16    result = 0;
+       result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->count), buffer, size));
+       result = (UINT16)(result + INTEL_PROP_VALUE_Marshal(&(source->property), buffer, size));
+
+       return result;
+}
+#endif
+
+// Table 2:107 - Definition of TPMU_CAPABILITIES Union  (UnionTable)
+//     TPMU_CAPABILITIES_Unmarshal not referenced
+UINT16
+TPMU_CAPABILITIES_Marshal(
+    TPMU_CAPABILITIES *source, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+        case TPM_CAP_ALGS:
+            return TPML_ALG_PROPERTY_Marshal((TPML_ALG_PROPERTY *)&(source->algorithms), buffer, size);
+        case TPM_CAP_HANDLES:
+            return TPML_HANDLE_Marshal((TPML_HANDLE *)&(source->handles), buffer, size);
+        case TPM_CAP_COMMANDS:
+            return TPML_CCA_Marshal((TPML_CCA *)&(source->command), buffer, size);
+        case TPM_CAP_PP_COMMANDS:
+            return TPML_CC_Marshal((TPML_CC *)&(source->ppCommands), buffer, size);
+        case TPM_CAP_AUDIT_COMMANDS:
+            return TPML_CC_Marshal((TPML_CC *)&(source->auditCommands), buffer, size);
+        case TPM_CAP_PCRS:
+            return TPML_PCR_SELECTION_Marshal((TPML_PCR_SELECTION *)&(source->assignedPCR), buffer, size);
+        case TPM_CAP_TPM_PROPERTIES:
+            return TPML_TAGGED_TPM_PROPERTY_Marshal((TPML_TAGGED_TPM_PROPERTY *)&(source->tpmProperties), buffer, size);
+        case TPM_CAP_PCR_PROPERTIES:
+            return TPML_TAGGED_PCR_PROPERTY_Marshal((TPML_TAGGED_PCR_PROPERTY *)&(source->pcrProperties), buffer, size);
+#ifdef    TPM_ALG_ECC
+        case TPM_CAP_ECC_CURVES:
+            return TPML_ECC_CURVE_Marshal((TPML_ECC_CURVE *)&(source->eccCurves), buffer, size);
+#endif // TPM_ALG_ECC
+#ifdef    ME11_SIM
+               case TPM_CAP_VENDOR_PROPERTY:
+                       return INTEL_PROPERTY_Marshal((INTEL_PROPERTY *)&(source->intelProperty), buffer, size);
+#endif
+       }
+    return 0;
+}
+
+
+// Table 2:108 - Definition of TPMS_CAPABILITY_DATA Structure  (StructureTable)
+//     TPMS_CAPABILITY_DATA_Unmarshal not referenced
+UINT16
+TPMS_CAPABILITY_DATA_Marshal(
+    TPMS_CAPABILITY_DATA *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_CAP_Marshal((TPM_CAP *)&(source->capability), buffer, size));
+    result = (UINT16)(result + TPMU_CAPABILITIES_Marshal((TPMU_CAPABILITIES *)&(source->data), buffer, size, (UINT32)source->capability));
+    return result;
+}
+
+
+// Table 2:109 - Definition of TPMS_CLOCK_INFO Structure (StructureTable)
+//     TPMS_CLOCK_INFO_Unmarshal not referenced
+UINT16
+TPMS_CLOCK_INFO_Marshal(
+    TPMS_CLOCK_INFO *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT64_Marshal((UINT64 *)&(source->clock), buffer, size));
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->resetCount), buffer, size));
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->restartCount), buffer, size));
+    result = (UINT16)(result + TPMI_YES_NO_Marshal((TPMI_YES_NO *)&(source->safe), buffer, size));
+    return result;
+}
+
+
+// Table 2:110 - Definition of TPMS_TIME_INFO Structure (StructureTable)
+//     TPMS_TIME_INFO_Unmarshal not referenced
+UINT16
+TPMS_TIME_INFO_Marshal(
+    TPMS_TIME_INFO *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT64_Marshal((UINT64 *)&(source->time), buffer, size));
+    result = (UINT16)(result + TPMS_CLOCK_INFO_Marshal((TPMS_CLOCK_INFO *)&(source->clockInfo), buffer, size));
+    return result;
+}
+
+
+// Table 2:111 - Definition of TPMS_TIME_ATTEST_INFO Structure  (StructureTable)
+//     TPMS_TIME_ATTEST_INFO_Unmarshal not referenced
+UINT16
+TPMS_TIME_ATTEST_INFO_Marshal(
+    TPMS_TIME_ATTEST_INFO *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMS_TIME_INFO_Marshal((TPMS_TIME_INFO *)&(source->time), buffer, size));
+    result = (UINT16)(result + UINT64_Marshal((UINT64 *)&(source->firmwareVersion), buffer, size));
+    return result;
+}
+
+
+// Table 2:112 - Definition of TPMS_CERTIFY_INFO Structure  (StructureTable)
+//     TPMS_CERTIFY_INFO_Unmarshal not referenced
+UINT16
+TPMS_CERTIFY_INFO_Marshal(
+    TPMS_CERTIFY_INFO *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->name), buffer, size));
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->qualifiedName), buffer, size));
+    return result;
+}
+
+
+// Table 2:113 - Definition of TPMS_QUOTE_INFO Structure  (StructureTable)
+//     TPMS_QUOTE_INFO_Unmarshal not referenced
+UINT16
+TPMS_QUOTE_INFO_Marshal(
+    TPMS_QUOTE_INFO *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPML_PCR_SELECTION_Marshal((TPML_PCR_SELECTION *)&(source->pcrSelect), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->pcrDigest), buffer, size));
+    return result;
+}
+
+
+// Table 2:114 - Definition of TPMS_COMMAND_AUDIT_INFO Structure  (StructureTable)
+//     TPMS_COMMAND_AUDIT_INFO_Unmarshal not referenced
+UINT16
+TPMS_COMMAND_AUDIT_INFO_Marshal(
+    TPMS_COMMAND_AUDIT_INFO *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT64_Marshal((UINT64 *)&(source->auditCounter), buffer, size));
+    result = (UINT16)(result + TPM_ALG_ID_Marshal((TPM_ALG_ID *)&(source->digestAlg), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->auditDigest), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->commandDigest), buffer, size));
+    return result;
+}
+
+
+// Table 2:115 - Definition of TPMS_SESSION_AUDIT_INFO Structure  (StructureTable)
+//     TPMS_SESSION_AUDIT_INFO_Unmarshal not referenced
+UINT16
+TPMS_SESSION_AUDIT_INFO_Marshal(
+    TPMS_SESSION_AUDIT_INFO *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_YES_NO_Marshal((TPMI_YES_NO *)&(source->exclusiveSession), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->sessionDigest), buffer, size));
+    return result;
+}
+
+
+// Table 2:116 - Definition of TPMS_CREATION_INFO Structure  (StructureTable)
+//     TPMS_CREATION_INFO_Unmarshal not referenced
+UINT16
+TPMS_CREATION_INFO_Marshal(
+    TPMS_CREATION_INFO *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->objectName), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->creationHash), buffer, size));
+    return result;
+}
+
+
+// Table 2:117 - Definition of TPMS_NV_CERTIFY_INFO Structure  (StructureTable)
+//     TPMS_NV_CERTIFY_INFO_Unmarshal not referenced
+UINT16
+TPMS_NV_CERTIFY_INFO_Marshal(
+    TPMS_NV_CERTIFY_INFO *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->indexName), buffer, size));
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->offset), buffer, size));
+    result = (UINT16)(result + TPM2B_MAX_NV_BUFFER_Marshal((TPM2B_MAX_NV_BUFFER *)&(source->nvContents), buffer, size));
+    return result;
+}
+
+
+// Table 2:118 - Definition of TPMI_ST_ATTEST Type  (TypeTable)
+//     TPMI_ST_ATTEST_Unmarshal not referenced
+//   TPMI_ST_ATTEST_Marshal changed to #define
+
+
+// Table 2:119 - Definition of TPMU_ATTEST Union  (UnionTable)
+//     TPMU_ATTEST_Unmarshal not referenced
+UINT16
+TPMU_ATTEST_Marshal(
+    TPMU_ATTEST *source, BYTE **buffer, INT32 *size, UINT32      selector
+    )
+{
+    switch(selector) {
+        case TPM_ST_ATTEST_CERTIFY:
+            return TPMS_CERTIFY_INFO_Marshal((TPMS_CERTIFY_INFO *)&(source->certify), buffer, size);
+        case TPM_ST_ATTEST_CREATION:
+            return TPMS_CREATION_INFO_Marshal((TPMS_CREATION_INFO *)&(source->creation), buffer, size);
+        case TPM_ST_ATTEST_QUOTE:
+            return TPMS_QUOTE_INFO_Marshal((TPMS_QUOTE_INFO *)&(source->quote), buffer, size);
+        case TPM_ST_ATTEST_COMMAND_AUDIT:
+            return TPMS_COMMAND_AUDIT_INFO_Marshal((TPMS_COMMAND_AUDIT_INFO *)&(source->commandAudit), buffer, size);
+        case TPM_ST_ATTEST_SESSION_AUDIT:
+            return TPMS_SESSION_AUDIT_INFO_Marshal((TPMS_SESSION_AUDIT_INFO *)&(source->sessionAudit), buffer, size);
+        case TPM_ST_ATTEST_TIME:
+            return TPMS_TIME_ATTEST_INFO_Marshal((TPMS_TIME_ATTEST_INFO *)&(source->time), buffer, size);
+        case TPM_ST_ATTEST_NV:
+            return TPMS_NV_CERTIFY_INFO_Marshal((TPMS_NV_CERTIFY_INFO *)&(source->nv), buffer, size);
+    }
+    return 0;
+}
+
+
+// Table 2:120 - Definition of TPMS_ATTEST Structure  (StructureTable)
+//     TPMS_ATTEST_Unmarshal not referenced
+UINT16
+TPMS_ATTEST_Marshal(
+    TPMS_ATTEST *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_GENERATED_Marshal((TPM_GENERATED *)&(source->magic), buffer, size));
+    result = (UINT16)(result + TPMI_ST_ATTEST_Marshal((TPMI_ST_ATTEST *)&(source->type), buffer, size));
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->qualifiedSigner), buffer, size));
+    result = (UINT16)(result + TPM2B_DATA_Marshal((TPM2B_DATA *)&(source->extraData), buffer, size));
+    result = (UINT16)(result + TPMS_CLOCK_INFO_Marshal((TPMS_CLOCK_INFO *)&(source->clockInfo), buffer, size));
+    result = (UINT16)(result + UINT64_Marshal((UINT64 *)&(source->firmwareVersion), buffer, size));
+    result = (UINT16)(result + TPMU_ATTEST_Marshal((TPMU_ATTEST *)&(source->attested), buffer, size, (UINT32)source->type));
+    return result;
+}
+
+
+// Table 2:121 - Definition of TPM2B_ATTEST Structure  (StructureTable)
+//     TPM2B_ATTEST_Unmarshal not referenced
+UINT16
+TPM2B_ATTEST_Marshal(
+    TPM2B_ATTEST *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.attestationData), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:122 - Definition of TPMS_AUTH_COMMAND Structure  (StructureTable)
+//     TPMS_AUTH_COMMAND_Unmarshal not referenced
+//     TPMS_AUTH_COMMAND_Marshal not referenced
+
+
+// Table 2:123 - Definition of TPMS_AUTH_RESPONSE Structure  (StructureTable)
+//     TPMS_AUTH_RESPONSE_Unmarshal not referenced
+//     TPMS_AUTH_RESPONSE_Marshal not referenced
+
+
+// Table 2:124 - Definition of TPMI_AES_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_AES
+TPM_RC
+TPMI_AES_KEY_BITS_Unmarshal(
+    TPMI_AES_KEY_BITS *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_KEY_BITS_Unmarshal((TPM_KEY_BITS *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case 128:
+        case 256:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_AES_KEY_BITS_Marshal changed to #define
+#endif // TPM_ALG_AES
+
+
+// Table 2:124 - Definition of TPMI_SM4_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_SM4
+TPM_RC
+TPMI_SM4_KEY_BITS_Unmarshal(
+    TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_KEY_BITS_Unmarshal((TPM_KEY_BITS *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case 128:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_SM4_KEY_BITS_Marshal changed to #define
+#endif // TPM_ALG_SM4
+
+
+// Table 2:124 - Definition of TPMI_CAMELLIA_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_CAMELLIA
+TPM_RC
+TPMI_CAMELLIA_KEY_BITS_Unmarshal(
+    TPMI_CAMELLIA_KEY_BITS *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_KEY_BITS_Unmarshal((TPM_KEY_BITS *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case 128:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_CAMELLIA_KEY_BITS_Marshal changed to #define
+#endif // TPM_ALG_CAMELLIA
+
+
+// Table 2:125 - Definition of TPMU_SYM_KEY_BITS Union (UnionTable)
+TPM_RC
+TPMU_SYM_KEY_BITS_Unmarshal(
+    TPMU_SYM_KEY_BITS *target, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_AES
+        case TPM_ALG_AES:
+            return TPMI_AES_KEY_BITS_Unmarshal((TPMI_AES_KEY_BITS *)&(target->aes), buffer, size);
+#endif // TPM_ALG_AES
+#ifdef    TPM_ALG_SM4
+        case TPM_ALG_SM4:
+            return TPMI_SM4_KEY_BITS_Unmarshal((TPMI_SM4_KEY_BITS *)&(target->sm4), buffer, size);
+#endif // TPM_ALG_SM4
+#ifdef    TPM_ALG_CAMELLIA
+        case TPM_ALG_CAMELLIA:
+            return TPMI_CAMELLIA_KEY_BITS_Unmarshal((TPMI_CAMELLIA_KEY_BITS *)&(target->camellia), buffer, size);
+#endif // TPM_ALG_CAMELLIA
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+            return TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->exclusiveOr
+                                       ), buffer, size, 0);
+#endif // TPM_ALG_XOR
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_SYM_KEY_BITS_Marshal(
+    TPMU_SYM_KEY_BITS *source, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_AES
+        case TPM_ALG_AES:
+            return TPMI_AES_KEY_BITS_Marshal((TPMI_AES_KEY_BITS *)&(source->aes), buffer, size);
+#endif // TPM_ALG_AES
+#ifdef    TPM_ALG_SM4
+        case TPM_ALG_SM4:
+            return TPMI_SM4_KEY_BITS_Marshal((TPMI_SM4_KEY_BITS *)&(source->sm4), buffer, size);
+#endif // TPM_ALG_SM4
+#ifdef    TPM_ALG_CAMELLIA
+        case TPM_ALG_CAMELLIA:
+            return TPMI_CAMELLIA_KEY_BITS_Marshal((TPMI_CAMELLIA_KEY_BITS *)&(source->camellia), buffer, size);
+#endif // TPM_ALG_CAMELLIA
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+            return TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->exclusiveOr
+                                       ), buffer, size);
+#endif // TPM_ALG_XOR
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:126 - Definition of TPMU_SYM_MODE Union (UnionTable)
+TPM_RC
+TPMU_SYM_MODE_Unmarshal(
+    TPMU_SYM_MODE *target, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_AES
+        case TPM_ALG_AES:
+            return TPMI_ALG_SYM_MODE_Unmarshal((TPMI_ALG_SYM_MODE *)&(target->aes), buffer, size, 1);
+#endif // TPM_ALG_AES
+#ifdef    TPM_ALG_SM4
+        case TPM_ALG_SM4:
+            return TPMI_ALG_SYM_MODE_Unmarshal((TPMI_ALG_SYM_MODE *)&(target->sm4), buffer, size, 1);
+#endif // TPM_ALG_SM4
+#ifdef    TPM_ALG_CAMELLIA
+        case TPM_ALG_CAMELLIA:
+            return TPMI_ALG_SYM_MODE_Unmarshal((TPMI_ALG_SYM_MODE *)&(target->camellia), buffer, size, 1);
+#endif // TPM_ALG_CAMELLIA
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+            return TPM_RC_SUCCESS;
+#endif // TPM_ALG_XOR
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_SYM_MODE_Marshal(
+    TPMU_SYM_MODE *source, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_AES
+        case TPM_ALG_AES:
+            return TPMI_ALG_SYM_MODE_Marshal((TPMI_ALG_SYM_MODE *)&(source->aes), buffer, size);
+#endif // TPM_ALG_AES
+#ifdef    TPM_ALG_SM4
+        case TPM_ALG_SM4:
+            return TPMI_ALG_SYM_MODE_Marshal((TPMI_ALG_SYM_MODE *)&(source->sm4), buffer, size);
+#endif // TPM_ALG_SM4
+#ifdef    TPM_ALG_CAMELLIA
+        case TPM_ALG_CAMELLIA:
+            return TPMI_ALG_SYM_MODE_Marshal((TPMI_ALG_SYM_MODE *)&(source->camellia), buffer, size);
+#endif // TPM_ALG_CAMELLIA
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+            return 0;
+#endif // TPM_ALG_XOR
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:128 - Definition of TPMT_SYM_DEF Structure (StructureTable)
+TPM_RC
+TPMT_SYM_DEF_Unmarshal(
+    TPMT_SYM_DEF *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_SYM_Unmarshal((TPMI_ALG_SYM *)&(target->algorithm), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SYM_KEY_BITS_Unmarshal((TPMU_SYM_KEY_BITS *)&(target->keyBits), buffer, size, (UINT32)target->algorithm);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SYM_MODE_Unmarshal((TPMU_SYM_MODE *)&(target->mode), buffer, size, (UINT32)target->algorithm);
+    return result;
+}
+
+//     TPMT_SYM_DEF_Marshal not referenced
+
+
+// Table 2:129 - Definition of TPMT_SYM_DEF_OBJECT Structure (StructureTable)
+TPM_RC
+TPMT_SYM_DEF_OBJECT_Unmarshal(
+    TPMT_SYM_DEF_OBJECT *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_SYM_OBJECT_Unmarshal((TPMI_ALG_SYM_OBJECT *)&(target->algorithm), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SYM_KEY_BITS_Unmarshal((TPMU_SYM_KEY_BITS *)&(target->keyBits), buffer, size, (UINT32)target->algorithm);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SYM_MODE_Unmarshal((TPMU_SYM_MODE *)&(target->mode), buffer, size, (UINT32)target->algorithm);
+    return result;
+}
+
+UINT16
+TPMT_SYM_DEF_OBJECT_Marshal(
+    TPMT_SYM_DEF_OBJECT *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_SYM_OBJECT_Marshal((TPMI_ALG_SYM_OBJECT *)&(source->algorithm), buffer, size));
+    result = (UINT16)(result + TPMU_SYM_KEY_BITS_Marshal((TPMU_SYM_KEY_BITS *)&(source->keyBits), buffer, size, (UINT32)source->algorithm));
+    result = (UINT16)(result + TPMU_SYM_MODE_Marshal((TPMU_SYM_MODE *)&(source->mode), buffer, size, (UINT32)source->algorithm));
+    return result;
+}
+
+
+// Table 2:130 - Definition of TPM2B_SYM_KEY Structure (StructureTable)
+TPM_RC
+TPM2B_SYM_KEY_Unmarshal(
+    TPM2B_SYM_KEY *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_SYM_KEY_BYTES)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_SYM_KEY_Marshal(
+    TPM2B_SYM_KEY *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:131 - Definition of TPMS_SYMCIPHER_PARMS Structure (StructureTable)
+//   TPMS_SYMCIPHER_PARMS_Unmarshal changed to #define
+//   TPMS_SYMCIPHER_PARMS_Marshal changed to #define
+
+
+// Table 2:132 - Definition of TPM2B_SENSITIVE_DATA Structure (StructureTable)
+TPM_RC
+TPM2B_SENSITIVE_DATA_Unmarshal(
+    TPM2B_SENSITIVE_DATA *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_SYM_DATA)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_SENSITIVE_DATA_Marshal(
+    TPM2B_SENSITIVE_DATA *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:133 - Definition of TPMS_SENSITIVE_CREATE Structure  (StructureTable)
+TPM_RC
+TPMS_SENSITIVE_CREATE_Unmarshal(
+    TPMS_SENSITIVE_CREATE *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM2B_AUTH_Unmarshal((TPM2B_AUTH *)&(target->userAuth), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_SENSITIVE_DATA_Unmarshal((TPM2B_SENSITIVE_DATA *)&(target->data), buffer, size);
+    return result;
+}
+
+//     TPMS_SENSITIVE_CREATE_Marshal not referenced
+
+
+// Table 2:134 - Definition of TPM2B_SENSITIVE_CREATE Structure  (StructureTable)
+TPM_RC
+TPM2B_SENSITIVE_CREATE_Unmarshal(
+    TPM2B_SENSITIVE_CREATE *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    INT32    startSize;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size is zero, then the required structure is missing
+    if(target->t.size == 0)
+        return TPM_RC_SIZE;
+    startSize = *size;
+    result = TPMS_SENSITIVE_CREATE_Unmarshal((TPMS_SENSITIVE_CREATE *)&(target->t.sensitive), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(target->t.size != (startSize - *size)) return TPM_RC_SIZE;
+    return TPM_RC_SUCCESS;
+}
+
+//     TPM2B_SENSITIVE_CREATE_Marshal not referenced
+
+
+// Table 2:135 - Definition of TPMS_SCHEME_HASH Structure (StructureTable)
+//   TPMS_SCHEME_HASH_Unmarshal changed to #define
+//   TPMS_SCHEME_HASH_Marshal changed to #define
+
+
+// Table 2:136 - Definition of TPMS_SCHEME_ECDAA Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_SCHEME_ECDAA_Unmarshal(
+    TPMS_SCHEME_ECDAA *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->hashAlg), buffer, size, 0);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->count), buffer, size);
+    return result;
+}
+
+UINT16
+TPMS_SCHEME_ECDAA_Marshal(
+    TPMS_SCHEME_ECDAA *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->hashAlg), buffer, size));
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->count), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:137 - Definition of TPMI_ALG_KEYEDHASH_SCHEME Type (TypeTable)
+TPM_RC
+TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal(
+    TPMI_ALG_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL      flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+#endif // TPM_ALG_HMAC
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+#endif // TPM_ALG_XOR
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_VALUE;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_KEYEDHASH_SCHEME_Marshal changed to #define
+
+
+// Table 2:138 - Definition of Types for HMAC_SIG_SCHEME (TypesTable)
+//   TPMS_SCHEME_HASH definition from table 2:138
+//   TPMS_SCHEME_HMAC_Unmarshal changed to #define
+//   TPMS_SCHEME_HMAC_Marshal changed to #define
+
+
+// Table 2:139 - Definition of TPMS_SCHEME_XOR Structure (StructureTable)
+TPM_RC
+TPMS_SCHEME_XOR_Unmarshal(
+    TPMS_SCHEME_XOR *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->hashAlg), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_ALG_KDF_Unmarshal((TPMI_ALG_KDF *)&(target->kdf), buffer, size, 1);
+    return result;
+}
+
+UINT16
+TPMS_SCHEME_XOR_Marshal(
+    TPMS_SCHEME_XOR *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->hashAlg), buffer, size));
+    result = (UINT16)(result + TPMI_ALG_KDF_Marshal((TPMI_ALG_KDF *)&(source->kdf), buffer, size));
+    return result;
+}
+
+
+// Table 2:140 - Definition of TPMU_SCHEME_KEYEDHASH Union  (UnionTable)
+TPM_RC
+TPMU_SCHEME_KEYEDHASH_Unmarshal(
+    TPMU_SCHEME_KEYEDHASH *target, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+            return TPMS_SCHEME_HMAC_Unmarshal((TPMS_SCHEME_HMAC *)&(target->hmac), buffer, size);
+#endif // TPM_ALG_HMAC
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+            return TPMS_SCHEME_XOR_Unmarshal((TPMS_SCHEME_XOR *)&(target->exclusiveOr
+                                       ), buffer, size, 1);
+#endif // TPM_ALG_XOR
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_SCHEME_KEYEDHASH_Marshal(
+    TPMU_SCHEME_KEYEDHASH *source, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+            return TPMS_SCHEME_HMAC_Marshal((TPMS_SCHEME_HMAC *)&(source->hmac), buffer, size);
+#endif // TPM_ALG_HMAC
+#ifdef    TPM_ALG_XOR
+        case TPM_ALG_XOR:
+            return TPMS_SCHEME_XOR_Marshal((TPMS_SCHEME_XOR *)&(source->exclusiveOr
+                                       ), buffer, size);
+#endif // TPM_ALG_XOR
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:141 - Definition of TPMT_KEYEDHASH_SCHEME Structure (StructureTable)
+TPM_RC
+TPMT_KEYEDHASH_SCHEME_Unmarshal(
+    TPMT_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL      flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal((TPMI_ALG_KEYEDHASH_SCHEME *)&(target->scheme), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SCHEME_KEYEDHASH_Unmarshal((TPMU_SCHEME_KEYEDHASH *)&(target->details), buffer, size, (UINT32)target->scheme);
+    return result;
+}
+
+UINT16
+TPMT_KEYEDHASH_SCHEME_Marshal(
+    TPMT_KEYEDHASH_SCHEME *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_KEYEDHASH_SCHEME_Marshal((TPMI_ALG_KEYEDHASH_SCHEME *)&(source->scheme), buffer, size));
+    result = (UINT16)(result + TPMU_SCHEME_KEYEDHASH_Marshal((TPMU_SCHEME_KEYEDHASH *)&(source->details), buffer, size, (UINT32)source->scheme));
+    return result;
+}
+
+
+// Table 2:142 - Definition of Types for RSA Signature Schemes  (TypesTable)
+#ifdef    TPM_ALG_RSA
+//   TPMS_SCHEME_HASH definition from table 2:142
+#ifdef    TPM_ALG_RSA
+//   TPMS_SIG_SCHEME_RSASSA_Unmarshal changed to #define
+//   TPMS_SIG_SCHEME_RSASSA_Marshal changed to #define
+#endif // TPM_ALG_RSA
+//   TPMS_SCHEME_HASH definition from table 2:142
+#ifdef    TPM_ALG_RSA
+//   TPMS_SIG_SCHEME_RSAPSS_Unmarshal changed to #define
+//   TPMS_SIG_SCHEME_RSAPSS_Marshal changed to #define
+#endif // TPM_ALG_RSA
+#endif // TPM_ALG_RSA
+
+
+// Table 2:143 - Definition of Types for ECC Signature Schemes  (TypesTable)
+#ifdef    TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:143
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIG_SCHEME_ECDSA_Unmarshal changed to #define
+//   TPMS_SIG_SCHEME_ECDSA_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:143
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIG_SCHEME_SM2_Unmarshal changed to #define
+//   TPMS_SIG_SCHEME_SM2_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:143
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal changed to #define
+//   TPMS_SIG_SCHEME_ECSCHNORR_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_ECDAA definition from table 2:143
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIG_SCHEME_ECDAA_Unmarshal changed to #define
+//   TPMS_SIG_SCHEME_ECDAA_Marshal changed to #define
+#endif // TPM_ALG_ECC
+#endif // TPM_ALG_ECC
+
+
+// Table 2:144 - Definition of TPMU_SIG_SCHEME Union  (UnionTable)
+TPM_RC
+TPMU_SIG_SCHEME_Unmarshal(
+    TPMU_SIG_SCHEME *target, BYTE **buffer, INT32 *size, UINT32      selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+            return TPMS_SIG_SCHEME_RSASSA_Unmarshal((TPMS_SIG_SCHEME_RSASSA *)&(target->rsassa), buffer, size);
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+            return TPMS_SIG_SCHEME_RSAPSS_Unmarshal((TPMS_SIG_SCHEME_RSAPSS *)&(target->rsapss), buffer, size);
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+            return TPMS_SIG_SCHEME_ECDSA_Unmarshal((TPMS_SIG_SCHEME_ECDSA *)&(target->ecdsa), buffer, size);
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+            return TPMS_SIG_SCHEME_SM2_Unmarshal((TPMS_SIG_SCHEME_SM2 *)&(target->sm2), buffer, size);
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+            return TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal((TPMS_SIG_SCHEME_ECSCHNORR *)&(target->ecschnorr), buffer, size);
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+            return TPMS_SIG_SCHEME_ECDAA_Unmarshal((TPMS_SIG_SCHEME_ECDAA *)&(target->ecdaa), buffer, size);
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+            return TPMS_SCHEME_HMAC_Unmarshal((TPMS_SCHEME_HMAC *)&(target->hmac), buffer, size);
+#endif // TPM_ALG_HMAC
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+//     TPMU_SIG_SCHEME_Marshal not referenced
+
+
+// Table 2:145 - Definition of TPMT_SIG_SCHEME Structure (StructureTable)
+TPM_RC
+TPMT_SIG_SCHEME_Unmarshal(
+    TPMT_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_SIG_SCHEME_Unmarshal((TPMI_ALG_SIG_SCHEME *)&(target->scheme), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SIG_SCHEME_Unmarshal((TPMU_SIG_SCHEME *)&(target->details), buffer, size, (UINT32)target->scheme);
+    return result;
+}
+
+//     TPMT_SIG_SCHEME_Marshal not referenced
+
+
+// Table 2:146 - Definition of Types for Encryption Schemes (TypesTable)
+#ifdef    TPM_ALG_RSA
+//   TPMS_SCHEME_HASH definition from table 2:146
+#ifdef    TPM_ALG_RSA
+//   TPMS_ENC_SCHEME_OAEP_Unmarshal changed to #define
+//   TPMS_ENC_SCHEME_OAEP_Marshal changed to #define
+#endif // TPM_ALG_RSA
+//   TPMS_EMPTY definition from table 2:146
+#ifdef    TPM_ALG_RSA
+//   TPMS_ENC_SCHEME_RSAES_Unmarshal changed to #define
+//   TPMS_ENC_SCHEME_RSAES_Marshal changed to #define
+#endif // TPM_ALG_RSA
+#endif // TPM_ALG_RSA
+
+
+// Table 2:147 - Definition of Types for ECC Key Exchange (TypesTable)
+#ifdef    TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:147
+#ifdef    TPM_ALG_ECC
+//   TPMS_KEY_SCHEME_ECDH_Unmarshal changed to #define
+//   TPMS_KEY_SCHEME_ECDH_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SCHEME_HASH definition from table 2:147
+#ifdef    TPM_ALG_ECC
+//   TPMS_KEY_SCHEME_ECMQV_Unmarshal changed to #define
+//   TPMS_KEY_SCHEME_ECMQV_Marshal changed to #define
+#endif // TPM_ALG_ECC
+#endif // TPM_ALG_ECC
+
+
+// Table 2:148 - Definition of Types for KDF Schemes (TypesTable)
+//   TPMS_SCHEME_HASH definition from table 2:148
+//   TPMS_SCHEME_MGF1_Unmarshal changed to #define
+//   TPMS_SCHEME_MGF1_Marshal changed to #define
+//   TPMS_SCHEME_HASH definition from table 2:148
+//   TPMS_SCHEME_KDF1_SP800_56A_Unmarshal changed to #define
+//   TPMS_SCHEME_KDF1_SP800_56A_Marshal changed to #define
+//   TPMS_SCHEME_HASH definition from table 2:148
+//   TPMS_SCHEME_KDF2_Unmarshal changed to #define
+//   TPMS_SCHEME_KDF2_Marshal changed to #define
+//   TPMS_SCHEME_HASH definition from table 2:148
+//   TPMS_SCHEME_KDF1_SP800_108_Unmarshal changed to #define
+//   TPMS_SCHEME_KDF1_SP800_108_Marshal changed to #define
+
+
+// Table 2:149 - Definition of TPMU_KDF_SCHEME Union  (UnionTable)
+TPM_RC
+TPMU_KDF_SCHEME_Unmarshal(
+    TPMU_KDF_SCHEME *target, BYTE **buffer, INT32 *size, UINT32      selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_MGF1
+        case TPM_ALG_MGF1:
+            return TPMS_SCHEME_MGF1_Unmarshal((TPMS_SCHEME_MGF1 *)&(target->mgf1), buffer, size);
+#endif // TPM_ALG_MGF1
+#ifdef    TPM_ALG_KDF1_SP800_56A
+        case TPM_ALG_KDF1_SP800_56A:
+            return TPMS_SCHEME_KDF1_SP800_56A_Unmarshal((TPMS_SCHEME_KDF1_SP800_56A *)&(target->kdf1_sp800_56a), buffer, size);
+#endif // TPM_ALG_KDF1_SP800_56A
+#ifdef    TPM_ALG_KDF2
+        case TPM_ALG_KDF2:
+            return TPMS_SCHEME_KDF2_Unmarshal((TPMS_SCHEME_KDF2 *)&(target->kdf2), buffer, size);
+#endif // TPM_ALG_KDF2
+#ifdef    TPM_ALG_KDF1_SP800_108
+        case TPM_ALG_KDF1_SP800_108:
+            return TPMS_SCHEME_KDF1_SP800_108_Unmarshal((TPMS_SCHEME_KDF1_SP800_108 *)&(target->kdf1_sp800_108), buffer, size);
+#endif // TPM_ALG_KDF1_SP800_108
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_KDF_SCHEME_Marshal(
+    TPMU_KDF_SCHEME *source, BYTE **buffer, INT32 *size, UINT32      selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_MGF1
+        case TPM_ALG_MGF1:
+            return TPMS_SCHEME_MGF1_Marshal((TPMS_SCHEME_MGF1 *)&(source->mgf1), buffer, size);
+#endif // TPM_ALG_MGF1
+#ifdef    TPM_ALG_KDF1_SP800_56A
+        case TPM_ALG_KDF1_SP800_56A:
+            return TPMS_SCHEME_KDF1_SP800_56A_Marshal((TPMS_SCHEME_KDF1_SP800_56A *)&(source->kdf1_sp800_56a), buffer, size);
+#endif // TPM_ALG_KDF1_SP800_56A
+#ifdef    TPM_ALG_KDF2
+        case TPM_ALG_KDF2:
+            return TPMS_SCHEME_KDF2_Marshal((TPMS_SCHEME_KDF2 *)&(source->kdf2), buffer, size);
+#endif // TPM_ALG_KDF2
+#ifdef    TPM_ALG_KDF1_SP800_108
+        case TPM_ALG_KDF1_SP800_108:
+            return TPMS_SCHEME_KDF1_SP800_108_Marshal((TPMS_SCHEME_KDF1_SP800_108 *)&(source->kdf1_sp800_108), buffer, size);
+#endif // TPM_ALG_KDF1_SP800_108
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:150 - Definition of TPMT_KDF_SCHEME Structure (StructureTable)
+TPM_RC
+TPMT_KDF_SCHEME_Unmarshal(
+    TPMT_KDF_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_KDF_Unmarshal((TPMI_ALG_KDF *)&(target->scheme), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_KDF_SCHEME_Unmarshal((TPMU_KDF_SCHEME *)&(target->details), buffer, size, (UINT32)target->scheme);
+    return result;
+}
+
+UINT16
+TPMT_KDF_SCHEME_Marshal(
+    TPMT_KDF_SCHEME *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_KDF_Marshal((TPMI_ALG_KDF *)&(source->scheme), buffer, size));
+    result = (UINT16)(result + TPMU_KDF_SCHEME_Marshal((TPMU_KDF_SCHEME *)&(source->details), buffer, size, (UINT32)source->scheme));
+    return result;
+}
+
+
+// Table 2:151 - Definition of TPMI_ALG_ASYM_SCHEME Type  (TypeTable)
+//     TPMI_ALG_ASYM_SCHEME_Unmarshal not referenced
+//     TPMI_ALG_ASYM_SCHEME_Marshal not referenced
+
+
+// Table 2:152 - Definition of TPMU_ASYM_SCHEME Union (UnionTable)
+TPM_RC
+TPMU_ASYM_SCHEME_Unmarshal(
+    TPMU_ASYM_SCHEME *target, BYTE **buffer, INT32 *size, UINT32     selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_ECDH
+        case TPM_ALG_ECDH:
+            return TPMS_KEY_SCHEME_ECDH_Unmarshal((TPMS_KEY_SCHEME_ECDH *)&(target->ecdh), buffer, size);
+#endif // TPM_ALG_ECDH
+#ifdef    TPM_ALG_ECMQV
+        case TPM_ALG_ECMQV:
+            return TPMS_KEY_SCHEME_ECMQV_Unmarshal((TPMS_KEY_SCHEME_ECMQV *)&(target->ecmqv), buffer, size);
+#endif // TPM_ALG_ECMQV
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+            return TPMS_SIG_SCHEME_RSASSA_Unmarshal((TPMS_SIG_SCHEME_RSASSA *)&(target->rsassa), buffer, size);
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+            return TPMS_SIG_SCHEME_RSAPSS_Unmarshal((TPMS_SIG_SCHEME_RSAPSS *)&(target->rsapss), buffer, size);
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+            return TPMS_SIG_SCHEME_ECDSA_Unmarshal((TPMS_SIG_SCHEME_ECDSA *)&(target->ecdsa), buffer, size);
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+            return TPMS_SIG_SCHEME_SM2_Unmarshal((TPMS_SIG_SCHEME_SM2 *)&(target->sm2), buffer, size);
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+            return TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal((TPMS_SIG_SCHEME_ECSCHNORR *)&(target->ecschnorr), buffer, size);
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+            return TPMS_SIG_SCHEME_ECDAA_Unmarshal((TPMS_SIG_SCHEME_ECDAA *)&(target->ecdaa), buffer, size);
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_OAEP
+        case TPM_ALG_OAEP:
+            return TPMS_ENC_SCHEME_OAEP_Unmarshal((TPMS_ENC_SCHEME_OAEP *)&(target->oaep), buffer, size);
+#endif // TPM_ALG_OAEP
+#ifdef    TPM_ALG_RSAES
+        case TPM_ALG_RSAES:
+            return TPMS_ENC_SCHEME_RSAES_Unmarshal((TPMS_ENC_SCHEME_RSAES *)&(target->rsaes), buffer, size);
+#endif // TPM_ALG_RSAES
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_ASYM_SCHEME_Marshal(
+    TPMU_ASYM_SCHEME *source, BYTE **buffer, INT32 *size, UINT32     selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_ECDH
+        case TPM_ALG_ECDH:
+            return TPMS_KEY_SCHEME_ECDH_Marshal((TPMS_KEY_SCHEME_ECDH *)&(source->ecdh), buffer, size);
+#endif // TPM_ALG_ECDH
+#ifdef    TPM_ALG_ECMQV
+        case TPM_ALG_ECMQV:
+            return TPMS_KEY_SCHEME_ECMQV_Marshal((TPMS_KEY_SCHEME_ECMQV *)&(source->ecmqv), buffer, size);
+#endif // TPM_ALG_ECMQV
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+            return TPMS_SIG_SCHEME_RSASSA_Marshal((TPMS_SIG_SCHEME_RSASSA *)&(source->rsassa), buffer, size);
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+            return TPMS_SIG_SCHEME_RSAPSS_Marshal((TPMS_SIG_SCHEME_RSAPSS *)&(source->rsapss), buffer, size);
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+            return TPMS_SIG_SCHEME_ECDSA_Marshal((TPMS_SIG_SCHEME_ECDSA *)&(source->ecdsa), buffer, size);
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+            return TPMS_SIG_SCHEME_SM2_Marshal((TPMS_SIG_SCHEME_SM2 *)&(source->sm2), buffer, size);
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+            return TPMS_SIG_SCHEME_ECSCHNORR_Marshal((TPMS_SIG_SCHEME_ECSCHNORR *)&(source->ecschnorr), buffer, size);
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+            return TPMS_SIG_SCHEME_ECDAA_Marshal((TPMS_SIG_SCHEME_ECDAA *)&(source->ecdaa), buffer, size);
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_OAEP
+        case TPM_ALG_OAEP:
+            return TPMS_ENC_SCHEME_OAEP_Marshal((TPMS_ENC_SCHEME_OAEP *)&(source->oaep), buffer, size);
+#endif // TPM_ALG_OAEP
+#ifdef    TPM_ALG_RSAES
+        case TPM_ALG_RSAES:
+            return TPMS_ENC_SCHEME_RSAES_Marshal((TPMS_ENC_SCHEME_RSAES *)&(source->rsaes), buffer, size);
+#endif // TPM_ALG_RSAES
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:153 - Definition of TPMT_ASYM_SCHEME Structure  (StructureTable)
+//     TPMT_ASYM_SCHEME_Unmarshal not referenced
+//     TPMT_ASYM_SCHEME_Marshal not referenced
+
+
+// Table 2:154 - Definition of TPMI_ALG_RSA_SCHEME Type (TypeTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMI_ALG_RSA_SCHEME_Unmarshal(
+    TPMI_ALG_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_OAEP
+        case TPM_ALG_OAEP:
+#endif // TPM_ALG_OAEP
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_RSAES
+        case TPM_ALG_RSAES:
+#endif // TPM_ALG_RSAES
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_VALUE;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_RSA_SCHEME_Marshal changed to #define
+#endif // TPM_ALG_RSA
+
+
+// Table 2:155 - Definition of TPMT_RSA_SCHEME Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMT_RSA_SCHEME_Unmarshal(
+    TPMT_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_RSA_SCHEME_Unmarshal((TPMI_ALG_RSA_SCHEME *)&(target->scheme), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_ASYM_SCHEME_Unmarshal((TPMU_ASYM_SCHEME *)&(target->details), buffer, size, (UINT32)target->scheme);
+    return result;
+}
+
+UINT16
+TPMT_RSA_SCHEME_Marshal(
+    TPMT_RSA_SCHEME *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_RSA_SCHEME_Marshal((TPMI_ALG_RSA_SCHEME *)&(source->scheme), buffer, size));
+    result = (UINT16)(result + TPMU_ASYM_SCHEME_Marshal((TPMU_ASYM_SCHEME *)&(source->details), buffer, size, (UINT32)source->scheme));
+    return result;
+}
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:156 - Definition of TPMI_ALG_RSA_DECRYPT Type (TypeTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMI_ALG_RSA_DECRYPT_Unmarshal(
+    TPMI_ALG_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_OAEP
+        case TPM_ALG_OAEP:
+#endif // TPM_ALG_OAEP
+#ifdef    TPM_ALG_RSAES
+        case TPM_ALG_RSAES:
+#endif // TPM_ALG_RSAES
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_VALUE;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//     TPMI_ALG_RSA_DECRYPT_Marshal not referenced
+#endif // TPM_ALG_RSA
+
+
+// Table 2:157 - Definition of TPMT_RSA_DECRYPT Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMT_RSA_DECRYPT_Unmarshal(
+    TPMT_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_RSA_DECRYPT_Unmarshal((TPMI_ALG_RSA_DECRYPT *)&(target->scheme), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_ASYM_SCHEME_Unmarshal((TPMU_ASYM_SCHEME *)&(target->details), buffer, size, (UINT32)target->scheme);
+    return result;
+}
+
+//     TPMT_RSA_DECRYPT_Marshal not referenced
+#endif // TPM_ALG_RSA
+
+
+// Table 2:158 - Definition of TPM2B_PUBLIC_KEY_RSA Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPM2B_PUBLIC_KEY_RSA_Unmarshal(
+    TPM2B_PUBLIC_KEY_RSA *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_RSA_KEY_BYTES)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_PUBLIC_KEY_RSA_Marshal(
+    TPM2B_PUBLIC_KEY_RSA *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:159 - Definition of TPMI_RSA_KEY_BITS Type (TypeTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMI_RSA_KEY_BITS_Unmarshal(
+    TPMI_RSA_KEY_BITS *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_KEY_BITS_Unmarshal((TPM_KEY_BITS *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case 1024:
+        case 2048:
+            break;
+        default:
+            return TPM_RC_VALUE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_RSA_KEY_BITS_Marshal changed to #define
+#endif // TPM_ALG_RSA
+
+
+// Table 2:160 - Definition of TPM2B_PRIVATE_KEY_RSA Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPM2B_PRIVATE_KEY_RSA_Unmarshal(
+    TPM2B_PRIVATE_KEY_RSA *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_RSA_KEY_BYTES/2)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_PRIVATE_KEY_RSA_Marshal(
+    TPM2B_PRIVATE_KEY_RSA *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:161 - Definition of TPM2B_ECC_PARAMETER Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPM2B_ECC_PARAMETER_Unmarshal(
+    TPM2B_ECC_PARAMETER *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > MAX_ECC_KEY_BYTES)
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_ECC_PARAMETER_Marshal(
+    TPM2B_ECC_PARAMETER *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:162 - Definition of TPMS_ECC_POINT Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_ECC_POINT_Unmarshal(
+    TPMS_ECC_POINT *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPM2B_ECC_PARAMETER_Unmarshal((TPM2B_ECC_PARAMETER *)&(target->x), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_ECC_PARAMETER_Unmarshal((TPM2B_ECC_PARAMETER *)&(target->y), buffer, size);
+    return result;
+}
+
+UINT16
+TPMS_ECC_POINT_Marshal(
+    TPMS_ECC_POINT *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->x), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->y), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:163 - Definition of TPM2B_ECC_POINT Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPM2B_ECC_POINT_Unmarshal(
+    TPM2B_ECC_POINT *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    INT32    startSize;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size is zero, then the required structure is missing
+    if(target->t.size == 0)
+        return TPM_RC_SIZE;
+    startSize = *size;
+    result = TPMS_ECC_POINT_Unmarshal((TPMS_ECC_POINT *)&(target->t.point), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(target->t.size != (startSize - *size)) return TPM_RC_SIZE;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPM2B_ECC_POINT_Marshal(
+    TPM2B_ECC_POINT *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    BYTE      *sizeField = *buffer;
+    // Advance buffer pointer by cononical size of a UINT16
+    *buffer += 2;
+    // Marshal the structure
+    result = (UINT16)(result + TPMS_ECC_POINT_Marshal((TPMS_ECC_POINT *)&(source->t.point), buffer, size));
+    // Marshal the size
+    result = (UINT16)(result + UINT16_Marshal(&result, &sizeField, size));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:164 - Definition of TPMI_ALG_ECC_SCHEME Type (TypeTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMI_ALG_ECC_SCHEME_Unmarshal(
+    TPMI_ALG_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_ECDH
+        case TPM_ALG_ECDH:
+#endif // TPM_ALG_ECDH
+#ifdef    TPM_ALG_ECMQV
+        case TPM_ALG_ECMQV:
+#endif // TPM_ALG_ECMQV
+            break;
+        case TPM_ALG_NULL:
+        if (flag)
+            break;
+        return TPM_RC_SCHEME;
+        default:
+            return TPM_RC_SCHEME;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_ECC_SCHEME_Marshal changed to #define
+#endif // TPM_ALG_ECC
+
+
+// Table 2:165 - Definition of TPMI_ECC_CURVE Type (TypeTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMI_ECC_CURVE_Unmarshal(
+    TPMI_ECC_CURVE *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ECC_CURVE_Unmarshal((TPM_ECC_CURVE *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+        case TPM_ECC_BN_P256:
+        case TPM_ECC_NIST_P256:
+#if defined ME11_SIM
+#elif defined INTEL_SMX
+               case TPM_ECC_SM2_P256:
+#else
+        case TPM_ECC_NIST_P384:
+#endif
+            break;
+        default:
+            return TPM_RC_CURVE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ECC_CURVE_Marshal changed to #define
+#endif // TPM_ALG_ECC
+
+
+// Table 2:166 - Definition of TPMT_ECC_SCHEME Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMT_ECC_SCHEME_Unmarshal(
+    TPMT_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_ECC_SCHEME_Unmarshal((TPMI_ALG_ECC_SCHEME *)&(target->scheme), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_ASYM_SCHEME_Unmarshal((TPMU_ASYM_SCHEME *)&(target->details), buffer, size, (UINT32)target->scheme);
+    return result;
+}
+
+UINT16
+TPMT_ECC_SCHEME_Marshal(
+    TPMT_ECC_SCHEME *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_ECC_SCHEME_Marshal((TPMI_ALG_ECC_SCHEME *)&(source->scheme), buffer, size));
+    result = (UINT16)(result + TPMU_ASYM_SCHEME_Marshal((TPMU_ASYM_SCHEME *)&(source->details), buffer, size, (UINT32)source->scheme));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:167 - Definition of TPMS_ALGORITHM_DETAIL_ECC Structure  (StructureTable)
+#ifdef    TPM_ALG_ECC
+//     TPMS_ALGORITHM_DETAIL_ECC_Unmarshal not referenced
+UINT16
+TPMS_ALGORITHM_DETAIL_ECC_Marshal(
+    TPMS_ALGORITHM_DETAIL_ECC *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPM_ECC_CURVE_Marshal((TPM_ECC_CURVE *)&(source->curveID), buffer, size));
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->keySize), buffer, size));
+    result = (UINT16)(result + TPMT_KDF_SCHEME_Marshal((TPMT_KDF_SCHEME *)&(source->kdf), buffer, size));
+    result = (UINT16)(result + TPMT_ECC_SCHEME_Marshal((TPMT_ECC_SCHEME *)&(source->sign), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->p), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->a), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->b), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->gX), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->gY), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->n), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->h), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:168 - Definition of TPMS_SIGNATURE_RSA Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMS_SIGNATURE_RSA_Unmarshal(
+    TPMS_SIGNATURE_RSA *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->hash), buffer, size, 0);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_PUBLIC_KEY_RSA_Unmarshal((TPM2B_PUBLIC_KEY_RSA *)&(target->sig), buffer, size);
+    return result;
+}
+
+UINT16
+TPMS_SIGNATURE_RSA_Marshal(
+    TPMS_SIGNATURE_RSA *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->hash), buffer, size));
+    result = (UINT16)(result + TPM2B_PUBLIC_KEY_RSA_Marshal((TPM2B_PUBLIC_KEY_RSA *)&(source->sig), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:169 - Definition of Types for Signature  (TypesTable)
+#ifdef    TPM_ALG_RSA
+//   TPMS_SIGNATURE_RSA definition from table 2:169
+#ifdef    TPM_ALG_RSA
+//   TPMS_SIGNATURE_RSASSA_Unmarshal changed to #define
+//   TPMS_SIGNATURE_RSASSA_Marshal changed to #define
+#endif // TPM_ALG_RSA
+//   TPMS_SIGNATURE_RSA definition from table 2:169
+#ifdef    TPM_ALG_RSA
+//   TPMS_SIGNATURE_RSAPSS_Unmarshal changed to #define
+//   TPMS_SIGNATURE_RSAPSS_Marshal changed to #define
+#endif // TPM_ALG_RSA
+#endif // TPM_ALG_RSA
+
+
+// Table 2:170 - Definition of TPMS_SIGNATURE_ECC Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_SIGNATURE_ECC_Unmarshal(
+    TPMS_SIGNATURE_ECC *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->hash), buffer, size, 0);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_ECC_PARAMETER_Unmarshal((TPM2B_ECC_PARAMETER *)&(target->signatureR), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_ECC_PARAMETER_Unmarshal((TPM2B_ECC_PARAMETER *)&(target->signatureS), buffer, size);
+    return result;
+}
+
+UINT16
+TPMS_SIGNATURE_ECC_Marshal(
+    TPMS_SIGNATURE_ECC *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->hash), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->signatureR), buffer, size));
+    result = (UINT16)(result + TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->signatureS), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:171 - Definition of Types for TPMS_SIGNATUE_ECC (TypesTable)
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECDSA_Unmarshal changed to #define
+//   TPMS_SIGNATURE_ECDSA_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIGNATURE_SM2_Unmarshal changed to #define
+//   TPMS_SIGNATURE_SM2_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECSCHNORR_Unmarshal changed to #define
+//   TPMS_SIGNATURE_ECSCHNORR_Marshal changed to #define
+#endif // TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECC definition from table 2:171
+#ifdef    TPM_ALG_ECC
+//   TPMS_SIGNATURE_ECDAA_Unmarshal changed to #define
+//   TPMS_SIGNATURE_ECDAA_Marshal changed to #define
+#endif // TPM_ALG_ECC
+#endif // TPM_ALG_ECC
+
+
+// Table 2:172 - Definition of TPMU_SIGNATURE Union  (UnionTable)
+TPM_RC
+TPMU_SIGNATURE_Unmarshal(
+    TPMU_SIGNATURE *target, BYTE **buffer, INT32 *size, UINT32   selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+            return TPMS_SIGNATURE_RSASSA_Unmarshal((TPMS_SIGNATURE_RSASSA *)&(target->rsassa), buffer, size);
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+            return TPMS_SIGNATURE_RSAPSS_Unmarshal((TPMS_SIGNATURE_RSAPSS *)&(target->rsapss), buffer, size);
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+            return TPMS_SIGNATURE_ECDSA_Unmarshal((TPMS_SIGNATURE_ECDSA *)&(target->ecdsa), buffer, size);
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+            return TPMS_SIGNATURE_SM2_Unmarshal((TPMS_SIGNATURE_SM2 *)&(target->sm2), buffer, size);
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+            return TPMS_SIGNATURE_ECSCHNORR_Unmarshal((TPMS_SIGNATURE_ECSCHNORR *)&(target->ecschnorr), buffer, size);
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+            return TPMS_SIGNATURE_ECDAA_Unmarshal((TPMS_SIGNATURE_ECDAA *)&(target->ecdaa), buffer, size);
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+            return TPMT_HA_Unmarshal((TPMT_HA *)&(target->hmac), buffer, size, 0);
+#endif // TPM_ALG_HMAC
+        case TPM_ALG_NULL:
+            return TPM_RC_SUCCESS;
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_SIGNATURE_Marshal(
+    TPMU_SIGNATURE *source, BYTE **buffer, INT32 *size, UINT32   selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_RSASSA
+        case TPM_ALG_RSASSA:
+            return TPMS_SIGNATURE_RSASSA_Marshal((TPMS_SIGNATURE_RSASSA *)&(source->rsassa), buffer, size);
+#endif // TPM_ALG_RSASSA
+#ifdef    TPM_ALG_RSAPSS
+        case TPM_ALG_RSAPSS:
+            return TPMS_SIGNATURE_RSAPSS_Marshal((TPMS_SIGNATURE_RSAPSS *)&(source->rsapss), buffer, size);
+#endif // TPM_ALG_RSAPSS
+#ifdef    TPM_ALG_ECDSA
+        case TPM_ALG_ECDSA:
+            return TPMS_SIGNATURE_ECDSA_Marshal((TPMS_SIGNATURE_ECDSA *)&(source->ecdsa), buffer, size);
+#endif // TPM_ALG_ECDSA
+#ifdef    TPM_ALG_SM2
+        case TPM_ALG_SM2:
+            return TPMS_SIGNATURE_SM2_Marshal((TPMS_SIGNATURE_SM2 *)&(source->sm2), buffer, size);
+#endif // TPM_ALG_SM2
+#ifdef    TPM_ALG_ECSCHNORR
+        case TPM_ALG_ECSCHNORR:
+            return TPMS_SIGNATURE_ECSCHNORR_Marshal((TPMS_SIGNATURE_ECSCHNORR *)&(source->ecschnorr), buffer, size);
+#endif // TPM_ALG_ECSCHNORR
+#ifdef    TPM_ALG_ECDAA
+        case TPM_ALG_ECDAA:
+            return TPMS_SIGNATURE_ECDAA_Marshal((TPMS_SIGNATURE_ECDAA *)&(source->ecdaa), buffer, size);
+#endif // TPM_ALG_ECDAA
+#ifdef    TPM_ALG_HMAC
+        case TPM_ALG_HMAC:
+            return TPMT_HA_Marshal((TPMT_HA *)&(source->hmac), buffer, size);
+#endif // TPM_ALG_HMAC
+        case TPM_ALG_NULL:
+            return 0;
+    }
+    return 0;
+}
+
+
+// Table 2:173 - Definition of TPMT_SIGNATURE Structure (StructureTable)
+TPM_RC
+TPMT_SIGNATURE_Unmarshal(
+    TPMT_SIGNATURE *target, BYTE **buffer, INT32 *size, BOOL     flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_SIG_SCHEME_Unmarshal((TPMI_ALG_SIG_SCHEME *)&(target->sigAlg), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SIGNATURE_Unmarshal((TPMU_SIGNATURE *)&(target->signature), buffer, size, (UINT32)target->sigAlg);
+    return result;
+}
+
+UINT16
+TPMT_SIGNATURE_Marshal(
+    TPMT_SIGNATURE *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_SIG_SCHEME_Marshal((TPMI_ALG_SIG_SCHEME *)&(source->sigAlg), buffer, size));
+    result = (UINT16)(result + TPMU_SIGNATURE_Marshal((TPMU_SIGNATURE *)&(source->signature), buffer, size, (UINT32)source->sigAlg));
+    return result;
+}
+
+
+// Table 2:174 - Definition of TPMU_ENCRYPTED_SECRET Union  (UnionTable)
+//     TPMU_ENCRYPTED_SECRET_Unmarshal not referenced
+//     TPMU_ENCRYPTED_SECRET_Marshal not referenced
+
+
+// Table 2:175 - Definition of TPM2B_ENCRYPTED_SECRET Structure (StructureTable)
+TPM_RC
+TPM2B_ENCRYPTED_SECRET_Unmarshal(
+    TPM2B_ENCRYPTED_SECRET *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(TPMU_ENCRYPTED_SECRET))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.secret), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_ENCRYPTED_SECRET_Marshal(
+    TPM2B_ENCRYPTED_SECRET *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.secret), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:176 - Definition of TPMI_ALG_PUBLIC Type (TypeTable)
+TPM_RC
+TPMI_ALG_PUBLIC_Unmarshal(
+    TPMI_ALG_PUBLIC *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = TPM_ALG_ID_Unmarshal((TPM_ALG_ID *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    switch (*target) {
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+#endif // TPM_ALG_SYMCIPHER
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+#endif // TPM_ALG_ECC
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+#endif // TPM_ALG_KEYEDHASH
+            break;
+        default:
+            return TPM_RC_TYPE;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMI_ALG_PUBLIC_Marshal changed to #define
+
+
+// Table 2:177 - Definition of TPMU_PUBLIC_ID Union  (UnionTable)
+TPM_RC
+TPMU_PUBLIC_ID_Unmarshal(
+    TPMU_PUBLIC_ID *target, BYTE **buffer, INT32 *size, UINT32   selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+            return TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->keyedHash), buffer, size);
+#endif // TPM_ALG_KEYEDHASH
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+            return TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->sym), buffer, size);
+#endif // TPM_ALG_SYMCIPHER
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+            return TPM2B_PUBLIC_KEY_RSA_Unmarshal((TPM2B_PUBLIC_KEY_RSA *)&(target->rsa), buffer, size);
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+            return TPMS_ECC_POINT_Unmarshal((TPMS_ECC_POINT *)&(target->ecc), buffer, size);
+#endif // TPM_ALG_ECC
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_PUBLIC_ID_Marshal(
+    TPMU_PUBLIC_ID *source, BYTE **buffer, INT32 *size, UINT32   selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+            return TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->keyedHash), buffer, size);
+#endif // TPM_ALG_KEYEDHASH
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+            return TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->sym), buffer, size);
+#endif // TPM_ALG_SYMCIPHER
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+            return TPM2B_PUBLIC_KEY_RSA_Marshal((TPM2B_PUBLIC_KEY_RSA *)&(source->rsa), buffer, size);
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+            return TPMS_ECC_POINT_Marshal((TPMS_ECC_POINT *)&(source->ecc), buffer, size);
+#endif // TPM_ALG_ECC
+    }
+    return 0;
+}
+
+
+// Table 2:178 - Definition of TPMS_KEYEDHASH_PARMS Structure (StructureTable)
+//   TPMS_KEYEDHASH_PARMS_Unmarshal changed to #define
+//   TPMS_KEYEDHASH_PARMS_Marshal changed to #define
+
+
+// Table 2:179 - Definition of TPMS_ASYM_PARMS Structure  (StructureTable)
+//     TPMS_ASYM_PARMS_Unmarshal not referenced
+//     TPMS_ASYM_PARMS_Marshal not referenced
+
+
+// Table 2:180 - Definition of TPMS_RSA_PARMS Structure (StructureTable)
+#ifdef    TPM_ALG_RSA
+TPM_RC
+TPMS_RSA_PARMS_Unmarshal(
+    TPMS_RSA_PARMS *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMT_SYM_DEF_OBJECT_Unmarshal((TPMT_SYM_DEF_OBJECT *)&(target->symmetric), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMT_RSA_SCHEME_Unmarshal((TPMT_RSA_SCHEME *)&(target->scheme), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_RSA_KEY_BITS_Unmarshal((TPMI_RSA_KEY_BITS *)&(target->keyBits), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = UINT32_Unmarshal((UINT32 *)&(target->exponent), buffer, size);
+    return result;
+}
+
+UINT16
+TPMS_RSA_PARMS_Marshal(
+    TPMS_RSA_PARMS *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMT_SYM_DEF_OBJECT_Marshal((TPMT_SYM_DEF_OBJECT *)&(source->symmetric), buffer, size));
+    result = (UINT16)(result + TPMT_RSA_SCHEME_Marshal((TPMT_RSA_SCHEME *)&(source->scheme), buffer, size));
+    result = (UINT16)(result + TPMI_RSA_KEY_BITS_Marshal((TPMI_RSA_KEY_BITS *)&(source->keyBits), buffer, size));
+    result = (UINT16)(result + UINT32_Marshal((UINT32 *)&(source->exponent), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_RSA
+
+
+// Table 2:181 - Definition of TPMS_ECC_PARMS Structure (StructureTable)
+#ifdef    TPM_ALG_ECC
+TPM_RC
+TPMS_ECC_PARMS_Unmarshal(
+    TPMS_ECC_PARMS *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMT_SYM_DEF_OBJECT_Unmarshal((TPMT_SYM_DEF_OBJECT *)&(target->symmetric), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMT_ECC_SCHEME_Unmarshal((TPMT_ECC_SCHEME *)&(target->scheme), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_ECC_CURVE_Unmarshal((TPMI_ECC_CURVE *)&(target->curveID), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMT_KDF_SCHEME_Unmarshal((TPMT_KDF_SCHEME *)&(target->kdf), buffer, size, 1);
+    return result;
+}
+
+UINT16
+TPMS_ECC_PARMS_Marshal(
+    TPMS_ECC_PARMS *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMT_SYM_DEF_OBJECT_Marshal((TPMT_SYM_DEF_OBJECT *)&(source->symmetric), buffer, size));
+    result = (UINT16)(result + TPMT_ECC_SCHEME_Marshal((TPMT_ECC_SCHEME *)&(source->scheme), buffer, size));
+    result = (UINT16)(result + TPMI_ECC_CURVE_Marshal((TPMI_ECC_CURVE *)&(source->curveID), buffer, size));
+    result = (UINT16)(result + TPMT_KDF_SCHEME_Marshal((TPMT_KDF_SCHEME *)&(source->kdf), buffer, size));
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+
+
+// Table 2:182 - Definition of TPMU_PUBLIC_PARMS Union  (UnionTable)
+TPM_RC
+TPMU_PUBLIC_PARMS_Unmarshal(
+    TPMU_PUBLIC_PARMS *target, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+            return TPMS_KEYEDHASH_PARMS_Unmarshal((TPMS_KEYEDHASH_PARMS *)&(target->keyedHashDetail), buffer, size);
+#endif // TPM_ALG_KEYEDHASH
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+            return TPMS_SYMCIPHER_PARMS_Unmarshal((TPMS_SYMCIPHER_PARMS *)&(target->symDetail), buffer, size);
+#endif // TPM_ALG_SYMCIPHER
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+            return TPMS_RSA_PARMS_Unmarshal((TPMS_RSA_PARMS *)&(target->rsaDetail), buffer, size);
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+            return TPMS_ECC_PARMS_Unmarshal((TPMS_ECC_PARMS *)&(target->eccDetail), buffer, size);
+#endif // TPM_ALG_ECC
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_PUBLIC_PARMS_Marshal(
+    TPMU_PUBLIC_PARMS *source, BYTE **buffer, INT32 *size, UINT32    selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+            return TPMS_KEYEDHASH_PARMS_Marshal((TPMS_KEYEDHASH_PARMS *)&(source->keyedHashDetail), buffer, size);
+#endif // TPM_ALG_KEYEDHASH
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+            return TPMS_SYMCIPHER_PARMS_Marshal((TPMS_SYMCIPHER_PARMS *)&(source->symDetail), buffer, size);
+#endif // TPM_ALG_SYMCIPHER
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+            return TPMS_RSA_PARMS_Marshal((TPMS_RSA_PARMS *)&(source->rsaDetail), buffer, size);
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+            return TPMS_ECC_PARMS_Marshal((TPMS_ECC_PARMS *)&(source->eccDetail), buffer, size);
+#endif // TPM_ALG_ECC
+    }
+    return 0;
+}
+
+
+// Table 2:183 - Definition of TPMT_PUBLIC_PARMS Structure (StructureTable)
+TPM_RC
+TPMT_PUBLIC_PARMS_Unmarshal(
+    TPMT_PUBLIC_PARMS *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_PUBLIC_Unmarshal((TPMI_ALG_PUBLIC *)&(target->type), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_PUBLIC_PARMS_Unmarshal((TPMU_PUBLIC_PARMS *)&(target->parameters), buffer, size, (UINT32)target->type);
+    return result;
+}
+
+//     TPMT_PUBLIC_PARMS_Marshal not referenced
+
+
+// Table 2:184 - Definition of TPMT_PUBLIC Structure (StructureTable)
+TPM_RC
+TPMT_PUBLIC_Unmarshal(
+    TPMT_PUBLIC *target, BYTE **buffer, INT32 *size, BOOL    flag
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_PUBLIC_Unmarshal((TPMI_ALG_PUBLIC *)&(target->type), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->nameAlg), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMA_OBJECT_Unmarshal((TPMA_OBJECT *)&(target->objectAttributes), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->authPolicy), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_PUBLIC_PARMS_Unmarshal((TPMU_PUBLIC_PARMS *)&(target->parameters), buffer, size, (UINT32)target->type);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_PUBLIC_ID_Unmarshal((TPMU_PUBLIC_ID *)&(target->unique), buffer, size, (UINT32)target->type);
+    return result;
+}
+
+UINT16
+TPMT_PUBLIC_Marshal(
+    TPMT_PUBLIC *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_PUBLIC_Marshal((TPMI_ALG_PUBLIC *)&(source->type), buffer, size));
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->nameAlg), buffer, size));
+    result = (UINT16)(result + TPMA_OBJECT_Marshal((TPMA_OBJECT *)&(source->objectAttributes), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->authPolicy), buffer, size));
+    result = (UINT16)(result + TPMU_PUBLIC_PARMS_Marshal((TPMU_PUBLIC_PARMS *)&(source->parameters), buffer, size, (UINT32)source->type));
+    result = (UINT16)(result + TPMU_PUBLIC_ID_Marshal((TPMU_PUBLIC_ID *)&(source->unique), buffer, size, (UINT32)source->type));
+    return result;
+}
+
+
+// Table 2:185 - Definition of TPM2B_PUBLIC Structure (StructureTable)
+TPM_RC
+TPM2B_PUBLIC_Unmarshal(
+    TPM2B_PUBLIC *target, BYTE **buffer, INT32 *size, BOOL   flag
+    )
+{
+    TPM_RC    result;
+    INT32    startSize;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size is zero, then the required structure is missing
+    if(target->t.size == 0)
+        return TPM_RC_SIZE;
+    startSize = *size;
+    result = TPMT_PUBLIC_Unmarshal((TPMT_PUBLIC *)&(target->t.publicArea), buffer, size, flag);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(target->t.size != (startSize - *size)) return TPM_RC_SIZE;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPM2B_PUBLIC_Marshal(
+    TPM2B_PUBLIC *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    BYTE      *sizeField = *buffer;
+    // Advance buffer pointer by cononical size of a UINT16
+    *buffer += 2;
+    // Marshal the structure
+    result = (UINT16)(result + TPMT_PUBLIC_Marshal((TPMT_PUBLIC *)&(source->t.publicArea), buffer, size));
+    // Marshal the size
+    result = (UINT16)(result + UINT16_Marshal(&result, &sizeField, size));
+    return result;
+}
+
+
+// Table 2:186 - Definition of TPM2B_PRIVATE_VENDOR_SPECIFIC Structure (StructureTable)
+//     TPM2B_PRIVATE_VENDOR_SPECIFIC_Unmarshal not referenced
+//     TPM2B_PRIVATE_VENDOR_SPECIFIC_Marshal not referenced
+
+
+// Table 2:187 - Definition of TPMU_SENSITIVE_COMPOSITE Union  (UnionTable)
+TPM_RC
+TPMU_SENSITIVE_COMPOSITE_Unmarshal(
+    TPMU_SENSITIVE_COMPOSITE *target, BYTE **buffer, INT32 *size, UINT32     selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+            return TPM2B_PRIVATE_KEY_RSA_Unmarshal((TPM2B_PRIVATE_KEY_RSA *)&(target->rsa), buffer, size);
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+            return TPM2B_ECC_PARAMETER_Unmarshal((TPM2B_ECC_PARAMETER *)&(target->ecc), buffer, size);
+#endif // TPM_ALG_ECC
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+            return TPM2B_SENSITIVE_DATA_Unmarshal((TPM2B_SENSITIVE_DATA *)&(target->bits), buffer, size);
+#endif // TPM_ALG_KEYEDHASH
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+            return TPM2B_SYM_KEY_Unmarshal((TPM2B_SYM_KEY *)&(target->sym), buffer, size);
+#endif // TPM_ALG_SYMCIPHER
+    }
+    return TPM_RC_SELECTOR;
+}
+
+UINT16
+TPMU_SENSITIVE_COMPOSITE_Marshal(
+    TPMU_SENSITIVE_COMPOSITE *source, BYTE **buffer, INT32 *size, UINT32     selector
+    )
+{
+    switch(selector) {
+#ifdef    TPM_ALG_RSA
+        case TPM_ALG_RSA:
+            return TPM2B_PRIVATE_KEY_RSA_Marshal((TPM2B_PRIVATE_KEY_RSA *)&(source->rsa), buffer, size);
+#endif // TPM_ALG_RSA
+#ifdef    TPM_ALG_ECC
+        case TPM_ALG_ECC:
+            return TPM2B_ECC_PARAMETER_Marshal((TPM2B_ECC_PARAMETER *)&(source->ecc), buffer, size);
+#endif // TPM_ALG_ECC
+#ifdef    TPM_ALG_KEYEDHASH
+        case TPM_ALG_KEYEDHASH:
+            return TPM2B_SENSITIVE_DATA_Marshal((TPM2B_SENSITIVE_DATA *)&(source->bits), buffer, size);
+#endif // TPM_ALG_KEYEDHASH
+#ifdef    TPM_ALG_SYMCIPHER
+        case TPM_ALG_SYMCIPHER:
+            return TPM2B_SYM_KEY_Marshal((TPM2B_SYM_KEY *)&(source->sym), buffer, size);
+#endif // TPM_ALG_SYMCIPHER
+    }
+    return 0;
+}
+
+
+// Table 2:188 - Definition of TPMT_SENSITIVE Structure (StructureTable)
+TPM_RC
+TPMT_SENSITIVE_Unmarshal(
+    TPMT_SENSITIVE *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_ALG_PUBLIC_Unmarshal((TPMI_ALG_PUBLIC *)&(target->sensitiveType), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_AUTH_Unmarshal((TPM2B_AUTH *)&(target->authValue), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->seedValue), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMU_SENSITIVE_COMPOSITE_Unmarshal((TPMU_SENSITIVE_COMPOSITE *)&(target->sensitive), buffer, size, (UINT32)target->sensitiveType);
+    return result;
+}
+
+UINT16
+TPMT_SENSITIVE_Marshal(
+    TPMT_SENSITIVE *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_ALG_PUBLIC_Marshal((TPMI_ALG_PUBLIC *)&(source->sensitiveType), buffer, size));
+    result = (UINT16)(result + TPM2B_AUTH_Marshal((TPM2B_AUTH *)&(source->authValue), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->seedValue), buffer, size));
+    result = (UINT16)(result + TPMU_SENSITIVE_COMPOSITE_Marshal((TPMU_SENSITIVE_COMPOSITE *)&(source->sensitive), buffer, size, (UINT32)source->sensitiveType));
+    return result;
+}
+
+
+// Table 2:189 - Definition of TPM2B_SENSITIVE Structure  (StructureTable)
+TPM_RC
+TPM2B_SENSITIVE_Unmarshal(
+    TPM2B_SENSITIVE *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    INT32    startSize;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    startSize = *size;
+    result = TPMT_SENSITIVE_Unmarshal((TPMT_SENSITIVE *)&(target->t.sensitiveArea), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(target->t.size != (startSize - *size)) return TPM_RC_SIZE;
+    return TPM_RC_SUCCESS;
+}
+
+//     TPM2B_SENSITIVE_Marshal not referenced
+
+
+// Table 2:190 - Definition of _PRIVATE Structure  (StructureTable)
+//     _PRIVATE_Unmarshal not referenced
+//     _PRIVATE_Marshal not referenced
+
+
+// Table 2:191 - Definition of TPM2B_PRIVATE Structure  (StructureTable)
+TPM_RC
+TPM2B_PRIVATE_Unmarshal(
+    TPM2B_PRIVATE *target, BYTE **buffer, INT32     *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(_PRIVATE))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_PRIVATE_Marshal(
+    TPM2B_PRIVATE *source, BYTE **buffer, INT32     *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:192 - Definition of _ID_OBJECT Structure  (StructureTable)
+//     _ID_OBJECT_Unmarshal not referenced
+//     _ID_OBJECT_Marshal not referenced
+
+
+// Table 2:193 - Definition of TPM2B_ID_OBJECT Structure  (StructureTable)
+TPM_RC
+TPM2B_ID_OBJECT_Unmarshal(
+    TPM2B_ID_OBJECT *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(_ID_OBJECT))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.credential), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_ID_OBJECT_Marshal(
+    TPM2B_ID_OBJECT *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.credential), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:194 - Definition of TPM_NV_INDEX Bits  (BitsTable)
+//     TPM_NV_INDEX_Unmarshal not referenced
+//     TPM_NV_INDEX_Marshal not referenced
+
+
+// Table 2:195 - Definition of TPMA_NV Bits (BitsTable)
+TPM_RC
+TPMA_NV_Unmarshal(
+    TPMA_NV *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    result = UINT32_Unmarshal((UINT32 *)target, buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(*((UINT32 *)target) & (UINT32)0x01f00380)
+        return TPM_RC_RESERVED_BITS;
+    return TPM_RC_SUCCESS;
+}
+
+//   TPMA_NV_Marshal changed to #define
+
+
+// Table 2:196 - Definition of TPMS_NV_PUBLIC Structure (StructureTable)
+TPM_RC
+TPMS_NV_PUBLIC_Unmarshal(
+    TPMS_NV_PUBLIC *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = TPMI_RH_NV_INDEX_Unmarshal((TPMI_RH_NV_INDEX *)&(target->nvIndex), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_ALG_HASH_Unmarshal((TPMI_ALG_HASH *)&(target->nameAlg), buffer, size, 0);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMA_NV_Unmarshal((TPMA_NV *)&(target->attributes), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_DIGEST_Unmarshal((TPM2B_DIGEST *)&(target->authPolicy), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->dataSize), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if( (target->dataSize> MAX_NV_INDEX_SIZE))
+        return TPM_RC_SIZE;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPMS_NV_PUBLIC_Marshal(
+    TPMS_NV_PUBLIC *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPMI_RH_NV_INDEX_Marshal((TPMI_RH_NV_INDEX *)&(source->nvIndex), buffer, size));
+    result = (UINT16)(result + TPMI_ALG_HASH_Marshal((TPMI_ALG_HASH *)&(source->nameAlg), buffer, size));
+    result = (UINT16)(result + TPMA_NV_Marshal((TPMA_NV *)&(source->attributes), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->authPolicy), buffer, size));
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->dataSize), buffer, size));
+    return result;
+}
+
+
+// Table 2:197 - Definition of TPM2B_NV_PUBLIC Structure (StructureTable)
+TPM_RC
+TPM2B_NV_PUBLIC_Unmarshal(
+    TPM2B_NV_PUBLIC *target, BYTE **buffer, INT32   *size
+    )
+{
+    TPM_RC    result;
+    INT32    startSize;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size is zero, then the required structure is missing
+    if(target->t.size == 0)
+        return TPM_RC_SIZE;
+    startSize = *size;
+    result = TPMS_NV_PUBLIC_Unmarshal((TPMS_NV_PUBLIC *)&(target->t.nvPublic), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    if(target->t.size != (startSize - *size)) return TPM_RC_SIZE;
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPM2B_NV_PUBLIC_Marshal(
+    TPM2B_NV_PUBLIC *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    BYTE      *sizeField = *buffer;
+    // Advance buffer pointer by cononical size of a UINT16
+    *buffer += 2;
+    // Marshal the structure
+    result = (UINT16)(result + TPMS_NV_PUBLIC_Marshal((TPMS_NV_PUBLIC *)&(source->t.nvPublic), buffer, size));
+    // Marshal the size
+    result = (UINT16)(result + UINT16_Marshal(&result, &sizeField, size));
+    return result;
+}
+
+
+// Table 2:198 - Definition of TPM2B_CONTEXT_SENSITIVE Structure  (StructureTable)
+//     TPM2B_CONTEXT_SENSITIVE_Unmarshal not referenced
+//     TPM2B_CONTEXT_SENSITIVE_Marshal not referenced
+
+
+// Table 2:199 - Definition of TPMS_CONTEXT_DATA Structure  (StructureTable)
+//     TPMS_CONTEXT_DATA_Unmarshal not referenced
+//     TPMS_CONTEXT_DATA_Marshal not referenced
+
+
+// Table 2:200 - Definition of TPM2B_CONTEXT_DATA Structure  (StructureTable)
+TPM_RC
+TPM2B_CONTEXT_DATA_Unmarshal(
+    TPM2B_CONTEXT_DATA *target, BYTE **buffer, INT32    *size
+    )
+{
+    TPM_RC    result;
+    result = UINT16_Unmarshal((UINT16 *)&(target->t.size), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(target->t.size == 0)
+        return TPM_RC_SUCCESS;
+    if((target->t.size) > sizeof(TPMS_CONTEXT_DATA))
+        return TPM_RC_SIZE;
+    result = BYTE_Array_Unmarshal((BYTE *)(target->t.buffer), buffer, size, (INT32)(target->t.size));
+    return result;
+}
+
+UINT16
+TPM2B_CONTEXT_DATA_Marshal(
+    TPM2B_CONTEXT_DATA *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT16_Marshal((UINT16 *)&(source->t.size), buffer, size));
+    // if size equal to 0, the rest of the structure is a zero buffer.  Stop processing
+    if(source->t.size == 0)
+        return result;
+    result = (UINT16)(result + BYTE_Array_Marshal((BYTE *)(source->t.buffer), buffer, size, (INT32)(source->t.size)));
+    return result;
+}
+
+
+// Table 2:201 - Definition of TPMS_CONTEXT Structure (StructureTable)
+TPM_RC
+TPMS_CONTEXT_Unmarshal(
+    TPMS_CONTEXT *target, BYTE **buffer, INT32  *size
+    )
+{
+    TPM_RC    result;
+    result = UINT64_Unmarshal((UINT64 *)&(target->sequence), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_DH_CONTEXT_Unmarshal((TPMI_DH_CONTEXT *)&(target->savedHandle), buffer, size);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPMI_RH_HIERARCHY_Unmarshal((TPMI_RH_HIERARCHY *)&(target->hierarchy), buffer, size, 1);
+    if(result != TPM_RC_SUCCESS)
+        return result;
+    result = TPM2B_CONTEXT_DATA_Unmarshal((TPM2B_CONTEXT_DATA *)&(target->contextBlob), buffer, size);
+    return result;
+}
+
+UINT16
+TPMS_CONTEXT_Marshal(
+    TPMS_CONTEXT *source, BYTE **buffer, INT32  *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + UINT64_Marshal((UINT64 *)&(source->sequence), buffer, size));
+    result = (UINT16)(result + TPMI_DH_CONTEXT_Marshal((TPMI_DH_CONTEXT *)&(source->savedHandle), buffer, size));
+    result = (UINT16)(result + TPMI_RH_HIERARCHY_Marshal((TPMI_RH_HIERARCHY *)&(source->hierarchy), buffer, size));
+    result = (UINT16)(result + TPM2B_CONTEXT_DATA_Marshal((TPM2B_CONTEXT_DATA *)&(source->contextBlob), buffer, size));
+    return result;
+}
+
+
+// Table 2:203 - Definition of TPMS_CREATION_DATA Structure  (StructureTable)
+//     TPMS_CREATION_DATA_Unmarshal not referenced
+UINT16
+TPMS_CREATION_DATA_Marshal(
+    TPMS_CREATION_DATA *source, BYTE **buffer, INT32    *size
+    )
+{
+    UINT16    result = 0;
+    result = (UINT16)(result + TPML_PCR_SELECTION_Marshal((TPML_PCR_SELECTION *)&(source->pcrSelect), buffer, size));
+    result = (UINT16)(result + TPM2B_DIGEST_Marshal((TPM2B_DIGEST *)&(source->pcrDigest), buffer, size));
+    result = (UINT16)(result + TPMA_LOCALITY_Marshal((TPMA_LOCALITY *)&(source->locality), buffer, size));
+    result = (UINT16)(result + TPM_ALG_ID_Marshal((TPM_ALG_ID *)&(source->parentNameAlg), buffer, size));
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->parentName), buffer, size));
+    result = (UINT16)(result + TPM2B_NAME_Marshal((TPM2B_NAME *)&(source->parentQualifiedName), buffer, size));
+    result = (UINT16)(result + TPM2B_DATA_Marshal((TPM2B_DATA *)&(source->outsideInfo), buffer, size));
+    return result;
+}
+
+
+// Table 2:204 - Definition of TPM2B_CREATION_DATA Structure  (StructureTable)
+//     TPM2B_CREATION_DATA_Unmarshal not referenced
+UINT16
+TPM2B_CREATION_DATA_Marshal(
+    TPM2B_CREATION_DATA *source, BYTE **buffer, INT32   *size
+    )
+{
+    UINT16    result = 0;
+    BYTE      *sizeField = *buffer;
+    // Advance buffer pointer by cononical size of a UINT16
+    *buffer += 2;
+    // Marshal the structure
+    result = (UINT16)(result + TPMS_CREATION_DATA_Marshal((TPMS_CREATION_DATA *)&(source->t.creationData), buffer, size));
+    // Marshal the size
+    result = (UINT16)(result + UINT16_Marshal(&result, &sizeField, size));
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPMS_TAGGED_PROPERTY
+//     TPMS_TAGGED_PROPERTY_Array_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PROPERTY_Array_Marshal(
+    TPMS_TAGGED_PROPERTY *source, BYTE **buffer, INT32 *size, INT32      count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPMS_TAGGED_PROPERTY_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPMS_ALG_PROPERTY
+//     TPMS_ALG_PROPERTY_Array_Unmarshal not referenced
+UINT16
+TPMS_ALG_PROPERTY_Array_Marshal(
+    TPMS_ALG_PROPERTY *source, BYTE **buffer, INT32 *size, INT32     count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPMS_ALG_PROPERTY_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPMS_PCR_SELECTION
+TPM_RC
+TPMS_PCR_SELECTION_Array_Unmarshal(
+    TPMS_PCR_SELECTION *target, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    TPM_RC    result;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = TPMS_PCR_SELECTION_Unmarshal(&target[i], buffer, size);
+        if(result != TPM_RC_SUCCESS)
+            return result;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPMS_PCR_SELECTION_Array_Marshal(
+    TPMS_PCR_SELECTION *source, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPMS_PCR_SELECTION_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPMT_HA
+TPM_RC
+TPMT_HA_Array_Unmarshal(
+    TPMT_HA *target, BYTE **buffer, INT32 *size, BOOL flag, INT32    count
+    )
+{
+    TPM_RC    result;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = TPMT_HA_Unmarshal(&target[i], buffer, size, flag);
+        if(result != TPM_RC_SUCCESS)
+            return result;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPMT_HA_Array_Marshal(
+    TPMT_HA *source, BYTE **buffer, INT32 *size, INT32   count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPMT_HA_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for BYTE
+TPM_RC
+BYTE_Array_Unmarshal(
+    BYTE *target, BYTE **buffer, INT32 *size, INT32      count
+    )
+{
+    TPM_RC    result;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = BYTE_Unmarshal(&target[i], buffer, size);
+        if(result != TPM_RC_SUCCESS)
+            return result;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+BYTE_Array_Marshal(
+    BYTE *source, BYTE **buffer, INT32 *size, INT32      count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + BYTE_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPM_HANDLE
+//     TPM_HANDLE_Array_Unmarshal not referenced
+UINT16
+TPM_HANDLE_Array_Marshal(
+    TPM_HANDLE *source, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPM_HANDLE_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPMA_CC
+//     TPMA_CC_Array_Unmarshal not referenced
+UINT16
+TPMA_CC_Array_Marshal(
+    TPMA_CC *source, BYTE **buffer, INT32 *size, INT32   count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPMA_CC_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPMS_TAGGED_PCR_SELECT
+//     TPMS_TAGGED_PCR_SELECT_Array_Unmarshal not referenced
+UINT16
+TPMS_TAGGED_PCR_SELECT_Array_Marshal(
+    TPMS_TAGGED_PCR_SELECT *source, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPMS_TAGGED_PCR_SELECT_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPM_ECC_CURVE
+#ifdef    TPM_ALG_ECC
+//     TPM_ECC_CURVE_Array_Unmarshal not referenced
+UINT16
+TPM_ECC_CURVE_Array_Marshal(
+    TPM_ECC_CURVE *source, BYTE **buffer, INT32 *size, INT32     count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPM_ECC_CURVE_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+#endif // TPM_ALG_ECC
+// Array Marshal/Unmarshal for TPM2B_DIGEST
+TPM_RC
+TPM2B_DIGEST_Array_Unmarshal(
+    TPM2B_DIGEST *target, BYTE **buffer, INT32 *size, INT32      count
+    )
+{
+    TPM_RC    result;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = TPM2B_DIGEST_Unmarshal(&target[i], buffer, size);
+        if(result != TPM_RC_SUCCESS)
+            return result;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPM2B_DIGEST_Array_Marshal(
+    TPM2B_DIGEST *source, BYTE **buffer, INT32 *size, INT32      count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPM2B_DIGEST_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPM_CC
+TPM_RC
+TPM_CC_Array_Unmarshal(
+    TPM_CC *target, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    TPM_RC    result;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = TPM_CC_Unmarshal(&target[i], buffer, size);
+        if(result != TPM_RC_SUCCESS)
+            return result;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPM_CC_Array_Marshal(
+    TPM_CC *source, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPM_CC_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
+// Array Marshal/Unmarshal for TPM_ALG_ID
+TPM_RC
+TPM_ALG_ID_Array_Unmarshal(
+    TPM_ALG_ID *target, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    TPM_RC    result;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = TPM_ALG_ID_Unmarshal(&target[i], buffer, size);
+        if(result != TPM_RC_SUCCESS)
+            return result;
+    }
+    return TPM_RC_SUCCESS;
+}
+
+UINT16
+TPM_ALG_ID_Array_Marshal(
+    TPM_ALG_ID *source, BYTE **buffer, INT32 *size, INT32    count
+    )
+{
+    UINT16    result = 0;
+    INT32 i;
+    for(i = 0; i < count; i++) {
+        result = (UINT16)(result + TPM_ALG_ID_Marshal(&source[i], buffer, size));
+    }
+    return result;
+}
+
diff --git a/tpm-util/duplicate/sampleMakefile b/tpm-util/duplicate/sampleMakefile
new file mode 100644 (file)
index 0000000..5139954
--- /dev/null
@@ -0,0 +1,42 @@
+
+CC = gcc
+#CC = g++
+LD = ld
+AR = ar
+LDDFLAGS += -fPIC
+ARFLAGS = -rc
+
+TSS_DIR?=/home/pramod/tpm2-tss
+OPENSSL_DIR?=/usr/local/bin/openssl
+
+OUTPUT=ossl_tpm_duplicate
+
+OBJS=  util.o \
+        marshal.o \
+        crypto_aux.o \
+        tpm_duplication_aux.o \
+        main.o 
+
+
+CFLAGS += -g -fPIC -I./include -I${TSS_DIR}/include/ -I$(TSS_DIR)/sysapi/include #-I${OPENSSL_DIR}/include/
+
+#LDFLAGS += -L${OPENSSL_DIR}/lib -ldl -L/usr/local/lib/ -lsapi -ltcti-device -ltcti-tabrmd 
+LDFLAGS += -ldl -L/usr/local/lib/ -lsapi -ltcti-device -ltcti-tabrmd 
+
+LIBS = -lpthread -lcrypto -lssl
+
+%.o : %.c
+       $(CC) -c $(CFLAGS) $< -o $@
+       
+
+$(OUTPUT): $(OBJS)
+       $(CC) $(OBJS) $(LDFLAGS) ${LIBS} -o $(OUTPUT)
+
+.PHONY: all
+all: $(OUTPUT)
+
+install:
+       @set -e; for i in $(OUTPUT); do mv $$i ../../bin/$$i ; done
+
+clean:
+       rm -f *.o $(OUTPUT) *.so 
diff --git a/tpm-util/duplicate/tpm_duplication_aux.c b/tpm-util/duplicate/tpm_duplication_aux.c
new file mode 100644 (file)
index 0000000..2baf3ac
--- /dev/null
@@ -0,0 +1,507 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+
+#include "tpm_duplication_aux.h"
+#include "marshal.h"
+
+#define AES_SIZE 16;
+
+void print2b(char* msg, TPM2B * toprint){
+       print_buff(msg, toprint->size, toprint->buffer);
+}
+
+void TPMT_PUBLIC_TO_TPM2B(TPMT_PUBLIC *source, TPM2B_PUBLIC *target)
+{
+       BYTE buff[1024],
+               *runner = buff+2;
+       int size = 1024;
+
+       UINT16 sizeField = TPMT_PUBLIC_Marshal(source, &runner, &size);
+       runner = buff;
+       UINT16_Marshal(&sizeField, &runner, &size);
+
+
+       runner = buff;
+       size = sizeof(TPM2B_PUBLIC);
+       TPM2B_PUBLIC_Unmarshal(target, &runner, &size, 1);
+}
+
+void TPMT_SENSITIVE_TO_TPM2B(TPMT_SENSITIVE *source, TPM2B_SENSITIVE *target)
+{
+       BYTE buff[1024]={0},
+               *runner = buff+2;
+       INT32 size = 1024;
+
+       UINT16 sizeField = TPMT_SENSITIVE_Marshal(source, &runner, &size);
+       runner = buff;
+       UINT16_Marshal(&sizeField, &runner, &size);
+
+
+       runner = buff;
+       size = sizeof(TPM2B_SENSITIVE);
+       TPM2B_SENSITIVE_Unmarshal(target, &runner, &size);
+
+
+}
+
+void TPM2B_SENSITIVE_TO_TPMT(TPM2B_SENSITIVE *source, TPMT_SENSITIVE *target)
+{
+       BYTE buffer[1024], *runner = buffer;
+       int size = 1024;
+       TPMT_SENSITIVE_Marshal(&(source->t.sensitiveArea), &runner, &size);
+
+       runner = buffer;
+       size = sizeof(*target);
+
+       TPMT_SENSITIVE_Unmarshal(target, &runner, &size);
+
+}
+void TPM2B_PUBLIC_TO_TPMT(TPM2B_PUBLIC *source, TPMT_PUBLIC *target)
+{
+       BYTE buffer[1024], *runner = buffer;
+       int size = 1024;
+       TPMT_PUBLIC_Marshal(&(source->t.publicArea), &runner, &size);
+
+       runner = buffer;
+       size = sizeof(*target);
+
+       TPMT_PUBLIC_Unmarshal(target, &runner, &size, 1);
+}
+
+
+TPM2B_NAME * GetName(TPMI_ALG_HASH hashAlg, TPM2B_PUBLIC *obj, TPM2B_NAME *outName)
+{
+       int size_in =1024;
+       BYTE buff[1024] = {0};
+       BYTE* runner = buff;
+
+       UINT16 toHashSize = TPM2B_PUBLIC_Marshal(obj, &runner, &size_in) ;
+
+       runner = outName->b.buffer;
+       size_in = 2;
+       outName->b.size =  TPM_ALG_ID_Marshal(&hashAlg, &runner , &size_in) + 32;
+
+       SHA256(buff+2, toHashSize-2, runner);
+
+       return outName;
+}
+
+
+void CreateDuplicationBlob2B(
+               //IN
+               TPM2B_PUBLIC_KEY_RSA *protector,
+               TPM2B_PUBLIC * public2B,
+               TPM2B_SENSITIVE *sens2B,
+               TPM2B_ENCRYPTED_SECRET *plainSymSeed, TPMI_YES_NO generateInSymSeed,
+               TPM2B_DATA *encryptionKey, TPMI_YES_NO generateEncryptionKey,
+
+               //OUT
+               TPM2B_PRIVATE *outDuplicate,
+               TPM2B_ENCRYPTED_SECRET *encSymSeed)
+{
+       TPMT_PUBLIC publicPortion;
+       TPMT_SENSITIVE sens;
+
+       TPM2B_PUBLIC_TO_TPMT(public2B, &publicPortion);
+       TPM2B_SENSITIVE_TO_TPMT(sens2B, &sens);
+
+       CreateDuplicationBlob(protector, &publicPortion, &sens, plainSymSeed, generateInSymSeed, encryptionKey, generateEncryptionKey, outDuplicate, encSymSeed);
+
+}
+
+void CreateSwDataObject2B(
+               BYTE* auth, UINT16 authSize,
+               RSA * rsaKey,
+               BYTE * policyDigest, UINT16 policyDigestSize,
+               TPM2B_PUBLIC * outPublic2B, 
+        TPM2B_SENSITIVE *outSens2B)
+{
+
+       TPMT_PUBLIC publicPortion;
+       TPMT_SENSITIVE sens;
+
+       CreateSwDataObject(auth, authSize, rsaKey, NULL, 0, policyDigest, policyDigestSize, &publicPortion, &sens);
+
+
+       TPMT_PUBLIC_TO_TPM2B(&publicPortion, outPublic2B);
+       TPMT_SENSITIVE_TO_TPM2B(&sens, outSens2B);
+}
+
+void CreateDuplicationBlob(
+               //IN
+               TPM2B_PUBLIC_KEY_RSA *protector,
+               TPMT_PUBLIC * publicPortion,
+               TPMT_SENSITIVE *sens,
+               TPM2B_ENCRYPTED_SECRET *plainSymSeed, TPMI_YES_NO generateInSymSeed,
+               TPM2B_DATA *encryptionKey, TPMI_YES_NO generateEncryptionKey,
+
+               //OUT
+               TPM2B_PRIVATE *outDuplicate,
+               TPM2B_ENCRYPTED_SECRET *encSymSeed)
+{
+       memset((void*)outDuplicate, 0, sizeof(TPM2B_PRIVATE));
+       memset((void*)encSymSeed, 0, sizeof(TPM2B_ENCRYPTED_SECRET));
+       TPM2B_SYM_KEY outerWrapper;
+       TPM2B NULL_2B = {0};
+       TPM2B_NAME swkName = {{0}};
+
+
+       TPM2B_PUBLIC public2B = {{0}};
+       TPM2B_SENSITIVE sens2B = {{0}};
+       INT32 size_in = 0;
+
+       TPM2B_MAX_BUFFER encSensitive = {{0}};
+
+       if(generateInSymSeed)
+       {
+               RAND_bytes(plainSymSeed->b.buffer, 16);
+               plainSymSeed->b.size = 16;
+       }
+       if(generateEncryptionKey)
+       {
+               RAND_bytes(encryptionKey->b.buffer, 16);
+               encryptionKey->b.size = 16;
+       }
+
+       // Preparing marshaled publicPortion:
+       TPMT_PUBLIC_TO_TPM2B(publicPortion, &public2B);
+
+       // calculating name:
+       GetName(TPM_ALG_SHA256, &(public2B), &swkName);
+
+       // preparing marshaled sensitive:
+       TPMT_SENSITIVE_TO_TPM2B(sens, &sens2B);
+
+       //preparing encSensitive
+       {
+               UINT16 tempUint16;
+               TPM2B_SYM_KEY IV = {0};
+               IV.b.size = 16;
+               TPM2B_MAX_BUFFER innerData = {0};
+               BYTE innerIntegrity[34] = {0}, toHash[1024] = {0};
+               size_in = 1024;
+               BYTE* runner = toHash;
+
+
+               UINT16_Marshal(&(sens2B.b.size), &runner, &size_in);
+               TPMT_SENSITIVE_Marshal(sens, &runner, &size_in);
+
+               memcpy(runner, swkName.b.buffer, swkName.b.size );
+               runner += swkName.b.size;
+
+
+               SHA256(toHash, runner - toHash, innerIntegrity+2);
+               runner = innerIntegrity;
+               tempUint16 = 32;
+               UINT16_Marshal(&tempUint16, &runner, &size_in);
+
+               memcpy(innerData.b.buffer, innerIntegrity, 34);
+               runner = innerData.b.buffer + 34;
+               size_in = 1024;
+
+               UINT16_Marshal(&(sens2B.b.size), &runner, &size_in);
+               TPMT_SENSITIVE_Marshal(sens, &runner, &size_in);
+
+               innerData.b.size = sens2B.b.size + 36;
+
+               AES_128_CFB_enc_dec(&(innerData.b), &(encSensitive.b), &(encryptionKey->b), &(IV.b), NULL, 1);
+       }
+
+
+       // outer integrity
+       {
+               TPM2B_SYM_KEY IV = {{0}};
+               TPM2B_DIGEST hmacKey = {{0}};
+               TPM2B_DIGEST outerHmac = {{0}};
+               TPM2B_MAX_BUFFER dupSensitive = {{0}};
+               TPM2B_MAX_BUFFER dataToHmac = {{0}};
+               BYTE * runner = NULL;
+
+               IV.b.size = 16;
+
+               KDFa(TPM_ALG_SHA256, &(plainSymSeed->b), "STORAGE", &(swkName.b), &NULL_2B, 128 , (TPM2B_MAX_BUFFER*) &outerWrapper);
+
+               AES_128_CFB_enc_dec(&(encSensitive.b), &(dupSensitive.b), &(outerWrapper.b), &(IV.b), NULL, 1);
+
+               KDFa(TPM_ALG_SHA256,  &(plainSymSeed->b), "INTEGRITY", &NULL_2B, &NULL_2B, 32*8,(TPM2B_MAX_BUFFER*) &(hmacKey.b));
+
+               memcpy(dataToHmac.b.buffer, dupSensitive.b.buffer, dupSensitive.b.size);
+               memcpy(dataToHmac.b.buffer + dupSensitive.b.size, swkName.b.buffer, swkName.b.size);
+               dataToHmac.b.size = dupSensitive.b.size + swkName.b.size;
+
+
+               HMAC(EVP_sha256(), hmacKey.b.buffer, hmacKey.b.size, dataToHmac.b.buffer, dataToHmac.b.size,
+                               outerHmac.b.buffer, (UINT32*) &size_in);
+
+               outerHmac.b.size = size_in;
+
+               runner = outDuplicate->b.buffer;
+               size_in = sizeof(*outDuplicate) - 2;
+               outDuplicate->b.size = TPM2B_DIGEST_Marshal(&outerHmac, &runner, &size_in);
+
+               memcpy(runner, dupSensitive.b.buffer, dupSensitive.b.size);
+               outDuplicate->b.size += dupSensitive.b.size;
+
+       }
+
+       // Encrypting seed with RSA pub:
+       TPM2B_DATA encodingParams = {{0}};
+       encodingParams.b.size = 10;
+       memcpy(encodingParams.b.buffer, "DUPLICATE", 10);
+
+       RSA_OAEP_Enc((TPM2B_PUBLIC_KEY_RSA*)plainSymSeed, (TPM2B_PUBLIC_KEY_RSA*)encSymSeed, protector, &encodingParams);
+
+}
+
+void rsaKeyTobn( const RSA* rsaKey,
+                const BIGNUM** n,
+                const BIGNUM** e,
+                const BIGNUM** d,
+                const BIGNUM** p,
+                const BIGNUM** q
+                )
+{
+#if OPENSSL_VERSION_NUMBER < 0x10100000
+    if (n != NULL) 
+    {
+        *n = rsaKey->n;
+        *e = rsaKey->e;
+        *d = rsaKey->d;
+    }
+    if (p != NULL) 
+    {
+        *p = rsaKey->p;
+        *q = rsaKey->q;
+    }
+
+#else
+    if (n != NULL) 
+    {
+        RSA_get0_key(rsaKey, n, e, d);
+    }
+    if (p != NULL) 
+    {
+        RSA_get0_factors(rsaKey, p, q);
+    }
+#endif
+}
+
+int rsabnTobin( const BIGNUM** n,
+                const BIGNUM** e,
+                const BIGNUM** p,
+                uint8_t** n_bytes, int* n_size,
+                uint8_t** e_bytes, int* e_size,
+                uint8_t** p_bytes, int* p_size
+                )
+{
+    int rc=-1;
+    
+    if(n_size != NULL)
+    {
+        *n_size = BN_num_bytes(*n);
+    }
+
+    if( (n_bytes != NULL) && (*n_size > 0) )
+    {
+        *n_bytes = (uint8_t*) malloc(*n_size);
+        BN_bn2bin(*n, *n_bytes); 
+        rc = 0;
+    }
+
+    if(e_size != NULL)
+    {
+        *e_size = BN_num_bytes(*e);
+    }
+
+    if( (e_bytes != NULL) && (*e_size > 0) )
+    {
+        *e_bytes = (uint8_t*) malloc(*e_size);
+        BN_bn2bin(*e, *e_bytes); 
+        rc = 0;
+    }
+
+    if(p_size != NULL)
+    {
+        *p_size = BN_num_bytes(*p);
+    }
+
+    if( (p_bytes != NULL) && (*p_size > 0) )
+    {
+        *p_bytes = (uint8_t*) malloc(*p_size);
+        BN_bn2bin(*p, *p_bytes); 
+        rc = 0;
+    }
+
+end:
+    return rc;
+}
+
+
+void CreateSwDataObject(
+               BYTE* auth, UINT16 authSize,
+               RSA * rsaKey,
+               BYTE * dataToSeal, UINT16 dataSize,
+               BYTE * policyDigest, UINT16 policyDigestSize,
+               TPMT_PUBLIC * outPublic, 
+        TPMT_SENSITIVE *outSens)
+{
+       TPM2B_MAX_BUFFER hash_buffer;
+       BYTE seed[32] = {0};
+
+    if(rsaKey != NULL)
+    {
+    /* Asymmetric key (RSA) creation */
+
+        const BIGNUM    *n;
+        const BIGNUM    *e;
+        const BIGNUM    *d;
+        const BIGNUM    *p;
+        const BIGNUM    *q;
+
+        uint8_t* n_bytes; int n_size;
+        uint8_t* e_bytes; int e_size;
+        uint8_t* p_bytes; int p_size;
+
+        rsaKeyTobn(rsaKey, &n, &e, &d, &p, &q);
+
+        rsabnTobin( &n, &e, &p,
+                &n_bytes, &n_size,
+                &e_bytes, &e_size,
+                &p_bytes, &p_size
+                );
+
+        /* Fill TPM Sensitive data */
+        outSens->sensitiveType = TPM_ALG_RSA;
+
+        outSens->authValue.b.size = authSize;
+        memcpy(outSens->authValue.b.buffer, auth, authSize);
+
+        outSens->seedValue.b.size = 32;
+        memcpy(outSens->seedValue.b.buffer, seed, 32);
+
+        outSens->sensitive.bits.b.size = p_size;
+        memcpy(outSens->sensitive.bits.b.buffer, p_bytes, p_size);
+
+        /* Fill TPM Public portion */
+        outPublic->type = TPM_ALG_RSA;
+        outPublic->nameAlg = TPM_ALG_SHA256;
+        outPublic->objectAttributes.val = 0;
+        //outPublic->objectAttributes.val |= TPMA_OBJECT_RESTRICTED;
+        outPublic->objectAttributes.val |= TPMA_OBJECT_USERWITHAUTH;
+        outPublic->objectAttributes.val |= TPMA_OBJECT_SIGN;
+        outPublic->authPolicy.t.size = 0;
+
+        /* Table 182 - Definition of TPMU_PUBLIC_PARMS Union <IN/OUT, S> */
+        outPublic->parameters.rsaDetail.symmetric.algorithm = TPM_ALG_NULL;
+        outPublic->parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL;
+        //outPublic->parameters.rsaDetail.scheme.details.rsassa.hashAlg = TPM_ALG_SHA256;
+        
+        outPublic->parameters.rsaDetail.keyBits = BYTES_TO_BITS(n_size);;
+        printf("outPublic->parameters.rsaDetail.keyBits: %d \n", outPublic->parameters.rsaDetail.keyBits);
+
+        unsigned long tmp_val = 0;  // Need to use this temp variable?
+        memcpy(&tmp_val, e_bytes, e_size);
+        outPublic->parameters.rsaDetail.exponent = tmp_val;
+        printf("outPublic->parameters.rsaDetail.exponent: 0x%x \n", outPublic->parameters.rsaDetail.exponent);
+
+        outPublic->unique.rsa.t.size = n_size;
+        memcpy(outPublic->unique.rsa.t.buffer, n_bytes, n_size);
+        printf("outPublic->unique.rsa.t.size: %d \n", outPublic->unique.rsa.t.size);
+
+        if(( policyDigestSize > 0) && (policyDigest != NULL) )
+        {
+            memcpy(outPublic->authPolicy.b.buffer, policyDigest, policyDigestSize);
+            outPublic->authPolicy.b.size = policyDigestSize;
+        }
+    }
+    
+    else if( (dataToSeal != NULL) && (dataSize > 0) )
+    {
+    /* Symmetric Key Creation */
+
+        outSens->authValue.b.size = authSize;
+        memcpy(outSens->authValue.b.buffer, auth, authSize);
+
+        outSens->seedValue.b.size = 32;
+        memcpy(outSens->seedValue.b.buffer, seed, 32);
+
+        outSens->sensitive.bits.b.size = dataSize;
+        memcpy(outSens->sensitive.bits.b.buffer, dataToSeal, dataSize);
+
+        outSens->sensitiveType = TPM_ALG_KEYEDHASH;
+
+        outPublic->objectAttributes.val = 0;
+        outPublic->objectAttributes.adminWithPolicy = 1;
+        outPublic->nameAlg = TPM_ALG_SHA256;
+        memcpy(outPublic->unique.keyedHash.b.buffer, dataToSeal, dataSize);
+        outPublic->unique.keyedHash.b.size = dataSize;
+
+        if(( policyDigestSize > 0) && (policyDigest != NULL) )
+        {
+            memcpy(outPublic->authPolicy.b.buffer, policyDigest, policyDigestSize);
+            outPublic->authPolicy.b.size = policyDigestSize;
+        }
+
+        outPublic->type = TPM_ALG_KEYEDHASH;
+        outPublic->nameAlg = TPM_ALG_SHA256;
+
+        outPublic->parameters.keyedHashDetail.scheme.scheme = TPM_ALG_NULL;
+        outPublic->parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM_ALG_NULL;
+
+        memcpy(hash_buffer.b.buffer, seed, 32);
+        memcpy(hash_buffer.b.buffer+32, dataToSeal, dataSize);
+        SHA256(hash_buffer.b.buffer, 32+dataSize, outPublic->unique.keyedHash.b.buffer);
+        outPublic->unique.keyedHash.b.size = 32;
+    }
+
+}
+
+
+TSS2_RC swKeyDuplicate(
+      /* IN */
+      RSA* rsaKey, TPM2B_PUBLIC* parentKeyPublicPortion, UINT8* policyDigest, int digestSize,
+      /* OUT */ 
+      TPM2B_DATA* encryptionKey, TPM2B_PUBLIC *swKeyPublic, TPM2B_PRIVATE *swKeyPrivate,  TPM2B_ENCRYPTED_SECRET *encSymSeed)
+{
+    TPM_RC rval = TPM_RC_SUCCESS;
+    UINT8 auth[0];
+    TPM2B_SENSITIVE swKeySens;
+    TPM2B_ENCRYPTED_SECRET plainSymSeed = {{0}};
+    TPM2B_PUBLIC_KEY_RSA protectorRsaPub = {{0}};
+
+    INIT_SIMPLE_TPM2B_SIZE(swKeySens);
+    INIT_SIMPLE_TPM2B_SIZE(*swKeyPublic);
+
+    // Fill the protector data
+    memcpy(protectorRsaPub.b.buffer, parentKeyPublicPortion->t.publicArea.unique.rsa.t.buffer, parentKeyPublicPortion->t.publicArea.unique.rsa.t.size);
+    protectorRsaPub.b.size = parentKeyPublicPortion->t.publicArea.unique.rsa.t.size;
+
+    // Fill Symmetric seed
+    plainSymSeed.b.size =  encryptionKey->b.size = 16;
+    encSymSeed->b.size = 16;
+
+    // Create SW Data Object Public and Sensitive portions
+    CreateSwDataObject2B(auth, 0, rsaKey, policyDigest, digestSize, swKeyPublic, &swKeySens);
+
+    // Create Duplication blob needed for Import
+    CreateDuplicationBlob2B( &protectorRsaPub, swKeyPublic, &swKeySens, &plainSymSeed, 0, encryptionKey, 1, swKeyPrivate, encSymSeed);
+
+       return rval;
+}
+
+
diff --git a/tpm-util/duplicate/util.c b/tpm-util/duplicate/util.c
new file mode 100644 (file)
index 0000000..6d5337f
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#include "util.h"
+
+TPM_RC ConcatSizedByteBuffer( TPM2B_MAX_BUFFER *result, TPM2B *addBuffer )
+{
+    int i;
+
+    if( ( result->t.size + addBuffer->size ) > MAX_DIGEST_BUFFER )
+        return TSS2_SYS_RC_BAD_VALUE;
+    else
+    {
+        for( i = 0; i < addBuffer->size; i++ )
+            result->t.buffer[i + result->t.size] = addBuffer->buffer[i];
+
+        result->t.size += addBuffer->size;
+
+        return TPM_RC_SUCCESS;
+    }
+}
+
+int saveDataToFile(const char *fileName, UINT8 *buf, UINT16 size)
+{
+    FILE *f;
+    UINT16 count = 1;
+    if( fileName == NULL || buf == NULL || size == 0 )
+        return -1;
+
+    f = fopen(fileName, "wb+");
+    if( f == NULL ) {
+        printf("File(%s) open error.\n", fileName);
+        return -2;
+    }
+
+    while( size > 0 && count > 0 ) {
+        count = fwrite(buf, 1, size, f);
+        size -= count;
+        buf += count;
+    }
+
+    if( size > 0 ) {
+        printf("File write error\n");
+        fclose(f);
+        return -3;
+    }
+
+    fclose(f);
+    return 0;
+}
+
+int loadDataFromFile(const char *fileName, UINT8 *buf, UINT16 *size)
+{
+    UINT16 count = 1, left;
+    FILE *f;
+    if ( size == NULL || buf == NULL || fileName == NULL )
+        return -1;
+
+    f = fopen(fileName, "rb+");
+    if( f == NULL ) {
+        printf("File(%s) open error.\n", fileName);
+        return -2;
+    }
+
+    left = *size;
+    *size = 0;
+    while( left > 0 && count > 0 ) {
+        count = fread(buf, 1, left, f);
+        *size += count;
+        left -= count;
+        buf += count;
+    }
+
+    if( *size == 0 ) {
+        printf("File read error\n");
+        fclose(f);
+        return -3;
+    }
+    fclose(f);
+    return 0;
+}
+
+
diff --git a/tpm-util/import/include/tpm_wrapper.h b/tpm-util/import/include/tpm_wrapper.h
new file mode 100644 (file)
index 0000000..4d1639d
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#ifndef __TPM_WRAPPER_H__
+#define __TPM_WRAPPER_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include <getopt.h>
+
+#include <sapi/tpm20.h>
+
+#include <tcti/tcti-tabrmd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define INIT_SIMPLE_TPM2B_SIZE( type ) (type).t.size = sizeof( type ) - 2;
+
+TSS2_TCTI_CONTEXT* tpm_tcti_tabrmd_init (void);
+
+TSS2_SYS_CONTEXT* sys_ctx_init (TSS2_TCTI_CONTEXT *tcti_ctx);
+
+TSS2_RC TeardownTctiContext( TSS2_TCTI_CONTEXT *tctiContext );
+
+void TeardownSysContext( TSS2_SYS_CONTEXT **sysContext );
+
+TSS2_RC swKeyTpmImport(
+      /* IN */
+      TSS2_SYS_CONTEXT *sysContext,
+      TPM_HANDLE parentKeyHandle,
+      TPM2B_DATA* encryptionKey, TPM2B_PUBLIC* swKeyPublic, TPM2B_PRIVATE* swKeyPrivate,  TPM2B_ENCRYPTED_SECRET* encSymSeed,
+      unsigned char* tpm_pwd, int tpm_pwd_len,
+      /* OUT */
+      TPM2B_PRIVATE *importPrivate);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/tpm-util/import/include/util.h b/tpm-util/import/include/util.h
new file mode 100644 (file)
index 0000000..5d89376
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+#ifndef __UTIL_H__
+#define __UTIL_H__
+
+int saveDataToFile(const char *fileName, UINT8 *buf, UINT16 size);
+
+int loadDataFromFile(const char *fileName, UINT8 *buf, UINT16 *size);
+
+#endif
diff --git a/tpm-util/import/main.c b/tpm-util/import/main.c
new file mode 100644 (file)
index 0000000..c498f6c
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+//
+// main.c : Tool to import Openssl RSA key into TPM
+// Author: Arun Kumar Sekar
+//
+
+#include <stdio.h>
+#include <stdlib.h>   
+#include <string.h>
+#include <unistd.h>  
+
+#include <sapi/tpm20.h>
+
+#include "tpm_wrapper.h" 
+#include "util.h" 
+
+char* tpm_pwd = "";
+int tpm_pwd_len = 0;
+
+void PrintHelp();
+char version[] = "0.1";
+
+void PrintHelp()
+{
+    printf(
+            "OSSL key to tpm import tool, Version %s\nUsage:" 
+            "./ossl_tpm_import " 
+            "[-dupPub out_dupPubFile] [-dupPriv out_dupPrivFile] [-dupSymSeed out_dupSymSeedFile] [-dupEncKey out_dupEncKeyFile]" 
+            "[-pub out_keyPub] [-priv out_KeyPriv]\n"
+                       "\n"
+                        , version);
+}
+
+int main(int argc, char* argv[])
+{
+    TPM_RC rval = 0;
+    int count=0;
+    TSS2_TCTI_CONTEXT *tcti_ctx = 0;
+    TSS2_SYS_CONTEXT  *sysContext = 0;
+
+    // SW Key Duplicate O/P variables
+    char dupPub_Filename[256];
+    int dupPub_flag = 0;
+    char dupPriv_Filename[256];
+    int dupPriv_flag = 0;
+    char dupSymSeed_Filename[256];
+    int dupSymSeed_flag = 0;
+    char dupEncKey_Filename[256];
+    int dupEncKey_flag = 0;
+    TPM2B_DATA encryptionKey; 
+    TPM2B_PUBLIC swKeyPublic; 
+    TPM2B_PRIVATE swKeyPrivate; 
+    TPM2B_ENCRYPTED_SECRET encSymSeed; 
+
+    // SW Key Import O/P variables
+    char pub_Filename[256];
+    int pub_flag = 0;
+    char priv_Filename[256];
+    int priv_flag = 0;
+    unsigned short file_size = 0;
+
+    TPM_HANDLE primaryKeyHandle = 0;
+    int H_flag = 0;
+
+    TPM2B_PUBLIC parentKeyPublicPortion;
+    int pubKeysize = 0;
+
+    setbuf(stdout, NULL);
+    setvbuf (stdout, NULL, _IONBF, BUFSIZ);
+    if( (argc < 2) )
+    {
+        printf("Arguments count does not match \n");
+        PrintHelp();
+        return 1;
+    }
+    else
+    {
+        /* Get the argument values and evaluate it */
+        for( count = 1; count < argc; count++ )
+        {
+            if( 0 == strcmp( argv[count], "-dupPub" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupPub_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupPub_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupPriv" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupPriv_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupPriv_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupSymSeed" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupSymSeed_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupSymSeed_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-dupEncKey" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", dupEncKey_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                dupEncKey_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-pub" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", pub_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                pub_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-priv" ) ) {
+                count++;
+                if( (1 != sscanf( argv[count], "%s", priv_Filename )) )
+                {
+                    PrintHelp();
+                    return 1;
+                }
+                priv_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "-H" ) ) {
+                count++;
+                primaryKeyHandle = strtoul(argv[count], NULL, 16);
+                printf("Primary Key handle Given: 0x%x \n", primaryKeyHandle);
+                H_flag = 1;
+            }
+            else if( 0 == strcmp( argv[count], "--help" ) ) {
+                PrintHelp();
+                exit(1);
+            }
+            else {
+                PrintHelp();
+                exit(1);
+            }
+        }
+    }
+
+    if((!H_flag)) {
+        printf("Parent handle should be passed for TPM import operation \n");
+        return -1;
+    }
+
+    // For TPM Import functionality, check all input params are present
+    if( (!dupPub_flag) ||
+                (!dupPriv_flag) ||
+                (!dupSymSeed_flag) ||
+                (!dupEncKey_flag) ||
+                (!pub_flag) ||
+                (!priv_flag)
+        ) {
+        printf("Error: One or more Inputs for TPM import functionality is missing ! \n");
+        return -1;
+    }
+
+    /* SW Key TPM Import operation started */
+    if(rval == 0) {
+        file_size = sizeof(TPM2B_PUBLIC);
+        rval = loadDataFromFile(dupPub_Filename, (UINT8 *) &swKeyPublic, &file_size);
+        if ( rval == 0 )  {
+            file_size = sizeof(TPM2B_PRIVATE);
+            rval = loadDataFromFile(dupPriv_Filename, (UINT8 *) &swKeyPrivate, &file_size);
+        }
+        if ( rval == 0 )  {
+            file_size = sizeof(TPM2B_ENCRYPTED_SECRET);
+            rval = loadDataFromFile(dupSymSeed_Filename, (UINT8 *) &encSymSeed, &file_size);
+        }
+        if ( rval == 0 )  {
+            file_size = sizeof(TPM2B_DATA);
+            rval = loadDataFromFile(dupEncKey_Filename, (UINT8 *) &encryptionKey, &file_size);
+        }
+
+        if ( rval == 0 ) {
+            /* Initialize TCTI and sapi context */
+            tcti_ctx = tpm_tcti_tabrmd_init();
+            if(tcti_ctx == NULL) {
+                printf("Creation of TCTI context with TABRMD failed ! \n");
+                goto end;
+            }
+
+            sysContext = sys_ctx_init(tcti_ctx);
+            if(sysContext == NULL) {
+                printf("Creation of SAPI context with TABRMD failed ! \n");
+                goto end;
+            }
+            printf("\nInitializing TPM context success: 0x%x ! \n", rval);
+        }
+
+        TPM2B_PRIVATE importPrivate;
+        INIT_SIMPLE_TPM2B_SIZE(importPrivate);
+        rval = swKeyTpmImport(sysContext, primaryKeyHandle, 
+                &encryptionKey, &swKeyPublic, &swKeyPrivate, &encSymSeed, 
+                tpm_pwd, tpm_pwd_len, 
+                &importPrivate);
+        if(rval != 0) {
+            printf("\nswKeyTpmImport failed: 0x%x ! \n", rval);
+            goto end;
+        }
+        else {
+            printf("\nswKeyImport success: 0x%x ! \n", rval);
+            saveDataToFile(pub_Filename, (UINT8 *) &swKeyPublic, sizeof(TPM2B_PUBLIC));
+            saveDataToFile(priv_Filename, (UINT8 *) &importPrivate, sizeof(TPM2B_PRIVATE));
+            printf("\nOutput files are written successfully ! \n");
+        }
+    }
+
+end:
+    if(sysContext) {
+        TeardownSysContext(&sysContext);
+    }
+    if(tcti_ctx) {
+        TeardownTctiContext(tcti_ctx);
+    }
+
+    return rval;
+}
+
diff --git a/tpm-util/import/sampleMakefile b/tpm-util/import/sampleMakefile
new file mode 100644 (file)
index 0000000..55c180a
--- /dev/null
@@ -0,0 +1,38 @@
+
+CC = gcc
+#CC = g++
+LD = ld
+AR = ar
+LDDFLAGS += -fPIC
+ARFLAGS = -rc
+
+TSS_DIR?=/home/pramod/tpm2-tss
+
+OUTPUT=ossl_tpm_import
+
+OBJS=  util.o \
+               tpm_wrapper.o \
+               main.o 
+
+
+CFLAGS += -g -fPIC -I./include -I${TSS_DIR}/include/ -I$(TSS_DIR)/sysapi/include 
+
+LDFLAGS += -ldl -L/usr/local/lib/ -lsapi -ltcti-device -ltcti-tabrmd 
+
+LIBS = -lpthread -lcrypto -lssl
+
+%.o : %.c
+       $(CC) -c $(CFLAGS) $< -o $@
+       
+
+$(OUTPUT): $(OBJS)
+       $(CC) $(OBJS) $(LDFLAGS) ${LIBS} -o $(OUTPUT)
+
+.PHONY: all
+all: $(OUTPUT)
+
+install:
+       @set -e; for i in $(OUTPUT); do mv $$i ../../bin/$$i ; done
+
+clean:
+       rm -f *.o $(OUTPUT) *.so 
diff --git a/tpm-util/import/tpm_wrapper.c b/tpm-util/import/tpm_wrapper.c
new file mode 100644 (file)
index 0000000..5f4ab2a
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+//
+// Author: Arun Kumar Sekar
+//
+
+#include "tpm_wrapper.h"
+#include "util.h"
+
+#include <errno.h>
+
+#include <sapi/tpm20.h>
+#include <sapi/tss2_sys.h>
+#include <tcti/tcti_device.h>
+#include "tcti_util.h"
+
+TSS2_RC swKeyTpmImport(
+      /* IN */
+      TSS2_SYS_CONTEXT *sysContext,
+      TPM_HANDLE parentKeyHandle,
+      TPM2B_DATA* encryptionKey, TPM2B_PUBLIC* swKeyPublic, TPM2B_PRIVATE* swKeyPrivate,  TPM2B_ENCRYPTED_SECRET* encSymSeed,
+      unsigned char* tpm_pwd, int tpm_pwd_len, 
+      /* OUT */
+      TPM2B_PRIVATE *importPrivate)
+{
+    TPM_RC rval = TPM_RC_SUCCESS;
+    TPM2B_NAME name = { { sizeof( TPM2B_NAME ) - 2, } };
+
+    TPM_HANDLE wrapperKeyHandle;
+
+    TSS2_SYS_CMD_AUTHS npsessionsData;
+    TSS2_SYS_RSP_AUTHS npsessionsDataOut;
+    TPMS_AUTH_COMMAND npsessionData;
+    TPMS_AUTH_RESPONSE npsessionDataOut;
+
+    if(NULL == tpm_pwd) {
+        printf("TPM password pinter is NULL \n");
+        return -1;
+    }
+
+    *((UINT8 *)((void *)&npsessionData.sessionAttributes)) = 0;
+    npsessionData.sessionHandle = TPM_RS_PW;
+    npsessionData.nonce.t.size = 0;
+    npsessionData.hmac.t.size = 0;
+
+    npsessionData.hmac.t.size = tpm_pwd_len;
+    if(tpm_pwd_len > 0)
+    {
+        memcpy(npsessionData.hmac.t.buffer, tpm_pwd, npsessionData.hmac.t.size);
+    }
+
+    TPMS_AUTH_COMMAND *npsessionDataArray[1];
+    TPMS_AUTH_RESPONSE *npsessionDataOutArray[1];
+    TPMT_SYM_DEF_OBJECT symmetricAlg;
+
+    npsessionDataArray[0] = &npsessionData;
+    npsessionDataOutArray[0] = &npsessionDataOut;
+    npsessionsData.cmdAuthsCount = 1;
+    npsessionsData.cmdAuths = &npsessionDataArray[0];
+    npsessionsDataOut.rspAuthsCount = 1;
+    npsessionsDataOut.rspAuths = &npsessionDataOutArray[0];
+
+    symmetricAlg.algorithm = TPM_ALG_AES;
+    symmetricAlg.keyBits.aes = 128;
+    symmetricAlg.mode.aes = TPM_ALG_CFB;
+
+    rval =  Tss2_Sys_Import( sysContext,
+                             parentKeyHandle,
+                             &npsessionsData,
+                             encryptionKey,
+                             swKeyPublic,
+                             swKeyPrivate,
+                             encSymSeed,
+                             &symmetricAlg,
+                             importPrivate,
+                             &npsessionsDataOut
+                           );
+    printf("The return value of sys import: 0x%x \n", rval);
+
+#if 0
+    if(rval == TSS2_RC_SUCCESS)
+    {
+        rval = Tss2_Sys_Load (sysContext, parentKeyHandle, &npsessionsData, importPrivate, swKeyPublic,
+                &wrapperKeyHandle, &name, &npsessionsDataOut);
+        printf("\n Load Imported Handle: 0x%x | rval 0x%x \n", wrapperKeyHandle, rval);
+    }
+    if(rval == TSS2_RC_SUCCESS)
+    {
+        rval = Tss2_Sys_FlushContext( sysContext, wrapperKeyHandle);
+        printf("\n Flush Loaded key Handle : 0x%8.8x| rval 0x%x \n", wrapperKeyHandle, rval);
+    }
+#endif
+
+    // Nullify TPM password
+    memset(tpm_pwd, 0, tpm_pwd_len);
+
+    return rval;
+}
+
+TSS2_TCTI_CONTEXT* tpm_tcti_tabrmd_init (void)
+{
+    TSS2_TCTI_CONTEXT *tcti_ctx;
+    TSS2_RC rc;
+    size_t size;
+
+    rc = tss2_tcti_tabrmd_init(NULL, &size);
+    if (rc != TSS2_RC_SUCCESS) {
+        printf ("Failed to get size for TABRMD TCTI context: 0x%x", rc);
+        return NULL;
+    }
+
+    tcti_ctx = (TSS2_TCTI_CONTEXT*)calloc (1, size);
+    if (tcti_ctx == NULL) {
+        printf ("Allocation for TABRMD TCTI context failed: %s",
+                 strerror (errno));
+        return NULL;
+    }
+    rc = tss2_tcti_tabrmd_init (tcti_ctx, &size);
+    if (rc != TSS2_RC_SUCCESS) {
+        printf ("Failed to initialize TABRMD TCTI context: 0x%x", rc);
+        free (tcti_ctx);
+        return NULL;
+    }
+
+    return tcti_ctx;
+}
+
+TSS2_SYS_CONTEXT* sys_ctx_init (TSS2_TCTI_CONTEXT *tcti_ctx)
+{
+    TSS2_SYS_CONTEXT *sys_ctx;
+    TSS2_RC rc;
+    size_t size;
+    TSS2_ABI_VERSION abi_version = {
+        .tssCreator = TSSWG_INTEROP,
+        .tssFamily  = TSS_SAPI_FIRST_FAMILY,
+        .tssLevel   = TSS_SAPI_FIRST_LEVEL,
+        .tssVersion = TSS_SAPI_FIRST_VERSION,
+    };
+
+    size = Tss2_Sys_GetContextSize (0);
+    sys_ctx = (TSS2_SYS_CONTEXT*)calloc (1, size);
+    if (sys_ctx == NULL) {
+        fprintf (stderr,
+                 "Failed to allocate 0x%zx bytes for the SAPI context\n",
+                 size);
+        return NULL;
+    }
+    rc = Tss2_Sys_Initialize (sys_ctx, size, tcti_ctx, &abi_version);
+    if (rc != TSS2_RC_SUCCESS) {
+        fprintf (stderr, "Failed to initialize SAPI context: 0x%x\n", rc);
+        free (sys_ctx);
+        return NULL;
+    }
+
+    return sys_ctx;
+}
+
+TSS2_RC TeardownTctiContext( TSS2_TCTI_CONTEXT *tctiContext )
+{
+    ((TSS2_TCTI_CONTEXT_INTEL *)tctiContext)->finalize( tctiContext );
+    free (tctiContext);
+    tctiContext = NULL;
+    return TSS2_RC_SUCCESS;
+}
+
+void TeardownSysContext( TSS2_SYS_CONTEXT **sysContext )
+{
+    if( *sysContext != 0 ) {
+        Tss2_Sys_Finalize(*sysContext);
+        free(*sysContext);
+        *sysContext = 0;
+    }
+}
+
+/* helper functions */
+#if 0
+TSS2_RC TPM2ReadPublicPortion(TSS2_SYS_CONTEXT *sysContext, TPM_HANDLE objectHandle, TPM2B_PUBLIC *publicPortion )
+{
+    TPM_RC rval = TPM_RC_SUCCESS;
+    TPM2B_NAME qualifiedName;
+    TPM2B_NAME name;
+    INIT_SIMPLE_TPM2B_SIZE( name );
+    INIT_SIMPLE_TPM2B_SIZE( qualifiedName );
+
+    if(publicPortion == NULL) {
+        printf("Input reference for TPM2B_PUBLIC structure is NULL");
+        return TPM_RC_FAILURE;
+    }
+
+    publicPortion->t.size = 0;
+    rval = Tss2_Sys_ReadPublic( sysContext, objectHandle , 0, publicPortion, &name, &qualifiedName, 0 );
+    if(rval != TPM_RC_SUCCESS)
+    {
+        printf("\n Tss2_Sys_ReadPublic failed: 0x%x ! for TPM handle: 0x%x \n", rval, objectHandle);
+    }
+
+    return rval;
+}
+#endif
+
diff --git a/tpm-util/import/util.c b/tpm-util/import/util.c
new file mode 100644 (file)
index 0000000..a0038a5
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+// Author: Arun Kumar Sekar
+
+
+#include "tpm_wrapper.h"
+
+int saveDataToFile(const char *fileName, UINT8 *buf, UINT16 size)
+{
+    FILE *f;
+    UINT16 count = 1;
+    if( fileName == NULL || buf == NULL || size == 0 )
+        return -1;
+
+    f = fopen(fileName, "wb+");
+    if( f == NULL ) {
+        printf("File(%s) open error.\n", fileName);
+        return -2;
+    }
+
+    while( size > 0 && count > 0 ) {
+        count = fwrite(buf, 1, size, f);
+        size -= count;
+        buf += count;
+    }
+
+    if( size > 0 ) {
+        printf("File write error\n");
+        fclose(f);
+        return -3;
+    }
+
+    fclose(f);
+    return 0;
+}
+
+int loadDataFromFile(const char *fileName, UINT8 *buf, UINT16 *size)
+{
+    UINT16 count = 1, left;
+    FILE *f;
+    if ( size == NULL || buf == NULL || fileName == NULL )
+        return -1;
+
+    f = fopen(fileName, "rb+");
+    if( f == NULL ) {
+        printf("File(%s) open error.\n", fileName);
+        return -2;
+    }
+
+    left = *size;
+    *size = 0;
+    while( left > 0 && count > 0 ) {
+        count = fread(buf, 1, left, f);
+        *size += count;
+        left -= count;
+        buf += count;
+    }
+
+    if( *size == 0 ) {
+        printf("File read error\n");
+        fclose(f);
+        return -3;
+    }
+    fclose(f);
+    return 0;
+}
+
+void hex_log(UINT8 *pData, UINT32 numBytes, const char* caption)
+{
+    int i = 0;
+
+    if(NULL == pData)
+    {
+        return;
+    }
+    if(caption != NULL)
+    {
+        printf("\n=== %s ===\n", caption);
+    }
+    printf("size: %d \n", numBytes);
+
+    for(i = 0; i < numBytes; i++)
+    {
+        printf("%02X ", pData[i]);
+
+        if (!((i + 1) % 16))
+          printf("\n");
+    }
+    printf("\n");
+}
+