Coverage Report

Created: 2026-10-17 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ibmswtpm2/src/Unmarshal.c
Line
Count
Source
1
/********************************************************************************/
2
/*                    */
3
/*           Parameter Unmarshaling       */
4
/*           Written by Ken Goldman       */
5
/*           IBM Thomas J. Watson Research Center     */
6
/*            $Id: Unmarshal.c 1272 2018-07-20 17:46:57Z kgoldman $   */
7
/*                    */
8
/* (c) Copyright IBM Corporation 2015 - 2018          */
9
/*                    */
10
/* All rights reserved.               */
11
/*                    */
12
/* Redistribution and use in source and binary forms, with or without   */
13
/* modification, are permitted provided that the following conditions are */
14
/* met:                   */
15
/*                    */
16
/* Redistributions of source code must retain the above copyright notice, */
17
/* this list of conditions and the following disclaimer.      */
18
/*                    */
19
/* Redistributions in binary form must reproduce the above copyright    */
20
/* notice, this list of conditions and the following disclaimer in the    */
21
/* documentation and/or other materials provided with the distribution.   */
22
/*                    */
23
/* Neither the names of the IBM Corporation nor the names of its    */
24
/* contributors may be used to endorse or promote products derived from   */
25
/* this software without specific prior written permission.     */
26
/*                    */
27
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS    */
28
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    */
29
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  */
30
/* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT   */
31
/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
32
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT   */
33
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  */
34
/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  */
35
/* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT    */
36
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  */
37
/* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   */
38
/********************************************************************************/
39
40
/* rev 136 */
41
42
#include <string.h>
43
44
#include "Unmarshal_fp.h"
45
46
TPM_RC
47
UINT8_Unmarshal(UINT8 *target, BYTE **buffer, INT32 *size)
48
0
{
49
0
    if ((UINT32)*size < sizeof(UINT8)) {
50
0
  return TPM_RC_INSUFFICIENT;
51
0
    }
52
0
    *target = (*buffer)[0];
53
0
    *buffer += sizeof(UINT8);
54
0
    *size -= sizeof(UINT8);
55
0
    return TPM_RC_SUCCESS;
56
0
}
57
58
TPM_RC
59
INT8_Unmarshal(INT8 *target, BYTE **buffer, INT32 *size)
60
0
{
61
0
    return UINT8_Unmarshal((UINT8 *)target, buffer, size);
62
0
}
63
64
TPM_RC
65
UINT16_Unmarshal(UINT16 *target, BYTE **buffer, INT32 *size)
66
10.6k
{
67
10.6k
    if ((UINT32)*size < sizeof(UINT16)) {
68
526
  return TPM_RC_INSUFFICIENT;
69
526
    }
70
10.0k
    *target = ((UINT16)((*buffer)[0]) << 8) |
71
10.0k
        ((UINT16)((*buffer)[1]) << 0);
72
10.0k
    *buffer += sizeof(UINT16);
73
10.0k
    *size -= sizeof(UINT16);
74
10.0k
    return TPM_RC_SUCCESS;
75
10.6k
}
76
77
TPM_RC
78
UINT32_Unmarshal(UINT32 *target, BYTE **buffer, INT32 *size)
79
11.8k
{
80
11.8k
    if ((UINT32)*size < sizeof(UINT32)) {
81
418
  return TPM_RC_INSUFFICIENT;
82
418
    }
83
11.4k
    *target = ((UINT32)((*buffer)[0]) << 24) |
84
11.4k
        ((UINT32)((*buffer)[1]) << 16) |
85
11.4k
        ((UINT32)((*buffer)[2]) <<  8) |
86
11.4k
        ((UINT32)((*buffer)[3]) <<  0);
87
11.4k
    *buffer += sizeof(UINT32);
88
11.4k
    *size -= sizeof(UINT32);
89
11.4k
    return TPM_RC_SUCCESS;
90
11.8k
}
91
92
TPM_RC
93
INT32_Unmarshal(INT32 *target, BYTE **buffer, INT32 *size)
94
0
{
95
0
    return UINT32_Unmarshal((UINT32 *)target, buffer, size);
96
0
}
97
98
99
TPM_RC
100
UINT64_Unmarshal(UINT64 *target, BYTE **buffer, INT32 *size)
101
0
{
102
0
    if ((UINT32)*size < sizeof(UINT64)) {
103
0
  return TPM_RC_INSUFFICIENT;
104
0
    }
105
0
    *target = ((UINT64)((*buffer)[0]) << 56) |
106
0
        ((UINT64)((*buffer)[1]) << 48) |
107
0
        ((UINT64)((*buffer)[2]) << 40) |
108
0
        ((UINT64)((*buffer)[3]) << 32) |
109
0
        ((UINT64)((*buffer)[4]) << 24) |
110
0
        ((UINT64)((*buffer)[5]) << 16) |
111
0
        ((UINT64)((*buffer)[6]) <<  8) |
112
0
        ((UINT64)((*buffer)[7]) <<  0);
113
0
    *buffer += sizeof(UINT64);
114
0
    *size -= sizeof(UINT64);
115
0
    return TPM_RC_SUCCESS;
116
0
}
117
118
TPM_RC
119
Array_Unmarshal(BYTE *targetBuffer, UINT16 targetSize, BYTE **buffer, INT32 *size)
120
0
{
121
0
    TPM_RC rc = TPM_RC_SUCCESS;
122
123
0
    if (targetSize > *size) {
124
0
  rc = TPM_RC_INSUFFICIENT;
125
0
    }
126
0
    else {
127
0
  memcpy(targetBuffer, *buffer, targetSize);
128
0
  *buffer += targetSize;
129
0
  *size -= targetSize;
130
0
    }
131
0
    return rc;
132
0
}
133
134
TPM_RC
135
TPM2B_Unmarshal(TPM2B *target, UINT16 targetSize, BYTE **buffer, INT32 *size)
136
0
{
137
0
    TPM_RC rc = TPM_RC_SUCCESS;
138
139
0
    if (rc == TPM_RC_SUCCESS) {
140
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
141
0
    }
142
0
    if (rc == TPM_RC_SUCCESS) {
143
0
  if (target->size > targetSize) {
144
0
      rc = TPM_RC_SIZE;
145
0
  }
146
0
    }
147
0
    if (rc == TPM_RC_SUCCESS) {
148
0
  rc = Array_Unmarshal(target->buffer, target->size, buffer, size);
149
0
    }
150
0
    return rc;
151
0
}
152
153
/* Table 5 - Definition of Types for Documentation Clarity */
154
155
TPM_RC
156
TPM_KEY_BITS_Unmarshal(TPM_KEY_BITS *target, BYTE **buffer, INT32 *size)
157
0
{
158
0
    TPM_RC rc = TPM_RC_SUCCESS;
159
160
0
    if (rc == TPM_RC_SUCCESS) {
161
0
  rc = UINT16_Unmarshal(target, buffer, size);  
162
0
    }
163
0
    return rc;
164
0
}
165
166
/* Table 7 - Definition of (UINT32) TPM_GENERATED Constants <O> */
167
168
TPM_RC
169
TPM_GENERATED_Unmarshal(TPM_GENERATED *target, BYTE **buffer, INT32 *size)
170
0
{
171
0
    TPM_RC rc = TPM_RC_SUCCESS;
172
173
0
    if (rc == TPM_RC_SUCCESS) {
174
0
  rc = UINT32_Unmarshal(target, buffer, size);  
175
0
    }
176
0
    if (rc == TPM_RC_SUCCESS) {
177
0
  if (*target != TPM_GENERATED_VALUE) {
178
0
      rc = TPM_RC_VALUE;
179
0
  }
180
0
    }
181
0
    return rc;
182
0
}
183
184
/* Table 9 - Definition of (UINT16) TPM_ALG_ID Constants <IN/OUT, S> */
185
186
TPM_RC
187
TPM_ALG_ID_Unmarshal(TPM_ALG_ID *target, BYTE **buffer, INT32 *size)
188
0
{
189
0
    TPM_RC rc = TPM_RC_SUCCESS;
190
191
0
    if (rc == TPM_RC_SUCCESS) {
192
0
  rc = UINT16_Unmarshal(target, buffer, size);  
193
0
    }
194
0
    return rc;
195
0
}
196
197
/* Table 10 - Definition of (UINT16) {ECC} TPM_ECC_CURVE Constants <IN/OUT, S> */
198
199
#if ALG_ECC
200
TPM_RC
201
TPM_ECC_CURVE_Unmarshal(TPM_ECC_CURVE *target, BYTE **buffer, INT32 *size)
202
0
{
203
0
    TPM_RC rc = TPM_RC_SUCCESS;
204
205
0
    if (rc == TPM_RC_SUCCESS) {
206
0
  rc = UINT16_Unmarshal(target, buffer, size);
207
0
    }
208
0
    if (rc == TPM_RC_SUCCESS) {
209
0
  switch (*target) {
210
0
    case TPM_ECC_NONE:
211
0
    case TPM_ECC_NIST_P192:
212
0
    case TPM_ECC_NIST_P224:
213
0
    case TPM_ECC_NIST_P256:
214
0
    case TPM_ECC_NIST_P384:
215
0
    case TPM_ECC_NIST_P521:
216
0
    case TPM_ECC_BN_P256:
217
0
    case TPM_ECC_BN_P638:
218
0
    case TPM_ECC_SM2_P256:
219
0
      break;
220
0
    default:
221
0
      rc = TPM_RC_CURVE;
222
0
  }
223
0
    }
224
0
    return rc;
225
0
}
226
#endif
227
228
/* Table 13 - Definition of (UINT32) TPM_CC Constants (Numeric Order) <IN/OUT, S> */
229
230
TPM_RC
231
TPM_CC_Unmarshal(TPM_RC *target, BYTE **buffer, INT32 *size)
232
4.77k
{
233
4.77k
    TPM_RC rc = TPM_RC_SUCCESS;
234
235
4.77k
    if (rc == TPM_RC_SUCCESS) {
236
4.77k
  rc = UINT32_Unmarshal(target, buffer, size);  
237
4.77k
    }
238
4.77k
    return rc;
239
4.77k
}
240
241
/* Table 17 - Definition of (UINT32) TPM_RC Constants (Actions) <OUT> */
242
243
TPM_RC
244
TPM_RC_Unmarshal(TPM_RC *target, BYTE **buffer, INT32 *size)
245
0
{
246
0
    TPM_RC rc = TPM_RC_SUCCESS;
247
248
0
    if (rc == TPM_RC_SUCCESS) {
249
0
  rc = UINT32_Unmarshal(target, buffer, size);  
250
0
    }
251
0
    return rc;
252
0
}
253
254
/* Table 18 - Definition of (INT8) TPM_CLOCK_ADJUST Constants <IN> */
255
256
TPM_RC
257
TPM_CLOCK_ADJUST_Unmarshal(TPM_CLOCK_ADJUST *target, BYTE **buffer, INT32 *size)
258
0
{
259
0
    TPM_RC rc = TPM_RC_SUCCESS;
260
261
0
    if (rc == TPM_RC_SUCCESS) {
262
0
  rc = INT8_Unmarshal(target, buffer, size);  
263
0
    }
264
0
    if (rc == TPM_RC_SUCCESS) {
265
0
  switch (*target) {
266
0
    case TPM_CLOCK_COARSE_SLOWER:
267
0
    case TPM_CLOCK_MEDIUM_SLOWER:
268
0
    case TPM_CLOCK_FINE_SLOWER:
269
0
    case TPM_CLOCK_NO_CHANGE:
270
0
    case TPM_CLOCK_FINE_FASTER:
271
0
    case TPM_CLOCK_MEDIUM_FASTER:
272
0
    case TPM_CLOCK_COARSE_FASTER:
273
0
      break;
274
0
    default:
275
0
      rc = TPM_RC_VALUE;
276
0
  }
277
0
    }
278
0
    return rc;
279
0
}
280
281
/* Table 19 - Definition of (UINT16) TPM_EO Constants <IN/OUT> */
282
283
TPM_RC
284
TPM_EO_Unmarshal(TPM_EO *target, BYTE **buffer, INT32 *size)
285
0
{
286
0
    TPM_RC rc = TPM_RC_SUCCESS;
287
288
0
    if (rc == TPM_RC_SUCCESS) {
289
0
  rc = UINT16_Unmarshal(target, buffer, size);  
290
0
    }
291
0
    if (rc == TPM_RC_SUCCESS) {
292
0
  switch (*target) {
293
0
    case TPM_EO_EQ:
294
0
    case TPM_EO_NEQ:
295
0
    case TPM_EO_SIGNED_GT:
296
0
    case TPM_EO_UNSIGNED_GT:
297
0
    case TPM_EO_SIGNED_LT:
298
0
    case TPM_EO_UNSIGNED_LT:
299
0
    case TPM_EO_SIGNED_GE:
300
0
    case TPM_EO_UNSIGNED_GE:
301
0
    case TPM_EO_SIGNED_LE:
302
0
    case TPM_EO_UNSIGNED_LE:
303
0
    case TPM_EO_BITSET:
304
0
    case TPM_EO_BITCLEAR:
305
0
      break;
306
0
    default:
307
0
      rc = TPM_RC_VALUE;
308
0
  }
309
0
    }
310
0
    return rc;
311
0
}
312
313
/* Table 20 - Definition of (UINT16) TPM_ST Constants <IN/OUT, S> */
314
315
TPM_RC
316
TPM_ST_Unmarshal(TPM_ST *target, BYTE **buffer, INT32 *size)
317
9.00k
{
318
9.00k
    TPM_RC rc = TPM_RC_SUCCESS;
319
320
9.00k
    if (rc == TPM_RC_SUCCESS) {
321
9.00k
  rc = UINT16_Unmarshal(target, buffer, size);  
322
9.00k
    }
323
9.00k
    if (rc == TPM_RC_SUCCESS) {
324
8.79k
  switch (*target) {
325
18
    case TPM_ST_RSP_COMMAND:
326
326
    case TPM_ST_NULL:
327
3.72k
    case TPM_ST_NO_SESSIONS:
328
6.47k
    case TPM_ST_SESSIONS:
329
6.64k
    case TPM_ST_ATTEST_NV:
330
6.82k
    case TPM_ST_ATTEST_COMMAND_AUDIT:
331
6.99k
    case TPM_ST_ATTEST_SESSION_AUDIT:
332
7.17k
    case TPM_ST_ATTEST_CERTIFY:
333
7.35k
    case TPM_ST_ATTEST_QUOTE:
334
7.52k
    case TPM_ST_ATTEST_TIME:
335
7.73k
    case TPM_ST_ATTEST_CREATION:
336
7.91k
    case TPM_ST_CREATION:
337
8.09k
    case TPM_ST_VERIFIED:
338
8.26k
    case TPM_ST_AUTH_SECRET:
339
8.44k
    case TPM_ST_HASHCHECK:
340
8.62k
    case TPM_ST_AUTH_SIGNED:
341
8.62k
      break;
342
177
    default:
343
177
      rc = TPM_RC_VALUE;
344
8.79k
  }
345
8.79k
    }
346
9.00k
    return rc;
347
9.00k
}
348
349
/* Table 20 - Definition of (UINT16) TPM_SU Constants <IN> */
350
351
TPM_RC
352
TPM_SU_Unmarshal(TPM_SU *target, BYTE **buffer, INT32 *size)
353
1.59k
{
354
1.59k
    TPM_RC rc = TPM_RC_SUCCESS;
355
356
1.59k
    if (rc == TPM_RC_SUCCESS) {
357
1.59k
  rc = UINT16_Unmarshal(target, buffer, size);  
358
1.59k
    }
359
1.59k
    if (rc == TPM_RC_SUCCESS) {
360
1.27k
  switch (*target) {
361
328
    case TPM_SU_CLEAR:
362
1.08k
    case TPM_SU_STATE:
363
1.08k
      break;
364
199
    default:
365
199
      rc = TPM_RC_VALUE;
366
1.27k
  }
367
1.27k
    }
368
1.59k
    return rc;
369
1.59k
}
370
371
/* Table 21 - Definition of (UINT8) TPM_SE Constants <IN> */
372
373
TPM_RC
374
TPM_SE_Unmarshal(TPM_SE *target, BYTE **buffer, INT32 *size)
375
0
{
376
0
    TPM_RC rc = TPM_RC_SUCCESS;
377
378
0
    if (rc == TPM_RC_SUCCESS) {
379
0
  rc = UINT8_Unmarshal(target, buffer, size);  
380
0
    }
381
0
    if (rc == TPM_RC_SUCCESS) {
382
0
  switch (*target) {
383
0
    case TPM_SE_HMAC:
384
0
    case TPM_SE_POLICY:
385
0
    case TPM_SE_TRIAL:
386
0
      break;
387
0
    default:
388
0
      rc = TPM_RC_VALUE;
389
0
  }
390
0
    }
391
0
    return rc;
392
0
}
393
394
/* Table 22 - Definition of (UINT32) TPM_CAP Constants  */
395
396
TPM_RC
397
TPM_CAP_Unmarshal(TPM_CAP *target, BYTE **buffer, INT32 *size)
398
0
{
399
0
    TPM_RC rc = TPM_RC_SUCCESS;
400
401
0
    if (rc == TPM_RC_SUCCESS) {
402
0
  rc = UINT32_Unmarshal(target, buffer, size);  
403
0
    }
404
0
    if (rc == TPM_RC_SUCCESS) {
405
0
  switch (*target) {
406
0
    case TPM_CAP_ALGS:
407
0
    case TPM_CAP_HANDLES:
408
0
    case TPM_CAP_COMMANDS:
409
0
    case TPM_CAP_PP_COMMANDS:
410
0
    case TPM_CAP_AUDIT_COMMANDS:
411
0
    case TPM_CAP_PCRS:
412
0
    case TPM_CAP_TPM_PROPERTIES:
413
0
    case TPM_CAP_PCR_PROPERTIES:
414
0
    case TPM_CAP_ECC_CURVES:
415
0
    case TPM_CAP_AUTH_POLICIES:
416
0
    case TPM_CAP_VENDOR_PROPERTY:
417
0
      break;
418
0
    default:
419
0
      rc = TPM_RC_VALUE;
420
0
  }
421
0
    }
422
0
    return rc;
423
0
}
424
425
/* Table 24 - Definition of (UINT32) TPM_PT Constants <IN/OUT, S> */
426
427
TPM_RC
428
TPM_PT_Unmarshal(TPM_HANDLE *target, BYTE **buffer, INT32 *size)
429
0
{
430
0
    TPM_RC rc = TPM_RC_SUCCESS;
431
432
0
    if (rc == TPM_RC_SUCCESS) {
433
0
  rc = UINT32_Unmarshal(target, buffer, size);  
434
0
    }
435
0
    return rc;
436
0
}
437
438
/* Table 25 - Definition of (UINT32) TPM_PT_PCR Constants <IN/OUT, S> */
439
440
TPM_RC
441
TPM_PT_PCR_Unmarshal(TPM_PT_PCR *target, BYTE **buffer, INT32 *size)
442
0
{
443
0
    TPM_RC rc = TPM_RC_SUCCESS;
444
445
0
    if (rc == TPM_RC_SUCCESS) {
446
0
  rc = UINT32_Unmarshal(target, buffer, size);  
447
0
    }
448
0
    return rc;
449
0
}
450
451
/* Table 27 - Definition of Types for Handles */
452
453
TPM_RC
454
TPM_HANDLE_Unmarshal(TPM_HANDLE *target, BYTE **buffer, INT32 *size)
455
0
{
456
0
    TPM_RC rc = TPM_RC_SUCCESS;
457
458
0
    if (rc == TPM_RC_SUCCESS) {
459
0
  rc = UINT32_Unmarshal(target, buffer, size);  
460
0
    }
461
0
    return rc;
462
0
}
463
464
/* Table 31 - Definition of (UINT32) TPMA_ALGORITHM Bits */
465
466
TPM_RC
467
TPMA_ALGORITHM_Unmarshal(TPMA_ALGORITHM *target, BYTE **buffer, INT32 *size)
468
0
{
469
0
    TPM_RC rc = TPM_RC_SUCCESS;
470
471
0
    if (rc == TPM_RC_SUCCESS) {
472
0
  rc = UINT32_Unmarshal(target, buffer, size);  
473
0
    }
474
0
    if (rc == TPM_RC_SUCCESS) {
475
0
  if (*target & TPMA_ALGORITHM_reserved) {
476
0
      rc = TPM_RC_RESERVED_BITS;
477
0
  }
478
0
    }
479
0
    return rc;
480
0
}
481
482
/* Table 32 - Definition of (UINT32) TPMA_OBJECT Bits */
483
484
TPM_RC
485
TPMA_OBJECT_Unmarshal(TPMA_OBJECT *target, BYTE **buffer, INT32 *size)
486
0
{
487
0
    TPM_RC rc = TPM_RC_SUCCESS;
488
489
0
    if (rc == TPM_RC_SUCCESS) {
490
0
  rc = UINT32_Unmarshal(target, buffer, size);  
491
0
    }
492
0
    if (rc == TPM_RC_SUCCESS) {
493
0
  if (*target & TPMA_OBJECT_reserved) {
494
0
      rc = TPM_RC_RESERVED_BITS;
495
0
  }
496
0
    }
497
0
    return rc;
498
0
}
499
500
/* Table 33 - Definition of (UINT8) TPMA_SESSION Bits <IN/OUT> */
501
502
TPM_RC
503
TPMA_SESSION_Unmarshal(TPMA_SESSION *target, BYTE **buffer, INT32 *size)
504
0
{
505
0
    TPM_RC rc = TPM_RC_SUCCESS;
506
507
0
    if (rc == TPM_RC_SUCCESS) {
508
0
  rc = UINT8_Unmarshal(target, buffer, size);  
509
0
    }
510
0
    if (rc == TPM_RC_SUCCESS) {
511
0
  if (*target & TPMA_SESSION_reserved) {
512
0
      rc = TPM_RC_RESERVED_BITS;
513
0
  }
514
0
    }
515
0
    return rc;
516
0
}
517
518
/* Table 34 - Definition of (UINT8) TPMA_LOCALITY Bits <IN/OUT> */
519
520
TPM_RC
521
TPMA_LOCALITY_Unmarshal(TPMA_LOCALITY *target, BYTE **buffer, INT32 *size)
522
0
{
523
0
    TPM_RC rc = TPM_RC_SUCCESS;
524
525
0
    if (rc == TPM_RC_SUCCESS) {
526
0
  rc = UINT8_Unmarshal(target, buffer, size);  
527
0
    }
528
0
    return rc;
529
0
}
530
531
/* Table 38 - Definition of (TPM_CC) TPMA_CC Bits <OUT> */
532
533
TPM_RC
534
TPMA_CC_Unmarshal(TPMA_CC *target, BYTE **buffer, INT32 *size)
535
0
{
536
0
    TPM_RC rc = TPM_RC_SUCCESS;
537
538
0
    if (rc == TPM_RC_SUCCESS) {
539
0
  rc = UINT32_Unmarshal(target, buffer, size);  
540
0
    }
541
0
    if (rc == TPM_RC_SUCCESS) {
542
0
  if (*target & TPMA_CC_reserved) {
543
0
      rc = TPM_RC_RESERVED_BITS;
544
0
  }
545
0
    }
546
0
    return rc;
547
0
}
548
549
/* Table 39 - Definition of (BYTE) TPMI_YES_NO Type */
550
551
TPM_RC
552
TPMI_YES_NO_Unmarshal(TPMI_YES_NO *target, BYTE **buffer, INT32 *size)
553
0
{
554
0
    TPM_RC rc = TPM_RC_SUCCESS;
555
556
0
    if (rc == TPM_RC_SUCCESS) {
557
0
  rc = UINT8_Unmarshal(target, buffer, size);  
558
0
    }
559
0
    if (rc == TPM_RC_SUCCESS) {
560
0
  switch (*target) {
561
0
    case NO:
562
0
    case YES:
563
0
      break;
564
0
    default:
565
0
      rc = TPM_RC_VALUE;
566
0
  }
567
0
    }
568
0
    return rc;
569
0
}
570
571
/* Table 40 - Definition of (TPM_HANDLE) TPMI_DH_OBJECT Type */
572
573
TPM_RC
574
TPMI_DH_OBJECT_Unmarshal(TPMI_DH_OBJECT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
575
0
{
576
0
    TPM_RC rc = TPM_RC_SUCCESS;
577
    
578
0
    if (rc == TPM_RC_SUCCESS) {
579
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
580
0
    }
581
0
    if (rc == TPM_RC_SUCCESS) {
582
0
  BOOL isNotTransient = (*target < TRANSIENT_FIRST) || (*target > TRANSIENT_LAST);
583
0
  BOOL isNotPersistent = (*target < PERSISTENT_FIRST) || (*target > PERSISTENT_LAST);
584
0
  BOOL isNotLegalNull = (*target != TPM_RH_NULL) || !allowNull;
585
0
  if (isNotTransient &&
586
0
      isNotPersistent &&
587
0
      isNotLegalNull) {
588
0
      rc = TPM_RC_VALUE;
589
0
  }
590
0
    }
591
0
    return rc;
592
0
}
593
594
/* Table 2:41 - Definition of TPMI_DH_PARENT Type (InterfaceTable()) */
595
596
TPM_RC
597
TPMI_DH_PARENT_Unmarshal(TPMI_DH_PARENT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
598
0
{
599
0
    TPM_RC rc = TPM_RC_SUCCESS;
600
    
601
0
    if (rc == TPM_RC_SUCCESS) {
602
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
603
0
    }
604
0
    if (rc == TPM_RC_SUCCESS) {
605
0
  BOOL isNotTransient = (*target < TRANSIENT_FIRST) || (*target > TRANSIENT_LAST);
606
0
  BOOL isNotPersistent = (*target < PERSISTENT_FIRST) || (*target > PERSISTENT_LAST);
607
0
  BOOL isNotOwner = *target != TPM_RH_OWNER;
608
0
  BOOL isNotPlatform = *target != TPM_RH_PLATFORM;
609
0
  BOOL isNotEndorsement = *target != TPM_RH_ENDORSEMENT;
610
0
  BOOL isNotLegalNull = (*target != TPM_RH_NULL) || !allowNull;
611
0
  if (isNotTransient &&
612
0
      isNotPersistent &&
613
0
      isNotOwner &&
614
0
      isNotPlatform &&
615
0
      isNotEndorsement && 
616
0
      isNotLegalNull) {
617
0
      rc = TPM_RC_VALUE;
618
0
  }
619
0
    }
620
0
    return rc;
621
0
}
622
623
/* Table 41 - Definition of (TPM_HANDLE) TPMI_DH_PERSISTENT Type */
624
625
TPM_RC
626
TPMI_DH_PERSISTENT_Unmarshal(TPMI_DH_PERSISTENT *target, BYTE **buffer, INT32 *size)
627
0
{
628
0
    TPM_RC rc = TPM_RC_SUCCESS;
629
630
0
    if (rc == TPM_RC_SUCCESS) {
631
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
632
0
    }
633
0
    if (rc == TPM_RC_SUCCESS) {
634
0
  BOOL isNotPersistent = (*target < PERSISTENT_FIRST) || (*target > PERSISTENT_LAST);
635
0
  if (isNotPersistent) {
636
0
      rc = TPM_RC_VALUE;
637
0
  }
638
0
    }
639
0
    return rc;
640
0
}
641
642
/* Table 42 - Definition of (TPM_HANDLE) TPMI_DH_ENTITY Type <IN> */
643
644
TPM_RC
645
TPMI_DH_ENTITY_Unmarshal(TPMI_DH_ENTITY *target, BYTE **buffer, INT32 *size, BOOL allowNull)
646
0
{
647
0
    TPM_RC rc = TPM_RC_SUCCESS;
648
649
0
    if (rc == TPM_RC_SUCCESS) {
650
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
651
0
    }
652
0
    if (rc == TPM_RC_SUCCESS) {
653
0
  BOOL isNotOwner = *target != TPM_RH_OWNER;
654
0
  BOOL isNotEndorsement = *target != TPM_RH_ENDORSEMENT;
655
0
  BOOL isNotPlatform = *target != TPM_RH_PLATFORM;
656
0
  BOOL isNotLockout = *target != TPM_RH_LOCKOUT;
657
0
  BOOL isNotTransient = (*target < TRANSIENT_FIRST) || (*target > TRANSIENT_LAST);
658
0
  BOOL isNotPersistent = (*target < PERSISTENT_FIRST) || (*target > PERSISTENT_LAST);
659
0
  BOOL isNotNv = (*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST);
660
0
  BOOL isNotPcr = (*target > PCR_LAST);
661
0
  BOOL isNotAuth = (*target < TPM_RH_AUTH_00) || (*target > TPM_RH_AUTH_FF);
662
0
  BOOL isNotLegalNull = (*target != TPM_RH_NULL) || !allowNull;
663
0
  if (isNotOwner &&
664
0
      isNotEndorsement &&
665
0
      isNotPlatform &&
666
0
      isNotLockout &&
667
0
      isNotTransient &&
668
0
      isNotPersistent &&
669
0
      isNotNv &&
670
0
      isNotPcr &&
671
0
      isNotAuth &&
672
0
      isNotLegalNull) {
673
0
      rc = TPM_RC_VALUE;
674
0
  }
675
0
    }
676
0
    return rc;
677
0
}
678
679
/* Table 43 - Definition of (TPM_HANDLE) TPMI_DH_PCR Type <IN> */
680
681
TPM_RC
682
TPMI_DH_PCR_Unmarshal(TPMI_DH_PCR *target, BYTE **buffer, INT32 *size, BOOL allowNull)
683
0
{
684
0
    TPM_RC rc = TPM_RC_SUCCESS;
685
686
0
    if (rc == TPM_RC_SUCCESS) {
687
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
688
0
    }
689
0
    if (rc == TPM_RC_SUCCESS) {
690
0
  BOOL isNotPcr = (*target > PCR_LAST);
691
0
  BOOL isNotLegalNull = (*target != TPM_RH_NULL) || !allowNull;
692
0
  if (isNotPcr &&
693
0
      isNotLegalNull) {
694
0
      rc = TPM_RC_VALUE;
695
0
  }
696
0
    }
697
0
    return rc;
698
0
}
699
700
/* Table 44 - Definition of (TPM_HANDLE) TPMI_SH_AUTH_SESSION Type <IN/OUT> */
701
702
TPM_RC
703
TPMI_SH_AUTH_SESSION_Unmarshal(TPMI_SH_AUTH_SESSION *target, BYTE **buffer, INT32 *size, BOOL allowPwd)
704
0
{
705
0
    TPM_RC rc = TPM_RC_SUCCESS;
706
707
0
    if (rc == TPM_RC_SUCCESS) {
708
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
709
0
    }
710
0
    if (rc == TPM_RC_SUCCESS) {
711
0
  BOOL isNotHmacSession = (*target < HMAC_SESSION_FIRST ) || (*target > HMAC_SESSION_LAST);
712
0
  BOOL isNotPolicySession = (*target < POLICY_SESSION_FIRST) || (*target > POLICY_SESSION_LAST);
713
0
  BOOL isNotLegalPwd = (*target != TPM_RS_PW) || !allowPwd;
714
0
  if (isNotHmacSession &&
715
0
      isNotPolicySession &&
716
0
      isNotLegalPwd) {
717
0
      rc = TPM_RC_VALUE;
718
0
  }
719
0
    }
720
0
    return rc;
721
0
}
722
723
/* Table 45 - Definition of (TPM_HANDLE) TPMI_SH_HMAC Type <IN/OUT> */
724
725
TPM_RC
726
TPMI_SH_HMAC_Unmarshal(TPMI_SH_HMAC *target, BYTE **buffer, INT32 *size, BOOL allowNull)
727
0
{
728
0
    TPM_RC rc = TPM_RC_SUCCESS;
729
0
    allowNull = allowNull;
730
    
731
0
    if (rc == TPM_RC_SUCCESS) {
732
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
733
0
    }
734
0
    if (rc == TPM_RC_SUCCESS) {
735
0
  BOOL isNotHmacSession = (*target < HMAC_SESSION_FIRST ) || (*target > HMAC_SESSION_LAST);
736
0
  if (isNotHmacSession) {
737
0
      rc = TPM_RC_VALUE;
738
0
  }
739
0
    }
740
0
    return rc;
741
0
}
742
743
/* Table 46 - Definition of (TPM_HANDLE) TPMI_SH_POLICY Type <IN/OUT> */
744
745
TPM_RC
746
TPMI_SH_POLICY_Unmarshal(TPMI_SH_POLICY *target, BYTE **buffer, INT32 *size, BOOL allowNull)
747
0
{
748
0
    TPM_RC rc = TPM_RC_SUCCESS;
749
0
    allowNull = allowNull;
750
    
751
0
    if (rc == TPM_RC_SUCCESS) {
752
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
753
0
    }
754
0
    if (rc == TPM_RC_SUCCESS) {
755
0
  BOOL isNotPolicySession = (*target < POLICY_SESSION_FIRST) || (*target > POLICY_SESSION_LAST);
756
0
  if (isNotPolicySession) {
757
0
      rc = TPM_RC_VALUE;
758
0
  }
759
0
    }
760
0
    return rc;
761
0
}
762
763
/* Table 47 - Definition of (TPM_HANDLE) TPMI_DH_CONTEXT Type  */
764
765
TPM_RC
766
TPMI_DH_CONTEXT_Unmarshal(TPMI_DH_CONTEXT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
767
0
{
768
0
    TPM_RC rc = TPM_RC_SUCCESS;
769
0
    allowNull = allowNull;
770
771
0
    if (rc == TPM_RC_SUCCESS) {
772
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
773
0
    }
774
0
    if (rc == TPM_RC_SUCCESS) {
775
0
  BOOL isNotHmacSession = (*target < HMAC_SESSION_FIRST ) || (*target > HMAC_SESSION_LAST);
776
0
  BOOL isNotPolicySession = (*target < POLICY_SESSION_FIRST) || (*target > POLICY_SESSION_LAST);
777
0
  BOOL isNotTransient = (*target < TRANSIENT_FIRST) || (*target > TRANSIENT_LAST);
778
0
  if (isNotHmacSession &&
779
0
      isNotPolicySession &&
780
0
      isNotTransient) {
781
0
      rc = TPM_RC_VALUE;
782
0
  }
783
0
    }
784
0
    return rc;
785
0
}
786
787
/* Table 49 - Definition of (TPM_HANDLE) TPMI_DH_SAVED Type */
788
789
TPM_RC
790
TPMI_DH_SAVED_Unmarshal(TPMI_DH_SAVED *target, BYTE **buffer, INT32 *size, BOOL allowNull)
791
0
{
792
0
    TPM_RC rc = TPM_RC_SUCCESS;
793
0
    allowNull = allowNull;
794
795
0
    if (rc == TPM_RC_SUCCESS) {
796
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
797
0
    }
798
0
    if (rc == TPM_RC_SUCCESS) {
799
0
  BOOL isNotHmacSession = (*target < HMAC_SESSION_FIRST ) || (*target > HMAC_SESSION_LAST);
800
0
  BOOL isNotPolicySession = (*target < POLICY_SESSION_FIRST) || (*target > POLICY_SESSION_LAST);
801
0
  BOOL isNotTransientObject = (*target != 0x80000000);
802
0
  BOOL isNotSequenceObject = (*target != 0x80000001);
803
0
  BOOL isNotTransientStClear = (*target != 0x80000002);
804
0
  if (isNotHmacSession &&
805
0
      isNotPolicySession &&
806
0
      isNotTransientObject &&
807
0
      isNotSequenceObject &&
808
0
      isNotTransientStClear) {
809
0
      rc = TPM_RC_VALUE;
810
0
  }
811
0
    }
812
0
    return rc;
813
0
}
814
815
/* Table 48 - Definition of (TPM_HANDLE) TPMI_RH_HIERARCHY Type  */
816
817
TPM_RC
818
TPMI_RH_HIERARCHY_Unmarshal(TPMI_RH_HIERARCHY *target, BYTE **buffer, INT32 *size, BOOL allowNull)
819
0
{
820
0
    TPM_RC rc = TPM_RC_SUCCESS;
821
822
0
    if (rc == TPM_RC_SUCCESS) {
823
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
824
0
    }
825
0
    if (rc == TPM_RC_SUCCESS) {
826
0
  switch (*target) {
827
0
    case TPM_RH_OWNER:
828
0
    case TPM_RH_PLATFORM:
829
0
    case TPM_RH_ENDORSEMENT:
830
0
      break;
831
0
    case TPM_RH_NULL:
832
0
      if (allowNull) {
833
0
    break;
834
0
      }
835
0
    default:
836
0
      rc = TPM_RC_VALUE;
837
0
  }
838
0
    }
839
0
    return rc;
840
0
}
841
842
/* Table 49 - Definition of (TPM_HANDLE) TPMI_RH_ENABLES Type */
843
844
TPM_RC
845
TPMI_RH_ENABLES_Unmarshal(TPMI_RH_ENABLES *target, BYTE **buffer, INT32 *size, BOOL allowNull)
846
0
{
847
0
    TPM_RC rc = TPM_RC_SUCCESS;
848
849
0
    if (rc == TPM_RC_SUCCESS) {
850
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
851
0
    }
852
0
    if (rc == TPM_RC_SUCCESS) {
853
0
  switch (*target) {
854
0
    case TPM_RH_OWNER:
855
0
    case TPM_RH_PLATFORM:
856
0
    case TPM_RH_ENDORSEMENT:
857
0
    case TPM_RH_PLATFORM_NV:
858
0
      break;
859
0
    case TPM_RH_NULL:
860
0
      if (allowNull) {
861
0
    break;
862
0
      }
863
0
    default:
864
0
      rc = TPM_RC_VALUE;
865
0
  }
866
0
    }
867
0
    return rc;
868
0
}
869
870
/* Table 50 - Definition of (TPM_HANDLE) TPMI_RH_HIERARCHY_AUTH Type <IN> */
871
872
TPM_RC
873
TPMI_RH_HIERARCHY_AUTH_Unmarshal(TPMI_RH_HIERARCHY_AUTH *target, BYTE **buffer, INT32 *size, BOOL allowNull)
874
0
{
875
0
    TPM_RC rc = TPM_RC_SUCCESS;
876
0
    allowNull = allowNull;
877
    
878
0
    if (rc == TPM_RC_SUCCESS) {
879
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
880
0
    }
881
0
    if (rc == TPM_RC_SUCCESS) {
882
0
  switch (*target) {
883
0
    case TPM_RH_OWNER:
884
0
    case TPM_RH_PLATFORM:
885
0
    case TPM_RH_ENDORSEMENT:
886
0
    case TPM_RH_LOCKOUT:
887
0
      break;
888
0
    default:
889
0
      rc = TPM_RC_VALUE;
890
0
  }
891
0
    }
892
0
    return rc;
893
0
}
894
895
/* Table 51 - Definition of (TPM_HANDLE) TPMI_RH_PLATFORM Type <IN> */
896
897
TPM_RC
898
TPMI_RH_PLATFORM_Unmarshal(TPMI_RH_PLATFORM *target, BYTE **buffer, INT32 *size, BOOL allowNull)
899
0
{
900
0
    TPM_RC rc = TPM_RC_SUCCESS;
901
0
    allowNull = allowNull;
902
903
0
    if (rc == TPM_RC_SUCCESS) {
904
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
905
0
    }
906
0
    if (rc == TPM_RC_SUCCESS) {
907
0
  switch (*target) {
908
0
    case TPM_RH_PLATFORM:
909
0
      break;
910
0
    default:
911
0
      rc = TPM_RC_VALUE;
912
0
  }
913
0
    }
914
0
    return rc;
915
0
}
916
917
/* Table 53 - Definition of (TPM_HANDLE) TPMI_RH_ENDORSEMENT Type <IN> */
918
919
TPM_RC
920
TPMI_RH_ENDORSEMENT_Unmarshal(TPMI_RH_ENDORSEMENT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
921
0
{
922
0
    TPM_RC rc = TPM_RC_SUCCESS;
923
924
0
    if (rc == TPM_RC_SUCCESS) {
925
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
926
0
    }
927
0
    if (rc == TPM_RC_SUCCESS) {
928
0
  switch (*target) {
929
0
    case TPM_RH_ENDORSEMENT:
930
0
      break;
931
0
    case TPM_RH_NULL:
932
0
      if (allowNull) {
933
0
    break;
934
0
      }
935
0
    default:
936
0
      rc = TPM_RC_VALUE;
937
0
  }
938
0
    }
939
0
    return rc;
940
0
}
941
942
/* Table 54 - Definition of (TPM_HANDLE) TPMI_RH_PROVISION Type <IN> */
943
944
TPM_RC
945
TPMI_RH_PROVISION_Unmarshal(TPMI_RH_PROVISION *target, BYTE **buffer, INT32 *size, BOOL allowNull)
946
0
{
947
0
    TPM_RC rc = TPM_RC_SUCCESS;
948
0
    allowNull = allowNull;
949
950
0
    if (rc == TPM_RC_SUCCESS) {
951
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
952
0
    }
953
0
    if (rc == TPM_RC_SUCCESS) {
954
0
  switch (*target) {
955
0
    case TPM_RH_OWNER:
956
0
    case TPM_RH_PLATFORM:
957
0
      break;
958
0
    default:
959
0
      rc = TPM_RC_VALUE;
960
0
  }
961
0
    }
962
0
    return rc;
963
0
}
964
965
/* Table 55 - Definition of (TPM_HANDLE) TPMI_RH_CLEAR Type <IN> */
966
967
TPM_RC
968
TPMI_RH_CLEAR_Unmarshal(TPMI_RH_CLEAR *target, BYTE **buffer, INT32 *size, BOOL allowNull)
969
0
{
970
0
    TPM_RC rc = TPM_RC_SUCCESS;
971
0
    allowNull = allowNull;
972
973
0
    if (rc == TPM_RC_SUCCESS) {
974
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
975
0
    }
976
0
    if (rc == TPM_RC_SUCCESS) {
977
0
  switch (*target) {
978
0
    case TPM_RH_LOCKOUT:
979
0
    case TPM_RH_PLATFORM:
980
0
      break;
981
0
    default:
982
0
      rc = TPM_RC_VALUE;
983
0
  }
984
0
    }
985
0
    return rc;
986
0
}
987
988
/* Table 56 - Definition of (TPM_HANDLE) TPMI_RH_NV_AUTH Type <IN> */
989
990
TPM_RC
991
TPMI_RH_NV_AUTH_Unmarshal(TPMI_RH_NV_AUTH *target, BYTE **buffer, INT32 *size, BOOL allowNull)
992
0
{
993
0
    TPM_RC rc = TPM_RC_SUCCESS;
994
0
    allowNull = allowNull;
995
    
996
0
    if (rc == TPM_RC_SUCCESS) {
997
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
998
0
    }
999
0
    if (rc == TPM_RC_SUCCESS) {
1000
0
  switch (*target) {
1001
0
    case TPM_RH_OWNER:
1002
0
    case TPM_RH_PLATFORM:
1003
0
      break;
1004
0
    default:
1005
0
        {
1006
0
      BOOL isNotNv = (*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST);
1007
0
      if (isNotNv) {
1008
0
          rc = TPM_RC_VALUE;
1009
0
      }
1010
0
        }
1011
0
  }
1012
0
    }
1013
0
    return rc;
1014
0
}
1015
1016
/* Table 57 - Definition of (TPM_HANDLE) TPMI_RH_LOCKOUT Type <IN> */
1017
1018
TPM_RC
1019
TPMI_RH_LOCKOUT_Unmarshal(TPMI_RH_LOCKOUT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1020
0
{
1021
0
    TPM_RC rc = TPM_RC_SUCCESS;
1022
0
    allowNull = allowNull;
1023
1024
0
    if (rc == TPM_RC_SUCCESS) {
1025
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
1026
0
    }
1027
0
    if (rc == TPM_RC_SUCCESS) {
1028
0
  switch (*target) {
1029
0
    case TPM_RH_LOCKOUT:
1030
0
      break;
1031
0
    default:
1032
0
      rc = TPM_RC_VALUE;
1033
0
  }
1034
0
    }
1035
0
    return rc;
1036
0
}
1037
1038
/* Table 58 - Definition of (TPM_HANDLE) TPMI_RH_NV_INDEX Type <IN/OUT> */
1039
1040
TPM_RC
1041
TPMI_RH_NV_INDEX_Unmarshal(TPMI_RH_NV_INDEX *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1042
0
{
1043
0
    TPM_RC rc = TPM_RC_SUCCESS;
1044
0
    allowNull = allowNull;
1045
1046
0
    if (rc == TPM_RC_SUCCESS) {
1047
0
  rc = TPM_HANDLE_Unmarshal(target, buffer, size);  
1048
0
    }
1049
0
    if (rc == TPM_RC_SUCCESS) {
1050
0
  BOOL isNotNv = (*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST);
1051
0
  if (isNotNv) {
1052
0
      rc = TPM_RC_VALUE;
1053
0
  }
1054
0
    }
1055
0
    return rc;
1056
0
}
1057
1058
/* Table 59 - Definition of (TPM_ALG_ID) TPMI_ALG_HASH Type  */
1059
1060
TPM_RC
1061
TPMI_ALG_HASH_Unmarshal(TPMI_ALG_HASH *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1062
0
{
1063
0
    TPM_RC rc = TPM_RC_SUCCESS;
1064
1065
0
    if (rc == TPM_RC_SUCCESS) {
1066
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1067
0
    }
1068
0
    if (rc == TPM_RC_SUCCESS) {
1069
0
  switch (*target) {
1070
0
#if ALG_SHA1
1071
0
    case TPM_ALG_SHA1:
1072
0
#endif
1073
0
#if ALG_SHA256  
1074
0
    case TPM_ALG_SHA256:
1075
0
#endif
1076
0
#if ALG_SHA384
1077
0
    case  TPM_ALG_SHA384:
1078
0
#endif
1079
0
#if ALG_SHA512
1080
0
    case  TPM_ALG_SHA512:
1081
0
#endif
1082
#if ALG_SM3_256
1083
    case TPM_ALG_SM3_256:
1084
#endif
1085
0
      break;
1086
0
    case TPM_ALG_NULL:
1087
0
      if (allowNull) {
1088
0
    break;
1089
0
      }
1090
0
    default:
1091
0
      rc = TPM_RC_HASH;
1092
0
  }
1093
0
    }
1094
0
    return rc;
1095
0
}
1096
1097
/* Table 61 - Definition of (TPM_ALG_ID) TPMI_ALG_SYM Type */
1098
1099
TPM_RC
1100
TPMI_ALG_SYM_Unmarshal(TPMI_ALG_SYM *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1101
0
{
1102
0
    TPM_RC rc = TPM_RC_SUCCESS;
1103
1104
0
    if (rc == TPM_RC_SUCCESS) {
1105
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1106
0
    }
1107
0
    if (rc == TPM_RC_SUCCESS) {
1108
0
  switch (*target) {
1109
0
#if ALG_AES
1110
0
    case TPM_ALG_AES:
1111
0
#endif
1112
#if ALG_SM4
1113
    case TPM_ALG_SM4:   
1114
#endif
1115
#if ALG_CAMELLIA
1116
    case TPM_ALG_CAMELLIA:  
1117
#endif
1118
0
#if ALG_XOR
1119
0
    case TPM_ALG_XOR:   
1120
0
#endif
1121
0
      break;
1122
0
    case TPM_ALG_NULL:
1123
0
      if (allowNull) {
1124
0
    break;
1125
0
      }
1126
0
    default:
1127
0
      rc = TPM_RC_SYMMETRIC;
1128
0
  }
1129
0
    }
1130
0
    return rc;
1131
0
}
1132
1133
/* Table 62 - Definition of (TPM_ALG_ID) TPMI_ALG_SYM_OBJECT Type */
1134
1135
TPM_RC
1136
TPMI_ALG_SYM_OBJECT_Unmarshal(TPMI_ALG_SYM_OBJECT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1137
0
{
1138
0
    TPM_RC rc = TPM_RC_SUCCESS;
1139
1140
0
    if (rc == TPM_RC_SUCCESS) {
1141
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1142
0
    }
1143
0
    if (rc == TPM_RC_SUCCESS) {
1144
0
  switch (*target) {
1145
0
#if ALG_AES
1146
0
    case TPM_ALG_AES:
1147
0
#endif
1148
#if ALG_SM4
1149
    case TPM_ALG_SM4:   
1150
#endif
1151
#if ALG_CAMELLIA
1152
    case TPM_ALG_CAMELLIA:  
1153
#endif
1154
0
      break;
1155
0
    case TPM_ALG_NULL:
1156
0
      if (allowNull) {
1157
0
    break;
1158
0
      }
1159
0
    default:
1160
0
      rc = TPM_RC_SYMMETRIC;
1161
0
  }
1162
0
    }
1163
0
    return rc;
1164
0
}
1165
1166
/* Table 63 - Definition of (TPM_ALG_ID) TPMI_ALG_SYM_MODE Type */
1167
1168
TPM_RC
1169
TPMI_ALG_SYM_MODE_Unmarshal(TPMI_ALG_SYM_MODE *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1170
0
{
1171
0
    TPM_RC rc = TPM_RC_SUCCESS;
1172
1173
0
    if (rc == TPM_RC_SUCCESS) {
1174
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1175
0
    }
1176
0
    if (rc == TPM_RC_SUCCESS) {
1177
0
  switch (*target) {
1178
0
#if ALG_CTR 
1179
0
    case TPM_ALG_CTR:
1180
0
#endif
1181
0
#if ALG_OFB 
1182
0
    case TPM_ALG_OFB:
1183
0
#endif
1184
0
#if ALG_CBC
1185
0
    case TPM_ALG_CBC:
1186
0
#endif
1187
0
#if ALG_CFB 
1188
0
    case TPM_ALG_CFB:
1189
0
#endif
1190
0
#if ALG_ECB 
1191
0
    case TPM_ALG_ECB:
1192
0
#endif
1193
0
#if ALG_CMAC
1194
0
    case TPM_ALG_CMAC:
1195
0
#endif
1196
0
      break;
1197
0
    case TPM_ALG_NULL:
1198
0
      if (allowNull) {
1199
0
    break;
1200
0
      }
1201
0
    default:
1202
0
      rc = TPM_RC_MODE;
1203
0
  }
1204
0
    }
1205
0
    return rc;
1206
0
}
1207
1208
/* Table 64 - Definition of (TPM_ALG_ID) TPMI_ALG_KDF Type */
1209
1210
TPM_RC
1211
TPMI_ALG_KDF_Unmarshal(TPMI_ALG_KDF *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1212
0
{
1213
0
    TPM_RC rc = TPM_RC_SUCCESS;
1214
1215
0
    if (rc == TPM_RC_SUCCESS) {
1216
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1217
0
    }
1218
0
    if (rc == TPM_RC_SUCCESS) {
1219
0
  switch (*target) {
1220
0
#if ALG_MGF1
1221
0
    case TPM_ALG_MGF1:
1222
0
#endif
1223
0
#if ALG_KDF1_SP800_56A
1224
0
    case TPM_ALG_KDF1_SP800_56A: 
1225
0
#endif
1226
#if ALG_KDF2
1227
    case TPM_ALG_KDF2:      
1228
#endif
1229
0
#if ALG_KDF1_SP800_108
1230
0
    case TPM_ALG_KDF1_SP800_108: 
1231
0
#endif
1232
0
      break;
1233
0
    case TPM_ALG_NULL:
1234
0
      if (allowNull) {
1235
0
    break;
1236
0
      }
1237
0
    default:
1238
0
      rc = TPM_RC_KDF;
1239
0
  }
1240
0
    }
1241
0
    return rc;
1242
0
}
1243
    
1244
/* Table 65 - Definition of (TPM_ALG_ID) TPMI_ALG_SIG_SCHEME Type */
1245
1246
TPM_RC
1247
TPMI_ALG_SIG_SCHEME_Unmarshal(TPMI_ALG_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1248
0
{
1249
0
    TPM_RC rc = TPM_RC_SUCCESS;
1250
1251
0
    if (rc == TPM_RC_SUCCESS) {
1252
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1253
0
    }
1254
0
    if (rc == TPM_RC_SUCCESS) {
1255
0
  switch (*target) {
1256
0
#if ALG_HMAC    
1257
0
    case TPM_ALG_HMAC:
1258
0
#endif
1259
0
#if ALG_RSASSA  
1260
0
    case TPM_ALG_RSASSA:
1261
0
#endif
1262
0
#if ALG_RSAPSS  
1263
0
    case TPM_ALG_RSAPSS:
1264
0
#endif
1265
0
#if ALG_ECDSA   
1266
0
    case TPM_ALG_ECDSA:
1267
0
#endif
1268
0
#if ALG_ECDAA   
1269
0
    case TPM_ALG_ECDAA:
1270
0
#endif
1271
#if ALG_SM2   
1272
    case TPM_ALG_SM2:
1273
#endif
1274
0
#if ALG_ECSCHNORR 
1275
0
    case TPM_ALG_ECSCHNORR:
1276
0
#endif
1277
0
      break;
1278
0
    case TPM_ALG_NULL:
1279
0
      if (allowNull) {
1280
0
    break;
1281
0
      }
1282
0
    default:
1283
0
      rc = TPM_RC_SCHEME;
1284
0
  }
1285
0
    }
1286
0
    return rc;
1287
0
}
1288
1289
/* Table 66 - Definition of (TPM_ALG_ID) TPMI_ECC_KEY_EXCHANGE Type */
1290
1291
TPM_RC
1292
TPMI_ECC_KEY_EXCHANGE_Unmarshal(TPMI_ECC_KEY_EXCHANGE *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1293
0
{
1294
0
    TPM_RC rc = TPM_RC_SUCCESS;
1295
1296
0
    if (rc == TPM_RC_SUCCESS) {
1297
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1298
0
    }
1299
0
    if (rc == TPM_RC_SUCCESS) {
1300
0
  switch (*target) {
1301
0
#if ALG_ECDH
1302
0
    case TPM_ALG_ECDH:
1303
0
#endif
1304
#if ALG_ECMQV
1305
    case TPM_ALG_ECMQV:
1306
#endif
1307
#if ALG_SM2
1308
    case TPM_ALG_SM2:
1309
#endif
1310
0
      break;
1311
0
    case TPM_ALG_NULL:
1312
0
      if (allowNull) {
1313
0
    break;
1314
0
      }
1315
0
    default:
1316
0
      rc = TPM_RC_SCHEME;
1317
0
  }
1318
0
    }
1319
0
    return rc;
1320
0
}
1321
1322
1323
/* Table 67 - Definition of (TPM_ST) TPMI_ST_COMMAND_TAG Type */
1324
1325
TPM_RC
1326
TPMI_ST_COMMAND_TAG_Unmarshal(TPMI_ST_COMMAND_TAG *target, BYTE **buffer, INT32 *size)
1327
9.00k
{
1328
9.00k
    TPM_RC rc = TPM_RC_SUCCESS;
1329
1330
9.00k
    if (rc == TPM_RC_SUCCESS) {
1331
9.00k
  rc = TPM_ST_Unmarshal(target, buffer, size);  
1332
9.00k
    }
1333
9.00k
    if (rc == TPM_RC_SUCCESS) {
1334
8.62k
  switch (*target) {
1335
3.39k
    case TPM_ST_NO_SESSIONS:
1336
6.14k
    case TPM_ST_SESSIONS:
1337
6.14k
      break;
1338
2.47k
    default:
1339
2.47k
      rc = TPM_RC_BAD_TAG;
1340
8.62k
  }
1341
8.62k
    }
1342
9.00k
    return rc;
1343
9.00k
}
1344
1345
/* Table 70 TPMI_ALG_MAC_SCHEME */
1346
1347
TPM_RC
1348
TPMI_ALG_MAC_SCHEME_Unmarshal(TPMI_ALG_MAC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1349
0
{
1350
0
    TPM_RC rc = TPM_RC_SUCCESS;
1351
1352
0
    if (rc == TPM_RC_SUCCESS) {
1353
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1354
0
    }
1355
0
    if (rc == TPM_RC_SUCCESS) {
1356
0
  switch (*target) {
1357
0
#if ALG_SHA1
1358
0
    case TPM_ALG_SHA1:
1359
0
#endif
1360
0
#if ALG_SHA256  
1361
0
    case TPM_ALG_SHA256:
1362
0
#endif
1363
0
#if ALG_SHA384
1364
0
    case  TPM_ALG_SHA384:
1365
0
#endif
1366
0
#if ALG_SHA512
1367
0
    case  TPM_ALG_SHA512:
1368
0
#endif
1369
#if ALG_SM3_256
1370
    case TPM_ALG_SM3_256:
1371
#endif
1372
0
#if ALG_CMAC
1373
0
    case TPM_ALG_CMAC:
1374
0
#endif
1375
0
      break;
1376
0
    case TPM_ALG_NULL:
1377
0
      if (allowNull) {
1378
0
    break;
1379
0
      }
1380
0
    default:
1381
0
      rc = TPM_RC_SYMMETRIC;
1382
0
  }
1383
0
    }
1384
0
    return rc;
1385
0
}
1386
    
1387
/* Table 70 TPMI_ALG_CIPHER_MODE */
1388
1389
TPM_RC
1390
TPMI_ALG_CIPHER_MODE_Unmarshal(TPMI_ALG_CIPHER_MODE*target, BYTE **buffer, INT32 *size, BOOL allowNull)
1391
0
{
1392
0
    TPM_RC rc = TPM_RC_SUCCESS;
1393
1394
0
    if (rc == TPM_RC_SUCCESS) {
1395
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
1396
0
    }
1397
0
    if (rc == TPM_RC_SUCCESS) {
1398
0
  switch (*target) {
1399
0
#if ALG_CTR 
1400
0
    case TPM_ALG_CTR:
1401
0
#endif
1402
0
#if ALG_OFB 
1403
0
    case TPM_ALG_OFB:
1404
0
#endif
1405
0
#if ALG_CBC
1406
0
    case TPM_ALG_CBC:
1407
0
#endif
1408
0
#if ALG_CFB 
1409
0
    case TPM_ALG_CFB:
1410
0
#endif
1411
0
#if ALG_ECB 
1412
0
    case TPM_ALG_ECB:
1413
0
#endif
1414
0
      break;
1415
0
    case TPM_ALG_NULL:
1416
0
      if (allowNull) {
1417
0
    break;
1418
0
      }
1419
0
    default:
1420
0
      rc = TPM_RC_MODE;
1421
0
  }
1422
0
    }
1423
0
    return rc;
1424
0
}
1425
1426
/* Table 68 - Definition of TPMS_EMPTY Structure <IN/OUT> */
1427
1428
TPM_RC
1429
TPMS_EMPTY_Unmarshal(TPMS_EMPTY *target, BYTE **buffer, INT32 *size)
1430
0
{
1431
0
    TPM_RC rc = TPM_RC_SUCCESS;
1432
0
    target = target;
1433
0
    buffer = buffer;
1434
0
    size = size;
1435
0
    return rc;
1436
0
}
1437
1438
/* Table 70 - Definition of TPMU_HA Union <IN/OUT, S> */
1439
1440
TPM_RC
1441
TPMU_HA_Unmarshal(TPMU_HA *target, BYTE **buffer, INT32 *size, UINT32 selector)
1442
0
{
1443
0
    TPM_RC rc = TPM_RC_SUCCESS;
1444
1445
0
    switch (selector) {
1446
0
#if ALG_SHA1
1447
0
      case TPM_ALG_SHA1:
1448
0
  rc = Array_Unmarshal(target->sha1, SHA1_DIGEST_SIZE, buffer, size);
1449
0
  break;
1450
0
#endif
1451
0
#if ALG_SHA256
1452
0
      case TPM_ALG_SHA256:
1453
0
  rc = Array_Unmarshal(target->sha256, SHA256_DIGEST_SIZE, buffer, size);
1454
0
  break;
1455
0
#endif
1456
0
#if ALG_SHA384
1457
0
      case TPM_ALG_SHA384:
1458
0
  rc = Array_Unmarshal(target->sha384, SHA384_DIGEST_SIZE, buffer, size);
1459
0
  break;
1460
0
#endif
1461
0
#if ALG_SHA512
1462
0
      case TPM_ALG_SHA512:
1463
0
  rc = Array_Unmarshal(target->sha512, SHA512_DIGEST_SIZE, buffer, size);
1464
0
  break;
1465
0
#endif
1466
#if ALG_SM3_256
1467
      case TPM_ALG_SM3_256:
1468
  rc = Array_Unmarshal(target->sm3_256, SM3_256_DIGEST_SIZE, buffer, size);
1469
  break;
1470
#endif
1471
0
      case TPM_ALG_NULL:
1472
0
  break;
1473
0
      default:
1474
0
  rc = TPM_RC_SELECTOR;
1475
0
    }
1476
0
    return rc;
1477
0
}
1478
1479
/* Table 71 - Definition of TPMT_HA Structure <IN/OUT> */
1480
1481
TPM_RC
1482
TPMT_HA_Unmarshal(TPMT_HA *target, BYTE **buffer, INT32 *size, BOOL allowNull)
1483
0
{
1484
0
    TPM_RC rc = TPM_RC_SUCCESS;
1485
1486
0
    if (rc == TPM_RC_SUCCESS) {
1487
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hashAlg, buffer, size, allowNull);
1488
0
    }
1489
0
    if (rc == TPM_RC_SUCCESS) {
1490
0
  rc = TPMU_HA_Unmarshal(&target->digest, buffer, size, target->hashAlg);
1491
0
    }
1492
0
    return rc;
1493
0
}
1494
1495
/* Table 72 - Definition of TPM2B_DIGEST Structure */
1496
1497
TPM_RC
1498
TPM2B_DIGEST_Unmarshal(TPM2B_DIGEST *target, BYTE **buffer, INT32 *size)
1499
0
{
1500
0
    TPM_RC rc = TPM_RC_SUCCESS;
1501
1502
0
    if (rc == TPM_RC_SUCCESS) {
1503
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMU_HA), buffer, size);
1504
0
    }
1505
0
    return rc;
1506
0
}
1507
1508
/* Table 73 - Definition of TPM2B_DATA Structure */
1509
1510
TPM_RC
1511
TPM2B_DATA_Unmarshal(TPM2B_DATA *target, BYTE **buffer, INT32 *size)
1512
0
{
1513
0
    TPM_RC rc = TPM_RC_SUCCESS;
1514
1515
0
    if (rc == TPM_RC_SUCCESS) {
1516
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMT_HA), buffer, size);
1517
0
    }
1518
0
    return rc;
1519
0
}
1520
1521
/* Table 74 - Definition of Types for TPM2B_NONCE */
1522
1523
TPM_RC
1524
TPM2B_NONCE_Unmarshal(TPM2B_NONCE *target, BYTE **buffer, INT32 *size)
1525
0
{
1526
0
    TPM_RC rc = TPM_RC_SUCCESS;
1527
1528
0
    if (rc == TPM_RC_SUCCESS) {
1529
0
  rc = TPM2B_DIGEST_Unmarshal(target, buffer, size);
1530
0
    }
1531
0
    return rc;
1532
0
}
1533
1534
/* Table 75 - Definition of Types for TPM2B_AUTH */
1535
1536
TPM_RC
1537
TPM2B_AUTH_Unmarshal(TPM2B_AUTH *target, BYTE **buffer, INT32 *size)
1538
0
{
1539
0
    TPM_RC rc = TPM_RC_SUCCESS;
1540
1541
0
    if (rc == TPM_RC_SUCCESS) {
1542
0
  rc = TPM2B_DIGEST_Unmarshal(target, buffer, size);
1543
0
    }
1544
0
    return rc;
1545
0
}
1546
1547
/* Table 76 - Definition of Types for TPM2B_OPERAND */
1548
1549
TPM_RC
1550
TPM2B_OPERAND_Unmarshal(TPM2B_OPERAND *target, BYTE **buffer, INT32 *size)
1551
0
{
1552
0
    TPM_RC rc = TPM_RC_SUCCESS;
1553
1554
0
    if (rc == TPM_RC_SUCCESS) {
1555
0
  rc = TPM2B_DIGEST_Unmarshal(target, buffer, size);
1556
0
    }
1557
0
    return rc;
1558
0
}
1559
1560
/* Table 77 - Definition of TPM2B_EVENT Structure */
1561
1562
TPM_RC
1563
TPM2B_EVENT_Unmarshal(TPM2B_EVENT *target, BYTE **buffer, INT32 *size)
1564
0
{
1565
0
    TPM_RC rc = TPM_RC_SUCCESS;
1566
1567
0
    if (rc == TPM_RC_SUCCESS) {
1568
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPM2B_EVENT) - sizeof(UINT16), buffer, size);
1569
0
    }
1570
0
    return rc;
1571
0
}
1572
 
1573
/* Table 78 - Definition of TPM2B_MAX_BUFFER Structure */
1574
1575
TPM_RC
1576
TPM2B_MAX_BUFFER_Unmarshal(TPM2B_MAX_BUFFER *target, BYTE **buffer, INT32 *size)
1577
0
{
1578
0
    TPM_RC rc = TPM_RC_SUCCESS;
1579
1580
0
    if (rc == TPM_RC_SUCCESS) {
1581
0
  rc = TPM2B_Unmarshal(&target->b, MAX_DIGEST_BUFFER, buffer, size);
1582
0
    }
1583
0
    return rc;
1584
0
}
1585
1586
/* Table 79 - Definition of TPM2B_MAX_NV_BUFFER Structure */
1587
1588
TPM_RC
1589
TPM2B_MAX_NV_BUFFER_Unmarshal(TPM2B_MAX_NV_BUFFER *target, BYTE **buffer, INT32 *size)
1590
0
{
1591
0
    TPM_RC rc = TPM_RC_SUCCESS;
1592
1593
0
    if (rc == TPM_RC_SUCCESS) {
1594
0
  rc = TPM2B_Unmarshal(&target->b, MAX_NV_BUFFER_SIZE, buffer, size);
1595
0
    }
1596
0
    return rc;
1597
0
}
1598
1599
/* Table 80 - Definition of TPM2B_TIMEOUT Structure <IN/OUT> */
1600
1601
TPM_RC
1602
TPM2B_TIMEOUT_Unmarshal(TPM2B_TIMEOUT *target, BYTE **buffer, INT32 *size)
1603
0
{
1604
0
    TPM_RC rc = TPM_RC_SUCCESS;
1605
1606
0
    if (rc == TPM_RC_SUCCESS) {
1607
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(target->t.buffer), buffer, size);
1608
0
    }
1609
0
    return rc;
1610
0
}
1611
1612
/* Table 81 - Definition of TPM2B_IV Structure <IN/OUT> */
1613
1614
TPM_RC
1615
TPM2B_IV_Unmarshal(TPM2B_IV *target, BYTE **buffer, INT32 *size)
1616
0
{
1617
0
    TPM_RC rc = TPM_RC_SUCCESS;
1618
1619
0
    if (rc == TPM_RC_SUCCESS) {
1620
0
  rc = TPM2B_Unmarshal(&target->b, MAX_SYM_BLOCK_SIZE, buffer, size);
1621
0
    }
1622
0
    return rc;
1623
0
}
1624
1625
/* Table 83 - Definition of TPM2B_NAME Structure */
1626
1627
TPM_RC
1628
TPM2B_NAME_Unmarshal(TPM2B_NAME *target, BYTE **buffer, INT32 *size)
1629
0
{
1630
0
    TPM_RC rc = TPM_RC_SUCCESS;
1631
1632
0
    if (rc == TPM_RC_SUCCESS) {
1633
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMU_NAME), buffer, size);
1634
0
    }
1635
0
    return rc;
1636
0
}
1637
1638
/* Table 85 - Definition of TPMS_PCR_SELECTION Structure */
1639
1640
TPM_RC
1641
TPMS_PCR_SELECTION_Unmarshal(TPMS_PCR_SELECTION *target, BYTE **buffer, INT32 *size)
1642
0
{
1643
0
    TPM_RC rc = TPM_RC_SUCCESS;
1644
    
1645
0
    if (rc == TPM_RC_SUCCESS) {
1646
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hash, buffer, size, NO);
1647
0
    }
1648
0
    if (rc == TPM_RC_SUCCESS) {
1649
0
  rc = UINT8_Unmarshal(&target->sizeofSelect, buffer, size);
1650
0
    }
1651
0
    if (rc == TPM_RC_SUCCESS) {
1652
0
  if ((target->sizeofSelect < PCR_SELECT_MIN) ||
1653
0
      (target->sizeofSelect > PCR_SELECT_MAX)) {
1654
0
      rc = TPM_RC_VALUE;
1655
0
  }
1656
0
    }
1657
0
    if (rc == TPM_RC_SUCCESS) {
1658
0
  rc = Array_Unmarshal(target->pcrSelect, target->sizeofSelect, buffer, size);
1659
0
    }
1660
0
    return rc;
1661
0
}
1662
 
1663
/* Table 88 - Definition of TPMT_TK_CREATION Structure */
1664
1665
TPM_RC
1666
TPMT_TK_CREATION_Unmarshal(TPMT_TK_CREATION *target, BYTE **buffer, INT32 *size)
1667
0
{
1668
0
    TPM_RC rc = TPM_RC_SUCCESS;
1669
1670
0
    if (rc == TPM_RC_SUCCESS) {
1671
0
  rc = TPM_ST_Unmarshal(&target->tag, buffer, size);
1672
0
    }
1673
0
    if (rc == TPM_RC_SUCCESS) {
1674
0
  if (target->tag != TPM_ST_CREATION) {
1675
0
      rc = TPM_RC_TAG;
1676
0
  }
1677
0
    }
1678
0
    if (rc == TPM_RC_SUCCESS) {
1679
0
  rc = TPMI_RH_HIERARCHY_Unmarshal(&target->hierarchy, buffer, size, YES);
1680
0
    }
1681
0
    if (rc == TPM_RC_SUCCESS) {
1682
0
  rc = TPM2B_DIGEST_Unmarshal(&target->digest, buffer, size);
1683
0
    }
1684
0
    return rc;
1685
0
}
1686
1687
/* Table 89 - Definition of TPMT_TK_VERIFIED Structure */
1688
1689
TPM_RC
1690
TPMT_TK_VERIFIED_Unmarshal(TPMT_TK_VERIFIED *target, BYTE **buffer, INT32 *size)
1691
0
{
1692
0
    TPM_RC rc = TPM_RC_SUCCESS;
1693
    
1694
0
    if (rc == TPM_RC_SUCCESS) {
1695
0
  rc = TPM_ST_Unmarshal(&target->tag, buffer, size);
1696
0
    }
1697
0
    if (rc == TPM_RC_SUCCESS) {
1698
0
  if (target->tag != TPM_ST_VERIFIED) {
1699
0
      rc = TPM_RC_TAG;
1700
0
  }
1701
0
    }
1702
0
    if (rc == TPM_RC_SUCCESS) {
1703
0
  rc = TPMI_RH_HIERARCHY_Unmarshal(&target->hierarchy, buffer, size, YES);
1704
0
    }
1705
0
    if (rc == TPM_RC_SUCCESS) {
1706
0
  rc = TPM2B_DIGEST_Unmarshal(&target->digest, buffer, size);
1707
0
    }
1708
0
    return rc;
1709
0
}
1710
1711
/* Table 90 - Definition of TPMT_TK_AUTH Structure */
1712
1713
TPM_RC
1714
TPMT_TK_AUTH_Unmarshal(TPMT_TK_AUTH *target, BYTE **buffer, INT32 *size)
1715
0
{
1716
0
    TPM_RC rc = TPM_RC_SUCCESS;
1717
1718
0
    if (rc == TPM_RC_SUCCESS) {
1719
0
  rc = TPM_ST_Unmarshal(&target->tag, buffer, size);
1720
0
    }
1721
0
    if (rc == TPM_RC_SUCCESS) {
1722
0
  if ((target->tag != TPM_ST_AUTH_SIGNED) &&
1723
0
      (target->tag != TPM_ST_AUTH_SECRET)) {
1724
0
      rc = TPM_RC_TAG;
1725
0
  }
1726
0
    }
1727
0
    if (rc == TPM_RC_SUCCESS) {
1728
0
  rc = TPMI_RH_HIERARCHY_Unmarshal(&target->hierarchy, buffer, size, YES);
1729
0
    }
1730
0
    if (rc == TPM_RC_SUCCESS) {
1731
0
  rc = TPM2B_DIGEST_Unmarshal(&target->digest, buffer, size);
1732
0
    }
1733
0
    return rc;
1734
0
}
1735
1736
/* Table 91 - Definition of TPMT_TK_HASHCHECK Structure */
1737
1738
TPM_RC
1739
TPMT_TK_HASHCHECK_Unmarshal(TPMT_TK_HASHCHECK *target, BYTE **buffer, INT32 *size)
1740
0
{
1741
0
    TPM_RC rc = TPM_RC_SUCCESS;
1742
1743
0
    if (rc == TPM_RC_SUCCESS) {
1744
0
  rc = TPM_ST_Unmarshal(&target->tag, buffer, size);
1745
0
    }
1746
0
    if (rc == TPM_RC_SUCCESS) {
1747
0
  if (target->tag != TPM_ST_HASHCHECK) {
1748
0
      rc = TPM_RC_TAG;
1749
0
  }
1750
0
    }
1751
0
    if (rc == TPM_RC_SUCCESS) {
1752
0
  rc = TPMI_RH_HIERARCHY_Unmarshal(&target->hierarchy, buffer, size, YES);
1753
0
    }
1754
0
    if (rc == TPM_RC_SUCCESS) {
1755
0
  rc = TPM2B_DIGEST_Unmarshal(&target->digest, buffer, size);
1756
0
    }
1757
0
    return rc;
1758
0
}
1759
1760
/* Table 92 - Definition of TPMS_ALG_PROPERTY Structure <OUT> */
1761
1762
TPM_RC
1763
TPMS_ALG_PROPERTY_Unmarshal(TPMS_ALG_PROPERTY *target, BYTE **buffer, INT32 *size)
1764
0
{
1765
0
    TPM_RC rc = TPM_RC_SUCCESS;
1766
    
1767
0
    if (rc == TPM_RC_SUCCESS) {
1768
0
  rc = TPM_ALG_ID_Unmarshal(&target->alg, buffer, size);
1769
0
    }
1770
0
    if (rc == TPM_RC_SUCCESS) {
1771
0
  rc = TPMA_ALGORITHM_Unmarshal(&target->algProperties, buffer, size);
1772
0
    }
1773
0
    return rc;
1774
0
}
1775
1776
/* Table 93 - Definition of TPMS_TAGGED_PROPERTY Structure <OUT> */
1777
1778
TPM_RC
1779
TPMS_TAGGED_PROPERTY_Unmarshal(TPMS_TAGGED_PROPERTY *target, BYTE **buffer, INT32 *size)
1780
0
{
1781
0
    TPM_RC rc = TPM_RC_SUCCESS;
1782
    
1783
0
    if (rc == TPM_RC_SUCCESS) {
1784
0
  rc = TPM_PT_Unmarshal(&target->property, buffer, size);
1785
0
    }
1786
0
    if (rc == TPM_RC_SUCCESS) {
1787
0
  rc = UINT32_Unmarshal(&target->value, buffer, size);
1788
0
    }
1789
0
    return rc;
1790
0
}
1791
 
1792
/* Table 94 - Definition of TPMS_TAGGED_PCR_SELECT Structure <OUT> */
1793
1794
TPM_RC
1795
TPMS_TAGGED_PCR_SELECT_Unmarshal(TPMS_TAGGED_PCR_SELECT *target, BYTE **buffer, INT32 *size)
1796
0
{
1797
0
    TPM_RC rc = TPM_RC_SUCCESS;
1798
    
1799
0
    if (rc == TPM_RC_SUCCESS) {
1800
0
  rc = TPM_PT_PCR_Unmarshal(&target->tag, buffer, size);
1801
0
    }
1802
0
    if (rc == TPM_RC_SUCCESS) {
1803
0
  rc = UINT8_Unmarshal(&target->sizeofSelect, buffer, size);
1804
0
    }
1805
0
    if (rc == TPM_RC_SUCCESS) {
1806
0
  rc = Array_Unmarshal(target->pcrSelect, target->sizeofSelect, buffer, size);
1807
0
    }
1808
0
     return rc;
1809
0
}
1810
1811
/* Table 95 - Definition of TPML_CC Structure */
1812
1813
TPM_RC
1814
TPML_CC_Unmarshal(TPML_CC *target, BYTE **buffer, INT32 *size)
1815
0
{
1816
0
    TPM_RC rc = TPM_RC_SUCCESS;
1817
    
1818
0
    UINT32 i;
1819
0
    if (rc == TPM_RC_SUCCESS) {
1820
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1821
0
    }
1822
0
    if (rc == TPM_RC_SUCCESS) {
1823
0
  if (target->count > MAX_CAP_CC) {
1824
0
      rc = TPM_RC_SIZE;
1825
0
  }
1826
0
    }
1827
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1828
0
  rc = TPM_CC_Unmarshal(&target->commandCodes[i], buffer, size);
1829
0
    }
1830
0
    return rc;
1831
0
}
1832
1833
/* Table 2:96 - Definition of TPMS_TAGGED_POLICY Structure (StructuresTable()) */
1834
1835
TPM_RC
1836
TPMS_TAGGED_POLICY_Unmarshal(TPMS_TAGGED_POLICY *target, BYTE **buffer, INT32 *size)
1837
0
{
1838
0
    TPM_RC rc = TPM_RC_SUCCESS;
1839
0
    if (rc == TPM_RC_SUCCESS) {
1840
0
  rc = TPM_HANDLE_Unmarshal(&target->handle, buffer, size);
1841
0
    }
1842
0
    if (rc == TPM_RC_SUCCESS) { 
1843
0
  rc = TPMT_HA_Unmarshal(&target->policyHash, buffer, size, NO);
1844
0
    } 
1845
0
    return rc;
1846
0
}
1847
1848
/* Table 96 - Definition of TPML_CCA Structure <OUT> */
1849
1850
TPM_RC
1851
TPML_CCA_Unmarshal(TPML_CCA *target, BYTE **buffer, INT32 *size)
1852
0
{
1853
0
    TPM_RC rc = TPM_RC_SUCCESS;
1854
    
1855
0
    UINT32 i;
1856
0
    if (rc == TPM_RC_SUCCESS) {
1857
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1858
0
    }
1859
0
    if (rc == TPM_RC_SUCCESS) {
1860
0
  if (target->count > MAX_CAP_CC) {
1861
0
      rc = TPM_RC_SIZE;
1862
0
  }
1863
0
    }
1864
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1865
0
  rc = TPMA_CC_Unmarshal(&target->commandAttributes[i], buffer, size);
1866
0
    }
1867
0
    return rc;
1868
0
}
1869
 
1870
/* Table 97 - Definition of TPML_ALG Structure */
1871
1872
TPM_RC
1873
TPML_ALG_Unmarshal(TPML_ALG *target, BYTE **buffer, INT32 *size)
1874
0
{
1875
0
    TPM_RC rc = TPM_RC_SUCCESS;
1876
    
1877
0
    UINT32 i;
1878
0
    if (rc == TPM_RC_SUCCESS) {
1879
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1880
0
    }
1881
0
    if (rc == TPM_RC_SUCCESS) {
1882
0
  if (target->count > MAX_ALG_LIST_SIZE) {
1883
0
      rc = TPM_RC_SIZE;
1884
0
  }
1885
0
    }
1886
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1887
0
  rc = TPM_ALG_ID_Unmarshal(&target->algorithms[i], buffer, size);
1888
0
    }
1889
0
    return rc;
1890
0
}
1891
1892
/* Table 98 - Definition of TPML_HANDLE Structure <OUT> */
1893
1894
TPM_RC
1895
TPML_HANDLE_Unmarshal(TPML_HANDLE *target, BYTE **buffer, INT32 *size)
1896
0
{
1897
0
    TPM_RC rc = TPM_RC_SUCCESS;
1898
    
1899
0
    UINT32 i;
1900
0
    if (rc == TPM_RC_SUCCESS) {
1901
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1902
0
    }
1903
0
    if (rc == TPM_RC_SUCCESS) {
1904
0
  if (target->count > MAX_CAP_HANDLES) {
1905
0
      rc = TPM_RC_SIZE;
1906
0
  }
1907
0
    }
1908
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1909
0
  rc = TPM_HANDLE_Unmarshal(&target->handle[i], buffer, size);
1910
0
    }
1911
0
    return rc;
1912
0
}
1913
1914
/* Table 99 - Definition of TPML_DIGEST Structure */
1915
1916
/* PolicyOr has a restriction of at least a count of two.  This function is also used to unmarshal
1917
   PCR_Read, where a count of one is permitted.
1918
*/
1919
1920
TPM_RC
1921
TPML_DIGEST_Unmarshal(TPML_DIGEST *target, BYTE **buffer, INT32 *size)
1922
0
{
1923
0
    TPM_RC rc = TPM_RC_SUCCESS;
1924
    
1925
0
    UINT32 i;
1926
0
    if (rc == TPM_RC_SUCCESS) {
1927
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1928
0
    }
1929
0
    if (rc == TPM_RC_SUCCESS) {
1930
  /* TPM side is hard coded to 2 minimum */
1931
0
  if (target->count < 2) {
1932
0
      rc = TPM_RC_SIZE;
1933
0
  }
1934
0
    }
1935
0
    if (rc == TPM_RC_SUCCESS) {
1936
0
  if (target->count > 8) {
1937
0
      rc = TPM_RC_SIZE;
1938
0
  }
1939
0
    }
1940
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1941
0
  rc = TPM2B_DIGEST_Unmarshal(&target->digests[i], buffer, size);
1942
0
    }
1943
0
    return rc;
1944
0
}
1945
1946
/* Table 100 - Definition of TPML_DIGEST_VALUES Structure */
1947
1948
TPM_RC
1949
TPML_DIGEST_VALUES_Unmarshal(TPML_DIGEST_VALUES *target, BYTE **buffer, INT32 *size)
1950
0
{
1951
0
    TPM_RC rc = TPM_RC_SUCCESS;
1952
    
1953
0
    UINT32 i;
1954
0
    if (rc == TPM_RC_SUCCESS) {
1955
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1956
0
    }
1957
0
    if (rc == TPM_RC_SUCCESS) {
1958
0
  if (target->count > HASH_COUNT) {
1959
0
      rc = TPM_RC_SIZE;
1960
0
  }
1961
0
    }
1962
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1963
0
  rc = TPMT_HA_Unmarshal(&target->digests[i], buffer, size, NO);
1964
0
    }
1965
0
    return rc;
1966
0
}
1967
1968
/* Table 102 - Definition of TPML_PCR_SELECTION Structure */
1969
1970
TPM_RC
1971
TPML_PCR_SELECTION_Unmarshal(TPML_PCR_SELECTION *target, BYTE **buffer, INT32 *size)
1972
0
{
1973
0
    TPM_RC rc = TPM_RC_SUCCESS;
1974
    
1975
0
    UINT32 i;
1976
0
    if (rc == TPM_RC_SUCCESS) {
1977
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
1978
0
    }
1979
0
    if (rc == TPM_RC_SUCCESS) {
1980
0
  if (target->count > HASH_COUNT) {
1981
0
      rc = TPM_RC_SIZE;
1982
0
  }
1983
0
    }
1984
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
1985
0
  rc = TPMS_PCR_SELECTION_Unmarshal(&target->pcrSelections[i], buffer, size);
1986
0
    }
1987
0
    return rc;
1988
0
}
1989
1990
/* Table 103 - Definition of TPML_ALG_PROPERTY Structure <OUT> */
1991
1992
TPM_RC
1993
TPML_ALG_PROPERTY_Unmarshal(TPML_ALG_PROPERTY *target, BYTE **buffer, INT32 *size)
1994
0
{
1995
0
    TPM_RC rc = TPM_RC_SUCCESS;
1996
1997
0
    UINT32 i;
1998
0
   if (rc == TPM_RC_SUCCESS) {
1999
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
2000
0
    }
2001
0
    if (rc == TPM_RC_SUCCESS) {
2002
0
  if (target->count > MAX_CAP_ALGS) {
2003
0
      rc = TPM_RC_SIZE;
2004
0
  }
2005
0
    }
2006
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
2007
0
  rc = TPMS_ALG_PROPERTY_Unmarshal(&target->algProperties[i], buffer, size);
2008
0
    }
2009
0
    return rc;
2010
0
}
2011
2012
/* Table 104 - Definition of TPML_TAGGED_TPM_PROPERTY Structure <OUT> */
2013
2014
TPM_RC
2015
TPML_TAGGED_TPM_PROPERTY_Unmarshal(TPML_TAGGED_TPM_PROPERTY  *target, BYTE **buffer, INT32 *size)
2016
0
{
2017
0
    TPM_RC rc = TPM_RC_SUCCESS;
2018
2019
0
    UINT32 i;
2020
0
    if (rc == TPM_RC_SUCCESS) {
2021
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
2022
0
    }
2023
0
    if (rc == TPM_RC_SUCCESS) {
2024
0
  if (target->count > MAX_TPM_PROPERTIES) {
2025
0
      rc = TPM_RC_SIZE;
2026
0
  }
2027
0
    }
2028
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
2029
0
  rc = TPMS_TAGGED_PROPERTY_Unmarshal(&target->tpmProperty[i], buffer, size);
2030
0
    }
2031
0
    return rc;
2032
0
}
2033
2034
/* Table 105 - Definition of TPML_TAGGED_PCR_PROPERTY Structure <OUT> */
2035
2036
TPM_RC
2037
TPML_TAGGED_PCR_PROPERTY_Unmarshal(TPML_TAGGED_PCR_PROPERTY *target, BYTE **buffer, INT32 *size)
2038
0
{
2039
0
    TPM_RC rc = TPM_RC_SUCCESS;
2040
2041
0
    UINT32 i;
2042
0
    if (rc == TPM_RC_SUCCESS) {
2043
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
2044
0
    }
2045
0
    if (rc == TPM_RC_SUCCESS) {
2046
0
  if (target->count > MAX_PCR_PROPERTIES) {
2047
0
      rc = TPM_RC_SIZE;
2048
0
  }
2049
0
    }
2050
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
2051
0
  rc = TPMS_TAGGED_PCR_SELECT_Unmarshal(&target->pcrProperty[i], buffer, size);
2052
0
    }
2053
0
    return rc;
2054
0
}
2055
2056
/* Table 106 - Definition of {ECC} TPML_ECC_CURVE Structure <OUT> */
2057
2058
TPM_RC
2059
TPML_ECC_CURVE_Unmarshal(TPML_ECC_CURVE *target, BYTE **buffer, INT32 *size)
2060
0
{
2061
0
    TPM_RC rc = TPM_RC_SUCCESS;
2062
2063
0
    UINT32 i;
2064
0
    if (rc == TPM_RC_SUCCESS) {
2065
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
2066
0
    }
2067
0
    if (rc == TPM_RC_SUCCESS) {
2068
0
  if (target->count > MAX_ECC_CURVES) {
2069
0
      rc = TPM_RC_SIZE;
2070
0
  }
2071
0
    }
2072
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
2073
0
  rc = TPM_ECC_CURVE_Unmarshal(&target->eccCurves[i], buffer, size);
2074
0
    }
2075
0
    return rc;
2076
0
}
2077
2078
/* Table 2:109 - Definition of TPML_TAGGED_POLICY Structure (StructuresTable()) */
2079
2080
TPM_RC
2081
TPML_TAGGED_POLICY_Unmarshal(TPML_TAGGED_POLICY *target, BYTE **buffer, INT32 *size)
2082
0
{
2083
0
    TPM_RC rc = TPM_RC_SUCCESS;
2084
2085
0
    UINT32 i;
2086
0
    if (rc == TPM_RC_SUCCESS) {
2087
0
  rc = UINT32_Unmarshal(&target->count, buffer, size);
2088
0
    }
2089
0
    if (rc == TPM_RC_SUCCESS) {
2090
0
  if (target->count > MAX_TAGGED_POLICIES) {
2091
0
      rc = TPM_RC_SIZE;
2092
0
  }
2093
0
    }
2094
0
    for (i = 0 ; (rc == TPM_RC_SUCCESS) && (i < target->count) ; i++) {
2095
0
  rc = TPMS_TAGGED_POLICY_Unmarshal(&target->policies[i], buffer, size);
2096
0
    }
2097
0
    return rc;
2098
0
}
2099
2100
/* Table 2:110 - Definition of TPMU_CAPABILITIES Union (StructuresTable()) */
2101
2102
TPM_RC
2103
TPMU_CAPABILITIES_Unmarshal(TPMU_CAPABILITIES *target, BYTE **buffer, INT32 *size, UINT32 selector)
2104
0
{
2105
0
    TPM_RC rc = TPM_RC_SUCCESS;
2106
2107
0
    switch (selector) {
2108
0
      case TPM_CAP_ALGS:
2109
0
  rc = TPML_ALG_PROPERTY_Unmarshal(&target->algorithms, buffer, size);
2110
0
  break;
2111
0
      case TPM_CAP_HANDLES:
2112
0
  rc = TPML_HANDLE_Unmarshal(&target->handles, buffer, size);
2113
0
  break;
2114
0
      case TPM_CAP_COMMANDS:
2115
0
  rc = TPML_CCA_Unmarshal(&target->command, buffer, size);
2116
0
  break;
2117
0
      case TPM_CAP_PP_COMMANDS:
2118
0
  rc = TPML_CC_Unmarshal(&target->ppCommands, buffer, size);
2119
0
  break;
2120
0
      case TPM_CAP_AUDIT_COMMANDS:
2121
0
  rc = TPML_CC_Unmarshal(&target->auditCommands, buffer, size);
2122
0
  break;
2123
0
      case TPM_CAP_PCRS:
2124
0
  rc = TPML_PCR_SELECTION_Unmarshal(&target->assignedPCR, buffer, size);
2125
0
  break;
2126
0
      case TPM_CAP_TPM_PROPERTIES:
2127
0
  rc = TPML_TAGGED_TPM_PROPERTY_Unmarshal(&target->tpmProperties, buffer, size);
2128
0
  break;
2129
0
      case TPM_CAP_PCR_PROPERTIES:
2130
0
  rc = TPML_TAGGED_PCR_PROPERTY_Unmarshal(&target->pcrProperties, buffer, size);
2131
0
  break;
2132
0
      case TPM_CAP_ECC_CURVES:
2133
0
  rc = TPML_ECC_CURVE_Unmarshal(&target->eccCurves, buffer, size);
2134
0
  break;
2135
0
      case TPM_CAP_AUTH_POLICIES: 
2136
0
  rc = TPML_TAGGED_POLICY_Unmarshal(&target->authPolicies, buffer, size);
2137
0
  break;
2138
0
      default:
2139
0
  rc = TPM_RC_SELECTOR;
2140
0
    }
2141
0
    return rc;
2142
0
}
2143
2144
/* Table 2:111 - Definition of TPMS_CAPABILITY_DATA Structure (StructuresTable()) */
2145
2146
TPM_RC
2147
TPMS_CAPABILITY_DATA_Unmarshal(TPMS_CAPABILITY_DATA *target, BYTE **buffer, INT32 *size)
2148
0
{
2149
0
    TPM_RC rc = TPM_RC_SUCCESS;
2150
  
2151
0
    if (rc == TPM_RC_SUCCESS) {
2152
0
  rc = TPM_CAP_Unmarshal(&target->capability, buffer, size);
2153
0
    }
2154
0
    if (rc == TPM_RC_SUCCESS) {
2155
0
  rc = TPMU_CAPABILITIES_Unmarshal(&target->data, buffer, size, target->capability);
2156
0
    }
2157
0
    return rc;
2158
0
}
2159
2160
/* Table 109 - Definition of TPMS_CLOCK_INFO Structure */
2161
2162
TPM_RC
2163
TPMS_CLOCK_INFO_Unmarshal(TPMS_CLOCK_INFO *target, BYTE **buffer, INT32 *size)
2164
0
{
2165
0
    TPM_RC rc = TPM_RC_SUCCESS;
2166
2167
0
    if (rc == TPM_RC_SUCCESS) {
2168
0
  rc = UINT64_Unmarshal(&target->clock, buffer, size);
2169
0
    }
2170
0
    if (rc == TPM_RC_SUCCESS) {
2171
0
  rc = UINT32_Unmarshal(&target->resetCount, buffer, size);
2172
0
    }
2173
0
    if (rc == TPM_RC_SUCCESS) {
2174
0
  rc = UINT32_Unmarshal(&target->restartCount, buffer, size);
2175
0
    }
2176
0
    if (rc == TPM_RC_SUCCESS) {
2177
0
  rc = TPMI_YES_NO_Unmarshal(&target->safe, buffer, size);
2178
0
    }
2179
0
    return rc;
2180
0
}
2181
2182
/* Table 110 - Definition of TPMS_TIME_INFO Structure */
2183
2184
TPM_RC
2185
TPMS_TIME_INFO_Unmarshal(TPMS_TIME_INFO *target, BYTE **buffer, INT32 *size)
2186
0
{
2187
0
    TPM_RC rc = TPM_RC_SUCCESS;
2188
    
2189
0
    if (rc == TPM_RC_SUCCESS) {
2190
0
  rc = UINT64_Unmarshal(&target->time, buffer, size);
2191
0
    }
2192
0
    if (rc == TPM_RC_SUCCESS) {
2193
0
  rc = TPMS_CLOCK_INFO_Unmarshal(&target->clockInfo, buffer, size);
2194
0
    }
2195
0
    return rc;
2196
0
}
2197
2198
/* Table 111 - Definition of TPMS_TIME_ATTEST_INFO Structure <OUT> */
2199
2200
TPM_RC
2201
TPMS_TIME_ATTEST_INFO_Unmarshal(TPMS_TIME_ATTEST_INFO *target, BYTE **buffer, INT32 *size)
2202
0
{
2203
0
    TPM_RC rc = TPM_RC_SUCCESS;
2204
2205
0
    if (rc == TPM_RC_SUCCESS) {
2206
0
  rc = TPMS_TIME_INFO_Unmarshal(&target->time, buffer, size);
2207
0
    }
2208
0
    if (rc == TPM_RC_SUCCESS) {
2209
0
  rc = UINT64_Unmarshal(&target->firmwareVersion, buffer, size);
2210
0
    }
2211
0
    return rc;
2212
0
}
2213
2214
/* Table 112 - Definition of TPMS_CERTIFY_INFO Structure <OUT> */
2215
2216
TPM_RC
2217
TPMS_CERTIFY_INFO_Unmarshal(TPMS_CERTIFY_INFO *target, BYTE **buffer, INT32 *size)
2218
0
{
2219
0
    TPM_RC rc = TPM_RC_SUCCESS;
2220
2221
0
    if (rc == TPM_RC_SUCCESS) {
2222
0
  rc = TPM2B_NAME_Unmarshal(&target->name, buffer, size);
2223
0
    }
2224
0
    if (rc == TPM_RC_SUCCESS) {
2225
0
  rc = TPM2B_NAME_Unmarshal(&target->qualifiedName, buffer, size);
2226
0
    }
2227
0
    return rc;
2228
0
}
2229
2230
/* Table 113 - Definition of TPMS_QUOTE_INFO Structure <OUT> */
2231
2232
TPM_RC
2233
TPMS_QUOTE_INFO_Unmarshal(TPMS_QUOTE_INFO *target, BYTE **buffer, INT32 *size)
2234
0
{
2235
0
    TPM_RC rc = TPM_RC_SUCCESS;
2236
2237
0
    if (rc == TPM_RC_SUCCESS) {
2238
0
  rc = TPML_PCR_SELECTION_Unmarshal(&target->pcrSelect, buffer, size);
2239
0
    }
2240
0
    if (rc == TPM_RC_SUCCESS) {
2241
0
  rc = TPM2B_DIGEST_Unmarshal(&target->pcrDigest, buffer, size);
2242
0
    }
2243
0
    return rc;
2244
0
}
2245
2246
/* Table 114 - Definition of TPMS_COMMAND_AUDIT_INFO Structure <OUT> */
2247
2248
TPM_RC
2249
TPMS_COMMAND_AUDIT_INFO_Unmarshal(TPMS_COMMAND_AUDIT_INFO *target, BYTE **buffer, INT32 *size)
2250
0
{
2251
0
    TPM_RC rc = TPM_RC_SUCCESS;
2252
2253
0
    if (rc == TPM_RC_SUCCESS) {
2254
0
  rc = UINT64_Unmarshal(&target->auditCounter, buffer, size);
2255
0
    }
2256
0
    if (rc == TPM_RC_SUCCESS) {
2257
0
  rc = TPM_ALG_ID_Unmarshal(&target->digestAlg, buffer, size);
2258
0
    }
2259
0
    if (rc == TPM_RC_SUCCESS) {
2260
0
  rc = TPM2B_DIGEST_Unmarshal(&target->auditDigest, buffer, size);
2261
0
    }
2262
0
    if (rc == TPM_RC_SUCCESS) {
2263
0
  rc = TPM2B_DIGEST_Unmarshal(&target->commandDigest, buffer, size);
2264
0
    }
2265
0
    return rc;
2266
0
}
2267
2268
/* Table 115 - Definition of TPMS_SESSION_AUDIT_INFO Structure <OUT> */
2269
2270
TPM_RC
2271
TPMS_SESSION_AUDIT_INFO_Unmarshal(TPMS_SESSION_AUDIT_INFO *target, BYTE **buffer, INT32 *size)
2272
0
{
2273
0
    TPM_RC rc = TPM_RC_SUCCESS;
2274
2275
0
    if (rc == TPM_RC_SUCCESS) {
2276
0
  rc = TPMI_YES_NO_Unmarshal(&target->exclusiveSession, buffer, size);
2277
0
    }
2278
0
    if (rc == TPM_RC_SUCCESS) {
2279
0
  rc = TPM2B_DIGEST_Unmarshal(&target->sessionDigest, buffer, size);
2280
0
    }
2281
0
    return rc;
2282
0
}
2283
2284
/* Table 116 - Definition of TPMS_CREATION_INFO Structure <OUT> */
2285
2286
TPM_RC
2287
TPMS_CREATION_INFO_Unmarshal(TPMS_CREATION_INFO *target, BYTE **buffer, INT32 *size)
2288
0
{
2289
0
    TPM_RC rc = TPM_RC_SUCCESS;
2290
2291
0
    if (rc == TPM_RC_SUCCESS) {
2292
0
  rc = TPM2B_NAME_Unmarshal(&target->objectName, buffer, size);
2293
0
    }
2294
0
    if (rc == TPM_RC_SUCCESS) {
2295
0
  rc = TPM2B_DIGEST_Unmarshal(&target->creationHash, buffer, size);
2296
0
    }
2297
0
    return rc;
2298
0
}
2299
2300
/* Table 117 - Definition of TPMS_NV_CERTIFY_INFO Structure <OUT> */
2301
2302
TPM_RC
2303
TPMS_NV_CERTIFY_INFO_Unmarshal(TPMS_NV_CERTIFY_INFO *target, BYTE **buffer, INT32 *size)
2304
0
{
2305
0
    TPM_RC rc = TPM_RC_SUCCESS;
2306
2307
0
    if (rc == TPM_RC_SUCCESS) {
2308
0
  rc = TPM2B_NAME_Unmarshal(&target->indexName, buffer, size);
2309
0
    }
2310
0
    if (rc == TPM_RC_SUCCESS) {
2311
0
  rc = UINT16_Unmarshal(&target->offset, buffer, size);
2312
0
    }
2313
0
    if (rc == TPM_RC_SUCCESS) {
2314
0
  rc = TPM2B_MAX_NV_BUFFER_Unmarshal(&target->nvContents, buffer, size);
2315
0
    }
2316
0
    return rc;
2317
0
}
2318
2319
/* Table 118 - Definition of (TPM_ST) TPMI_ST_ATTEST Type <OUT> */
2320
2321
TPM_RC
2322
TPMI_ST_ATTEST_Unmarshal(TPMI_ST_ATTEST *target, BYTE **buffer, INT32 *size)
2323
0
{
2324
0
    TPM_RC rc = TPM_RC_SUCCESS;
2325
2326
0
    if (rc == TPM_RC_SUCCESS) {
2327
0
  rc = TPM_ST_Unmarshal(target, buffer, size);
2328
0
    }
2329
0
    if (rc == TPM_RC_SUCCESS) {
2330
0
  switch (*target) {
2331
0
    case TPM_ST_ATTEST_CERTIFY:
2332
0
    case TPM_ST_ATTEST_CREATION:
2333
0
    case TPM_ST_ATTEST_QUOTE:
2334
0
    case TPM_ST_ATTEST_COMMAND_AUDIT:
2335
0
    case TPM_ST_ATTEST_SESSION_AUDIT:
2336
0
    case TPM_ST_ATTEST_TIME:
2337
0
    case TPM_ST_ATTEST_NV:
2338
0
      break;
2339
0
    default:
2340
0
      rc = TPM_RC_SELECTOR;
2341
0
  }
2342
0
    }
2343
0
    return rc;
2344
0
}
2345
2346
/*  Table 119 - Definition of TPMU_ATTEST Union <OUT> */
2347
2348
TPM_RC
2349
TPMU_ATTEST_Unmarshal(TPMU_ATTEST *target, BYTE **buffer, INT32 *size, UINT32 selector)
2350
0
{
2351
0
    TPM_RC rc = TPM_RC_SUCCESS;
2352
2353
0
    switch (selector) {
2354
0
      case TPM_ST_ATTEST_CERTIFY:
2355
0
  rc = TPMS_CERTIFY_INFO_Unmarshal(&target->certify, buffer, size);
2356
0
  break;
2357
0
      case TPM_ST_ATTEST_CREATION:
2358
0
  rc = TPMS_CREATION_INFO_Unmarshal(&target->creation, buffer, size);
2359
0
  break;
2360
0
      case TPM_ST_ATTEST_QUOTE:
2361
0
  rc = TPMS_QUOTE_INFO_Unmarshal(&target->quote, buffer, size);
2362
0
  break;
2363
0
      case TPM_ST_ATTEST_COMMAND_AUDIT:
2364
0
  rc = TPMS_COMMAND_AUDIT_INFO_Unmarshal(&target->commandAudit, buffer, size);
2365
0
  break;
2366
0
      case TPM_ST_ATTEST_SESSION_AUDIT:
2367
0
  rc = TPMS_SESSION_AUDIT_INFO_Unmarshal(&target->sessionAudit, buffer, size);
2368
0
  break;
2369
0
      case TPM_ST_ATTEST_TIME:
2370
0
  rc = TPMS_TIME_ATTEST_INFO_Unmarshal(&target->time, buffer, size);
2371
0
  break;
2372
0
      case TPM_ST_ATTEST_NV:
2373
0
  rc = TPMS_NV_CERTIFY_INFO_Unmarshal(&target->nv, buffer, size);
2374
0
  break;
2375
0
      default:
2376
0
  rc = TPM_RC_SELECTOR;
2377
  
2378
0
    }
2379
0
    return rc;
2380
0
}
2381
2382
/* Table 120 - Definition of TPMS_ATTEST Structure <OUT> */
2383
2384
TPM_RC
2385
TPMS_ATTEST_Unmarshal(TPMS_ATTEST *target, BYTE **buffer, INT32 *size)
2386
0
{
2387
0
    TPM_RC rc = TPM_RC_SUCCESS;
2388
2389
0
    if (rc == TPM_RC_SUCCESS) {
2390
0
  rc = TPM_GENERATED_Unmarshal(&target->magic, buffer, size);
2391
0
    }
2392
0
    if (rc == TPM_RC_SUCCESS) {
2393
0
  rc = TPMI_ST_ATTEST_Unmarshal(&target->type, buffer, size);
2394
0
    }
2395
0
    if (rc == TPM_RC_SUCCESS) {
2396
0
  rc = TPM2B_NAME_Unmarshal(&target->qualifiedSigner, buffer, size);
2397
0
    }
2398
0
    if (rc == TPM_RC_SUCCESS) {
2399
0
  rc = TPM2B_DATA_Unmarshal(&target->extraData, buffer, size);
2400
0
    }
2401
0
    if (rc == TPM_RC_SUCCESS) {
2402
0
  rc = TPMS_CLOCK_INFO_Unmarshal(&target->clockInfo, buffer, size);
2403
0
    }
2404
0
    if (rc == TPM_RC_SUCCESS) {
2405
0
  rc = UINT64_Unmarshal(&target->firmwareVersion, buffer, size);
2406
0
    }
2407
0
    if (rc == TPM_RC_SUCCESS) {
2408
0
  rc = TPMU_ATTEST_Unmarshal(&target->attested, buffer, size, target->type);
2409
0
    }
2410
0
    return rc;
2411
0
}
2412
2413
/* Table 121 - Definition of TPM2B_ATTEST Structure <OUT> */
2414
2415
TPM_RC
2416
TPM2B_ATTEST_Unmarshal(TPM2B_ATTEST *target, BYTE **buffer, INT32 *size)
2417
0
{
2418
0
    TPM_RC rc = TPM_RC_SUCCESS;
2419
    
2420
0
    if (rc == TPM_RC_SUCCESS) {
2421
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMS_ATTEST), buffer, size);
2422
0
    }
2423
0
    return rc;
2424
0
}
2425
2426
/* Table 123 - Definition of TPMS_AUTH_RESPONSE Structure <OUT> */
2427
2428
TPM_RC
2429
TPMS_AUTH_RESPONSE_Unmarshal(TPMS_AUTH_RESPONSE *target, BYTE **buffer, INT32 *size)
2430
0
{
2431
0
    TPM_RC rc = TPM_RC_SUCCESS;
2432
    
2433
0
    if (rc == TPM_RC_SUCCESS) {
2434
0
  rc = TPM2B_NONCE_Unmarshal(&target->nonce, buffer, size);
2435
0
    }
2436
0
    if (rc == TPM_RC_SUCCESS) {
2437
0
  rc = TPMA_SESSION_Unmarshal(&target->sessionAttributes, buffer, size);
2438
0
    }
2439
0
    if (rc == TPM_RC_SUCCESS) {
2440
0
  rc = TPM2B_AUTH_Unmarshal(&target->hmac, buffer, size);
2441
0
    }
2442
0
    return rc;
2443
0
}
2444
2445
/* Table 124 - Definition of {!ALG.S} (TPM_KEY_BITS) TPMI_!ALG.S_KEY_BITS Type */
2446
2447
#if ALG_AES
2448
TPM_RC
2449
TPMI_AES_KEY_BITS_Unmarshal(TPMI_AES_KEY_BITS *target, BYTE **buffer, INT32 *size)
2450
0
{
2451
0
    TPM_RC rc = TPM_RC_SUCCESS;
2452
2453
0
    if (rc == TPM_RC_SUCCESS) {
2454
0
  rc = TPM_KEY_BITS_Unmarshal(target, buffer, size);  
2455
0
    }
2456
0
    if (rc == TPM_RC_SUCCESS) {
2457
0
  switch (*target) {
2458
0
    case 128:
2459
0
    case 256:
2460
0
      break;
2461
0
    default:
2462
0
      rc = TPM_RC_VALUE;
2463
0
  }
2464
0
    }
2465
0
    return rc;
2466
0
}
2467
#endif
2468
 
2469
#if ALG_CAMELLIA
2470
TPM_RC
2471
TPMI_CAMELLIA_KEY_BITS_Unmarshal(TPMI_CAMELLIA_KEY_BITS *target, BYTE **buffer, INT32 *size)
2472
{
2473
    TPM_RC rc = TPM_RC_SUCCESS;
2474
2475
    if (rc == TPM_RC_SUCCESS) {
2476
  rc = TPM_KEY_BITS_Unmarshal(target, buffer, size);  
2477
    }
2478
    if (rc == TPM_RC_SUCCESS) {
2479
  switch (*target) {
2480
    case 128:
2481
      break;
2482
    default:
2483
      rc = TPM_RC_VALUE;
2484
  }
2485
    }
2486
    return rc;
2487
}
2488
#endif
2489
2490
#if ALG_SM4
2491
TPM_RC
2492
TPMI_SM4_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *size)
2493
{
2494
    TPM_RC rc = TPM_RC_SUCCESS;
2495
2496
    if (rc == TPM_RC_SUCCESS) {
2497
  rc = TPM_KEY_BITS_Unmarshal(target, buffer, size);  
2498
    }
2499
    if (rc == TPM_RC_SUCCESS) {
2500
  switch (*target) {
2501
    case 128:
2502
      break;
2503
    default:
2504
      rc = TPM_RC_VALUE;
2505
  }
2506
    }
2507
    return rc;
2508
}
2509
#endif
2510
2511
/* Table 125 - Definition of TPMU_SYM_KEY_BITS Union */
2512
2513
TPM_RC
2514
TPMU_SYM_KEY_BITS_Unmarshal(TPMU_SYM_KEY_BITS *target, BYTE **buffer, INT32 *size, UINT32 selector)
2515
0
{
2516
0
    TPM_RC rc = TPM_RC_SUCCESS;
2517
2518
0
    switch (selector) {
2519
0
#if ALG_AES
2520
0
      case TPM_ALG_AES:
2521
0
  rc = TPMI_AES_KEY_BITS_Unmarshal(&target->aes, buffer, size);
2522
0
  break;
2523
0
#endif
2524
#if ALG_SM4
2525
      case TPM_ALG_SM4:
2526
  rc = TPMI_SM4_KEY_BITS_Unmarshal(&target->sm4, buffer, size);
2527
  break;
2528
#endif
2529
#if ALG_CAMELLIA
2530
      case TPM_ALG_CAMELLIA:
2531
  rc = TPMI_CAMELLIA_KEY_BITS_Unmarshal(&target->camellia, buffer, size);
2532
  break;
2533
#endif
2534
0
#if ALG_XOR
2535
0
      case TPM_ALG_XOR:
2536
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->xorr, buffer, size, NO);
2537
0
  break;
2538
0
#endif
2539
0
      case TPM_ALG_NULL:
2540
0
  break;
2541
0
      default:
2542
0
  rc = TPM_RC_SELECTOR;
2543
0
    }
2544
0
    return rc;
2545
0
}
2546
2547
/* Table 126 - Definition of TPMU_SYM_MODE Union */
2548
2549
TPM_RC
2550
TPMU_SYM_MODE_Unmarshal(TPMU_SYM_MODE *target, BYTE **buffer, INT32 *size, UINT32 selector)
2551
0
{
2552
0
    TPM_RC rc = TPM_RC_SUCCESS;
2553
2554
0
    switch (selector) {
2555
0
#if ALG_AES
2556
0
      case TPM_ALG_AES:
2557
0
  rc = TPMI_ALG_SYM_MODE_Unmarshal(&target->aes, buffer, size, YES);
2558
0
  break;
2559
0
#endif
2560
#if ALG_SM4
2561
      case TPM_ALG_SM4:
2562
  rc = TPMI_ALG_SYM_MODE_Unmarshal(&target->sm4, buffer, size, YES);
2563
  break;
2564
#endif
2565
#if ALG_CAMELLIA
2566
      case TPM_ALG_CAMELLIA:
2567
  rc = TPMI_ALG_SYM_MODE_Unmarshal(&target->camellia, buffer, size, YES);
2568
  break;
2569
#endif
2570
0
      case TPM_ALG_XOR:
2571
0
      case TPM_ALG_NULL:
2572
0
  break;
2573
0
      default:
2574
0
  rc = TPM_RC_SELECTOR;
2575
0
    }
2576
0
    return rc;
2577
0
}
2578
2579
/* Table 131 - Definition of TPMT_SYM_DEF Structure */
2580
2581
TPM_RC
2582
TPMT_SYM_DEF_Unmarshal(TPMT_SYM_DEF *target, BYTE **buffer, INT32 *size, BOOL allowNull)
2583
0
{
2584
0
    TPM_RC rc = TPM_RC_SUCCESS;
2585
2586
0
    if (rc == TPM_RC_SUCCESS) {
2587
0
  rc = TPMI_ALG_SYM_Unmarshal(&target->algorithm, buffer, size, allowNull);
2588
0
    }
2589
0
    if (rc == TPM_RC_SUCCESS) {
2590
0
  rc = TPMU_SYM_KEY_BITS_Unmarshal(&target->keyBits, buffer, size, target->algorithm);
2591
0
    }
2592
0
    if (rc == TPM_RC_SUCCESS) {
2593
0
  rc = TPMU_SYM_MODE_Unmarshal(&target->mode, buffer, size, target->algorithm);
2594
0
    }
2595
0
    return rc;
2596
0
}
2597
2598
/* Table 132 - Definition of TPMT_SYM_DEF_OBJECT Structure */
2599
2600
TPM_RC
2601
TPMT_SYM_DEF_OBJECT_Unmarshal(TPMT_SYM_DEF_OBJECT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
2602
0
{
2603
0
    TPM_RC rc = TPM_RC_SUCCESS;
2604
2605
0
    if (rc == TPM_RC_SUCCESS) {
2606
0
  rc = TPMI_ALG_SYM_OBJECT_Unmarshal(&target->algorithm, buffer, size, allowNull);
2607
0
    }
2608
0
    if (rc == TPM_RC_SUCCESS) {
2609
0
  rc = TPMU_SYM_KEY_BITS_Unmarshal(&target->keyBits, buffer, size, target->algorithm);
2610
0
    }
2611
0
    if (rc == TPM_RC_SUCCESS) {
2612
0
  rc = TPMU_SYM_MODE_Unmarshal(&target->mode, buffer, size, target->algorithm);
2613
0
    }
2614
0
    return rc;
2615
0
}
2616
2617
/* Table 133 - Definition of TPM2B_SYM_KEY Structure */
2618
2619
TPM_RC
2620
TPM2B_SYM_KEY_Unmarshal(TPM2B_SYM_KEY *target, BYTE **buffer, INT32 *size)
2621
0
{
2622
0
    TPM_RC rc = TPM_RC_SUCCESS;
2623
    
2624
0
    if (rc == TPM_RC_SUCCESS) {
2625
0
  rc = TPM2B_Unmarshal(&target->b, MAX_SYM_KEY_BYTES, buffer, size);
2626
0
    }
2627
0
    return rc;
2628
0
}
2629
2630
/* Table 134 - Definition of TPMS_SYMCIPHER_PARMS Structure */
2631
2632
TPM_RC
2633
TPMS_SYMCIPHER_PARMS_Unmarshal(TPMS_SYMCIPHER_PARMS *target, BYTE **buffer, INT32 *size)
2634
0
{
2635
0
    TPM_RC rc = TPM_RC_SUCCESS;
2636
    
2637
0
    if (rc == TPM_RC_SUCCESS) {
2638
0
  rc = TPMT_SYM_DEF_OBJECT_Unmarshal(&target->sym, buffer, size, NO);
2639
0
    }
2640
0
    return rc;
2641
0
}
2642
2643
/* Table 2:135 - Definition of TPM2B_LABEL Structure (StructuresTable()) */
2644
2645
TPM_RC
2646
TPM2B_LABEL_Unmarshal(TPM2B_LABEL *target, BYTE **buffer, INT32 *size)
2647
0
{
2648
0
    TPM_RC rc = TPM_RC_SUCCESS;
2649
    
2650
0
    if (rc == TPM_RC_SUCCESS) {
2651
0
  rc = TPM2B_Unmarshal(&target->b, LABEL_MAX_BUFFER, buffer, size);
2652
0
    }
2653
0
    return rc;
2654
0
}
2655
2656
/* Table 2:136 - Definition of TPMS_DERIVE Structure (StructuresTable()) */
2657
2658
TPM_RC
2659
TPMS_DERIVE_Unmarshal(TPMS_DERIVE *target, BYTE **buffer, INT32 *size)
2660
0
{
2661
0
    TPM_RC rc = TPM_RC_SUCCESS;
2662
    
2663
0
    if (rc == TPM_RC_SUCCESS) {
2664
0
  rc = TPM2B_LABEL_Unmarshal(&target->label, buffer, size);
2665
0
    }
2666
0
    if (rc == TPM_RC_SUCCESS) {
2667
0
  rc = TPM2B_LABEL_Unmarshal(&target->context, buffer, size);
2668
0
    }
2669
0
    return rc;
2670
0
}
2671
2672
/* Table 2:137 - Definition of TPM2B_DERIVE Structure (StructuresTable()) */
2673
2674
TPM_RC
2675
TPM2B_DERIVE_Unmarshal(TPM2B_DERIVE *target, BYTE **buffer, INT32 *size)
2676
0
{
2677
0
    TPM_RC rc = TPM_RC_SUCCESS;
2678
2679
0
    if (rc == TPM_RC_SUCCESS) {
2680
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMS_DERIVE), buffer, size);
2681
0
    }
2682
0
    return rc;
2683
0
}
2684
2685
/* Table 139 - Definition of TPM2B_SENSITIVE_DATA Structure */
2686
2687
TPM_RC
2688
TPM2B_SENSITIVE_DATA_Unmarshal(TPM2B_SENSITIVE_DATA *target, BYTE **buffer, INT32 *size)
2689
0
{
2690
0
    TPM_RC rc = TPM_RC_SUCCESS;
2691
    
2692
0
    if (rc == TPM_RC_SUCCESS) {
2693
0
  rc = TPM2B_Unmarshal(&target->b, MAX_SYM_DATA, buffer, size);
2694
0
    }
2695
0
    return rc;
2696
0
}
2697
2698
/* Table 133 - Definition of TPMS_SENSITIVE_CREATE Structure <IN> */
2699
2700
TPM_RC
2701
TPMS_SENSITIVE_CREATE_Unmarshal(TPMS_SENSITIVE_CREATE *target, BYTE **buffer, INT32 *size)
2702
0
{
2703
0
    TPM_RC rc = TPM_RC_SUCCESS;
2704
    
2705
0
    if (rc == TPM_RC_SUCCESS) {
2706
0
  rc = TPM2B_AUTH_Unmarshal(&target->userAuth, buffer, size);
2707
0
    }
2708
0
    if (rc == TPM_RC_SUCCESS) {
2709
0
  rc = TPM2B_SENSITIVE_DATA_Unmarshal(&target->data, buffer, size);
2710
0
    }
2711
0
    return rc;
2712
0
}
2713
2714
/* Table 134 - Definition of TPM2B_SENSITIVE_CREATE Structure <IN, S> */
2715
2716
TPM_RC
2717
TPM2B_SENSITIVE_CREATE_Unmarshal(TPM2B_SENSITIVE_CREATE *target, BYTE **buffer, INT32 *size)
2718
0
{
2719
0
    TPM_RC rc = TPM_RC_SUCCESS;
2720
    
2721
0
    INT32 startSize;
2722
0
    if (rc == TPM_RC_SUCCESS) {
2723
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
2724
0
    }
2725
0
    if (rc == TPM_RC_SUCCESS) {
2726
0
  if (target->size == 0) {
2727
0
      rc = TPM_RC_SIZE;
2728
0
  }
2729
0
    }
2730
0
    if (rc == TPM_RC_SUCCESS) {
2731
0
  startSize = *size;
2732
0
    }
2733
0
    if (rc == TPM_RC_SUCCESS) {
2734
0
  rc = TPMS_SENSITIVE_CREATE_Unmarshal(&target->sensitive, buffer, size);
2735
0
    }
2736
0
    if (rc == TPM_RC_SUCCESS) {
2737
0
  if (target->size != startSize - *size) {
2738
0
      rc = TPM_RC_SIZE;
2739
0
  }
2740
0
    }
2741
0
    return rc;
2742
0
}
2743
2744
/* Table 135 - Definition of TPMS_SCHEME_HASH Structure */
2745
2746
TPM_RC
2747
TPMS_SCHEME_HASH_Unmarshal(TPMS_SCHEME_HASH *target, BYTE **buffer, INT32 *size)
2748
0
{
2749
0
    TPM_RC rc = TPM_RC_SUCCESS;
2750
    
2751
0
    if (rc == TPM_RC_SUCCESS) {
2752
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hashAlg, buffer, size, NO);
2753
0
    }
2754
0
    return rc;
2755
0
}
2756
2757
/* Table 136 - Definition of {ECC} TPMS_SCHEME_ECDAA Structure */
2758
2759
TPM_RC
2760
TPMS_SCHEME_ECDAA_Unmarshal(TPMS_SCHEME_ECDAA *target, BYTE **buffer, INT32 *size) 
2761
0
{
2762
0
    TPM_RC rc = TPM_RC_SUCCESS;
2763
2764
0
    if (rc == TPM_RC_SUCCESS) {
2765
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hashAlg, buffer, size, NO);  
2766
0
    }
2767
0
    if (rc == TPM_RC_SUCCESS) {
2768
0
  rc = UINT16_Unmarshal(&target->count, buffer, size);  
2769
0
    }
2770
0
    return rc;
2771
0
}
2772
2773
/* Table 137 - Definition of (TPM_ALG_ID) TPMI_ALG_KEYEDHASH_SCHEME Type */
2774
2775
TPM_RC
2776
TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal(TPMI_ALG_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
2777
0
{
2778
0
    TPM_RC rc = TPM_RC_SUCCESS;
2779
2780
0
    if (rc == TPM_RC_SUCCESS) {
2781
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
2782
0
    }
2783
0
    if (rc == TPM_RC_SUCCESS) {
2784
0
  switch (*target) {
2785
0
#if ALG_HMAC
2786
0
    case TPM_ALG_HMAC: 
2787
0
#endif
2788
0
#if ALG_XOR
2789
0
    case TPM_ALG_XOR: 
2790
0
#endif
2791
0
      break;
2792
0
    case TPM_ALG_NULL:
2793
0
      if (allowNull) {
2794
0
    break;
2795
0
      }
2796
0
    default:
2797
0
      rc = TPM_RC_VALUE;
2798
0
  }
2799
0
    }
2800
0
    return rc;
2801
0
}
2802
2803
/* Table 138 - Definition of Types for HMAC_SIG_SCHEME */
2804
2805
TPM_RC
2806
TPMS_SCHEME_HMAC_Unmarshal(TPMS_SCHEME_HMAC *target, BYTE **buffer, INT32 *size)
2807
0
{
2808
0
    TPM_RC rc = TPM_RC_SUCCESS;
2809
    
2810
0
    if (rc == TPM_RC_SUCCESS) {
2811
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
2812
0
    }
2813
0
    return rc;
2814
0
}
2815
2816
/* Table 139 - Definition of TPMS_SCHEME_XOR Structure */
2817
2818
TPM_RC
2819
TPMS_SCHEME_XOR_Unmarshal(TPMS_SCHEME_XOR *target, BYTE **buffer, INT32 *size)
2820
0
{
2821
0
    TPM_RC rc = TPM_RC_SUCCESS;
2822
    
2823
0
    if (rc == TPM_RC_SUCCESS) {
2824
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hashAlg, buffer, size, NO);  /* as of rev 147 */
2825
0
    }
2826
0
    if (rc == TPM_RC_SUCCESS) {
2827
0
  rc = TPMI_ALG_KDF_Unmarshal(&target->kdf, buffer, size, YES);
2828
0
    }
2829
0
    return rc;
2830
0
}
2831
    
2832
/* Table 140 - Definition of TPMU_SCHEME_KEYEDHASH Union <IN/OUT, S> */
2833
2834
TPM_RC
2835
TPMU_SCHEME_KEYEDHASH_Unmarshal(TPMU_SCHEME_KEYEDHASH *target, BYTE **buffer, INT32 *size, UINT32 selector)
2836
0
{
2837
0
    TPM_RC rc = TPM_RC_SUCCESS;
2838
2839
0
    switch (selector) {
2840
0
#if ALG_HMAC
2841
0
      case TPM_ALG_HMAC:
2842
0
  rc = TPMS_SCHEME_HMAC_Unmarshal(&target->hmac, buffer, size);
2843
0
  break;
2844
0
#endif
2845
0
#if ALG_XOR
2846
0
      case TPM_ALG_XOR:
2847
0
  rc = TPMS_SCHEME_XOR_Unmarshal(&target->xorr, buffer, size);
2848
0
  break;
2849
0
#endif
2850
0
      case TPM_ALG_NULL:
2851
0
  break;
2852
0
      default:
2853
0
  rc = TPM_RC_SELECTOR;
2854
0
    }
2855
0
    return rc;
2856
0
}
2857
2858
/* Table 141 - Definition of TPMT_KEYEDHASH_SCHEME Structure */
2859
2860
TPM_RC
2861
TPMT_KEYEDHASH_SCHEME_Unmarshal(TPMT_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
2862
0
{
2863
0
    TPM_RC rc = TPM_RC_SUCCESS;
2864
2865
0
    if (rc == TPM_RC_SUCCESS) {
2866
0
  rc = TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal(&target->scheme, buffer, size, allowNull);
2867
0
    }
2868
0
    if (rc == TPM_RC_SUCCESS) {
2869
0
  rc = TPMU_SCHEME_KEYEDHASH_Unmarshal(&target->details, buffer, size, target->scheme);
2870
0
    }
2871
0
    return rc;
2872
0
}
2873
2874
/* Table 142 - Definition of {RSA} Types for RSA Signature Schemes */
2875
2876
TPM_RC
2877
TPMS_SIG_SCHEME_RSAPSS_Unmarshal(TPMS_SIG_SCHEME_RSAPSS *target, BYTE **buffer, INT32 *size)
2878
0
{
2879
0
    TPM_RC rc = TPM_RC_SUCCESS;
2880
    
2881
0
    if (rc == TPM_RC_SUCCESS) {
2882
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
2883
0
    }
2884
0
    return rc;
2885
0
}
2886
2887
/* Table 142 - Definition of {RSA} Types for RSA Signature Schemes */
2888
2889
TPM_RC
2890
TPMS_SIG_SCHEME_RSASSA_Unmarshal(TPMS_SIG_SCHEME_RSASSA *target, BYTE **buffer, INT32 *size)
2891
0
{
2892
0
    TPM_RC rc = TPM_RC_SUCCESS;
2893
2894
0
    if (rc == TPM_RC_SUCCESS) {
2895
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
2896
0
    }
2897
0
    return rc;
2898
0
}
2899
2900
/* Table 143 - Definition of {ECC} Types for ECC Signature Schemes */
2901
2902
TPM_RC
2903
TPMS_SIG_SCHEME_ECDAA_Unmarshal(TPMS_SIG_SCHEME_ECDAA *target, BYTE **buffer, INT32 *size)
2904
0
{
2905
0
    TPM_RC rc = TPM_RC_SUCCESS;
2906
2907
0
    if (rc == TPM_RC_SUCCESS) {
2908
0
  rc = TPMS_SCHEME_ECDAA_Unmarshal(target, buffer, size);
2909
0
    }
2910
0
    return rc;
2911
0
}
2912
2913
/* Table 143 - Definition of {ECC} Types for ECC Signature Schemes */
2914
2915
TPM_RC
2916
TPMS_SIG_SCHEME_ECDSA_Unmarshal(TPMS_SIG_SCHEME_ECDSA *target, BYTE **buffer, INT32 *size)
2917
0
{
2918
0
    TPM_RC rc = TPM_RC_SUCCESS;
2919
2920
0
    if (rc == TPM_RC_SUCCESS) {
2921
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
2922
0
    }
2923
0
    return rc;
2924
0
}
2925
2926
/* Table 143 - Definition of {ECC} Types for ECC Signature Schemes */
2927
2928
TPM_RC
2929
TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal(TPMS_SIG_SCHEME_ECSCHNORR *target, BYTE **buffer, INT32 *size)
2930
0
{
2931
0
    TPM_RC rc = TPM_RC_SUCCESS;
2932
2933
0
    if (rc == TPM_RC_SUCCESS) {
2934
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
2935
0
    }
2936
0
    return rc;
2937
0
}
2938
2939
/* Table 143 - Definition of {ECC} Types for ECC Signature Schemes */
2940
2941
TPM_RC
2942
TPMS_SIG_SCHEME_SM2_Unmarshal(TPMS_SIG_SCHEME_SM2 *target, BYTE **buffer, INT32 *size)
2943
0
{
2944
0
    TPM_RC rc = TPM_RC_SUCCESS;
2945
2946
0
    if (rc == TPM_RC_SUCCESS) {
2947
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
2948
0
    }
2949
0
    return rc;
2950
0
}
2951
2952
/* Table 144 - Definition of TPMU_SIG_SCHEME Union <IN/OUT, S> */
2953
2954
TPM_RC
2955
TPMU_SIG_SCHEME_Unmarshal(TPMU_SIG_SCHEME *target, BYTE **buffer, INT32 *size, UINT32 selector)
2956
0
{
2957
0
    TPM_RC rc = TPM_RC_SUCCESS;
2958
2959
0
    switch (selector) {
2960
0
#if ALG_RSASSA
2961
0
      case TPM_ALG_RSASSA:
2962
0
  rc = TPMS_SIG_SCHEME_RSASSA_Unmarshal(&target->rsassa, buffer, size);
2963
0
  break;
2964
0
#endif
2965
0
#if ALG_RSAPSS
2966
0
      case TPM_ALG_RSAPSS:
2967
0
  rc = TPMS_SIG_SCHEME_RSAPSS_Unmarshal(&target->rsapss, buffer, size);
2968
0
  break;
2969
0
#endif
2970
0
#if ALG_ECDSA
2971
0
      case TPM_ALG_ECDSA:
2972
0
  rc = TPMS_SIG_SCHEME_ECDSA_Unmarshal(&target->ecdsa, buffer, size);
2973
0
  break;
2974
0
#endif
2975
0
#if ALG_ECDAA
2976
0
      case TPM_ALG_ECDAA:
2977
0
  rc = TPMS_SIG_SCHEME_ECDAA_Unmarshal(&target->ecdaa, buffer, size);
2978
0
  break;
2979
0
#endif
2980
#if ALG_SM2
2981
      case TPM_ALG_SM2:
2982
  rc = TPMS_SIG_SCHEME_SM2_Unmarshal(&target->sm2, buffer, size);
2983
  break;
2984
#endif
2985
0
#if ALG_ECSCHNORR
2986
0
      case TPM_ALG_ECSCHNORR:
2987
0
  rc = TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal(&target->ecschnorr, buffer, size);
2988
0
  break;
2989
0
#endif
2990
0
#if ALG_HMAC
2991
0
      case TPM_ALG_HMAC:
2992
0
  rc = TPMS_SCHEME_HMAC_Unmarshal(&target->hmac, buffer, size);
2993
0
  break;
2994
0
#endif
2995
0
      case TPM_ALG_NULL:
2996
0
  break;
2997
0
      default:
2998
0
  rc = TPM_RC_SELECTOR;
2999
0
    }
3000
0
    return rc;
3001
0
}
3002
3003
/* Table 145 - Definition of TPMT_SIG_SCHEME Structure */
3004
3005
TPM_RC
3006
TPMT_SIG_SCHEME_Unmarshal(TPMT_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3007
0
{
3008
0
    TPM_RC rc = TPM_RC_SUCCESS;
3009
3010
0
    if (rc == TPM_RC_SUCCESS) {
3011
0
  rc = TPMI_ALG_SIG_SCHEME_Unmarshal(&target->scheme, buffer, size, allowNull);
3012
0
    }
3013
0
    if (rc == TPM_RC_SUCCESS) {
3014
0
  rc = TPMU_SIG_SCHEME_Unmarshal(&target->details, buffer, size, target->scheme);
3015
0
    }
3016
0
    return rc;
3017
0
}
3018
3019
/* Table 146 - Definition of Types for {RSA} Encryption Schemes */
3020
3021
TPM_RC
3022
TPMS_ENC_SCHEME_OAEP_Unmarshal(TPMS_ENC_SCHEME_OAEP *target, BYTE **buffer, INT32 *size)
3023
0
{
3024
0
    TPM_RC rc = TPM_RC_SUCCESS;
3025
3026
0
    if (rc == TPM_RC_SUCCESS) {
3027
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
3028
0
    }
3029
0
    return rc;
3030
0
}
3031
3032
/* Table 146 - Definition of Types for {RSA} Encryption Schemes */
3033
3034
TPM_RC
3035
TPMS_ENC_SCHEME_RSAES_Unmarshal(TPMS_ENC_SCHEME_RSAES *target, BYTE **buffer, INT32 *size)
3036
0
{
3037
0
    TPM_RC rc = TPM_RC_SUCCESS;
3038
3039
0
    if (rc == TPM_RC_SUCCESS) {
3040
0
  rc = TPMS_EMPTY_Unmarshal(target, buffer, size);
3041
0
    }
3042
0
    return rc;
3043
0
}
3044
3045
/* Table 147 - Definition of Types for {ECC} ECC Key Exchange */
3046
3047
TPM_RC
3048
TPMS_KEY_SCHEME_ECDH_Unmarshal(TPMS_KEY_SCHEME_ECDH *target, BYTE **buffer, INT32 *size)
3049
0
{
3050
0
    TPM_RC rc = TPM_RC_SUCCESS;
3051
3052
0
    if (rc == TPM_RC_SUCCESS) {
3053
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size); 
3054
0
    }
3055
0
    return rc;
3056
0
}
3057
3058
/* Table 147 - Definition of Types for {ECC} ECC Key Exchange */
3059
3060
TPM_RC
3061
TPMS_KEY_SCHEME_ECMQV_Unmarshal(TPMS_KEY_SCHEME_ECMQV *target, BYTE **buffer, INT32 *size)
3062
0
{
3063
0
    TPM_RC rc = TPM_RC_SUCCESS;
3064
3065
0
    if (rc == TPM_RC_SUCCESS) {
3066
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size); 
3067
0
    }
3068
0
    return rc;
3069
0
}
3070
3071
/* Table 148 - Definition of Types for KDF Schemes, hash-based key- or mask-generation functions */
3072
3073
TPM_RC
3074
TPMS_SCHEME_KDF1_SP800_108_Unmarshal(TPMS_SCHEME_KDF1_SP800_108 *target, BYTE **buffer, INT32 *size)
3075
0
{
3076
0
    TPM_RC rc = TPM_RC_SUCCESS;
3077
3078
0
    if (rc == TPM_RC_SUCCESS) {
3079
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size); 
3080
0
    }
3081
0
    return rc;
3082
0
}
3083
3084
/* Table 148 - Definition of Types for KDF Schemes, hash-based key- or mask-generation functions */
3085
3086
TPM_RC
3087
TPMS_SCHEME_KDF1_SP800_56A_Unmarshal(TPMS_SCHEME_KDF1_SP800_56A *target, BYTE **buffer, INT32 *size)
3088
0
{
3089
0
    TPM_RC rc = TPM_RC_SUCCESS;
3090
3091
0
    if (rc == TPM_RC_SUCCESS) {
3092
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size); 
3093
0
    }
3094
0
    return rc;
3095
0
}
3096
3097
/* Table 148 - Definition of Types for KDF Schemes, hash-based key- or mask-generation functions */
3098
3099
TPM_RC
3100
TPMS_SCHEME_KDF2_Unmarshal(TPMS_SCHEME_KDF2 *target, BYTE **buffer, INT32 *size)
3101
0
{
3102
0
    TPM_RC rc = TPM_RC_SUCCESS;
3103
3104
0
    if (rc == TPM_RC_SUCCESS) {
3105
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
3106
0
    }
3107
0
    return rc;
3108
0
}
3109
3110
/* Table 148 - Definition of Types for KDF Schemes, hash-based key- or mask-generation functions */
3111
3112
TPM_RC
3113
TPMS_SCHEME_MGF1_Unmarshal(TPMS_SCHEME_MGF1 *target, BYTE **buffer, INT32 *size)
3114
0
{
3115
0
    TPM_RC rc = TPM_RC_SUCCESS;
3116
3117
0
    if (rc == TPM_RC_SUCCESS) {
3118
0
  rc = TPMS_SCHEME_HASH_Unmarshal(target, buffer, size);
3119
0
    }
3120
0
    return rc;
3121
0
}
3122
3123
/* Table 149 - Definition of TPMU_KDF_SCHEME Union <IN/OUT, S> */
3124
3125
TPM_RC
3126
TPMU_KDF_SCHEME_Unmarshal(TPMU_KDF_SCHEME *target, BYTE **buffer, INT32 *size, UINT32 selector)
3127
0
{
3128
0
    TPM_RC rc = TPM_RC_SUCCESS;
3129
3130
0
    switch (selector) {
3131
0
#if ALG_MGF1
3132
0
      case TPM_ALG_MGF1:
3133
0
  rc = TPMS_SCHEME_MGF1_Unmarshal(&target->mgf1, buffer, size);
3134
0
  break;
3135
0
#endif
3136
0
#if ALG_KDF1_SP800_56A
3137
0
      case TPM_ALG_KDF1_SP800_56A:
3138
0
  rc = TPMS_SCHEME_KDF1_SP800_56A_Unmarshal(&target->kdf1_sp800_56a, buffer, size);
3139
0
  break;
3140
0
#endif
3141
#if ALG_KDF2
3142
      case TPM_ALG_KDF2:
3143
  rc = TPMS_SCHEME_KDF2_Unmarshal(&target->kdf2, buffer, size);
3144
  break;
3145
#endif
3146
0
#if ALG_KDF1_SP800_108
3147
0
      case TPM_ALG_KDF1_SP800_108:
3148
0
  rc = TPMS_SCHEME_KDF1_SP800_108_Unmarshal(&target->kdf1_sp800_108, buffer, size);
3149
0
  break;
3150
0
#endif
3151
0
      case TPM_ALG_NULL:
3152
0
  break;
3153
0
      default:
3154
0
  rc = TPM_RC_SELECTOR;
3155
0
    }
3156
0
    return rc;
3157
0
}
3158
3159
/* Table 150 - Definition of TPMT_KDF_SCHEME Structure */
3160
3161
TPM_RC
3162
TPMT_KDF_SCHEME_Unmarshal(TPMT_KDF_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3163
0
{
3164
0
    TPM_RC rc = TPM_RC_SUCCESS;
3165
3166
0
    if (rc == TPM_RC_SUCCESS) {
3167
0
  rc = TPMI_ALG_KDF_Unmarshal(&target->scheme, buffer, size, allowNull);
3168
0
    }
3169
0
    if (rc == TPM_RC_SUCCESS) {
3170
0
  rc = TPMU_KDF_SCHEME_Unmarshal(&target->details, buffer, size, target->scheme);
3171
0
    }
3172
0
    return rc;
3173
0
}
3174
3175
/* Table 151 - Definition of (TPM_ALG_ID) TPMI_ALG_ASYM_SCHEME Type <> */
3176
3177
#if 0
3178
TPM_RC
3179
TPMI_ALG_ASYM_SCHEME_Unmarshal(TPMI_ALG_ASYM_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3180
{
3181
    TPM_RC rc = TPM_RC_SUCCESS;
3182
3183
    if (rc == TPM_RC_SUCCESS) {
3184
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
3185
    }
3186
    if (rc == TPM_RC_SUCCESS) {
3187
  switch (*target) {
3188
#if ALG_ECDH
3189
    case TPM_ALG_ECDH:
3190
#endif
3191
#if ALG_ECMQV
3192
    case TPM_ALG_ECMQV:
3193
#endif
3194
#if ALG_RSASSA
3195
    case TPM_ALG_RSASSA:
3196
#endif
3197
#if ALG_RSAPSS
3198
    case TPM_ALG_RSAPSS:
3199
#endif
3200
#if ALG_ECDSA
3201
    case TPM_ALG_ECDSA:
3202
#endif
3203
#if ALG_ECDAA
3204
    case TPM_ALG_ECDAA:
3205
#endif
3206
#if ALG_SM2
3207
    case TPM_ALG_SM2:
3208
#endif
3209
#if ALG_ECSCHNORR
3210
    case TPM_ALG_ECSCHNORR:
3211
#endif
3212
#if ALG_RSAES
3213
    case TPM_ALG_RSAES:
3214
#endif
3215
#if ALG_OAEP
3216
    case TPM_ALG_OAEP:
3217
#endif
3218
      break;
3219
    case TPM_ALG_NULL:
3220
      if (allowNull) {
3221
    break;
3222
      }
3223
    default:
3224
      rc = TPM_RC_VALUE;
3225
  }
3226
    }
3227
    return rc;
3228
}
3229
#endif
3230
3231
/* Table 152 - Definition of TPMU_ASYM_SCHEME Union */
3232
3233
TPM_RC
3234
TPMU_ASYM_SCHEME_Unmarshal(TPMU_ASYM_SCHEME *target, BYTE **buffer, INT32 *size, UINT32 selector)
3235
0
{
3236
0
    TPM_RC rc = TPM_RC_SUCCESS;
3237
3238
0
    switch (selector) {
3239
0
#if ALG_ECDH
3240
0
      case TPM_ALG_ECDH:
3241
0
  rc = TPMS_KEY_SCHEME_ECDH_Unmarshal(&target->ecdh, buffer, size);
3242
0
  break;
3243
0
#endif
3244
#if ALG_ECMQV
3245
      case TPM_ALG_ECMQV:
3246
  rc = TPMS_KEY_SCHEME_ECMQV_Unmarshal(&target->ecmqv, buffer, size);
3247
  break;
3248
#endif
3249
0
#if ALG_RSASSA
3250
0
      case TPM_ALG_RSASSA:
3251
0
  rc = TPMS_SIG_SCHEME_RSASSA_Unmarshal(&target->rsassa, buffer, size);
3252
0
  break;
3253
0
#endif
3254
0
#if ALG_RSAPSS
3255
0
      case TPM_ALG_RSAPSS:
3256
0
  rc = TPMS_SIG_SCHEME_RSAPSS_Unmarshal(&target->rsapss, buffer, size);
3257
0
  break;
3258
0
#endif
3259
0
#if ALG_ECDSA
3260
0
      case TPM_ALG_ECDSA:
3261
0
  rc = TPMS_SIG_SCHEME_ECDSA_Unmarshal(&target->ecdsa, buffer, size);
3262
0
  break;
3263
0
#endif
3264
0
#if ALG_ECDAA
3265
0
      case TPM_ALG_ECDAA:
3266
0
  rc = TPMS_SIG_SCHEME_ECDAA_Unmarshal(&target->ecdaa, buffer, size);
3267
0
  break;
3268
0
#endif
3269
#if ALG_SM2
3270
      case TPM_ALG_SM2:
3271
  rc = TPMS_SIG_SCHEME_SM2_Unmarshal(&target->sm2, buffer, size);
3272
  break;
3273
#endif
3274
0
#if ALG_ECSCHNORR
3275
0
      case TPM_ALG_ECSCHNORR:
3276
0
  rc = TPMS_SIG_SCHEME_ECSCHNORR_Unmarshal(&target->ecschnorr, buffer, size);
3277
0
  break;
3278
0
#endif
3279
0
#if ALG_RSAES
3280
0
      case TPM_ALG_RSAES:
3281
0
  rc = TPMS_ENC_SCHEME_RSAES_Unmarshal(&target->rsaes, buffer, size);
3282
0
  break;
3283
0
#endif
3284
0
#if ALG_OAEP
3285
0
      case TPM_ALG_OAEP:
3286
0
  rc = TPMS_ENC_SCHEME_OAEP_Unmarshal(&target->oaep, buffer, size);
3287
0
  break;
3288
0
#endif
3289
0
      case TPM_ALG_NULL:
3290
0
  break;
3291
0
      default:
3292
0
  rc = TPM_RC_SELECTOR;
3293
0
    }
3294
0
    return rc;
3295
0
}
3296
3297
/* Table 153 - Definition of TPMT_ASYM_SCHEME Structure <> */
3298
3299
#if 0
3300
TPM_RC
3301
TPMT_ASYM_SCHEME_Unmarshal(TPMT_ASYM_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3302
{
3303
    TPM_RC rc = TPM_RC_SUCCESS;
3304
3305
    if (rc == TPM_RC_SUCCESS) {
3306
  rc = TPMI_ALG_ASYM_SCHEME_Unmarshal(&target->scheme, buffer, size, allowNull);
3307
    }
3308
    if (rc == TPM_RC_SUCCESS) {
3309
  rc = TPMU_ASYM_SCHEME_Unmarshal(&target->details, buffer, size, target->scheme);
3310
    }
3311
    return rc;
3312
}
3313
#endif
3314
3315
/* Table 154 - Definition of (TPM_ALG_ID) {RSA} TPMI_ALG_RSA_SCHEME Type */
3316
3317
TPM_RC
3318
TPMI_ALG_RSA_SCHEME_Unmarshal(TPMI_ALG_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3319
0
{
3320
0
    TPM_RC rc = TPM_RC_SUCCESS;
3321
3322
0
    if (rc == TPM_RC_SUCCESS) {
3323
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
3324
0
    }
3325
0
    if (rc == TPM_RC_SUCCESS) {
3326
0
  switch (*target) {
3327
0
#if ALG_RSASSA
3328
0
    case TPM_ALG_RSASSA:
3329
0
#endif
3330
0
#if ALG_RSAPSS
3331
0
    case TPM_ALG_RSAPSS:
3332
0
#endif
3333
0
#if ALG_RSAES
3334
0
    case TPM_ALG_RSAES:
3335
0
#endif
3336
0
#if ALG_OAEP
3337
0
    case TPM_ALG_OAEP:
3338
0
#endif
3339
0
      break;
3340
0
    case TPM_ALG_NULL:
3341
0
      if (allowNull) {
3342
0
    break;
3343
0
      }
3344
0
    default:
3345
0
      rc = TPM_RC_VALUE;
3346
0
  }
3347
0
    }
3348
0
    return rc;
3349
0
}
3350
3351
/* Table 155 - Definition of {RSA} TPMT_RSA_SCHEME Structure */
3352
3353
TPM_RC
3354
TPMT_RSA_SCHEME_Unmarshal(TPMT_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3355
0
{
3356
0
    TPM_RC rc = TPM_RC_SUCCESS;
3357
3358
0
    if (rc == TPM_RC_SUCCESS) {
3359
0
  rc = TPMI_ALG_RSA_SCHEME_Unmarshal(&target->scheme, buffer, size, allowNull);
3360
0
    }
3361
0
    if (rc == TPM_RC_SUCCESS) {
3362
0
  rc = TPMU_ASYM_SCHEME_Unmarshal(&target->details, buffer, size, target->scheme);
3363
0
    }
3364
0
    return rc;
3365
0
}
3366
3367
/* Table 156 - Definition of (TPM_ALG_ID) {RSA} TPMI_ALG_RSA_DECRYPT Type */
3368
3369
TPM_RC
3370
TPMI_ALG_RSA_DECRYPT_Unmarshal(TPMI_ALG_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3371
0
{
3372
0
    TPM_RC rc = TPM_RC_SUCCESS;
3373
3374
0
    if (rc == TPM_RC_SUCCESS) {
3375
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
3376
0
    }
3377
0
    if (rc == TPM_RC_SUCCESS) {
3378
0
  switch (*target) {
3379
0
#if ALG_RSAES
3380
0
    case TPM_ALG_RSAES:
3381
0
#endif
3382
0
#if ALG_OAEP
3383
0
    case TPM_ALG_OAEP:
3384
0
#endif
3385
0
      break;
3386
0
    case TPM_ALG_NULL:
3387
0
      if (allowNull) {
3388
0
    break;
3389
0
      }
3390
0
    default:
3391
0
      rc = TPM_RC_VALUE;
3392
0
  }
3393
0
    }
3394
0
    return rc;
3395
0
}
3396
3397
/* Table 157 - Definition of {RSA} TPMT_RSA_DECRYPT Structure */
3398
3399
TPM_RC
3400
TPMT_RSA_DECRYPT_Unmarshal(TPMT_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3401
0
{
3402
0
    TPM_RC rc = TPM_RC_SUCCESS;
3403
3404
0
    if (rc == TPM_RC_SUCCESS) {
3405
0
  rc = TPMI_ALG_RSA_DECRYPT_Unmarshal(&target->scheme, buffer, size, allowNull);
3406
0
    }
3407
0
    if (rc == TPM_RC_SUCCESS) {
3408
0
  rc = TPMU_ASYM_SCHEME_Unmarshal(&target->details, buffer, size, target->scheme);
3409
0
    }
3410
0
    return rc;
3411
0
}
3412
3413
/* Table 158 - Definition of {RSA} TPM2B_PUBLIC_KEY_RSA Structure */
3414
3415
TPM_RC
3416
TPM2B_PUBLIC_KEY_RSA_Unmarshal(TPM2B_PUBLIC_KEY_RSA *target, BYTE **buffer, INT32 *size)
3417
0
{
3418
0
    TPM_RC rc = TPM_RC_SUCCESS;
3419
3420
0
    if (rc == TPM_RC_SUCCESS) {
3421
0
  rc = TPM2B_Unmarshal(&target->b, MAX_RSA_KEY_BYTES, buffer, size);
3422
0
    }
3423
0
    return rc;
3424
0
}
3425
    
3426
/* Table 159 - Definition of {RSA} (TPM_KEY_BITS) TPMI_RSA_KEY_BITS Type */
3427
3428
TPM_RC
3429
TPMI_RSA_KEY_BITS_Unmarshal(TPMI_RSA_KEY_BITS *target, BYTE **buffer, INT32 *size)
3430
0
{
3431
0
    TPM_RC rc = TPM_RC_SUCCESS;
3432
3433
0
    if (rc == TPM_RC_SUCCESS) {
3434
0
  rc = TPM_KEY_BITS_Unmarshal(target, buffer, size);  
3435
0
    }
3436
0
    if (rc == TPM_RC_SUCCESS) {
3437
0
  switch (*target) {
3438
0
    case 1024:
3439
0
    case 2048:
3440
0
      break;
3441
0
    default:
3442
0
      rc = TPM_RC_VALUE;
3443
0
  }
3444
0
    }
3445
0
    return rc;
3446
0
}
3447
3448
/* Table 160 - Definition of {RSA} TPM2B_PRIVATE_KEY_RSA Structure */
3449
3450
TPM_RC
3451
TPM2B_PRIVATE_KEY_RSA_Unmarshal(TPM2B_PRIVATE_KEY_RSA *target, BYTE **buffer, INT32 *size)
3452
0
{
3453
0
    TPM_RC rc = TPM_RC_SUCCESS;
3454
3455
0
    if (rc == TPM_RC_SUCCESS) {
3456
0
  rc = TPM2B_Unmarshal(&target->b, MAX_RSA_KEY_BYTES/2, buffer, size);
3457
0
    }
3458
0
    return rc;
3459
0
}
3460
 
3461
/* Table 161 - Definition of {ECC} TPM2B_ECC_PARAMETER Structure */
3462
3463
TPM_RC
3464
TPM2B_ECC_PARAMETER_Unmarshal(TPM2B_ECC_PARAMETER *target, BYTE **buffer, INT32 *size)
3465
0
{
3466
0
    TPM_RC rc = TPM_RC_SUCCESS;
3467
3468
0
    if (rc == TPM_RC_SUCCESS) {
3469
0
      rc = TPM2B_Unmarshal(&target->b, MAX_ECC_KEY_BYTES, buffer, size);
3470
0
    }
3471
0
    return rc;
3472
0
}
3473
    
3474
/* Table 162 - Definition of {ECC} TPMS_ECC_POINT Structure */
3475
3476
TPM_RC
3477
TPMS_ECC_POINT_Unmarshal(TPMS_ECC_POINT *target, BYTE **buffer, INT32 *size)
3478
0
{
3479
0
    TPM_RC rc = TPM_RC_SUCCESS;
3480
3481
0
    if (rc == TPM_RC_SUCCESS) {
3482
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->x, buffer, size);
3483
0
    }
3484
0
    if (rc == TPM_RC_SUCCESS) {
3485
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->y, buffer, size);
3486
0
    }
3487
0
    return rc;
3488
0
}
3489
3490
/* Table 163 - Definition of {ECC} TPM2B_ECC_POINT Structure */
3491
3492
TPM_RC
3493
TPM2B_ECC_POINT_Unmarshal(TPM2B_ECC_POINT *target, BYTE **buffer, INT32 *size)
3494
0
{
3495
0
    TPM_RC rc = TPM_RC_SUCCESS;
3496
3497
0
    INT32 startSize;
3498
0
    if (rc == TPM_RC_SUCCESS) {
3499
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
3500
0
    }
3501
0
    if (rc == TPM_RC_SUCCESS) {
3502
0
  if (target->size == 0) {
3503
0
      rc = TPM_RC_SIZE;
3504
0
  }
3505
0
    }
3506
0
    if (rc == TPM_RC_SUCCESS) {
3507
0
  startSize = *size;
3508
0
    }
3509
0
    if (rc == TPM_RC_SUCCESS) {
3510
0
  rc = TPMS_ECC_POINT_Unmarshal(&target->point, buffer, size);
3511
0
    }
3512
0
    if (rc == TPM_RC_SUCCESS) {
3513
0
  if (target->size != startSize - *size) {
3514
0
      rc = TPM_RC_SIZE;
3515
0
  }
3516
0
    }
3517
0
    return rc;
3518
0
}
3519
3520
/* Table 164 - Definition of (TPM_ALG_ID) {ECC} TPMI_ALG_ECC_SCHEME Type */
3521
3522
TPM_RC
3523
TPMI_ALG_ECC_SCHEME_Unmarshal(TPMI_ALG_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3524
0
{
3525
0
    TPM_RC rc = TPM_RC_SUCCESS;
3526
3527
0
    if (rc == TPM_RC_SUCCESS) {
3528
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
3529
0
    }
3530
0
    if (rc == TPM_RC_SUCCESS) {
3531
0
  switch (*target) {
3532
0
#if ALG_ECDSA
3533
0
    case TPM_ALG_ECDSA:
3534
0
#endif
3535
#if ALG_SM2
3536
    case TPM_ALG_SM2:
3537
#endif
3538
0
#if ALG_ECDAA
3539
0
    case TPM_ALG_ECDAA:
3540
0
#endif
3541
0
#if ALG_ECSCHNORR
3542
0
    case TPM_ALG_ECSCHNORR:
3543
0
#endif
3544
0
#if ALG_ECDH
3545
0
    case TPM_ALG_ECDH:
3546
0
#endif
3547
#if ALG_ECMQV
3548
    case TPM_ALG_ECMQV:
3549
#endif
3550
0
      break;
3551
0
    case TPM_ALG_NULL:
3552
0
      if (allowNull) {
3553
0
    break;
3554
0
      }
3555
0
    default:
3556
0
      rc = TPM_RC_SCHEME;
3557
0
  }
3558
0
    }
3559
0
    return rc;
3560
0
}
3561
3562
/* Table 165 - Definition of {ECC} (TPM_ECC_CURVE) TPMI_ECC_CURVE Type */
3563
3564
TPM_RC
3565
TPMI_ECC_CURVE_Unmarshal(TPMI_ECC_CURVE *target, BYTE **buffer, INT32 *size)
3566
0
{
3567
0
    TPM_RC rc = TPM_RC_SUCCESS;
3568
3569
0
    if (rc == TPM_RC_SUCCESS) {
3570
0
  rc = TPM_ECC_CURVE_Unmarshal(target, buffer, size);  
3571
0
    }
3572
0
    if (rc == TPM_RC_SUCCESS) {
3573
0
  switch (*target) {
3574
0
#if ECC_BN_P256
3575
0
    case TPM_ECC_BN_P256:
3576
0
#endif
3577
0
#if ECC_NIST_P256
3578
0
    case TPM_ECC_NIST_P256:
3579
0
#endif
3580
0
#if ECC_NIST_P384
3581
0
    case TPM_ECC_NIST_P384:
3582
0
#endif
3583
0
      break;
3584
0
    default:
3585
0
      rc = TPM_RC_CURVE;
3586
0
  }
3587
0
    }
3588
0
    return rc;
3589
0
}
3590
3591
/* Table 166 - Definition of (TPMT_SIG_SCHEME) {ECC} TPMT_ECC_SCHEME Structure */
3592
3593
TPM_RC
3594
TPMT_ECC_SCHEME_Unmarshal(TPMT_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3595
0
{
3596
0
    TPM_RC rc = TPM_RC_SUCCESS;
3597
3598
0
    if (rc == TPM_RC_SUCCESS) {
3599
0
  rc = TPMI_ALG_ECC_SCHEME_Unmarshal(&target->scheme, buffer, size, allowNull);
3600
0
    }
3601
0
    if (rc == TPM_RC_SUCCESS) {
3602
0
  rc = TPMU_ASYM_SCHEME_Unmarshal(&target->details, buffer, size, target->scheme);
3603
0
    }
3604
0
    return rc;
3605
0
}
3606
3607
/* Table 167 - Definition of {ECC} TPMS_ALGORITHM_DETAIL_ECC Structure <OUT> */
3608
3609
TPM_RC
3610
TPMS_ALGORITHM_DETAIL_ECC_Unmarshal(TPMS_ALGORITHM_DETAIL_ECC *target, BYTE **buffer, INT32 *size)
3611
0
{
3612
0
    TPM_RC rc = TPM_RC_SUCCESS;
3613
3614
0
    if (rc == TPM_RC_SUCCESS) {
3615
0
  rc = TPM_ECC_CURVE_Unmarshal(&target->curveID, buffer, size);
3616
0
    }
3617
0
    if (rc == TPM_RC_SUCCESS) {
3618
0
  rc = UINT16_Unmarshal(&target->keySize, buffer, size);
3619
0
    }
3620
0
    if (rc == TPM_RC_SUCCESS) {
3621
0
  rc = TPMT_KDF_SCHEME_Unmarshal(&target->kdf, buffer, size, YES);
3622
0
    }
3623
0
    if (rc == TPM_RC_SUCCESS) {
3624
0
  rc = TPMT_ECC_SCHEME_Unmarshal(&target->sign, buffer, size, YES);
3625
0
    }
3626
0
    if (rc == TPM_RC_SUCCESS) {
3627
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->p, buffer, size);
3628
0
    }
3629
0
    if (rc == TPM_RC_SUCCESS) {
3630
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->a, buffer, size);
3631
0
    }
3632
0
    if (rc == TPM_RC_SUCCESS) {
3633
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->b, buffer, size);
3634
0
    }
3635
0
    if (rc == TPM_RC_SUCCESS) {
3636
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->gX, buffer, size);
3637
0
    }
3638
0
    if (rc == TPM_RC_SUCCESS) {
3639
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->gY, buffer, size);
3640
0
    }
3641
0
    if (rc == TPM_RC_SUCCESS) {
3642
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->n, buffer, size);
3643
0
    }
3644
0
    if (rc == TPM_RC_SUCCESS) {
3645
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->h, buffer, size);
3646
0
    }
3647
0
    return rc;
3648
0
}
3649
3650
/* Table 168 - Definition of {RSA} TPMS_SIGNATURE_RSA Structure */
3651
3652
TPM_RC
3653
TPMS_SIGNATURE_RSA_Unmarshal(TPMS_SIGNATURE_RSA *target, BYTE **buffer, INT32 *size)
3654
0
{
3655
0
    TPM_RC rc = TPM_RC_SUCCESS;
3656
3657
0
    if (rc == TPM_RC_SUCCESS) {
3658
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hash, buffer, size, NO);
3659
0
    }
3660
0
    if (rc == TPM_RC_SUCCESS) {
3661
0
  rc = TPM2B_PUBLIC_KEY_RSA_Unmarshal(&target->sig, buffer, size);
3662
0
    }
3663
0
    return rc;
3664
0
}
3665
3666
/* Table 169 - Definition of Types for {RSA} Signature */
3667
3668
TPM_RC
3669
TPMS_SIGNATURE_RSASSA_Unmarshal(TPMS_SIGNATURE_RSASSA *target, BYTE **buffer, INT32 *size)
3670
0
{
3671
0
    TPM_RC rc = TPM_RC_SUCCESS;
3672
3673
0
    if (rc == TPM_RC_SUCCESS) {
3674
0
  rc = TPMS_SIGNATURE_RSA_Unmarshal(target, buffer, size);
3675
0
    }
3676
0
    return rc;
3677
0
}
3678
3679
/* Table 169 - Definition of Types for {RSA} Signature */
3680
    
3681
TPM_RC
3682
TPMS_SIGNATURE_RSAPSS_Unmarshal(TPMS_SIGNATURE_RSAPSS *target, BYTE **buffer, INT32 *size)
3683
0
{
3684
0
    TPM_RC rc = TPM_RC_SUCCESS;
3685
3686
0
    if (rc == TPM_RC_SUCCESS) {
3687
0
  rc = TPMS_SIGNATURE_RSA_Unmarshal(target, buffer, size);
3688
0
    }
3689
0
    return rc;
3690
0
}
3691
3692
/* Table 170 - Definition of {ECC} TPMS_SIGNATURE_ECC Structure */
3693
3694
TPM_RC
3695
TPMS_SIGNATURE_ECC_Unmarshal(TPMS_SIGNATURE_ECC *target, BYTE **buffer, INT32 *size)
3696
0
{
3697
0
    TPM_RC rc = TPM_RC_SUCCESS;
3698
    
3699
0
    if (rc == TPM_RC_SUCCESS) {
3700
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->hash, buffer, size, NO);
3701
0
    }
3702
0
    if (rc == TPM_RC_SUCCESS) {
3703
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->signatureR, buffer, size);
3704
0
    }
3705
0
    if (rc == TPM_RC_SUCCESS) {
3706
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->signatureS, buffer, size);
3707
0
    }
3708
0
    return rc;
3709
0
}
3710
3711
/* Table 171 - Definition of Types for {ECC} TPMS_SIGNATURE_ECC */
3712
3713
TPM_RC
3714
TPMS_SIGNATURE_ECDSA_Unmarshal(TPMS_SIGNATURE_ECDSA *target, BYTE **buffer, INT32 *size)
3715
0
{
3716
0
    TPM_RC rc = TPM_RC_SUCCESS;
3717
     
3718
0
    if (rc == TPM_RC_SUCCESS) {
3719
0
  rc = TPMS_SIGNATURE_ECC_Unmarshal(target, buffer, size);
3720
0
    }
3721
0
    return rc;
3722
0
}
3723
    
3724
TPM_RC
3725
TPMS_SIGNATURE_ECDAA_Unmarshal(TPMS_SIGNATURE_ECDAA *target, BYTE **buffer, INT32 *size)
3726
0
{
3727
0
    TPM_RC rc = TPM_RC_SUCCESS;
3728
     
3729
0
    if (rc == TPM_RC_SUCCESS) {
3730
0
  rc = TPMS_SIGNATURE_ECC_Unmarshal(target, buffer, size);
3731
0
    }
3732
0
    return rc;
3733
0
}
3734
3735
TPM_RC
3736
TPMS_SIGNATURE_SM2_Unmarshal(TPMS_SIGNATURE_SM2 *target, BYTE **buffer, INT32 *size)
3737
0
{
3738
0
    TPM_RC rc = TPM_RC_SUCCESS;
3739
     
3740
0
    if (rc == TPM_RC_SUCCESS) {
3741
0
  rc = TPMS_SIGNATURE_ECC_Unmarshal(target, buffer, size);
3742
0
    }
3743
0
    return rc;
3744
0
}
3745
3746
TPM_RC
3747
TPMS_SIGNATURE_ECSCHNORR_Unmarshal(TPMS_SIGNATURE_ECSCHNORR *target, BYTE **buffer, INT32 *size)
3748
0
{
3749
0
    TPM_RC rc = TPM_RC_SUCCESS;
3750
     
3751
0
    if (rc == TPM_RC_SUCCESS) {
3752
0
  rc = TPMS_SIGNATURE_ECC_Unmarshal(target, buffer, size);
3753
0
    }
3754
0
    return rc;
3755
0
}
3756
3757
/* Table 172 - Definition of TPMU_SIGNATURE Union <IN/OUT, S> */
3758
3759
TPM_RC
3760
TPMU_SIGNATURE_Unmarshal(TPMU_SIGNATURE *target, BYTE **buffer, INT32 *size, UINT32 selector)
3761
0
{
3762
0
    TPM_RC rc = TPM_RC_SUCCESS;
3763
3764
0
    switch (selector) {
3765
0
#if ALG_RSASSA
3766
0
      case TPM_ALG_RSASSA:
3767
0
  rc = TPMS_SIGNATURE_RSASSA_Unmarshal(&target->rsassa, buffer, size);
3768
0
  break;
3769
0
#endif
3770
0
#if ALG_RSAPSS
3771
0
      case TPM_ALG_RSAPSS:
3772
0
  rc = TPMS_SIGNATURE_RSAPSS_Unmarshal(&target->rsapss, buffer, size);
3773
0
  break;
3774
0
#endif
3775
0
#if ALG_ECDSA
3776
0
      case TPM_ALG_ECDSA:
3777
0
  rc = TPMS_SIGNATURE_ECDSA_Unmarshal(&target->ecdsa, buffer, size);
3778
0
  break;
3779
0
#endif
3780
0
#if ALG_ECDAA
3781
0
      case TPM_ALG_ECDAA:
3782
0
  rc = TPMS_SIGNATURE_ECDAA_Unmarshal(&target->ecdaa, buffer, size);
3783
0
  break;
3784
0
#endif
3785
#if ALG_SM2
3786
      case TPM_ALG_SM2:
3787
  rc = TPMS_SIGNATURE_SM2_Unmarshal(&target->sm2, buffer, size);
3788
  break;
3789
#endif
3790
0
#if ALG_ECSCHNORR
3791
0
      case TPM_ALG_ECSCHNORR:
3792
0
  rc = TPMS_SIGNATURE_ECSCHNORR_Unmarshal(&target->ecschnorr, buffer, size);
3793
0
  break;
3794
0
#endif
3795
0
#if ALG_HMAC
3796
0
      case TPM_ALG_HMAC:
3797
0
  rc = TPMT_HA_Unmarshal(&target->hmac, buffer, size, NO);
3798
0
  break;
3799
0
#endif
3800
0
      case TPM_ALG_NULL:
3801
0
  break;
3802
0
      default:
3803
0
  rc = TPM_RC_SELECTOR;
3804
0
    }
3805
0
    return rc;
3806
0
}
3807
3808
/* Table 173 - Definition of TPMT_SIGNATURE Structure */
3809
3810
TPM_RC
3811
TPMT_SIGNATURE_Unmarshal(TPMT_SIGNATURE *target, BYTE **buffer, INT32 *size, BOOL allowNull)
3812
0
{
3813
0
    TPM_RC rc = TPM_RC_SUCCESS;
3814
3815
0
    if (rc == TPM_RC_SUCCESS) {
3816
0
  rc = TPMI_ALG_SIG_SCHEME_Unmarshal(&target->sigAlg, buffer, size, allowNull);
3817
0
    }
3818
0
    if (rc == TPM_RC_SUCCESS) {
3819
0
  rc = TPMU_SIGNATURE_Unmarshal(&target->signature, buffer, size, target->sigAlg);
3820
0
    }
3821
0
    return rc;
3822
0
}
3823
3824
/* Table 175 - Definition of TPM2B_ENCRYPTED_SECRET Structure */
3825
3826
TPM_RC
3827
TPM2B_ENCRYPTED_SECRET_Unmarshal(TPM2B_ENCRYPTED_SECRET *target, BYTE **buffer, INT32 *size)
3828
0
{
3829
0
    TPM_RC rc = TPM_RC_SUCCESS;
3830
3831
0
    if (rc == TPM_RC_SUCCESS) {
3832
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMU_ENCRYPTED_SECRET), buffer, size);
3833
0
    }
3834
0
    return rc;
3835
0
}
3836
3837
/* Table 176 - Definition of (TPM_ALG_ID) TPMI_ALG_PUBLIC Type */
3838
3839
TPM_RC
3840
TPMI_ALG_PUBLIC_Unmarshal(TPMI_ALG_PUBLIC *target, BYTE **buffer, INT32 *size)
3841
0
{
3842
0
    TPM_RC rc = TPM_RC_SUCCESS;
3843
3844
0
    if (rc == TPM_RC_SUCCESS) {
3845
0
  rc = TPM_ALG_ID_Unmarshal(target, buffer, size);  
3846
0
    }
3847
0
    if (rc == TPM_RC_SUCCESS) {
3848
0
  switch (*target) {
3849
0
#if ALG_KEYEDHASH
3850
0
    case TPM_ALG_KEYEDHASH:
3851
0
#endif
3852
0
#if ALG_RSA
3853
0
    case TPM_ALG_RSA:
3854
0
#endif
3855
0
#if ALG_ECC
3856
0
    case TPM_ALG_ECC:
3857
0
#endif
3858
0
#if ALG_SYMCIPHER
3859
0
    case TPM_ALG_SYMCIPHER:
3860
0
#endif
3861
0
      break;
3862
0
    default:
3863
0
      rc = TPM_RC_TYPE;
3864
0
  }
3865
0
    }
3866
0
    return rc;
3867
0
}
3868
    
3869
/* Table 177 - Definition of TPMU_PUBLIC_ID Union <IN/OUT, S> */
3870
3871
TPM_RC
3872
TPMU_PUBLIC_ID_Unmarshal(TPMU_PUBLIC_ID *target, BYTE **buffer, INT32 *size, UINT32 selector)
3873
0
{
3874
0
    TPM_RC rc = TPM_RC_SUCCESS;
3875
3876
0
    switch (selector) {
3877
0
#if ALG_KEYEDHASH
3878
0
      case TPM_ALG_KEYEDHASH:
3879
0
  rc = TPM2B_DIGEST_Unmarshal(&target->keyedHash, buffer, size);
3880
0
  break;
3881
0
#endif
3882
0
#if ALG_SYMCIPHER
3883
0
      case TPM_ALG_SYMCIPHER:
3884
0
  rc = TPM2B_DIGEST_Unmarshal(&target->sym, buffer, size);
3885
0
  break;
3886
0
#endif
3887
0
#if ALG_RSA
3888
0
      case TPM_ALG_RSA: 
3889
0
  rc = TPM2B_PUBLIC_KEY_RSA_Unmarshal(&target->rsa, buffer, size);
3890
0
  break;
3891
0
#endif
3892
0
#if ALG_ECC
3893
0
      case TPM_ALG_ECC:
3894
0
  rc = TPMS_ECC_POINT_Unmarshal(&target->ecc, buffer, size);
3895
0
  break;
3896
0
#endif
3897
0
      default:
3898
0
  rc = TPM_RC_SELECTOR;
3899
0
    }
3900
0
    return rc;
3901
0
}
3902
3903
/* Table 178 - Definition of TPMS_KEYEDHASH_PARMS Structure */
3904
3905
TPM_RC
3906
TPMS_KEYEDHASH_PARMS_Unmarshal(TPMS_KEYEDHASH_PARMS *target, BYTE **buffer, INT32 *size)
3907
0
{
3908
0
    TPM_RC rc = TPM_RC_SUCCESS;
3909
    
3910
0
    if (rc == TPM_RC_SUCCESS) {
3911
0
  rc = TPMT_KEYEDHASH_SCHEME_Unmarshal(&target->scheme, buffer, size, YES);
3912
0
    }
3913
0
    return rc;
3914
0
}
3915
3916
/* Table 179 - Definition of TPMS_ASYM_PARMS Structure <> */
3917
3918
#if 0
3919
TPM_RC
3920
TPMS_ASYM_PARMS_Unmarshal(TPMS_ASYM_PARMS *target, BYTE **buffer, INT32 *size)
3921
{
3922
    TPM_RC rc = TPM_RC_SUCCESS;
3923
    
3924
    if (rc == TPM_RC_SUCCESS) {
3925
  rc = TPMT_SYM_DEF_OBJECT_Unmarshal(&target->symmetric, buffer, size, YES);
3926
    }
3927
    if (rc == TPM_RC_SUCCESS) {
3928
  rc = TPMT_ASYM_SCHEME_Unmarshal(&target->scheme, buffer, size, YES);
3929
    }
3930
    return rc;
3931
}
3932
#endif
3933
3934
/* Table 180 - Definition of {RSA} TPMS_RSA_PARMS Structure */
3935
3936
TPM_RC
3937
TPMS_RSA_PARMS_Unmarshal(TPMS_RSA_PARMS *target, BYTE **buffer, INT32 *size)
3938
0
{
3939
0
    TPM_RC rc = TPM_RC_SUCCESS;
3940
    
3941
0
    if (rc == TPM_RC_SUCCESS) {
3942
0
  rc = TPMT_SYM_DEF_OBJECT_Unmarshal(&target->symmetric, buffer, size, YES);
3943
0
    }
3944
0
    if (rc == TPM_RC_SUCCESS) {
3945
0
  rc = TPMT_RSA_SCHEME_Unmarshal(&target->scheme, buffer, size, YES);
3946
0
    }
3947
0
    if (rc == TPM_RC_SUCCESS) {
3948
0
  rc = TPMI_RSA_KEY_BITS_Unmarshal(&target->keyBits, buffer, size);
3949
0
    }
3950
0
    if (rc == TPM_RC_SUCCESS) {
3951
0
  rc = UINT32_Unmarshal(&target->exponent, buffer, size);
3952
0
    }
3953
0
    return rc;
3954
0
}
3955
3956
/* Table 181 - Definition of {ECC} TPMS_ECC_PARMS Structure */
3957
3958
TPM_RC
3959
TPMS_ECC_PARMS_Unmarshal(TPMS_ECC_PARMS *target, BYTE **buffer, INT32 *size)
3960
0
{
3961
0
    TPM_RC rc = TPM_RC_SUCCESS;
3962
    
3963
0
    if (rc == TPM_RC_SUCCESS) {
3964
0
  rc = TPMT_SYM_DEF_OBJECT_Unmarshal(&target->symmetric, buffer, size, YES);
3965
0
    }
3966
0
    if (rc == TPM_RC_SUCCESS) {
3967
0
  rc = TPMT_ECC_SCHEME_Unmarshal(&target->scheme, buffer, size, YES);
3968
0
    }
3969
0
    if (rc == TPM_RC_SUCCESS) {
3970
0
  rc = TPMI_ECC_CURVE_Unmarshal(&target->curveID, buffer, size);
3971
0
    }
3972
0
    if (rc == TPM_RC_SUCCESS) {
3973
0
  rc = TPMT_KDF_SCHEME_Unmarshal(&target->kdf, buffer, size, YES);
3974
0
    }
3975
0
    return rc;
3976
0
}
3977
3978
/* Table 182 - Definition of TPMU_PUBLIC_PARMS Union <IN/OUT, S> */
3979
3980
TPM_RC
3981
TPMU_PUBLIC_PARMS_Unmarshal(TPMU_PUBLIC_PARMS *target, BYTE **buffer, INT32 *size, UINT32 selector)
3982
0
{
3983
0
    TPM_RC rc = TPM_RC_SUCCESS;
3984
3985
0
    switch (selector) {
3986
0
#if ALG_KEYEDHASH
3987
0
      case TPM_ALG_KEYEDHASH:
3988
0
  rc = TPMS_KEYEDHASH_PARMS_Unmarshal(&target->keyedHashDetail, buffer, size);
3989
0
  break;
3990
0
#endif
3991
0
#if ALG_SYMCIPHER
3992
0
      case TPM_ALG_SYMCIPHER:
3993
0
  rc = TPMS_SYMCIPHER_PARMS_Unmarshal(&target->symDetail, buffer, size);
3994
0
  break;
3995
0
#endif
3996
0
#if ALG_RSA
3997
0
      case TPM_ALG_RSA:
3998
0
  rc = TPMS_RSA_PARMS_Unmarshal(&target->rsaDetail, buffer, size);
3999
0
  break;
4000
0
#endif
4001
0
#if ALG_ECC
4002
0
      case TPM_ALG_ECC:
4003
0
  rc = TPMS_ECC_PARMS_Unmarshal(&target->eccDetail, buffer, size);
4004
0
  break;
4005
0
#endif
4006
0
      default:
4007
0
  rc = TPM_RC_SELECTOR;
4008
0
    }
4009
0
    return rc;
4010
0
}
4011
4012
/* Table 183 - Definition of TPMT_PUBLIC_PARMS Structure */
4013
4014
TPM_RC
4015
TPMT_PUBLIC_PARMS_Unmarshal(TPMT_PUBLIC_PARMS *target, BYTE **buffer, INT32 *size)
4016
0
{
4017
0
    TPM_RC rc = TPM_RC_SUCCESS;
4018
4019
0
    if (rc == TPM_RC_SUCCESS) {
4020
0
  rc = TPMI_ALG_PUBLIC_Unmarshal(&target->type, buffer, size);
4021
0
    }
4022
0
    if (rc == TPM_RC_SUCCESS) {
4023
0
  rc = TPMU_PUBLIC_PARMS_Unmarshal(&target->parameters, buffer, size, target->type);
4024
0
    }
4025
0
    return rc;
4026
0
}
4027
4028
/* Table 191 - Definition of TPMT_PUBLIC Structure */
4029
4030
TPM_RC
4031
TPMT_PUBLIC_Unmarshal(TPMT_PUBLIC *target, BYTE **buffer, INT32 *size, BOOL allowNull)
4032
0
{
4033
0
    TPM_RC rc = TPM_RC_SUCCESS;
4034
    
4035
0
    if (rc == TPM_RC_SUCCESS) {
4036
0
  rc = TPMI_ALG_PUBLIC_Unmarshal(&target->type, buffer, size);
4037
0
    }
4038
0
    if (rc == TPM_RC_SUCCESS) {
4039
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->nameAlg, buffer, size, allowNull);
4040
0
    }
4041
0
    if (rc == TPM_RC_SUCCESS) {
4042
0
  rc = TPMA_OBJECT_Unmarshal(&target->objectAttributes, buffer, size);
4043
0
    }
4044
0
    if (rc == TPM_RC_SUCCESS) {
4045
0
  rc = TPM2B_DIGEST_Unmarshal(&target->authPolicy, buffer, size);
4046
0
    }
4047
0
    if (rc == TPM_RC_SUCCESS) {
4048
0
  rc = TPMU_PUBLIC_PARMS_Unmarshal(&target->parameters, buffer, size, target->type);
4049
0
    }
4050
0
    if (rc == TPM_RC_SUCCESS) {
4051
0
  rc = TPMU_PUBLIC_ID_Unmarshal(&target->unique, buffer, size, target->type);
4052
0
    }
4053
0
    return rc;
4054
0
}
4055
4056
/* Table 192 - Definition of TPM2B_PUBLIC Structure */
4057
4058
TPM_RC
4059
TPM2B_PUBLIC_Unmarshal(TPM2B_PUBLIC *target, BYTE **buffer, INT32 *size, BOOL allowNull)
4060
0
{
4061
0
    TPM_RC rc = TPM_RC_SUCCESS;
4062
    
4063
0
    INT32 startSize;
4064
0
    if (rc == TPM_RC_SUCCESS) {
4065
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
4066
0
    }
4067
0
    if (rc == TPM_RC_SUCCESS) {
4068
0
  if (target->size == 0) {
4069
0
      rc = TPM_RC_SIZE;
4070
0
  }
4071
0
    }
4072
0
    if (rc == TPM_RC_SUCCESS) {
4073
0
  startSize = *size;
4074
0
    }
4075
0
    if (rc == TPM_RC_SUCCESS) {
4076
0
  rc = TPMT_PUBLIC_Unmarshal(&target->publicArea, buffer, size, allowNull);
4077
0
    }
4078
0
    if (rc == TPM_RC_SUCCESS) {
4079
0
  if (target->size != startSize - *size) {
4080
0
      rc = TPM_RC_SIZE;
4081
0
  }
4082
0
    }
4083
0
    return rc;
4084
0
}
4085
4086
/* Table 2:193 - Definition of TPM2B_TEMPLATE Structure (StructuresTable()) */
4087
4088
TPM_RC
4089
TPM2B_TEMPLATE_Unmarshal(TPM2B_TEMPLATE *target, BYTE **buffer, INT32 *size)
4090
0
{
4091
0
    TPM_RC rc = TPM_RC_SUCCESS;
4092
4093
0
    if (rc == TPM_RC_SUCCESS) {
4094
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMT_PUBLIC), buffer, size);
4095
0
    }
4096
0
    return rc;
4097
0
}
4098
4099
/* Table 186 - Definition of TPM2B_PRIVATE_VENDOR_SPECIFIC Structure<> */
4100
4101
#if 0
4102
TPM_RC
4103
TPM2B_PRIVATE_VENDOR_SPECIFIC_Unmarshal(TPM2B_PRIVATE_VENDOR_SPECIFIC *target, BYTE **buffer, INT32 *size)
4104
{
4105
    TPM_RC rc = TPM_RC_SUCCESS;
4106
4107
    if (rc == TPM_RC_SUCCESS) {
4108
  rc = TPM2B_Unmarshal(&target->b, PRIVATE_VENDOR_SPECIFIC_BYTES, buffer, size);
4109
    }
4110
    return rc;
4111
}
4112
#endif
4113
    
4114
/* Table 187 - Definition of TPMU_SENSITIVE_COMPOSITE Union <IN/OUT, S> */
4115
4116
TPM_RC
4117
TPMU_SENSITIVE_COMPOSITE_Unmarshal(TPMU_SENSITIVE_COMPOSITE *target, BYTE **buffer, INT32 *size, UINT32 selector)
4118
0
{
4119
0
    TPM_RC rc = TPM_RC_SUCCESS;
4120
4121
0
    switch (selector) {
4122
0
#if ALG_RSA
4123
0
      case TPM_ALG_RSA:
4124
0
  rc = TPM2B_PRIVATE_KEY_RSA_Unmarshal(&target->rsa, buffer, size);
4125
0
  break;
4126
0
#endif
4127
0
#if ALG_ECC
4128
0
      case TPM_ALG_ECC:
4129
0
  rc = TPM2B_ECC_PARAMETER_Unmarshal(&target->ecc, buffer, size);
4130
0
  break;
4131
0
#endif
4132
0
#if ALG_KEYEDHASH
4133
0
      case TPM_ALG_KEYEDHASH:
4134
0
  rc = TPM2B_SENSITIVE_DATA_Unmarshal(&target->bits, buffer, size);
4135
0
  break;
4136
0
#endif
4137
0
#if ALG_SYMCIPHER
4138
0
      case TPM_ALG_SYMCIPHER:
4139
0
  rc = TPM2B_SYM_KEY_Unmarshal(&target->sym, buffer, size);
4140
0
  break;
4141
0
#endif
4142
0
      default:
4143
0
  rc = TPM_RC_SELECTOR;
4144
0
    }
4145
0
    return rc;
4146
0
}
4147
4148
/* Table 188 - Definition of TPMT_SENSITIVE Structure */
4149
4150
TPM_RC
4151
TPMT_SENSITIVE_Unmarshal(TPMT_SENSITIVE *target, BYTE **buffer, INT32 *size)
4152
0
{
4153
0
    TPM_RC rc = TPM_RC_SUCCESS;
4154
4155
0
    if (rc == TPM_RC_SUCCESS) {
4156
0
  rc = TPMI_ALG_PUBLIC_Unmarshal(&target->sensitiveType, buffer, size);
4157
0
    }
4158
0
    if (rc == TPM_RC_SUCCESS) {
4159
0
  rc = TPM2B_AUTH_Unmarshal(&target->authValue, buffer, size);
4160
0
    }
4161
0
    if (rc == TPM_RC_SUCCESS) {
4162
0
  rc = TPM2B_DIGEST_Unmarshal(&target->seedValue, buffer, size);
4163
0
    }
4164
0
    if (rc == TPM_RC_SUCCESS) {
4165
0
  rc = TPMU_SENSITIVE_COMPOSITE_Unmarshal(&target->sensitive, buffer, size, target->sensitiveType);
4166
0
    }
4167
0
    return rc;
4168
0
}
4169
4170
/* Table 189 - Definition of TPM2B_SENSITIVE Structure <IN/OUT> */
4171
4172
TPM_RC
4173
TPM2B_SENSITIVE_Unmarshal(TPM2B_SENSITIVE *target, BYTE **buffer, INT32 *size)
4174
0
{
4175
0
    TPM_RC rc = TPM_RC_SUCCESS;
4176
    
4177
0
    INT32 startSize;
4178
0
    if (rc == TPM_RC_SUCCESS) {
4179
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
4180
0
    }
4181
0
    if (target->size != 0) {
4182
0
  if (rc == TPM_RC_SUCCESS) {
4183
0
      startSize = *size;
4184
0
  }
4185
0
  if (rc == TPM_RC_SUCCESS) {
4186
0
      rc = TPMT_SENSITIVE_Unmarshal(&target->sensitiveArea, buffer, size);
4187
0
  }
4188
0
  if (rc == TPM_RC_SUCCESS) {
4189
0
      if (target->size != startSize - *size) {
4190
0
    rc = TPM_RC_SIZE;
4191
0
      }
4192
0
  }
4193
0
    }
4194
0
    return rc;
4195
0
}
4196
4197
/* Table 191 - Definition of TPM2B_PRIVATE Structure <IN/OUT, S> */
4198
4199
TPM_RC
4200
TPM2B_PRIVATE_Unmarshal(TPM2B_PRIVATE *target, BYTE **buffer, INT32 *size)
4201
0
{
4202
0
    TPM_RC rc = TPM_RC_SUCCESS;
4203
4204
0
    if (rc == TPM_RC_SUCCESS) {
4205
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(_PRIVATE), buffer, size);
4206
0
    }
4207
0
    return rc;
4208
0
}
4209
    
4210
/* Table 193 - Definition of TPM2B_ID_OBJECT Structure <IN/OUT> */
4211
4212
TPM_RC
4213
TPM2B_ID_OBJECT_Unmarshal(TPM2B_ID_OBJECT *target, BYTE **buffer, INT32 *size)
4214
0
{
4215
0
    TPM_RC rc = TPM_RC_SUCCESS;
4216
4217
0
    if (rc == TPM_RC_SUCCESS) {
4218
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMS_ID_OBJECT), buffer, size);
4219
0
    }
4220
0
    return rc;
4221
0
}
4222
4223
/* Table 196 - Definition of (UINT32) TPMA_NV Bits */
4224
4225
TPM_RC
4226
TPMA_NV_Unmarshal(TPMA_NV *target, BYTE **buffer, INT32 *size)
4227
0
{
4228
0
    TPM_RC rc = TPM_RC_SUCCESS;
4229
4230
0
    if (rc == TPM_RC_SUCCESS) {
4231
0
  rc = UINT32_Unmarshal(target, buffer, size);  
4232
0
    }
4233
0
    if (rc == TPM_RC_SUCCESS) {
4234
0
  if (*target & TPMA_NV_RESERVED) {
4235
0
      rc = TPM_RC_RESERVED_BITS;
4236
0
  }
4237
0
    }
4238
0
    return rc;
4239
0
}
4240
4241
/* Table 197 - Definition of TPMS_NV_PUBLIC Structure */
4242
4243
TPM_RC
4244
TPMS_NV_PUBLIC_Unmarshal(TPMS_NV_PUBLIC *target, BYTE **buffer, INT32 *size)
4245
0
{
4246
0
    TPM_RC rc = TPM_RC_SUCCESS;
4247
    
4248
0
    if (rc == TPM_RC_SUCCESS) {
4249
0
  rc = TPMI_RH_NV_INDEX_Unmarshal(&target->nvIndex, buffer, size, NO);
4250
0
    }
4251
0
    if (rc == TPM_RC_SUCCESS) {
4252
0
  rc = TPMI_ALG_HASH_Unmarshal(&target->nameAlg, buffer, size, NO);
4253
0
    }
4254
0
    if (rc == TPM_RC_SUCCESS) {
4255
0
  rc = TPMA_NV_Unmarshal(&target->attributes, buffer, size);
4256
0
    }
4257
0
    if (rc == TPM_RC_SUCCESS) {
4258
0
  rc = TPM2B_DIGEST_Unmarshal(&target->authPolicy, buffer, size);
4259
0
    }
4260
0
    if (rc == TPM_RC_SUCCESS) {
4261
0
  rc = UINT16_Unmarshal(&target->dataSize, buffer, size);
4262
0
    }
4263
0
    if (rc == TPM_RC_SUCCESS) {
4264
0
  if (target->dataSize > MAX_NV_INDEX_SIZE) {
4265
0
      rc = TPM_RC_SIZE;
4266
0
  }
4267
0
    }
4268
0
    return rc;
4269
0
}
4270
4271
/* Table 198 - Definition of TPM2B_NV_PUBLIC Structure */
4272
4273
TPM_RC
4274
TPM2B_NV_PUBLIC_Unmarshal(TPM2B_NV_PUBLIC *target, BYTE **buffer, INT32 *size)
4275
0
{
4276
0
    TPM_RC rc = TPM_RC_SUCCESS;
4277
    
4278
0
    INT32 startSize;
4279
0
    if (rc == TPM_RC_SUCCESS) {
4280
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
4281
0
    }
4282
0
    if (rc == TPM_RC_SUCCESS) {
4283
0
  if (target->size == 0) {
4284
0
      rc = TPM_RC_SIZE;
4285
0
  }
4286
0
    }
4287
0
    if (rc == TPM_RC_SUCCESS) {
4288
0
  startSize = *size;
4289
0
    }
4290
0
    if (rc == TPM_RC_SUCCESS) {
4291
0
  rc = TPMS_NV_PUBLIC_Unmarshal(&target->nvPublic, buffer, size);
4292
0
    }
4293
0
    if (rc == TPM_RC_SUCCESS) {
4294
0
  if (target->size != startSize - *size) {
4295
0
      rc = TPM_RC_SIZE;
4296
0
  }
4297
0
    }
4298
0
    return rc;
4299
0
}
4300
4301
/* Table 199 - Definition of TPM2B_CONTEXT_SENSITIVE Structure <IN/OUT> */
4302
4303
TPM_RC
4304
TPM2B_CONTEXT_SENSITIVE_Unmarshal(TPM2B_CONTEXT_SENSITIVE *target, BYTE **buffer, INT32 *size)
4305
0
{
4306
0
    TPM_RC rc = TPM_RC_SUCCESS;
4307
    
4308
0
    if (rc == TPM_RC_SUCCESS) {
4309
0
  rc = TPM2B_Unmarshal(&target->b, MAX_CONTEXT_SIZE, buffer, size);
4310
0
    }
4311
0
    return rc;
4312
0
}
4313
4314
/* Table 200 - Definition of TPMS_CONTEXT_DATA Structure <IN/OUT, S> */
4315
4316
TPM_RC
4317
TPMS_CONTEXT_DATA_Unmarshal(TPMS_CONTEXT_DATA *target, BYTE **buffer, INT32 *size)
4318
0
{
4319
0
    TPM_RC rc = TPM_RC_SUCCESS;
4320
4321
0
    if (rc == TPM_RC_SUCCESS) {
4322
0
  rc = TPM2B_DIGEST_Unmarshal(&target->integrity, buffer, size);  
4323
0
    }
4324
0
    if (rc == TPM_RC_SUCCESS) {
4325
0
  rc = TPM2B_CONTEXT_SENSITIVE_Unmarshal(&target->encrypted, buffer, size);
4326
0
    }
4327
0
    return rc;
4328
0
}
4329
4330
/* Table 201 - Definition of TPM2B_CONTEXT_DATA Structure <IN/OUT> */
4331
4332
TPM_RC
4333
TPM2B_CONTEXT_DATA_Unmarshal(TPM2B_CONTEXT_DATA *target, BYTE **buffer, INT32 *size)
4334
0
{
4335
0
    TPM_RC rc = TPM_RC_SUCCESS;
4336
    
4337
0
    if (rc == TPM_RC_SUCCESS) {
4338
0
  rc = TPM2B_Unmarshal(&target->b, sizeof(TPMS_CONTEXT_DATA), buffer, size);
4339
0
    }
4340
0
    return rc;
4341
0
}
4342
4343
/* Table 202 - Definition of TPMS_CONTEXT Structure */
4344
4345
TPM_RC
4346
TPMS_CONTEXT_Unmarshal(TPMS_CONTEXT *target, BYTE **buffer, INT32 *size)
4347
0
{
4348
0
    TPM_RC rc = TPM_RC_SUCCESS;
4349
    
4350
0
    if (rc == TPM_RC_SUCCESS) {
4351
0
  rc = UINT64_Unmarshal(&target->sequence, buffer, size);
4352
0
    }
4353
0
    if (rc == TPM_RC_SUCCESS) {
4354
0
  rc = TPMI_DH_SAVED_Unmarshal(&target->savedHandle, buffer, size, NO);
4355
0
    }
4356
0
    if (rc == TPM_RC_SUCCESS) {
4357
0
  rc = TPMI_RH_HIERARCHY_Unmarshal(&target->hierarchy, buffer, size, YES);
4358
0
    }
4359
0
    if (rc == TPM_RC_SUCCESS) {
4360
0
  rc = TPM2B_CONTEXT_DATA_Unmarshal(&target->contextBlob, buffer, size);
4361
0
    }
4362
0
    return rc;
4363
0
}
4364
4365
/* Table 204 - Definition of TPMS_CREATION_DATA Structure <OUT> */
4366
4367
TPM_RC
4368
TPMS_CREATION_DATA_Unmarshal(TPMS_CREATION_DATA *target, BYTE **buffer, INT32 *size)
4369
0
{
4370
0
    TPM_RC rc = TPM_RC_SUCCESS;
4371
4372
0
    if (rc == TPM_RC_SUCCESS) {
4373
0
  rc = TPML_PCR_SELECTION_Unmarshal(&target->pcrSelect, buffer, size);
4374
0
    }
4375
0
    if (rc == TPM_RC_SUCCESS) {
4376
0
  rc = TPM2B_DIGEST_Unmarshal(&target->pcrDigest, buffer, size);
4377
0
    }
4378
0
    if (rc == TPM_RC_SUCCESS) {
4379
0
  rc = TPMA_LOCALITY_Unmarshal(&target->locality, buffer, size);
4380
0
    }
4381
0
    if (rc == TPM_RC_SUCCESS) {
4382
0
  rc = TPM_ALG_ID_Unmarshal(&target->parentNameAlg, buffer, size);
4383
0
    }
4384
0
    if (rc == TPM_RC_SUCCESS) {
4385
0
  rc = TPM2B_NAME_Unmarshal(&target->parentName, buffer, size);
4386
0
    }
4387
0
    if (rc == TPM_RC_SUCCESS) {
4388
0
  rc = TPM2B_NAME_Unmarshal(&target->parentQualifiedName, buffer, size);
4389
0
    }
4390
0
    if (rc == TPM_RC_SUCCESS) {
4391
0
  rc = TPM2B_DATA_Unmarshal(&target->outsideInfo, buffer, size);
4392
0
    }
4393
0
    return rc;
4394
0
}
4395
4396
/* Table 205 - Definition of TPM2B_CREATION_DATA Structure <OUT> */
4397
4398
TPM_RC
4399
TPM2B_CREATION_DATA_Unmarshal(TPM2B_CREATION_DATA *target, BYTE **buffer, INT32 *size)
4400
0
{
4401
0
    TPM_RC rc = TPM_RC_SUCCESS;
4402
    
4403
0
    INT32 startSize;
4404
0
    if (rc == TPM_RC_SUCCESS) {
4405
0
  rc = UINT16_Unmarshal(&target->size, buffer, size);
4406
0
    }
4407
0
    if (rc == TPM_RC_SUCCESS) {
4408
0
  if (target->size == 0) {
4409
0
      rc = TPM_RC_SIZE;
4410
0
  }
4411
0
    }
4412
0
    if (rc == TPM_RC_SUCCESS) {
4413
0
  startSize = *size;
4414
0
    }
4415
0
    if (rc == TPM_RC_SUCCESS) {
4416
0
  rc = TPMS_CREATION_DATA_Unmarshal(&target->creationData, buffer, size);
4417
0
    }
4418
0
    if (rc == TPM_RC_SUCCESS) {
4419
0
  if (target->size != startSize - *size) {
4420
0
      rc = TPM_RC_SIZE;
4421
0
  }
4422
0
    }
4423
0
    return rc;
4424
0
}
4425