Coverage Report

Created: 2025-08-26 06:23

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