1 /* Microsoft Reference Implementation for TPM 2.0
2  *
3  *  The copyright in this software is being made available under the BSD License,
4  *  included below. This software may be subject to other third party and
5  *  contributor rights, including patent rights, and no such rights are granted
6  *  under this license.
7  *
8  *  Copyright (c) Microsoft Corporation
9  *
10  *  All rights reserved.
11  *
12  *  BSD License
13  *
14  *  Redistribution and use in source and binary forms, with or without modification,
15  *  are permitted provided that the following conditions are met:
16  *
17  *  Redistributions of source code must retain the above copyright notice, this list
18  *  of conditions and the following disclaimer.
19  *
20  *  Redistributions in binary form must reproduce the above copyright notice, this
21  *  list of conditions and the following disclaimer in the documentation and/or
22  *  other materials provided with the distribution.
23  *
24  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
25  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
28  *  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29  *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31  *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 /*(Auto-generated)
36  *  Created by NewMarshal; Version 1.4 Apr 7, 2019
37  *  Date: Mar  6, 2020  Time: 01:50:10PM
38  */
39 
40 // This file contains the data initializer used for the table-driven marshaling code.
41 
42 #include "Tpm.h"
43 
44 
45 #if TABLE_DRIVEN_MARSHAL
46 #include "TableMarshal.h"
47 #include "Marshal.h"
48 
49 // The array marshaling table
50 ArrayMarshal_mst   ArrayLookupTable[] = {
51     ARRAY_MARSHAL_ENTRY(UINT8),
52     ARRAY_MARSHAL_ENTRY(TPM_CC),
53     ARRAY_MARSHAL_ENTRY(TPMA_CC),
54     ARRAY_MARSHAL_ENTRY(TPM_ALG_ID),
55     ARRAY_MARSHAL_ENTRY(TPM_HANDLE),
56     ARRAY_MARSHAL_ENTRY(TPM2B_DIGEST),
57     ARRAY_MARSHAL_ENTRY(TPMT_HA),
58     ARRAY_MARSHAL_ENTRY(TPMS_PCR_SELECTION),
59     ARRAY_MARSHAL_ENTRY(TPMS_ALG_PROPERTY),
60     ARRAY_MARSHAL_ENTRY(TPMS_TAGGED_PROPERTY),
61     ARRAY_MARSHAL_ENTRY(TPMS_TAGGED_PCR_SELECT),
62     ARRAY_MARSHAL_ENTRY(TPM_ECC_CURVE),
63     ARRAY_MARSHAL_ENTRY(TPMS_TAGGED_POLICY),
64     ARRAY_MARSHAL_ENTRY(TPMS_ACT_DATA),
65     ARRAY_MARSHAL_ENTRY(TPMS_AC_OUTPUT)};
66 
67 // The main marshaling structure
68 MarshalData_st MarshalData = {
69 // UINT8_DATA
70 {UINT_MTYPE, 0},
71 // UINT16_DATA
72 {UINT_MTYPE, 1},
73 // UINT32_DATA
74 {UINT_MTYPE, 2},
75 // UINT64_DATA
76 {UINT_MTYPE, 3},
77 // INT8_DATA
78 {UINT_MTYPE, 0 + IS_SIGNED},
79 // INT16_DATA
80 {UINT_MTYPE, 1 + IS_SIGNED},
81 // INT32_DATA
82 {UINT_MTYPE, 2 + IS_SIGNED},
83 // INT64_DATA
84 {UINT_MTYPE, 3 + IS_SIGNED},
85 // UINT0_DATA
86 {NULL_MTYPE, 0},
87 // TPM_ECC_CURVE_DATA
88 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_CURVE,
89     {TPM_ECC_NONE,
90     RANGE(1, 32, UINT16),
91     (UINT32)((ECC_NIST_P192 << 0) | (ECC_NIST_P224 << 1) | (ECC_NIST_P256 << 2) |
92              (ECC_NIST_P384 << 3) | (ECC_NIST_P521 << 4) | (ECC_BN_P256 << 15)  |
93              (ECC_BN_P638 << 16)  | (ECC_SM2_P256 << 31))}},
94 // TPM_CLOCK_ADJUST_DATA
95 {MIN_MAX_MTYPE, ONE_BYTES|IS_SIGNED, (UINT8)TPM_RC_VALUE,
96     {RANGE(TPM_CLOCK_COARSE_SLOWER, TPM_CLOCK_COARSE_FASTER, INT8)}},
97 // TPM_EO_DATA
98 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE,
99     {RANGE(TPM_EO_EQ, TPM_EO_BITCLEAR, UINT16)}},
100 // TPM_SU_DATA
101 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 2,
102     {TPM_SU_CLEAR, TPM_SU_STATE}},
103 // TPM_SE_DATA
104 {TABLE_MTYPE, ONE_BYTES, (UINT8)TPM_RC_VALUE, 3,
105     {TPM_SE_HMAC, TPM_SE_POLICY, TPM_SE_TRIAL}},
106 // TPM_CAP_DATA
107 {VALUES_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 1, 1,
108    {RANGE(TPM_CAP_ALGS, TPM_CAP_ACT, UINT32),
109     TPM_CAP_VENDOR_PROPERTY}},
110 // TPMA_ALGORITHM_DATA
111 {ATTRIBUTES_MTYPE, FOUR_BYTES, 0xFFFFF8F0},
112 // TPMA_OBJECT_DATA
113 {ATTRIBUTES_MTYPE, FOUR_BYTES, 0xFFF0F309},
114 // TPMA_SESSION_DATA
115 {ATTRIBUTES_MTYPE, ONE_BYTES, 0x00000018},
116 // TPMA_ACT_DATA
117 {ATTRIBUTES_MTYPE, FOUR_BYTES, 0xFFFFFFFC},
118 // TPMI_YES_NO_DATA
119 {TABLE_MTYPE, ONE_BYTES, (UINT8)TPM_RC_VALUE, 2,
120     {NO, YES}},
121 // TPMI_DH_OBJECT_DATA
122 {VALUES_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 2, 0,
123     {TPM_RH_NULL,
124     RANGE(TRANSIENT_FIRST, TRANSIENT_LAST, UINT32),
125     RANGE(PERSISTENT_FIRST, PERSISTENT_LAST, UINT32)}},
126 // TPMI_DH_PARENT_DATA
127 {VALUES_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 2, 3,
128     {TPM_RH_NULL,
129     RANGE(TRANSIENT_FIRST, TRANSIENT_LAST, UINT32),
130     RANGE(PERSISTENT_FIRST, PERSISTENT_LAST, UINT32),
131     TPM_RH_OWNER, TPM_RH_ENDORSEMENT, TPM_RH_PLATFORM}},
132 // TPMI_DH_PERSISTENT_DATA
133 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE,
134     {RANGE(PERSISTENT_FIRST, PERSISTENT_LAST, UINT32)}},
135 // TPMI_DH_ENTITY_DATA
136 {VALUES_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 5, 4,
137     {TPM_RH_NULL,
138     RANGE(TRANSIENT_FIRST, TRANSIENT_LAST, UINT32),
139     RANGE(PERSISTENT_FIRST, PERSISTENT_LAST, UINT32),
140     RANGE(NV_INDEX_FIRST, NV_INDEX_LAST, UINT32),
141     RANGE(PCR_FIRST, PCR_LAST, UINT32),
142     RANGE(TPM_RH_AUTH_00, TPM_RH_AUTH_FF, UINT32),
143     TPM_RH_OWNER, TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT, TPM_RH_PLATFORM}},
144 // TPMI_DH_PCR_DATA
145 {MIN_MAX_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE,
146     {TPM_RH_NULL,
147     RANGE(PCR_FIRST, PCR_LAST, UINT32)}},
148 // TPMI_SH_AUTH_SESSION_DATA
149 {VALUES_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 2, 0,
150     {TPM_RS_PW,
151     RANGE(HMAC_SESSION_FIRST, HMAC_SESSION_LAST, UINT32),
152     RANGE(POLICY_SESSION_FIRST, POLICY_SESSION_LAST, UINT32)}},
153 // TPMI_SH_HMAC_DATA
154 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE,
155     {RANGE(HMAC_SESSION_FIRST, HMAC_SESSION_LAST, UINT32)}},
156 // TPMI_SH_POLICY_DATA
157 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE,
158     {RANGE(POLICY_SESSION_FIRST, POLICY_SESSION_LAST, UINT32)}},
159 // TPMI_DH_CONTEXT_DATA
160 {VALUES_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 3, 0,
161     {RANGE(HMAC_SESSION_FIRST, HMAC_SESSION_LAST, UINT32),
162     RANGE(POLICY_SESSION_FIRST, POLICY_SESSION_LAST, UINT32),
163     RANGE(TRANSIENT_FIRST, TRANSIENT_LAST, UINT32)}},
164 // TPMI_DH_SAVED_DATA
165 {VALUES_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 2, 3,
166     {RANGE(HMAC_SESSION_FIRST, HMAC_SESSION_LAST, UINT32),
167     RANGE(POLICY_SESSION_FIRST, POLICY_SESSION_LAST, UINT32),
168     0x80000000, 0x80000001, 0x80000002}},
169 // TPMI_RH_HIERARCHY_DATA
170 {TABLE_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 3,
171     {TPM_RH_NULL,
172     TPM_RH_OWNER, TPM_RH_ENDORSEMENT, TPM_RH_PLATFORM}},
173 // TPMI_RH_ENABLES_DATA
174 {TABLE_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 4,
175     {TPM_RH_NULL,
176     TPM_RH_OWNER, TPM_RH_ENDORSEMENT, TPM_RH_PLATFORM, TPM_RH_PLATFORM_NV}},
177 // TPMI_RH_HIERARCHY_AUTH_DATA
178 {TABLE_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 4,
179     {TPM_RH_OWNER, TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT, TPM_RH_PLATFORM}},
180 // TPMI_RH_HIERARCHY_POLICY_DATA
181 {VALUES_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 1, 4,
182     {RANGE(TPM_RH_ACT_0, TPM_RH_ACT_F, UINT32),
183     TPM_RH_OWNER, TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT, TPM_RH_PLATFORM}},
184 // TPMI_RH_PLATFORM_DATA
185 {TABLE_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 1,
186     {TPM_RH_PLATFORM}},
187 // TPMI_RH_OWNER_DATA
188 {TABLE_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 1,
189     {TPM_RH_NULL,
190     TPM_RH_OWNER}},
191 // TPMI_RH_ENDORSEMENT_DATA
192 {TABLE_MTYPE, FOUR_BYTES|TAKES_NULL, (UINT8)TPM_RC_VALUE, 1,
193     {TPM_RH_NULL,
194     TPM_RH_ENDORSEMENT}},
195 // TPMI_RH_PROVISION_DATA
196 {TABLE_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 2,
197     {TPM_RH_OWNER, TPM_RH_PLATFORM}},
198 // TPMI_RH_CLEAR_DATA
199 {TABLE_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 2,
200     {TPM_RH_LOCKOUT, TPM_RH_PLATFORM}},
201 // TPMI_RH_NV_AUTH_DATA
202 {VALUES_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 1, 2,
203     {RANGE(NV_INDEX_FIRST, NV_INDEX_LAST, UINT32),
204     TPM_RH_OWNER, TPM_RH_PLATFORM}},
205 // TPMI_RH_LOCKOUT_DATA
206 {TABLE_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 1,
207     {TPM_RH_LOCKOUT}},
208 // TPMI_RH_NV_INDEX_DATA
209 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE,
210     {RANGE(NV_INDEX_FIRST, NV_INDEX_LAST, UINT32)}},
211 // TPMI_RH_AC_DATA
212 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE,
213     {RANGE(AC_FIRST, AC_LAST, UINT32)}},
214 // TPMI_RH_ACT_DATA
215 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE,
216     {RANGE(TPM_RH_ACT_0, TPM_RH_ACT_F, UINT32)}},
217 // TPMI_ALG_HASH_DATA
218 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_HASH,
219     {TPM_ALG_NULL,
220     RANGE(4, 41, UINT16),
221     (UINT32)((ALG_SHA1 << 0)   | (ALG_SHA256 << 7) | (ALG_SHA384 << 8) |
222              (ALG_SHA512 << 9) | (ALG_SM3_256 << 14)),
223     (UINT32)((ALG_SHA3_256 << 3)|(ALG_SHA3_384 << 4)|(ALG_SHA3_512 << 5))}},
224 // TPMI_ALG_ASYM_DATA
225 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_ASYMMETRIC,
226     {TPM_ALG_NULL,
227     RANGE(1, 35, UINT16),
228     (UINT32)((ALG_RSA << 0)),
229     (UINT32)((ALG_ECC << 2))}},
230 // TPMI_ALG_SYM_DATA
231 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_SYMMETRIC,
232     {TPM_ALG_NULL,
233     RANGE(3, 38, UINT16),
234     (UINT32)((ALG_TDES << 0)|(ALG_AES << 3)|(ALG_XOR << 7)|(ALG_SM4 << 16)),
235     (UINT32)((ALG_CAMELLIA << 3))}},
236 // TPMI_ALG_SYM_OBJECT_DATA
237 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_SYMMETRIC,
238     {TPM_ALG_NULL,
239     RANGE(3, 38, UINT16),
240     (UINT32)((ALG_TDES << 0)|(ALG_AES << 3)|(ALG_SM4 << 16)),
241     (UINT32)((ALG_CAMELLIA << 3))}},
242 // TPMI_ALG_SYM_MODE_DATA
243 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_MODE,
244     {TPM_ALG_NULL,
245     RANGE(63, 68, UINT16),
246     (UINT32)((ALG_CMAC << 0) | (ALG_CTR << 1)  | (ALG_OFB << 2)  |
247              (ALG_CBC << 3)  | (ALG_CFB << 4)  | (ALG_ECB << 5))}},
248 // TPMI_ALG_KDF_DATA
249 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_KDF,
250     {TPM_ALG_NULL,
251     RANGE(7, 34, UINT16),
252     (UINT32)((ALG_MGF1 << 0)            | (ALG_KDF1_SP800_56A << 25) |
253              (ALG_KDF2 << 26)           | (ALG_KDF1_SP800_108 << 27))}},
254 // TPMI_ALG_SIG_SCHEME_DATA
255 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_SCHEME,
256     {TPM_ALG_NULL,
257     RANGE(5, 28, UINT16),
258     (UINT32)((ALG_HMAC << 0)    | (ALG_RSASSA << 15) | (ALG_RSAPSS << 17) |
259              (ALG_ECDSA << 19)  | (ALG_ECDAA << 21)  | (ALG_SM2 << 22)    |
260              (ALG_ECSCHNORR << 23))}},
261 // TPMI_ECC_KEY_EXCHANGE_DATA
262 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_SCHEME,
263     {TPM_ALG_NULL,
264     RANGE(25, 29, UINT16),
265     (UINT32)((ALG_ECDH << 0)|(ALG_SM2 << 2)|(ALG_ECMQV << 4))}},
266 // TPMI_ST_COMMAND_TAG_DATA
267 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_BAD_TAG, 2,
268     {TPM_ST_NO_SESSIONS, TPM_ST_SESSIONS}},
269 // TPMI_ALG_MAC_SCHEME_DATA
270 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_SYMMETRIC,
271     {TPM_ALG_NULL,
272     RANGE(4, 63, UINT16),
273     (UINT32)((ALG_SHA1 << 0)   | (ALG_SHA256 << 7) | (ALG_SHA384 << 8) |
274              (ALG_SHA512 << 9) | (ALG_SM3_256 << 14)),
275     (UINT32)((ALG_SHA3_256 << 3) | (ALG_SHA3_384 << 4) | (ALG_SHA3_512 << 5) |
276              (ALG_CMAC << 27))}},
277 // TPMI_ALG_CIPHER_MODE_DATA
278 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_MODE,
279     {TPM_ALG_NULL,
280     RANGE(64, 68, UINT16),
281     (UINT32)((ALG_CTR << 0) | (ALG_OFB << 1) | (ALG_CBC << 2) | (ALG_CFB << 3) |
282              (ALG_ECB << 4))}},
283 // TPMS_EMPTY_DATA
284 {STRUCTURE_MTYPE, 1,
285      {SET_ELEMENT_TYPE(SIMPLE_STYPE), UINT0_MARSHAL_REF, 0}},
286 // TPMS_ALGORITHM_DESCRIPTION_DATA
287 {STRUCTURE_MTYPE, 2, {
288         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
289             TPM_ALG_ID_MARSHAL_REF,
290             (UINT16)(offsetof(TPMS_ALGORITHM_DESCRIPTION, alg)),
291         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
292             TPMA_ALGORITHM_MARSHAL_REF,
293             (UINT16)(offsetof(TPMS_ALGORITHM_DESCRIPTION, attributes))}},
294 // TPMU_HA_DATA
295 {9, IS_ARRAY_UNION, (UINT16)(offsetof(TPMU_HA_mst, marshalingTypes)),
296     {(UINT32)TPM_ALG_SHA1,     (UINT32)TPM_ALG_SHA256,   (UINT32)TPM_ALG_SHA384,
297      (UINT32)TPM_ALG_SHA512,   (UINT32)TPM_ALG_SM3_256,  (UINT32)TPM_ALG_SHA3_256,
298      (UINT32)TPM_ALG_SHA3_384, (UINT32)TPM_ALG_SHA3_512, (UINT32)TPM_ALG_NULL},
299     {(UINT16)(SHA1_DIGEST_SIZE),     (UINT16)(SHA256_DIGEST_SIZE),
300      (UINT16)(SHA384_DIGEST_SIZE),   (UINT16)(SHA512_DIGEST_SIZE),
301      (UINT16)(SM3_256_DIGEST_SIZE),  (UINT16)(SHA3_256_DIGEST_SIZE),
302      (UINT16)(SHA3_384_DIGEST_SIZE), (UINT16)(SHA3_512_DIGEST_SIZE),
303      (UINT16)(0)}
304 },
305 // TPMT_HA_DATA
306 {STRUCTURE_MTYPE, 2, {
307         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
308             TPMI_ALG_HASH_MARSHAL_REF,
309             (UINT16)(offsetof(TPMT_HA, hashAlg)),
310         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
311             TPMU_HA_MARSHAL_REF,
312             (UINT16)(offsetof(TPMT_HA, digest))}},
313 // TPM2B_DIGEST_DATA
314 {TPM2B_MTYPE, Type00_MARSHAL_REF},
315 // TPM2B_DATA_DATA
316 {TPM2B_MTYPE, Type01_MARSHAL_REF},
317 // TPM2B_EVENT_DATA
318 {TPM2B_MTYPE, Type02_MARSHAL_REF},
319 // TPM2B_MAX_BUFFER_DATA
320 {TPM2B_MTYPE, Type03_MARSHAL_REF},
321 // TPM2B_MAX_NV_BUFFER_DATA
322 {TPM2B_MTYPE, Type04_MARSHAL_REF},
323 // TPM2B_TIMEOUT_DATA
324 {TPM2B_MTYPE, Type05_MARSHAL_REF},
325 // TPM2B_IV_DATA
326 {TPM2B_MTYPE, Type06_MARSHAL_REF},
327 // NULL_UNION_DATA
328 {0},
329 // TPM2B_NAME_DATA
330 {TPM2B_MTYPE, Type07_MARSHAL_REF},
331 // TPMS_PCR_SELECT_DATA
332 {STRUCTURE_MTYPE, 2, {
333         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
334             Type08_MARSHAL_REF,
335             (UINT16)(offsetof(TPMS_PCR_SELECT, sizeofSelect)),
336         SET_ELEMENT_TYPE(ARRAY_STYPE)|SET_ELEMENT_NUMBER(0),
337             UINT8_ARRAY_MARSHAL_INDEX,
338             (UINT16)(offsetof(TPMS_PCR_SELECT, pcrSelect))}},
339 // TPMS_PCR_SELECTION_DATA
340 {STRUCTURE_MTYPE, 3, {
341         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
342             TPMI_ALG_HASH_MARSHAL_REF,
343             (UINT16)(offsetof(TPMS_PCR_SELECTION, hash)),
344         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
345             Type08_MARSHAL_REF,
346             (UINT16)(offsetof(TPMS_PCR_SELECTION, sizeofSelect)),
347         SET_ELEMENT_TYPE(ARRAY_STYPE)|SET_ELEMENT_NUMBER(1),
348             UINT8_ARRAY_MARSHAL_INDEX,
349             (UINT16)(offsetof(TPMS_PCR_SELECTION, pcrSelect))}},
350 // TPMT_TK_CREATION_DATA
351 {STRUCTURE_MTYPE, 3, {
352         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
353             Type10_MARSHAL_REF,
354             (UINT16)(offsetof(TPMT_TK_CREATION, tag)),
355         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
356             TPMI_RH_HIERARCHY_MARSHAL_REF|NULL_FLAG,
357             (UINT16)(offsetof(TPMT_TK_CREATION, hierarchy)),
358         SET_ELEMENT_TYPE(SIMPLE_STYPE),
359             TPM2B_DIGEST_MARSHAL_REF,
360             (UINT16)(offsetof(TPMT_TK_CREATION, digest))}},
361 // TPMT_TK_VERIFIED_DATA
362 {STRUCTURE_MTYPE, 3, {
363         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
364             Type11_MARSHAL_REF,
365             (UINT16)(offsetof(TPMT_TK_VERIFIED, tag)),
366         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
367             TPMI_RH_HIERARCHY_MARSHAL_REF|NULL_FLAG,
368             (UINT16)(offsetof(TPMT_TK_VERIFIED, hierarchy)),
369         SET_ELEMENT_TYPE(SIMPLE_STYPE),
370             TPM2B_DIGEST_MARSHAL_REF,
371             (UINT16)(offsetof(TPMT_TK_VERIFIED, digest))}},
372 // TPMT_TK_AUTH_DATA
373 {STRUCTURE_MTYPE, 3, {
374         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
375             Type12_MARSHAL_REF,
376             (UINT16)(offsetof(TPMT_TK_AUTH, tag)),
377         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
378             TPMI_RH_HIERARCHY_MARSHAL_REF|NULL_FLAG,
379             (UINT16)(offsetof(TPMT_TK_AUTH, hierarchy)),
380         SET_ELEMENT_TYPE(SIMPLE_STYPE),
381             TPM2B_DIGEST_MARSHAL_REF,
382             (UINT16)(offsetof(TPMT_TK_AUTH, digest))}},
383 // TPMT_TK_HASHCHECK_DATA
384 {STRUCTURE_MTYPE, 3, {
385         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
386             Type13_MARSHAL_REF,
387             (UINT16)(offsetof(TPMT_TK_HASHCHECK, tag)),
388         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
389             TPMI_RH_HIERARCHY_MARSHAL_REF|NULL_FLAG,
390             (UINT16)(offsetof(TPMT_TK_HASHCHECK, hierarchy)),
391         SET_ELEMENT_TYPE(SIMPLE_STYPE),
392             TPM2B_DIGEST_MARSHAL_REF,
393             (UINT16)(offsetof(TPMT_TK_HASHCHECK, digest))}},
394 // TPMS_ALG_PROPERTY_DATA
395 {STRUCTURE_MTYPE, 2, {
396         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
397             TPM_ALG_ID_MARSHAL_REF,
398             (UINT16)(offsetof(TPMS_ALG_PROPERTY, alg)),
399         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
400             TPMA_ALGORITHM_MARSHAL_REF,
401             (UINT16)(offsetof(TPMS_ALG_PROPERTY, algProperties))}},
402 // TPMS_TAGGED_PROPERTY_DATA
403 {STRUCTURE_MTYPE, 2, {
404         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
405             TPM_PT_MARSHAL_REF,
406             (UINT16)(offsetof(TPMS_TAGGED_PROPERTY, property)),
407         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
408             UINT32_MARSHAL_REF,
409             (UINT16)(offsetof(TPMS_TAGGED_PROPERTY, value))}},
410 // TPMS_TAGGED_PCR_SELECT_DATA
411 {STRUCTURE_MTYPE, 3, {
412         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
413             TPM_PT_PCR_MARSHAL_REF,
414             (UINT16)(offsetof(TPMS_TAGGED_PCR_SELECT, tag)),
415         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
416             Type08_MARSHAL_REF,
417             (UINT16)(offsetof(TPMS_TAGGED_PCR_SELECT, sizeofSelect)),
418         SET_ELEMENT_TYPE(ARRAY_STYPE)|SET_ELEMENT_NUMBER(1),
419             UINT8_ARRAY_MARSHAL_INDEX,
420             (UINT16)(offsetof(TPMS_TAGGED_PCR_SELECT, pcrSelect))}},
421 // TPMS_TAGGED_POLICY_DATA
422 {STRUCTURE_MTYPE, 2, {
423         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
424             TPM_HANDLE_MARSHAL_REF,
425             (UINT16)(offsetof(TPMS_TAGGED_POLICY, handle)),
426         SET_ELEMENT_TYPE(SIMPLE_STYPE),
427             TPMT_HA_MARSHAL_REF,
428             (UINT16)(offsetof(TPMS_TAGGED_POLICY, policyHash))}},
429 // TPMS_ACT_DATA_DATA
430 {STRUCTURE_MTYPE, 3, {
431         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
432             TPM_HANDLE_MARSHAL_REF,
433             (UINT16)(offsetof(TPMS_ACT_DATA, handle)),
434         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
435             UINT32_MARSHAL_REF,
436             (UINT16)(offsetof(TPMS_ACT_DATA, timeout)),
437         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
438             TPMA_ACT_MARSHAL_REF,
439             (UINT16)(offsetof(TPMS_ACT_DATA, attributes))}},
440 // TPML_CC_DATA
441 {LIST_MTYPE,
442     (UINT8)(offsetof(TPML_CC, commandCodes)),
443     Type15_MARSHAL_REF,
444     TPM_CC_ARRAY_MARSHAL_INDEX},
445 // TPML_CCA_DATA
446 {LIST_MTYPE,
447     (UINT8)(offsetof(TPML_CCA, commandAttributes)),
448     Type15_MARSHAL_REF,
449     TPMA_CC_ARRAY_MARSHAL_INDEX},
450 // TPML_ALG_DATA
451 {LIST_MTYPE,
452     (UINT8)(offsetof(TPML_ALG, algorithms)),
453     Type17_MARSHAL_REF,
454     TPM_ALG_ID_ARRAY_MARSHAL_INDEX},
455 // TPML_HANDLE_DATA
456 {LIST_MTYPE,
457     (UINT8)(offsetof(TPML_HANDLE, handle)),
458     Type18_MARSHAL_REF,
459     TPM_HANDLE_ARRAY_MARSHAL_INDEX},
460 // TPML_DIGEST_DATA
461 {LIST_MTYPE,
462     (UINT8)(offsetof(TPML_DIGEST, digests)),
463     Type19_MARSHAL_REF,
464     TPM2B_DIGEST_ARRAY_MARSHAL_INDEX},
465 // TPML_DIGEST_VALUES_DATA
466 {LIST_MTYPE,
467     (UINT8)(offsetof(TPML_DIGEST_VALUES, digests)),
468     Type20_MARSHAL_REF,
469     TPMT_HA_ARRAY_MARSHAL_INDEX},
470 // TPML_PCR_SELECTION_DATA
471 {LIST_MTYPE,
472     (UINT8)(offsetof(TPML_PCR_SELECTION, pcrSelections)),
473     Type20_MARSHAL_REF,
474     TPMS_PCR_SELECTION_ARRAY_MARSHAL_INDEX},
475 // TPML_ALG_PROPERTY_DATA
476 {LIST_MTYPE,
477     (UINT8)(offsetof(TPML_ALG_PROPERTY, algProperties)),
478     Type22_MARSHAL_REF,
479     TPMS_ALG_PROPERTY_ARRAY_MARSHAL_INDEX},
480 // TPML_TAGGED_TPM_PROPERTY_DATA
481 {LIST_MTYPE,
482     (UINT8)(offsetof(TPML_TAGGED_TPM_PROPERTY, tpmProperty)),
483     Type23_MARSHAL_REF,
484     TPMS_TAGGED_PROPERTY_ARRAY_MARSHAL_INDEX},
485 // TPML_TAGGED_PCR_PROPERTY_DATA
486 {LIST_MTYPE,
487     (UINT8)(offsetof(TPML_TAGGED_PCR_PROPERTY, pcrProperty)),
488     Type24_MARSHAL_REF,
489     TPMS_TAGGED_PCR_SELECT_ARRAY_MARSHAL_INDEX},
490 // TPML_ECC_CURVE_DATA
491 {LIST_MTYPE,
492     (UINT8)(offsetof(TPML_ECC_CURVE, eccCurves)),
493     Type25_MARSHAL_REF,
494     TPM_ECC_CURVE_ARRAY_MARSHAL_INDEX},
495 // TPML_TAGGED_POLICY_DATA
496 {LIST_MTYPE,
497     (UINT8)(offsetof(TPML_TAGGED_POLICY, policies)),
498     Type26_MARSHAL_REF,
499     TPMS_TAGGED_POLICY_ARRAY_MARSHAL_INDEX},
500 // TPML_ACT_DATA_DATA
501 {LIST_MTYPE,
502     (UINT8)(offsetof(TPML_ACT_DATA, actData)),
503     Type27_MARSHAL_REF,
504     TPMS_ACT_DATA_ARRAY_MARSHAL_INDEX},
505 // TPMU_CAPABILITIES_DATA
506 {11, 0, (UINT16)(offsetof(TPMU_CAPABILITIES_mst, marshalingTypes)),
507     {(UINT32)TPM_CAP_ALGS,           (UINT32)TPM_CAP_HANDLES,
508      (UINT32)TPM_CAP_COMMANDS,       (UINT32)TPM_CAP_PP_COMMANDS,
509      (UINT32)TPM_CAP_AUDIT_COMMANDS, (UINT32)TPM_CAP_PCRS,
510      (UINT32)TPM_CAP_TPM_PROPERTIES, (UINT32)TPM_CAP_PCR_PROPERTIES,
511      (UINT32)TPM_CAP_ECC_CURVES,     (UINT32)TPM_CAP_AUTH_POLICIES,
512      (UINT32)TPM_CAP_ACT},
513     {(UINT16)(TPML_ALG_PROPERTY_MARSHAL_REF),
514      (UINT16)(TPML_HANDLE_MARSHAL_REF),
515      (UINT16)(TPML_CCA_MARSHAL_REF),
516      (UINT16)(TPML_CC_MARSHAL_REF),
517      (UINT16)(TPML_CC_MARSHAL_REF),
518      (UINT16)(TPML_PCR_SELECTION_MARSHAL_REF),
519      (UINT16)(TPML_TAGGED_TPM_PROPERTY_MARSHAL_REF),
520      (UINT16)(TPML_TAGGED_PCR_PROPERTY_MARSHAL_REF),
521      (UINT16)(TPML_ECC_CURVE_MARSHAL_REF),
522      (UINT16)(TPML_TAGGED_POLICY_MARSHAL_REF),
523      (UINT16)(TPML_ACT_DATA_MARSHAL_REF)}
524 },
525 // TPMS_CAPABILITY_DATA_DATA
526 {STRUCTURE_MTYPE, 2, {
527         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
528             TPM_CAP_MARSHAL_REF,
529             (UINT16)(offsetof(TPMS_CAPABILITY_DATA, capability)),
530         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
531             TPMU_CAPABILITIES_MARSHAL_REF,
532             (UINT16)(offsetof(TPMS_CAPABILITY_DATA, data))}},
533 // TPMS_CLOCK_INFO_DATA
534 {STRUCTURE_MTYPE, 4, {
535         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(EIGHT_BYTES),
536             UINT64_MARSHAL_REF,
537             (UINT16)(offsetof(TPMS_CLOCK_INFO, clock)),
538         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
539             UINT32_MARSHAL_REF,
540             (UINT16)(offsetof(TPMS_CLOCK_INFO, resetCount)),
541         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
542             UINT32_MARSHAL_REF,
543             (UINT16)(offsetof(TPMS_CLOCK_INFO, restartCount)),
544         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
545             TPMI_YES_NO_MARSHAL_REF,
546             (UINT16)(offsetof(TPMS_CLOCK_INFO, safe))}},
547 // TPMS_TIME_INFO_DATA
548 {STRUCTURE_MTYPE, 2, {
549         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(EIGHT_BYTES),
550             UINT64_MARSHAL_REF,
551             (UINT16)(offsetof(TPMS_TIME_INFO, time)),
552         SET_ELEMENT_TYPE(SIMPLE_STYPE),
553             TPMS_CLOCK_INFO_MARSHAL_REF,
554             (UINT16)(offsetof(TPMS_TIME_INFO, clockInfo))}},
555 // TPMS_TIME_ATTEST_INFO_DATA
556 {STRUCTURE_MTYPE, 2, {
557         SET_ELEMENT_TYPE(SIMPLE_STYPE),
558             TPMS_TIME_INFO_MARSHAL_REF,
559             (UINT16)(offsetof(TPMS_TIME_ATTEST_INFO, time)),
560         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(EIGHT_BYTES),
561             UINT64_MARSHAL_REF,
562             (UINT16)(offsetof(TPMS_TIME_ATTEST_INFO, firmwareVersion))}},
563 // TPMS_CERTIFY_INFO_DATA
564 {STRUCTURE_MTYPE, 2, {
565         SET_ELEMENT_TYPE(SIMPLE_STYPE),
566             TPM2B_NAME_MARSHAL_REF,
567             (UINT16)(offsetof(TPMS_CERTIFY_INFO, name)),
568         SET_ELEMENT_TYPE(SIMPLE_STYPE),
569             TPM2B_NAME_MARSHAL_REF,
570             (UINT16)(offsetof(TPMS_CERTIFY_INFO, qualifiedName))}},
571 // TPMS_QUOTE_INFO_DATA
572 {STRUCTURE_MTYPE, 2, {
573         SET_ELEMENT_TYPE(SIMPLE_STYPE),
574             TPML_PCR_SELECTION_MARSHAL_REF,
575             (UINT16)(offsetof(TPMS_QUOTE_INFO, pcrSelect)),
576         SET_ELEMENT_TYPE(SIMPLE_STYPE),
577             TPM2B_DIGEST_MARSHAL_REF,
578             (UINT16)(offsetof(TPMS_QUOTE_INFO, pcrDigest))}},
579 // TPMS_COMMAND_AUDIT_INFO_DATA
580 {STRUCTURE_MTYPE, 4, {
581         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(EIGHT_BYTES),
582             UINT64_MARSHAL_REF,
583             (UINT16)(offsetof(TPMS_COMMAND_AUDIT_INFO, auditCounter)),
584         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
585             TPM_ALG_ID_MARSHAL_REF,
586             (UINT16)(offsetof(TPMS_COMMAND_AUDIT_INFO, digestAlg)),
587         SET_ELEMENT_TYPE(SIMPLE_STYPE),
588             TPM2B_DIGEST_MARSHAL_REF,
589             (UINT16)(offsetof(TPMS_COMMAND_AUDIT_INFO, auditDigest)),
590         SET_ELEMENT_TYPE(SIMPLE_STYPE),
591             TPM2B_DIGEST_MARSHAL_REF,
592             (UINT16)(offsetof(TPMS_COMMAND_AUDIT_INFO, commandDigest))}},
593 // TPMS_SESSION_AUDIT_INFO_DATA
594 {STRUCTURE_MTYPE, 2, {
595         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
596             TPMI_YES_NO_MARSHAL_REF,
597             (UINT16)(offsetof(TPMS_SESSION_AUDIT_INFO, exclusiveSession)),
598         SET_ELEMENT_TYPE(SIMPLE_STYPE),
599             TPM2B_DIGEST_MARSHAL_REF,
600             (UINT16)(offsetof(TPMS_SESSION_AUDIT_INFO, sessionDigest))}},
601 // TPMS_CREATION_INFO_DATA
602 {STRUCTURE_MTYPE, 2, {
603         SET_ELEMENT_TYPE(SIMPLE_STYPE),
604             TPM2B_NAME_MARSHAL_REF,
605             (UINT16)(offsetof(TPMS_CREATION_INFO, objectName)),
606         SET_ELEMENT_TYPE(SIMPLE_STYPE),
607             TPM2B_DIGEST_MARSHAL_REF,
608             (UINT16)(offsetof(TPMS_CREATION_INFO, creationHash))}},
609 // TPMS_NV_CERTIFY_INFO_DATA
610 {STRUCTURE_MTYPE, 3, {
611         SET_ELEMENT_TYPE(SIMPLE_STYPE),
612             TPM2B_NAME_MARSHAL_REF,
613             (UINT16)(offsetof(TPMS_NV_CERTIFY_INFO, indexName)),
614         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
615             UINT16_MARSHAL_REF,
616             (UINT16)(offsetof(TPMS_NV_CERTIFY_INFO, offset)),
617         SET_ELEMENT_TYPE(SIMPLE_STYPE),
618             TPM2B_MAX_NV_BUFFER_MARSHAL_REF,
619             (UINT16)(offsetof(TPMS_NV_CERTIFY_INFO, nvContents))}},
620 // TPMS_NV_DIGEST_CERTIFY_INFO_DATA
621 {STRUCTURE_MTYPE, 2, {
622         SET_ELEMENT_TYPE(SIMPLE_STYPE),
623             TPM2B_NAME_MARSHAL_REF,
624             (UINT16)(offsetof(TPMS_NV_DIGEST_CERTIFY_INFO, indexName)),
625         SET_ELEMENT_TYPE(SIMPLE_STYPE),
626             TPM2B_DIGEST_MARSHAL_REF,
627             (UINT16)(offsetof(TPMS_NV_DIGEST_CERTIFY_INFO, nvDigest))}},
628 // TPMI_ST_ATTEST_DATA
629 {VALUES_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 1, 1,
630    {RANGE(TPM_ST_ATTEST_NV, TPM_ST_ATTEST_CREATION, UINT16),
631     TPM_ST_ATTEST_NV_DIGEST}},
632 // TPMU_ATTEST_DATA
633 {8, 0, (UINT16)(offsetof(TPMU_ATTEST_mst, marshalingTypes)),
634     {(UINT32)TPM_ST_ATTEST_CERTIFY,       (UINT32)TPM_ST_ATTEST_CREATION,
635      (UINT32)TPM_ST_ATTEST_QUOTE,         (UINT32)TPM_ST_ATTEST_COMMAND_AUDIT,
636      (UINT32)TPM_ST_ATTEST_SESSION_AUDIT, (UINT32)TPM_ST_ATTEST_TIME,
637      (UINT32)TPM_ST_ATTEST_NV,            (UINT32)TPM_ST_ATTEST_NV_DIGEST},
638     {(UINT16)(TPMS_CERTIFY_INFO_MARSHAL_REF),
639      (UINT16)(TPMS_CREATION_INFO_MARSHAL_REF),
640      (UINT16)(TPMS_QUOTE_INFO_MARSHAL_REF),
641      (UINT16)(TPMS_COMMAND_AUDIT_INFO_MARSHAL_REF),
642      (UINT16)(TPMS_SESSION_AUDIT_INFO_MARSHAL_REF),
643      (UINT16)(TPMS_TIME_ATTEST_INFO_MARSHAL_REF),
644      (UINT16)(TPMS_NV_CERTIFY_INFO_MARSHAL_REF),
645      (UINT16)(TPMS_NV_DIGEST_CERTIFY_INFO_MARSHAL_REF)}
646 },
647 // TPMS_ATTEST_DATA
648 {STRUCTURE_MTYPE, 7, {
649         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
650             TPM_CONSTANTS32_MARSHAL_REF,
651             (UINT16)(offsetof(TPMS_ATTEST, magic)),
652         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
653             TPMI_ST_ATTEST_MARSHAL_REF,
654             (UINT16)(offsetof(TPMS_ATTEST, type)),
655         SET_ELEMENT_TYPE(SIMPLE_STYPE),
656             TPM2B_NAME_MARSHAL_REF,
657             (UINT16)(offsetof(TPMS_ATTEST, qualifiedSigner)),
658         SET_ELEMENT_TYPE(SIMPLE_STYPE),
659             TPM2B_DATA_MARSHAL_REF,
660             (UINT16)(offsetof(TPMS_ATTEST, extraData)),
661         SET_ELEMENT_TYPE(SIMPLE_STYPE),
662             TPMS_CLOCK_INFO_MARSHAL_REF,
663             (UINT16)(offsetof(TPMS_ATTEST, clockInfo)),
664         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(EIGHT_BYTES),
665             UINT64_MARSHAL_REF,
666             (UINT16)(offsetof(TPMS_ATTEST, firmwareVersion)),
667         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(1),
668             TPMU_ATTEST_MARSHAL_REF,
669             (UINT16)(offsetof(TPMS_ATTEST, attested))}},
670 // TPM2B_ATTEST_DATA
671 {TPM2B_MTYPE, Type28_MARSHAL_REF},
672 // TPMS_AUTH_COMMAND_DATA
673 {STRUCTURE_MTYPE, 4, {
674         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
675             TPMI_SH_AUTH_SESSION_MARSHAL_REF|NULL_FLAG,
676             (UINT16)(offsetof(TPMS_AUTH_COMMAND, sessionHandle)),
677         SET_ELEMENT_TYPE(SIMPLE_STYPE),
678             TPM2B_NONCE_MARSHAL_REF,
679             (UINT16)(offsetof(TPMS_AUTH_COMMAND, nonce)),
680         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
681             TPMA_SESSION_MARSHAL_REF,
682             (UINT16)(offsetof(TPMS_AUTH_COMMAND, sessionAttributes)),
683         SET_ELEMENT_TYPE(SIMPLE_STYPE),
684             TPM2B_AUTH_MARSHAL_REF,
685             (UINT16)(offsetof(TPMS_AUTH_COMMAND, hmac))}},
686 // TPMS_AUTH_RESPONSE_DATA
687 {STRUCTURE_MTYPE, 3, {
688         SET_ELEMENT_TYPE(SIMPLE_STYPE),
689             TPM2B_NONCE_MARSHAL_REF,
690             (UINT16)(offsetof(TPMS_AUTH_RESPONSE, nonce)),
691         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
692             TPMA_SESSION_MARSHAL_REF,
693             (UINT16)(offsetof(TPMS_AUTH_RESPONSE, sessionAttributes)),
694         SET_ELEMENT_TYPE(SIMPLE_STYPE),
695             TPM2B_AUTH_MARSHAL_REF,
696             (UINT16)(offsetof(TPMS_AUTH_RESPONSE, hmac))}},
697 // TPMI_TDES_KEY_BITS_DATA
698 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 1,
699     {128*TDES_128}},
700 // TPMI_AES_KEY_BITS_DATA
701 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 3,
702     {192*AES_192, 128*AES_128, 256*AES_256}},
703 // TPMI_SM4_KEY_BITS_DATA
704 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 1,
705     {128*SM4_128}},
706 // TPMI_CAMELLIA_KEY_BITS_DATA
707 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 3,
708     {192*CAMELLIA_192, 128*CAMELLIA_128, 256*CAMELLIA_256}},
709 // TPMU_SYM_KEY_BITS_DATA
710 {6, 0, (UINT16)(offsetof(TPMU_SYM_KEY_BITS_mst, marshalingTypes)),
711     {(UINT32)TPM_ALG_TDES,     (UINT32)TPM_ALG_AES,      (UINT32)TPM_ALG_SM4,
712      (UINT32)TPM_ALG_CAMELLIA, (UINT32)TPM_ALG_XOR,      (UINT32)TPM_ALG_NULL},
713     {(UINT16)(TPMI_TDES_KEY_BITS_MARSHAL_REF),
714      (UINT16)(TPMI_AES_KEY_BITS_MARSHAL_REF),
715      (UINT16)(TPMI_SM4_KEY_BITS_MARSHAL_REF),
716      (UINT16)(TPMI_CAMELLIA_KEY_BITS_MARSHAL_REF),
717      (UINT16)(TPMI_ALG_HASH_MARSHAL_REF),
718      (UINT16)(UINT0_MARSHAL_REF)}
719 },
720 // TPMU_SYM_MODE_DATA
721 {6, 0, (UINT16)(offsetof(TPMU_SYM_MODE_mst, marshalingTypes)),
722     {(UINT32)TPM_ALG_TDES,     (UINT32)TPM_ALG_AES,      (UINT32)TPM_ALG_SM4,
723      (UINT32)TPM_ALG_CAMELLIA, (UINT32)TPM_ALG_XOR,      (UINT32)TPM_ALG_NULL},
724     {(UINT16)(TPMI_ALG_SYM_MODE_MARSHAL_REF|NULL_FLAG),
725      (UINT16)(TPMI_ALG_SYM_MODE_MARSHAL_REF|NULL_FLAG),
726      (UINT16)(TPMI_ALG_SYM_MODE_MARSHAL_REF|NULL_FLAG),
727      (UINT16)(TPMI_ALG_SYM_MODE_MARSHAL_REF|NULL_FLAG),
728      (UINT16)(UINT0_MARSHAL_REF),
729      (UINT16)(UINT0_MARSHAL_REF)}
730 },
731 // TPMT_SYM_DEF_DATA
732 {STRUCTURE_MTYPE, 3, {
733         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
734             TPMI_ALG_SYM_MARSHAL_REF,
735             (UINT16)(offsetof(TPMT_SYM_DEF, algorithm)),
736         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
737             TPMU_SYM_KEY_BITS_MARSHAL_REF,
738             (UINT16)(offsetof(TPMT_SYM_DEF, keyBits)),
739         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
740             TPMU_SYM_MODE_MARSHAL_REF,
741             (UINT16)(offsetof(TPMT_SYM_DEF, mode))}},
742 // TPMT_SYM_DEF_OBJECT_DATA
743 {STRUCTURE_MTYPE, 3, {
744         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
745             TPMI_ALG_SYM_OBJECT_MARSHAL_REF,
746             (UINT16)(offsetof(TPMT_SYM_DEF_OBJECT, algorithm)),
747         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
748             TPMU_SYM_KEY_BITS_MARSHAL_REF,
749             (UINT16)(offsetof(TPMT_SYM_DEF_OBJECT, keyBits)),
750         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
751             TPMU_SYM_MODE_MARSHAL_REF,
752             (UINT16)(offsetof(TPMT_SYM_DEF_OBJECT, mode))}},
753 // TPM2B_SYM_KEY_DATA
754 {TPM2B_MTYPE, Type29_MARSHAL_REF},
755 // TPMS_SYMCIPHER_PARMS_DATA
756 {STRUCTURE_MTYPE, 1, {
757         SET_ELEMENT_TYPE(SIMPLE_STYPE),
758             TPMT_SYM_DEF_OBJECT_MARSHAL_REF,
759             (UINT16)(offsetof(TPMS_SYMCIPHER_PARMS, sym))}},
760 // TPM2B_LABEL_DATA
761 {TPM2B_MTYPE, Type30_MARSHAL_REF},
762 // TPMS_DERIVE_DATA
763 {STRUCTURE_MTYPE, 2, {
764         SET_ELEMENT_TYPE(SIMPLE_STYPE),
765             TPM2B_LABEL_MARSHAL_REF,
766             (UINT16)(offsetof(TPMS_DERIVE, label)),
767         SET_ELEMENT_TYPE(SIMPLE_STYPE),
768             TPM2B_LABEL_MARSHAL_REF,
769             (UINT16)(offsetof(TPMS_DERIVE, context))}},
770 // TPM2B_DERIVE_DATA
771 {TPM2B_MTYPE, Type31_MARSHAL_REF},
772 // TPM2B_SENSITIVE_DATA_DATA
773 {TPM2B_MTYPE, Type32_MARSHAL_REF},
774 // TPMS_SENSITIVE_CREATE_DATA
775 {STRUCTURE_MTYPE, 2, {
776         SET_ELEMENT_TYPE(SIMPLE_STYPE),
777             TPM2B_AUTH_MARSHAL_REF,
778             (UINT16)(offsetof(TPMS_SENSITIVE_CREATE, userAuth)),
779         SET_ELEMENT_TYPE(SIMPLE_STYPE),
780             TPM2B_SENSITIVE_DATA_MARSHAL_REF,
781             (UINT16)(offsetof(TPMS_SENSITIVE_CREATE, data))}},
782 // TPM2B_SENSITIVE_CREATE_DATA
783 {TPM2BS_MTYPE,
784     (UINT8)(offsetof(TPM2B_SENSITIVE_CREATE, sensitive))|SIZE_EQUAL,
785     UINT16_MARSHAL_REF,
786     TPMS_SENSITIVE_CREATE_MARSHAL_REF},
787 // TPMS_SCHEME_HASH_DATA
788 {STRUCTURE_MTYPE, 1, {
789         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
790             TPMI_ALG_HASH_MARSHAL_REF,
791             (UINT16)(offsetof(TPMS_SCHEME_HASH, hashAlg))}},
792 // TPMS_SCHEME_ECDAA_DATA
793 {STRUCTURE_MTYPE, 2, {
794         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
795             TPMI_ALG_HASH_MARSHAL_REF,
796             (UINT16)(offsetof(TPMS_SCHEME_ECDAA, hashAlg)),
797         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
798             UINT16_MARSHAL_REF,
799             (UINT16)(offsetof(TPMS_SCHEME_ECDAA, count))}},
800 // TPMI_ALG_KEYEDHASH_SCHEME_DATA
801 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_VALUE,
802     {TPM_ALG_NULL,
803     RANGE(5, 10, UINT16),
804     (UINT32)((ALG_HMAC << 0)|(ALG_XOR << 5))}},
805 // TPMS_SCHEME_XOR_DATA
806 {STRUCTURE_MTYPE, 2, {
807         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
808             TPMI_ALG_HASH_MARSHAL_REF,
809             (UINT16)(offsetof(TPMS_SCHEME_XOR, hashAlg)),
810         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
811             TPMI_ALG_KDF_MARSHAL_REF|NULL_FLAG,
812             (UINT16)(offsetof(TPMS_SCHEME_XOR, kdf))}},
813 // TPMU_SCHEME_KEYEDHASH_DATA
814 {3, 0, (UINT16)(offsetof(TPMU_SCHEME_KEYEDHASH_mst, marshalingTypes)),
815     {(UINT32)TPM_ALG_HMAC, (UINT32)TPM_ALG_XOR, (UINT32)TPM_ALG_NULL},
816     {(UINT16)(TPMS_SCHEME_HMAC_MARSHAL_REF),
817      (UINT16)(TPMS_SCHEME_XOR_MARSHAL_REF),
818      (UINT16)(UINT0_MARSHAL_REF)}
819 },
820 // TPMT_KEYEDHASH_SCHEME_DATA
821 {STRUCTURE_MTYPE, 2, {
822         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
823             TPMI_ALG_KEYEDHASH_SCHEME_MARSHAL_REF,
824             (UINT16)(offsetof(TPMT_KEYEDHASH_SCHEME, scheme)),
825         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
826             TPMU_SCHEME_KEYEDHASH_MARSHAL_REF,
827             (UINT16)(offsetof(TPMT_KEYEDHASH_SCHEME, details))}},
828 // TPMU_SIG_SCHEME_DATA
829 {8, 0, (UINT16)(offsetof(TPMU_SIG_SCHEME_mst, marshalingTypes)),
830     {(UINT32)TPM_ALG_ECDAA,     (UINT32)TPM_ALG_RSASSA,
831      (UINT32)TPM_ALG_RSAPSS,    (UINT32)TPM_ALG_ECDSA,
832      (UINT32)TPM_ALG_SM2,       (UINT32)TPM_ALG_ECSCHNORR,
833      (UINT32)TPM_ALG_HMAC,      (UINT32)TPM_ALG_NULL},
834     {(UINT16)(TPMS_SIG_SCHEME_ECDAA_MARSHAL_REF),
835      (UINT16)(TPMS_SIG_SCHEME_RSASSA_MARSHAL_REF),
836      (UINT16)(TPMS_SIG_SCHEME_RSAPSS_MARSHAL_REF),
837      (UINT16)(TPMS_SIG_SCHEME_ECDSA_MARSHAL_REF),
838      (UINT16)(TPMS_SIG_SCHEME_SM2_MARSHAL_REF),
839      (UINT16)(TPMS_SIG_SCHEME_ECSCHNORR_MARSHAL_REF),
840      (UINT16)(TPMS_SCHEME_HMAC_MARSHAL_REF),
841      (UINT16)(UINT0_MARSHAL_REF)}
842 },
843 // TPMT_SIG_SCHEME_DATA
844 {STRUCTURE_MTYPE, 2, {
845         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
846             TPMI_ALG_SIG_SCHEME_MARSHAL_REF,
847             (UINT16)(offsetof(TPMT_SIG_SCHEME, scheme)),
848         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
849             TPMU_SIG_SCHEME_MARSHAL_REF,
850             (UINT16)(offsetof(TPMT_SIG_SCHEME, details))}},
851 // TPMU_KDF_SCHEME_DATA
852 {5, 0, (UINT16)(offsetof(TPMU_KDF_SCHEME_mst, marshalingTypes)),
853     {(UINT32)TPM_ALG_MGF1,           (UINT32)TPM_ALG_KDF1_SP800_56A,
854      (UINT32)TPM_ALG_KDF2,           (UINT32)TPM_ALG_KDF1_SP800_108,
855      (UINT32)TPM_ALG_NULL},
856     {(UINT16)(TPMS_KDF_SCHEME_MGF1_MARSHAL_REF),
857      (UINT16)(TPMS_KDF_SCHEME_KDF1_SP800_56A_MARSHAL_REF),
858      (UINT16)(TPMS_KDF_SCHEME_KDF2_MARSHAL_REF),
859      (UINT16)(TPMS_KDF_SCHEME_KDF1_SP800_108_MARSHAL_REF),
860      (UINT16)(UINT0_MARSHAL_REF)}
861 },
862 // TPMT_KDF_SCHEME_DATA
863 {STRUCTURE_MTYPE, 2, {
864         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
865             TPMI_ALG_KDF_MARSHAL_REF,
866             (UINT16)(offsetof(TPMT_KDF_SCHEME, scheme)),
867         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
868             TPMU_KDF_SCHEME_MARSHAL_REF,
869             (UINT16)(offsetof(TPMT_KDF_SCHEME, details))}},
870 // TPMI_ALG_ASYM_SCHEME_DATA
871 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_VALUE,
872     {TPM_ALG_NULL,
873     RANGE(20, 29, UINT16),
874     (UINT32)((ALG_RSASSA << 0)    | (ALG_RSAES << 1)     | (ALG_RSAPSS << 2)    |
875              (ALG_OAEP << 3)      | (ALG_ECDSA << 4)     | (ALG_ECDH << 5)      |
876              (ALG_ECDAA << 6)     | (ALG_SM2 << 7)       | (ALG_ECSCHNORR << 8) |
877              (ALG_ECMQV << 9))}},
878 // TPMU_ASYM_SCHEME_DATA
879 {11, 0, (UINT16)(offsetof(TPMU_ASYM_SCHEME_mst, marshalingTypes)),
880     {(UINT32)TPM_ALG_ECDH,      (UINT32)TPM_ALG_ECMQV,
881      (UINT32)TPM_ALG_ECDAA,     (UINT32)TPM_ALG_RSASSA,
882      (UINT32)TPM_ALG_RSAPSS,    (UINT32)TPM_ALG_ECDSA,
883      (UINT32)TPM_ALG_SM2,       (UINT32)TPM_ALG_ECSCHNORR,
884      (UINT32)TPM_ALG_RSAES,     (UINT32)TPM_ALG_OAEP,
885      (UINT32)TPM_ALG_NULL},
886     {(UINT16)(TPMS_KEY_SCHEME_ECDH_MARSHAL_REF),
887      (UINT16)(TPMS_KEY_SCHEME_ECMQV_MARSHAL_REF),
888      (UINT16)(TPMS_SIG_SCHEME_ECDAA_MARSHAL_REF),
889      (UINT16)(TPMS_SIG_SCHEME_RSASSA_MARSHAL_REF),
890      (UINT16)(TPMS_SIG_SCHEME_RSAPSS_MARSHAL_REF),
891      (UINT16)(TPMS_SIG_SCHEME_ECDSA_MARSHAL_REF),
892      (UINT16)(TPMS_SIG_SCHEME_SM2_MARSHAL_REF),
893      (UINT16)(TPMS_SIG_SCHEME_ECSCHNORR_MARSHAL_REF),
894      (UINT16)(TPMS_ENC_SCHEME_RSAES_MARSHAL_REF),
895      (UINT16)(TPMS_ENC_SCHEME_OAEP_MARSHAL_REF),
896      (UINT16)(UINT0_MARSHAL_REF)}
897 },
898 // TPMI_ALG_RSA_SCHEME_DATA
899 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_VALUE,
900     {TPM_ALG_NULL,
901     RANGE(20, 23, UINT16),
902     (UINT32)((ALG_RSASSA << 0)|(ALG_RSAES << 1)|(ALG_RSAPSS << 2)|(ALG_OAEP << 3))}},
903 // TPMT_RSA_SCHEME_DATA
904 {STRUCTURE_MTYPE, 2, {
905         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
906             TPMI_ALG_RSA_SCHEME_MARSHAL_REF,
907             (UINT16)(offsetof(TPMT_RSA_SCHEME, scheme)),
908         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
909             TPMU_ASYM_SCHEME_MARSHAL_REF,
910             (UINT16)(offsetof(TPMT_RSA_SCHEME, details))}},
911 // TPMI_ALG_RSA_DECRYPT_DATA
912 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_VALUE,
913     {TPM_ALG_NULL,
914     RANGE(21, 23, UINT16),
915     (UINT32)((ALG_RSAES << 0)|(ALG_OAEP << 2))}},
916 // TPMT_RSA_DECRYPT_DATA
917 {STRUCTURE_MTYPE, 2, {
918         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
919             TPMI_ALG_RSA_DECRYPT_MARSHAL_REF,
920             (UINT16)(offsetof(TPMT_RSA_DECRYPT, scheme)),
921         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
922             TPMU_ASYM_SCHEME_MARSHAL_REF,
923             (UINT16)(offsetof(TPMT_RSA_DECRYPT, details))}},
924 // TPM2B_PUBLIC_KEY_RSA_DATA
925 {TPM2B_MTYPE, Type33_MARSHAL_REF},
926 // TPMI_RSA_KEY_BITS_DATA
927 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_VALUE, 3,
928     {3072*RSA_3072, 1024*RSA_1024, 2048*RSA_2048}},
929 // TPM2B_PRIVATE_KEY_RSA_DATA
930 {TPM2B_MTYPE, Type34_MARSHAL_REF},
931 // TPM2B_ECC_PARAMETER_DATA
932 {TPM2B_MTYPE, Type35_MARSHAL_REF},
933 // TPMS_ECC_POINT_DATA
934 {STRUCTURE_MTYPE, 2, {
935         SET_ELEMENT_TYPE(SIMPLE_STYPE),
936             TPM2B_ECC_PARAMETER_MARSHAL_REF,
937             (UINT16)(offsetof(TPMS_ECC_POINT, x)),
938         SET_ELEMENT_TYPE(SIMPLE_STYPE),
939             TPM2B_ECC_PARAMETER_MARSHAL_REF,
940             (UINT16)(offsetof(TPMS_ECC_POINT, y))}},
941 // TPM2B_ECC_POINT_DATA
942 {TPM2BS_MTYPE,
943     (UINT8)(offsetof(TPM2B_ECC_POINT, point))|SIZE_EQUAL,
944     UINT16_MARSHAL_REF,
945     TPMS_ECC_POINT_MARSHAL_REF},
946 // TPMI_ALG_ECC_SCHEME_DATA
947 {MIN_MAX_MTYPE, TWO_BYTES|TAKES_NULL|HAS_BITS, (UINT8)TPM_RC_SCHEME,
948     {TPM_ALG_NULL,
949     RANGE(24, 29, UINT16),
950     (UINT32)((ALG_ECDSA << 0)     | (ALG_ECDH << 1)      | (ALG_ECDAA << 2)     |
951              (ALG_SM2 << 3)       | (ALG_ECSCHNORR << 4) | (ALG_ECMQV << 5))}},
952 // TPMI_ECC_CURVE_DATA
953 {MIN_MAX_MTYPE, TWO_BYTES|HAS_BITS, (UINT8)TPM_RC_CURVE,
954     {RANGE(1, 32, UINT16),
955     (UINT32)((ECC_NIST_P192 << 0) | (ECC_NIST_P224 << 1) | (ECC_NIST_P256 << 2) |
956              (ECC_NIST_P384 << 3) | (ECC_NIST_P521 << 4) | (ECC_BN_P256 << 15)  |
957              (ECC_BN_P638 << 16)  | (ECC_SM2_P256 << 31))}},
958 // TPMT_ECC_SCHEME_DATA
959 {STRUCTURE_MTYPE, 2, {
960         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
961             TPMI_ALG_ECC_SCHEME_MARSHAL_REF,
962             (UINT16)(offsetof(TPMT_ECC_SCHEME, scheme)),
963         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
964             TPMU_ASYM_SCHEME_MARSHAL_REF,
965             (UINT16)(offsetof(TPMT_ECC_SCHEME, details))}},
966 // TPMS_ALGORITHM_DETAIL_ECC_DATA
967 {STRUCTURE_MTYPE, 11, {
968         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
969             TPM_ECC_CURVE_MARSHAL_REF,
970             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, curveID)),
971         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
972             UINT16_MARSHAL_REF,
973             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, keySize)),
974         SET_ELEMENT_TYPE(SIMPLE_STYPE),
975             TPMT_KDF_SCHEME_MARSHAL_REF|NULL_FLAG,
976             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, kdf)),
977         SET_ELEMENT_TYPE(SIMPLE_STYPE),
978             TPMT_ECC_SCHEME_MARSHAL_REF|NULL_FLAG,
979             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, sign)),
980         SET_ELEMENT_TYPE(SIMPLE_STYPE),
981             TPM2B_ECC_PARAMETER_MARSHAL_REF,
982             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, p)),
983         SET_ELEMENT_TYPE(SIMPLE_STYPE),
984             TPM2B_ECC_PARAMETER_MARSHAL_REF,
985             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, a)),
986         SET_ELEMENT_TYPE(SIMPLE_STYPE),
987             TPM2B_ECC_PARAMETER_MARSHAL_REF,
988             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, b)),
989         SET_ELEMENT_TYPE(SIMPLE_STYPE),
990             TPM2B_ECC_PARAMETER_MARSHAL_REF,
991             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, gX)),
992         SET_ELEMENT_TYPE(SIMPLE_STYPE),
993             TPM2B_ECC_PARAMETER_MARSHAL_REF,
994             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, gY)),
995         SET_ELEMENT_TYPE(SIMPLE_STYPE),
996             TPM2B_ECC_PARAMETER_MARSHAL_REF,
997             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, n)),
998         SET_ELEMENT_TYPE(SIMPLE_STYPE),
999             TPM2B_ECC_PARAMETER_MARSHAL_REF,
1000             (UINT16)(offsetof(TPMS_ALGORITHM_DETAIL_ECC, h))}},
1001 // TPMS_SIGNATURE_RSA_DATA
1002 {STRUCTURE_MTYPE, 2, {
1003         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1004             TPMI_ALG_HASH_MARSHAL_REF,
1005             (UINT16)(offsetof(TPMS_SIGNATURE_RSA, hash)),
1006         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1007             TPM2B_PUBLIC_KEY_RSA_MARSHAL_REF,
1008             (UINT16)(offsetof(TPMS_SIGNATURE_RSA, sig))}},
1009 // TPMS_SIGNATURE_ECC_DATA
1010 {STRUCTURE_MTYPE, 3, {
1011         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1012             TPMI_ALG_HASH_MARSHAL_REF,
1013             (UINT16)(offsetof(TPMS_SIGNATURE_ECC, hash)),
1014         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1015             TPM2B_ECC_PARAMETER_MARSHAL_REF,
1016             (UINT16)(offsetof(TPMS_SIGNATURE_ECC, signatureR)),
1017         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1018             TPM2B_ECC_PARAMETER_MARSHAL_REF,
1019             (UINT16)(offsetof(TPMS_SIGNATURE_ECC, signatureS))}},
1020 // TPMU_SIGNATURE_DATA
1021 {8, 0, (UINT16)(offsetof(TPMU_SIGNATURE_mst, marshalingTypes)),
1022     {(UINT32)TPM_ALG_ECDAA,     (UINT32)TPM_ALG_RSASSA,
1023      (UINT32)TPM_ALG_RSAPSS,    (UINT32)TPM_ALG_ECDSA,
1024      (UINT32)TPM_ALG_SM2,       (UINT32)TPM_ALG_ECSCHNORR,
1025      (UINT32)TPM_ALG_HMAC,      (UINT32)TPM_ALG_NULL},
1026     {(UINT16)(TPMS_SIGNATURE_ECDAA_MARSHAL_REF),
1027      (UINT16)(TPMS_SIGNATURE_RSASSA_MARSHAL_REF),
1028      (UINT16)(TPMS_SIGNATURE_RSAPSS_MARSHAL_REF),
1029      (UINT16)(TPMS_SIGNATURE_ECDSA_MARSHAL_REF),
1030      (UINT16)(TPMS_SIGNATURE_SM2_MARSHAL_REF),
1031      (UINT16)(TPMS_SIGNATURE_ECSCHNORR_MARSHAL_REF),
1032      (UINT16)(TPMT_HA_MARSHAL_REF),
1033      (UINT16)(UINT0_MARSHAL_REF)}
1034 },
1035 // TPMT_SIGNATURE_DATA
1036 {STRUCTURE_MTYPE, 2, {
1037         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
1038             TPMI_ALG_SIG_SCHEME_MARSHAL_REF,
1039             (UINT16)(offsetof(TPMT_SIGNATURE, sigAlg)),
1040         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
1041             TPMU_SIGNATURE_MARSHAL_REF,
1042             (UINT16)(offsetof(TPMT_SIGNATURE, signature))}},
1043 // TPMU_ENCRYPTED_SECRET_DATA
1044 {4, IS_ARRAY_UNION, (UINT16)(offsetof(TPMU_ENCRYPTED_SECRET_mst, marshalingTypes)),
1045     {(UINT32)TPM_ALG_ECC,       (UINT32)TPM_ALG_RSA,
1046      (UINT32)TPM_ALG_SYMCIPHER, (UINT32)TPM_ALG_KEYEDHASH},
1047     {(UINT16)(sizeof(TPMS_ECC_POINT)), (UINT16)(MAX_RSA_KEY_BYTES),
1048      (UINT16)(sizeof(TPM2B_DIGEST)),   (UINT16)(sizeof(TPM2B_DIGEST))}
1049 },
1050 // TPM2B_ENCRYPTED_SECRET_DATA
1051 {TPM2B_MTYPE, Type36_MARSHAL_REF},
1052 // TPMI_ALG_PUBLIC_DATA
1053 {MIN_MAX_MTYPE, TWO_BYTES|HAS_BITS, (UINT8)TPM_RC_TYPE,
1054     {RANGE(1, 37, UINT16),
1055     (UINT32)((ALG_RSA << 0)|(ALG_KEYEDHASH << 7)),
1056     (UINT32)((ALG_ECC << 2)|(ALG_SYMCIPHER << 4))}},
1057 // TPMU_PUBLIC_ID_DATA
1058 {4, 0, (UINT16)(offsetof(TPMU_PUBLIC_ID_mst, marshalingTypes)),
1059     {(UINT32)TPM_ALG_KEYEDHASH, (UINT32)TPM_ALG_SYMCIPHER,
1060      (UINT32)TPM_ALG_RSA,       (UINT32)TPM_ALG_ECC},
1061     {(UINT16)(TPM2B_DIGEST_MARSHAL_REF),
1062      (UINT16)(TPM2B_DIGEST_MARSHAL_REF),
1063      (UINT16)(TPM2B_PUBLIC_KEY_RSA_MARSHAL_REF),
1064      (UINT16)(TPMS_ECC_POINT_MARSHAL_REF)}
1065 },
1066 // TPMS_KEYEDHASH_PARMS_DATA
1067 {STRUCTURE_MTYPE, 1, {
1068         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1069             TPMT_KEYEDHASH_SCHEME_MARSHAL_REF|NULL_FLAG,
1070             (UINT16)(offsetof(TPMS_KEYEDHASH_PARMS, scheme))}},
1071 // TPMS_RSA_PARMS_DATA
1072 {STRUCTURE_MTYPE, 4, {
1073         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1074             TPMT_SYM_DEF_OBJECT_MARSHAL_REF|NULL_FLAG,
1075             (UINT16)(offsetof(TPMS_RSA_PARMS, symmetric)),
1076         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1077             TPMT_RSA_SCHEME_MARSHAL_REF|NULL_FLAG,
1078             (UINT16)(offsetof(TPMS_RSA_PARMS, scheme)),
1079         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1080             TPMI_RSA_KEY_BITS_MARSHAL_REF,
1081             (UINT16)(offsetof(TPMS_RSA_PARMS, keyBits)),
1082         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1083             UINT32_MARSHAL_REF,
1084             (UINT16)(offsetof(TPMS_RSA_PARMS, exponent))}},
1085 // TPMS_ECC_PARMS_DATA
1086 {STRUCTURE_MTYPE, 4, {
1087         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1088             TPMT_SYM_DEF_OBJECT_MARSHAL_REF|NULL_FLAG,
1089             (UINT16)(offsetof(TPMS_ECC_PARMS, symmetric)),
1090         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1091             TPMT_ECC_SCHEME_MARSHAL_REF|NULL_FLAG,
1092             (UINT16)(offsetof(TPMS_ECC_PARMS, scheme)),
1093         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1094             TPMI_ECC_CURVE_MARSHAL_REF,
1095             (UINT16)(offsetof(TPMS_ECC_PARMS, curveID)),
1096         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1097             TPMT_KDF_SCHEME_MARSHAL_REF|NULL_FLAG,
1098             (UINT16)(offsetof(TPMS_ECC_PARMS, kdf))}},
1099 // TPMU_PUBLIC_PARMS_DATA
1100 {4, 0, (UINT16)(offsetof(TPMU_PUBLIC_PARMS_mst, marshalingTypes)),
1101     {(UINT32)TPM_ALG_KEYEDHASH, (UINT32)TPM_ALG_SYMCIPHER,
1102      (UINT32)TPM_ALG_RSA,       (UINT32)TPM_ALG_ECC},
1103     {(UINT16)(TPMS_KEYEDHASH_PARMS_MARSHAL_REF),
1104      (UINT16)(TPMS_SYMCIPHER_PARMS_MARSHAL_REF),
1105      (UINT16)(TPMS_RSA_PARMS_MARSHAL_REF),
1106      (UINT16)(TPMS_ECC_PARMS_MARSHAL_REF)}
1107 },
1108 // TPMT_PUBLIC_PARMS_DATA
1109 {STRUCTURE_MTYPE, 2, {
1110         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1111             TPMI_ALG_PUBLIC_MARSHAL_REF,
1112             (UINT16)(offsetof(TPMT_PUBLIC_PARMS, type)),
1113         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
1114             TPMU_PUBLIC_PARMS_MARSHAL_REF,
1115             (UINT16)(offsetof(TPMT_PUBLIC_PARMS, parameters))}},
1116 // TPMT_PUBLIC_DATA
1117 {STRUCTURE_MTYPE, 6, {
1118         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1119             TPMI_ALG_PUBLIC_MARSHAL_REF,
1120             (UINT16)(offsetof(TPMT_PUBLIC, type)),
1121         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES)|ELEMENT_PROPAGATE,
1122             TPMI_ALG_HASH_MARSHAL_REF,
1123             (UINT16)(offsetof(TPMT_PUBLIC, nameAlg)),
1124         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1125             TPMA_OBJECT_MARSHAL_REF,
1126             (UINT16)(offsetof(TPMT_PUBLIC, objectAttributes)),
1127         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1128             TPM2B_DIGEST_MARSHAL_REF,
1129             (UINT16)(offsetof(TPMT_PUBLIC, authPolicy)),
1130         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
1131             TPMU_PUBLIC_PARMS_MARSHAL_REF,
1132             (UINT16)(offsetof(TPMT_PUBLIC, parameters)),
1133         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
1134             TPMU_PUBLIC_ID_MARSHAL_REF,
1135             (UINT16)(offsetof(TPMT_PUBLIC, unique))}},
1136 // TPM2B_PUBLIC_DATA
1137 {TPM2BS_MTYPE,
1138     (UINT8)(offsetof(TPM2B_PUBLIC, publicArea))|SIZE_EQUAL|ELEMENT_PROPAGATE,
1139     UINT16_MARSHAL_REF,
1140     TPMT_PUBLIC_MARSHAL_REF},
1141 // TPM2B_TEMPLATE_DATA
1142 {TPM2B_MTYPE, Type37_MARSHAL_REF},
1143 // TPM2B_PRIVATE_VENDOR_SPECIFIC_DATA
1144 {TPM2B_MTYPE, Type38_MARSHAL_REF},
1145 // TPMU_SENSITIVE_COMPOSITE_DATA
1146 {4, 0, (UINT16)(offsetof(TPMU_SENSITIVE_COMPOSITE_mst, marshalingTypes)),
1147     {(UINT32)TPM_ALG_RSA,       (UINT32)TPM_ALG_ECC,
1148      (UINT32)TPM_ALG_KEYEDHASH, (UINT32)TPM_ALG_SYMCIPHER},
1149     {(UINT16)(TPM2B_PRIVATE_KEY_RSA_MARSHAL_REF),
1150      (UINT16)(TPM2B_ECC_PARAMETER_MARSHAL_REF),
1151      (UINT16)(TPM2B_SENSITIVE_DATA_MARSHAL_REF),
1152      (UINT16)(TPM2B_SYM_KEY_MARSHAL_REF)}
1153 },
1154 // TPMT_SENSITIVE_DATA
1155 {STRUCTURE_MTYPE, 4, {
1156         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1157             TPMI_ALG_PUBLIC_MARSHAL_REF,
1158             (UINT16)(offsetof(TPMT_SENSITIVE, sensitiveType)),
1159         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1160             TPM2B_AUTH_MARSHAL_REF,
1161             (UINT16)(offsetof(TPMT_SENSITIVE, authValue)),
1162         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1163             TPM2B_DIGEST_MARSHAL_REF,
1164             (UINT16)(offsetof(TPMT_SENSITIVE, seedValue)),
1165         SET_ELEMENT_TYPE(UNION_STYPE)|SET_ELEMENT_NUMBER(0),
1166             TPMU_SENSITIVE_COMPOSITE_MARSHAL_REF,
1167             (UINT16)(offsetof(TPMT_SENSITIVE, sensitive))}},
1168 // TPM2B_SENSITIVE_DATA
1169 {TPM2BS_MTYPE,
1170     (UINT8)(offsetof(TPM2B_SENSITIVE, sensitiveArea)),
1171     UINT16_MARSHAL_REF,
1172     TPMT_SENSITIVE_MARSHAL_REF},
1173 // TPM2B_PRIVATE_DATA
1174 {TPM2B_MTYPE, Type39_MARSHAL_REF},
1175 // TPM2B_ID_OBJECT_DATA
1176 {TPM2B_MTYPE, Type40_MARSHAL_REF},
1177 // TPMS_NV_PIN_COUNTER_PARAMETERS_DATA
1178 {STRUCTURE_MTYPE, 2, {
1179         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1180             UINT32_MARSHAL_REF,
1181             (UINT16)(offsetof(TPMS_NV_PIN_COUNTER_PARAMETERS, pinCount)),
1182         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1183             UINT32_MARSHAL_REF,
1184             (UINT16)(offsetof(TPMS_NV_PIN_COUNTER_PARAMETERS, pinLimit))}},
1185 // TPMA_NV_DATA
1186 {ATTRIBUTES_MTYPE, FOUR_BYTES, 0x01F00300},
1187 // TPMS_NV_PUBLIC_DATA
1188 {STRUCTURE_MTYPE, 5, {
1189         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1190             TPMI_RH_NV_INDEX_MARSHAL_REF,
1191             (UINT16)(offsetof(TPMS_NV_PUBLIC, nvIndex)),
1192         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1193             TPMI_ALG_HASH_MARSHAL_REF,
1194             (UINT16)(offsetof(TPMS_NV_PUBLIC, nameAlg)),
1195         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1196             TPMA_NV_MARSHAL_REF,
1197             (UINT16)(offsetof(TPMS_NV_PUBLIC, attributes)),
1198         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1199             TPM2B_DIGEST_MARSHAL_REF,
1200             (UINT16)(offsetof(TPMS_NV_PUBLIC, authPolicy)),
1201         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1202             Type41_MARSHAL_REF,
1203             (UINT16)(offsetof(TPMS_NV_PUBLIC, dataSize))}},
1204 // TPM2B_NV_PUBLIC_DATA
1205 {TPM2BS_MTYPE,
1206     (UINT8)(offsetof(TPM2B_NV_PUBLIC, nvPublic))|SIZE_EQUAL,
1207     UINT16_MARSHAL_REF,
1208     TPMS_NV_PUBLIC_MARSHAL_REF},
1209 // TPM2B_CONTEXT_SENSITIVE_DATA
1210 {TPM2B_MTYPE, Type42_MARSHAL_REF},
1211 // TPMS_CONTEXT_DATA_DATA
1212 {STRUCTURE_MTYPE, 2, {
1213         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1214             TPM2B_DIGEST_MARSHAL_REF,
1215             (UINT16)(offsetof(TPMS_CONTEXT_DATA, integrity)),
1216         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1217             TPM2B_CONTEXT_SENSITIVE_MARSHAL_REF,
1218             (UINT16)(offsetof(TPMS_CONTEXT_DATA, encrypted))}},
1219 // TPM2B_CONTEXT_DATA_DATA
1220 {TPM2B_MTYPE, Type43_MARSHAL_REF},
1221 // TPMS_CONTEXT_DATA
1222 {STRUCTURE_MTYPE, 4, {
1223         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(EIGHT_BYTES),
1224             UINT64_MARSHAL_REF,
1225             (UINT16)(offsetof(TPMS_CONTEXT, sequence)),
1226         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1227             TPMI_DH_SAVED_MARSHAL_REF,
1228             (UINT16)(offsetof(TPMS_CONTEXT, savedHandle)),
1229         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1230             TPMI_RH_HIERARCHY_MARSHAL_REF|NULL_FLAG,
1231             (UINT16)(offsetof(TPMS_CONTEXT, hierarchy)),
1232         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1233             TPM2B_CONTEXT_DATA_MARSHAL_REF,
1234             (UINT16)(offsetof(TPMS_CONTEXT, contextBlob))}},
1235 // TPMS_CREATION_DATA_DATA
1236 {STRUCTURE_MTYPE, 7, {
1237         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1238             TPML_PCR_SELECTION_MARSHAL_REF,
1239             (UINT16)(offsetof(TPMS_CREATION_DATA, pcrSelect)),
1240         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1241             TPM2B_DIGEST_MARSHAL_REF,
1242             (UINT16)(offsetof(TPMS_CREATION_DATA, pcrDigest)),
1243         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(ONE_BYTES),
1244             TPMA_LOCALITY_MARSHAL_REF,
1245             (UINT16)(offsetof(TPMS_CREATION_DATA, locality)),
1246         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(TWO_BYTES),
1247             TPM_ALG_ID_MARSHAL_REF,
1248             (UINT16)(offsetof(TPMS_CREATION_DATA, parentNameAlg)),
1249         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1250             TPM2B_NAME_MARSHAL_REF,
1251             (UINT16)(offsetof(TPMS_CREATION_DATA, parentName)),
1252         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1253             TPM2B_NAME_MARSHAL_REF,
1254             (UINT16)(offsetof(TPMS_CREATION_DATA, parentQualifiedName)),
1255         SET_ELEMENT_TYPE(SIMPLE_STYPE),
1256             TPM2B_DATA_MARSHAL_REF,
1257             (UINT16)(offsetof(TPMS_CREATION_DATA, outsideInfo))}},
1258 // TPM2B_CREATION_DATA_DATA
1259 {TPM2BS_MTYPE,
1260     (UINT8)(offsetof(TPM2B_CREATION_DATA, creationData))|SIZE_EQUAL,
1261     UINT16_MARSHAL_REF,
1262     TPMS_CREATION_DATA_MARSHAL_REF},
1263 // TPM_AT_DATA
1264 {TABLE_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_VALUE, 4,
1265     {TPM_AT_ANY, TPM_AT_ERROR, TPM_AT_PV1, TPM_AT_VEND}},
1266 // TPMS_AC_OUTPUT_DATA
1267 {STRUCTURE_MTYPE, 2, {
1268         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1269             TPM_AT_MARSHAL_REF,
1270             (UINT16)(offsetof(TPMS_AC_OUTPUT, tag)),
1271         SET_ELEMENT_TYPE(SIMPLE_STYPE)|SET_ELEMENT_SIZE(FOUR_BYTES),
1272             UINT32_MARSHAL_REF,
1273             (UINT16)(offsetof(TPMS_AC_OUTPUT, data))}},
1274 // TPML_AC_CAPABILITIES_DATA
1275 {LIST_MTYPE,
1276     (UINT8)(offsetof(TPML_AC_CAPABILITIES, acCapabilities)),
1277     Type44_MARSHAL_REF,
1278     TPMS_AC_OUTPUT_ARRAY_MARSHAL_INDEX},
1279 // Type00_DATA
1280 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1281     {RANGE(0, sizeof(TPMU_HA), UINT16)}},
1282 // Type01_DATA
1283 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1284     {RANGE(0, sizeof(TPMT_HA), UINT16)}},
1285 // Type02_DATA
1286 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1287     {RANGE(0, 1024, UINT16)}},
1288 // Type03_DATA
1289 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1290     {RANGE(0, MAX_DIGEST_BUFFER, UINT16)}},
1291 // Type04_DATA
1292 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1293     {RANGE(0, MAX_NV_BUFFER_SIZE, UINT16)}},
1294 // Type05_DATA
1295 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1296     {RANGE(0, sizeof(UINT64), UINT16)}},
1297 // Type06_DATA
1298 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1299     {RANGE(0, MAX_SYM_BLOCK_SIZE, UINT16)}},
1300 // Type07_DATA
1301 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1302     {RANGE(0, sizeof(TPMU_NAME), UINT16)}},
1303 // Type08_DATA
1304 {MIN_MAX_MTYPE, ONE_BYTES, (UINT8)TPM_RC_VALUE,
1305     {RANGE(PCR_SELECT_MIN, PCR_SELECT_MAX, UINT8)}},
1306 // Type10_DATA
1307 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_TAG, 1,
1308     {TPM_ST_CREATION}},
1309 // Type11_DATA
1310 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_TAG, 1,
1311     {TPM_ST_VERIFIED}},
1312 // Type12_DATA
1313 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_TAG, 2,
1314     {TPM_ST_AUTH_SECRET, TPM_ST_AUTH_SIGNED}},
1315 // Type13_DATA
1316 {TABLE_MTYPE, TWO_BYTES, (UINT8)TPM_RC_TAG, 1,
1317     {TPM_ST_HASHCHECK}},
1318 // Type15_DATA
1319 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1320     {RANGE(0, MAX_CAP_CC, UINT32)}},
1321 // Type17_DATA
1322 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1323     {RANGE(0, MAX_ALG_LIST_SIZE, UINT32)}},
1324 // Type18_DATA
1325 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1326     {RANGE(0, MAX_CAP_HANDLES, UINT32)}},
1327 // Type19_DATA
1328 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1329     {RANGE(2, 8, UINT32)}},
1330 // Type20_DATA
1331 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1332     {RANGE(0, HASH_COUNT, UINT32)}},
1333 // Type22_DATA
1334 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1335     {RANGE(0, MAX_CAP_ALGS, UINT32)}},
1336 // Type23_DATA
1337 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1338     {RANGE(0, MAX_TPM_PROPERTIES, UINT32)}},
1339 // Type24_DATA
1340 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1341     {RANGE(0, MAX_PCR_PROPERTIES, UINT32)}},
1342 // Type25_DATA
1343 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1344     {RANGE(0, MAX_ECC_CURVES, UINT32)}},
1345 // Type26_DATA
1346 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1347     {RANGE(0, MAX_TAGGED_POLICIES, UINT32)}},
1348 // Type27_DATA
1349 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1350     {RANGE(0, MAX_ACT_DATA, UINT32)}},
1351 // Type28_DATA
1352 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1353     {RANGE(0, sizeof(TPMS_ATTEST), UINT16)}},
1354 // Type29_DATA
1355 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1356     {RANGE(0, MAX_SYM_KEY_BYTES, UINT16)}},
1357 // Type30_DATA
1358 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1359     {RANGE(0, LABEL_MAX_BUFFER, UINT16)}},
1360 // Type31_DATA
1361 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1362     {RANGE(0, sizeof(TPMS_DERIVE), UINT16)}},
1363 // Type32_DATA
1364 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1365     {RANGE(0, sizeof(TPMU_SENSITIVE_CREATE), UINT16)}},
1366 // Type33_DATA
1367 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1368     {RANGE(0, MAX_RSA_KEY_BYTES, UINT16)}},
1369 // Type34_DATA
1370 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1371     {RANGE(0, RSA_PRIVATE_SIZE, UINT16)}},
1372 // Type35_DATA
1373 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1374     {RANGE(0, MAX_ECC_KEY_BYTES, UINT16)}},
1375 // Type36_DATA
1376 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1377     {RANGE(0, sizeof(TPMU_ENCRYPTED_SECRET), UINT16)}},
1378 // Type37_DATA
1379 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1380     {RANGE(0, sizeof(TPMT_PUBLIC), UINT16)}},
1381 // Type38_DATA
1382 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1383     {RANGE(0, PRIVATE_VENDOR_SPECIFIC_BYTES, UINT16)}},
1384 // Type39_DATA
1385 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1386     {RANGE(0, sizeof(_PRIVATE), UINT16)}},
1387 // Type40_DATA
1388 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1389     {RANGE(0, sizeof(TPMS_ID_OBJECT), UINT16)}},
1390 // Type41_DATA
1391 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1392     {RANGE(0, MAX_NV_INDEX_SIZE, UINT16)}},
1393 // Type42_DATA
1394 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1395     {RANGE(0, MAX_CONTEXT_SIZE, UINT16)}},
1396 // Type43_DATA
1397 {MIN_MAX_MTYPE, TWO_BYTES, (UINT8)TPM_RC_SIZE,
1398     {RANGE(0, sizeof(TPMS_CONTEXT_DATA), UINT16)}},
1399 // Type44_DATA
1400 {MIN_MAX_MTYPE, FOUR_BYTES, (UINT8)TPM_RC_SIZE,
1401     {RANGE(0, MAX_AC_CAPABILITIES, UINT32)}}
1402 };
1403 #endif // TABLE_DRIVEN_MARSHAL
1404