aboutsummaryrefslogtreecommitdiff
path: root/tpm_types.h
blob: 56af630fe05b80e08d08ffd43bfc0992eefc6812 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// THIS CODE IS GENERATED - DO NOT MODIFY!

#ifndef TPM2_TPM_TYPES_H_
#define TPM2_TPM_TYPES_H_
// Unprocessed: Table 1  Name Prefix Convention
// Skipped: Table 2  Unmarshaling Errors
// Table 3  Definition of Base Types
typedef uint8_t UINT8;
typedef uint8_t BYTE;
typedef int8_t INT8;
typedef int BOOL;
typedef uint16_t UINT16;
typedef int16_t INT16;
typedef uint32_t UINT32;
typedef int32_t INT32;
typedef uint64_t UINT64;
typedef int64_t INT64;

// Table 4  Defines for Logic Values
#define TRUE   1
#define FALSE  0
#define YES    1
#define NO     0
#define SET    1
#define CLEAR  0

// Table 5  Definition of Types for Documentation Clarity
typedef UINT32 TPM_ALGORITHM_ID;
typedef UINT32 TPM_MODIFIER_INDICATOR;
typedef UINT32 TPM_AUTHORIZATION_SIZE;
typedef UINT32 TPM_PARAMETER_SIZE;
typedef UINT16 TPM_KEY_SIZE;
typedef UINT16 TPM_KEY_BITS;

// Skipped: Table 6  Definition of TPM_SPEC Constants <>
// Table 7  Definition of TPM_GENERATED Constants <  O>
typedef UINT32 TPM_GENERATED;
#define TPM_GENERATED_VALUE  0xff544347

// Unprocessed: Table 8  Legend for TPM_ALG_ID Table
// Skipped: Table 9  Definition of TPM_ALG_ID Constants <  IN/OUT, S>
// Skipped: Table 10  Definition of TPM_ECC_CURVE Constants <  IN/OUT, S>
// Unprocessed: Table 11  TPM Command Format Fields Description
// Unprocessed: Table 12  Legend for Command Code Tables
// Skipped: Table 13  Definition of TPM_CC Constants <  IN/OUT, S>
// Unprocessed: Table 14  Format-Zero Response Codes
// Unprocessed: Table 15  Format-One Response Codes
// Unprocessed: Table 16  Response Code Groupings
// Table 17  Definition of TPM_RC Constants <  OUT>
typedef UINT32 TPM_RC;
#define TPM_RC_SUCCESS                                  0x000
#define TPM_RC_BAD_TAG                                  0x01E
#define RC_VER1                                         0x100
#define TPM_RC_INITIALIZE         ((TPM_RC)(RC_VER1 + 0x000))
#define TPM_RC_FAILURE            ((TPM_RC)(RC_VER1 + 0x001))
#define TPM_RC_SEQUENCE           ((TPM_RC)(RC_VER1 + 0x003))
#define TPM_RC_PRIVATE            ((TPM_RC)(RC_VER1 + 0x00B))
#define TPM_RC_HMAC               ((TPM_RC)(RC_VER1 + 0x019))
#define TPM_RC_DISABLED           ((TPM_RC)(RC_VER1 + 0x020))
#define TPM_RC_EXCLUSIVE          ((TPM_RC)(RC_VER1 + 0x021))
#define TPM_RC_AUTH_TYPE          ((TPM_RC)(RC_VER1 + 0x024))
#define TPM_RC_AUTH_MISSING       ((TPM_RC)(RC_VER1 + 0x025))
#define TPM_RC_POLICY             ((TPM_RC)(RC_VER1 + 0x026))
#define TPM_RC_PCR                ((TPM_RC)(RC_VER1 + 0x027))
#define TPM_RC_PCR_CHANGED        ((TPM_RC)(RC_VER1 + 0x028))
#define TPM_RC_UPGRADE            ((TPM_RC)(RC_VER1 + 0x02D))
#define TPM_RC_TOO_MANY_CONTEXTS  ((TPM_RC)(RC_VER1 + 0x02E))
#define TPM_RC_AUTH_UNAVAILABLE   ((TPM_RC)(RC_VER1 + 0x02F))
#define TPM_RC_REBOOT             ((TPM_RC)(RC_VER1 + 0x030))
#define TPM_RC_UNBALANCED         ((TPM_RC)(RC_VER1 + 0x031))
#define TPM_RC_COMMAND_SIZE       ((TPM_RC)(RC_VER1 + 0x042))
#define TPM_RC_COMMAND_CODE       ((TPM_RC)(RC_VER1 + 0x043))
#define TPM_RC_AUTHSIZE           ((TPM_RC)(RC_VER1 + 0x044))
#define TPM_RC_AUTH_CONTEXT       ((TPM_RC)(RC_VER1 + 0x045))
#define TPM_RC_NV_RANGE           ((TPM_RC)(RC_VER1 + 0x046))
#define TPM_RC_NV_SIZE            ((TPM_RC)(RC_VER1 + 0x047))
#define TPM_RC_NV_LOCKED          ((TPM_RC)(RC_VER1 + 0x048))
#define TPM_RC_NV_AUTHORIZATION   ((TPM_RC)(RC_VER1 + 0x049))
#define TPM_RC_NV_UNINITIALIZED   ((TPM_RC)(RC_VER1 + 0x04A))
#define TPM_RC_NV_SPACE           ((TPM_RC)(RC_VER1 + 0x04B))
#define TPM_RC_NV_DEFINED         ((TPM_RC)(RC_VER1 + 0x04C))
#define TPM_RC_BAD_CONTEXT        ((TPM_RC)(RC_VER1 + 0x050))
#define TPM_RC_CPHASH             ((TPM_RC)(RC_VER1 + 0x051))
#define TPM_RC_PARENT             ((TPM_RC)(RC_VER1 + 0x052))
#define TPM_RC_NEEDS_TEST         ((TPM_RC)(RC_VER1 + 0x053))
#define TPM_RC_NO_RESULT          ((TPM_RC)(RC_VER1 + 0x054))
#define TPM_RC_SENSITIVE          ((TPM_RC)(RC_VER1 + 0x055))
#define RC_MAX_FM0                ((TPM_RC)(RC_VER1 + 0x07F))
#define RC_FMT1                                         0x080
#define TPM_RC_ASYMMETRIC         ((TPM_RC)(RC_FMT1 + 0x001))
#define TPM_RC_ATTRIBUTES         ((TPM_RC)(RC_FMT1 + 0x002))
#define TPM_RC_HASH               ((TPM_RC)(RC_FMT1 + 0x003))
#define TPM_RC_VALUE              ((TPM_RC)(RC_FMT1 + 0x004))
#define TPM_RC_HIERARCHY          ((TPM_RC)(RC_FMT1 + 0x005))
#define TPM_RC_KEY_SIZE           ((TPM_RC)(RC_FMT1 + 0x007))
#define TPM_RC_MGF                ((TPM_RC)(RC_FMT1 + 0x008))
#define TPM_RC_MODE               ((TPM_RC)(RC_FMT1 + 0x009))
#define TPM_RC_TYPE               ((TPM_RC)(RC_FMT1 + 0x00A))
#define TPM_RC_HANDLE             ((TPM_RC)(RC_FMT1 + 0x00B))
#define TPM_RC_KDF                ((TPM_RC)(RC_FMT1 + 0x00C))
#define TPM_RC_RANGE              ((TPM_RC)(RC_FMT1 + 0x00D))
#define TPM_RC_AUTH_FAIL          ((TPM_RC)(RC_FMT1 + 0x00E))
#define TPM_RC_NONCE              ((TPM_RC)(RC_FMT1 + 0x00F))
#define TPM_RC_PP                 ((TPM_RC)(RC_FMT1 + 0x010))
#define TPM_RC_SCHEME             ((TPM_RC)(RC_FMT1 + 0x012))
#define TPM_RC_SIZE               ((TPM_RC)(RC_FMT1 + 0x015))
#define TPM_RC_SYMMETRIC          ((TPM_RC)(RC_FMT1 + 0x016))
#define TPM_RC_TAG                ((TPM_RC)(RC_FMT1 + 0x017))
#define TPM_RC_SELECTOR           ((TPM_RC)(RC_FMT1 + 0x018))
#define TPM_RC_INSUFFICIENT       ((TPM_RC)(RC_FMT1 + 0x01A))
#define TPM_RC_SIGNATURE          ((TPM_RC)(RC_FMT1 + 0x01B))
#define TPM_RC_KEY                ((TPM_RC)(RC_FMT1 + 0x01C))
#define TPM_RC_POLICY_FAIL        ((TPM_RC)(RC_FMT1 + 0x01D))
#define TPM_RC_INTEGRITY          ((TPM_RC)(RC_FMT1 + 0x01F))
#define TPM_RC_TICKET             ((TPM_RC)(RC_FMT1 + 0x020))
#define TPM_RC_RESERVED_BITS      ((TPM_RC)(RC_FMT1 + 0x021))
#define TPM_RC_BAD_AUTH           ((TPM_RC)(RC_FMT1 + 0x022))
#define TPM_RC_EXPIRED            ((TPM_RC)(RC_FMT1 + 0x023))
#define TPM_RC_POLICY_CC          ((TPM_RC)(RC_FMT1 + 0x024))
#define TPM_RC_BINDING            ((TPM_RC)(RC_FMT1 + 0x025))
#define TPM_RC_CURVE              ((TPM_RC)(RC_FMT1 + 0x026))
#define TPM_RC_ECC_POINT          ((TPM_RC)(RC_FMT1 + 0x027))
#define RC_WARN                                         0x900
#define TPM_RC_CONTEXT_GAP        ((TPM_RC)(RC_WARN + 0x001))
#define TPM_RC_OBJECT_MEMORY      ((TPM_RC)(RC_WARN + 0x002))
#define TPM_RC_SESSION_MEMORY     ((TPM_RC)(RC_WARN + 0x003))
#define TPM_RC_MEMORY             ((TPM_RC)(RC_WARN + 0x004))
#define TPM_RC_SESSION_HANDLES    ((TPM_RC)(RC_WARN + 0x005))
#define TPM_RC_OBJECT_HANDLES     ((TPM_RC)(RC_WARN + 0x006))
#define TPM_RC_LOCALITY           ((TPM_RC)(RC_WARN + 0x007))
#define TPM_RC_YIELDED            ((TPM_RC)(RC_WARN + 0x008))
#define TPM_RC_CANCELED           ((TPM_RC)(RC_WARN + 0x009))
#define TPM_RC_TESTING            ((TPM_RC)(RC_WARN + 0x00A))
#define TPM_RC_REFERENCE_H0       ((TPM_RC)(RC_WARN + 0x010))
#define TPM_RC_REFERENCE_H1       ((TPM_RC)(RC_WARN + 0x011))
#define TPM_RC_REFERENCE_H2       ((TPM_RC)(RC_WARN + 0x012))
#define TPM_RC_REFERENCE_H3       ((TPM_RC)(RC_WARN + 0x013))
#define TPM_RC_REFERENCE_H4       ((TPM_RC)(RC_WARN + 0x014))
#define TPM_RC_REFERENCE_H5       ((TPM_RC)(RC_WARN + 0x015))
#define TPM_RC_REFERENCE_H6       ((TPM_RC)(RC_WARN + 0x016))
#define TPM_RC_REFERENCE_S0       ((TPM_RC)(RC_WARN + 0x018))
#define TPM_RC_REFERENCE_S1       ((TPM_RC)(RC_WARN + 0x019))
#define TPM_RC_REFERENCE_S2       ((TPM_RC)(RC_WARN + 0x01A))
#define TPM_RC_REFERENCE_S3       ((TPM_RC)(RC_WARN + 0x01B))
#define TPM_RC_REFERENCE_S4       ((TPM_RC)(RC_WARN + 0x01C))
#define TPM_RC_REFERENCE_S5       ((TPM_RC)(RC_WARN + 0x01D))
#define TPM_RC_REFERENCE_S6       ((TPM_RC)(RC_WARN + 0x01E))
#define TPM_RC_NV_RATE            ((TPM_RC)(RC_WARN + 0x020))
#define TPM_RC_LOCKOUT            ((TPM_RC)(RC_WARN + 0x021))
#define TPM_RC_RETRY              ((TPM_RC)(RC_WARN + 0x022))
#define TPM_RC_NV_UNAVAILABLE     ((TPM_RC)(RC_WARN + 0x023))
#define TPM_RC_NOT_USED            ((TPM_RC)(RC_WARN + 0x7F))
#define TPM_RC_H                                        0x000
#define TPM_RC_P                                        0x040
#define TPM_RC_S                                        0x800
#define TPM_RC_1                                        0x100
#define TPM_RC_2                                        0x200
#define TPM_RC_3                                        0x300
#define TPM_RC_4                                        0x400
#define TPM_RC_5                                        0x500
#define TPM_RC_6                                        0x600
#define TPM_RC_7                                        0x700
#define TPM_RC_8                                        0x800
#define TPM_RC_9                                        0x900
#define TPM_RC_A                                        0xA00
#define TPM_RC_B                                        0xB00
#define TPM_RC_C                                        0xC00
#define TPM_RC_D                                        0xD00
#define TPM_RC_E                                        0xE00
#define TPM_RC_F                                        0xF00
#define TPM_RC_N_MASK                                   0xF00

// Table 18  Definition of TPM_CLOCK_ADJUST Constants <  IN>
typedef INT8 TPM_CLOCK_ADJUST;
#define TPM_CLOCK_COARSE_SLOWER  -3
#define TPM_CLOCK_MEDIUM_SLOWER  -2
#define TPM_CLOCK_FINE_SLOWER    -1
#define TPM_CLOCK_NO_CHANGE       0
#define TPM_CLOCK_FINE_FASTER     1
#define TPM_CLOCK_MEDIUM_FASTER   2
#define TPM_CLOCK_COARSE_FASTER   3

// Table 19  Definition of TPM_EO Constants <  IN/OUT>
typedef UINT16 TPM_EO;
#define TPM_EO_EQ           0x0000
#define TPM_EO_NEQ          0x0001
#define TPM_EO_SIGNED_GT    0x0002
#define TPM_EO_UNSIGNED_GT  0x0003
#define TPM_EO_SIGNED_LT    0x0004
#define TPM_EO_UNSIGNED_LT  0x0005
#define TPM_EO_SIGNED_GE    0x0006
#define TPM_EO_UNSIGNED_GE  0x0007
#define TPM_EO_SIGNED_LE    0x0008
#define TPM_EO_UNSIGNED_LE  0x0009
#define TPM_EO_BITSET       0x000A
#define TPM_EO_BITCLEAR     0x000B

// Table 20  Definition of TPM_ST Constants <  IN/OUT, S>
typedef UINT16 TPM_ST;
#define TPM_ST_RSP_COMMAND           0x00C4
#define TPM_ST_NULL                  0X8000
#define TPM_ST_NO_SESSIONS           0x8001
#define TPM_ST_SESSIONS              0x8002
#define TPM_ST_ATTEST_NV             0x8014
#define TPM_ST_ATTEST_COMMAND_AUDIT  0x8015
#define TPM_ST_ATTEST_SESSION_AUDIT  0x8016
#define TPM_ST_ATTEST_CERTIFY        0x8017
#define TPM_ST_ATTEST_QUOTE          0x8018
#define TPM_ST_ATTEST_TIME           0x8019
#define TPM_ST_ATTEST_CREATION       0x801A
#define TPM_ST_CREATION              0x8021
#define TPM_ST_VERIFIED              0x8022
#define TPM_ST_AUTH_SECRET           0x8023
#define TPM_ST_HASHCHECK             0x8024
#define TPM_ST_AUTH_SIGNED           0x8025
#define TPM_ST_FU_MANIFEST           0x8029

// Table 21  Definition of TPM_SU Constants <  IN>
typedef UINT16 TPM_SU;
#define TPM_SU_CLEAR  0x0000
#define TPM_SU_STATE  0x0001

// Table 22  Definition of TPM_SE Constants <  IN>
typedef UINT8 TPM_SE;
#define TPM_SE_HMAC    0x00
#define TPM_SE_POLICY  0x01
#define TPM_SE_TRIAL   0x03

// Table 23  Definition of TPM_CAP Constants
typedef UINT32 TPM_CAP;
#define TPM_CAP_FIRST            0x00000000
#define TPM_CAP_ALGS             0x00000000
#define TPM_CAP_HANDLES          0x00000001
#define TPM_CAP_COMMANDS         0x00000002
#define TPM_CAP_PP_COMMANDS      0x00000003
#define TPM_CAP_AUDIT_COMMANDS   0x00000004
#define TPM_CAP_PCRS             0x00000005
#define TPM_CAP_TPM_PROPERTIES   0x00000006
#define TPM_CAP_PCR_PROPERTIES   0x00000007
#define TPM_CAP_ECC_CURVES       0x00000008
#define TPM_CAP_LAST             0x00000008
#define TPM_CAP_VENDOR_PROPERTY  0x00000100

// Table 24  Definition of TPM_PT Constants <  IN/OUT, S>
typedef UINT32 TPM_PT;
#define TPM_PT_NONE                                0x00000000
#define PT_GROUP                                   0x00000100
#define PT_FIXED                               (PT_GROUP * 1)
#define TPM_PT_FAMILY_INDICATOR      ((TPM_PT)(PT_FIXED + 0))
#define TPM_PT_LEVEL                 ((TPM_PT)(PT_FIXED + 1))
#define TPM_PT_REVISION              ((TPM_PT)(PT_FIXED + 2))
#define TPM_PT_DAY_OF_YEAR           ((TPM_PT)(PT_FIXED + 3))
#define TPM_PT_YEAR                  ((TPM_PT)(PT_FIXED + 4))
#define TPM_PT_MANUFACTURER          ((TPM_PT)(PT_FIXED + 5))
#define TPM_PT_VENDOR_STRING_1       ((TPM_PT)(PT_FIXED + 6))
#define TPM_PT_VENDOR_STRING_2       ((TPM_PT)(PT_FIXED + 7))
#define TPM_PT_VENDOR_STRING_3       ((TPM_PT)(PT_FIXED + 8))
#define TPM_PT_VENDOR_STRING_4       ((TPM_PT)(PT_FIXED + 9))
#define TPM_PT_VENDOR_TPM_TYPE      ((TPM_PT)(PT_FIXED + 10))
#define TPM_PT_FIRMWARE_VERSION_1   ((TPM_PT)(PT_FIXED + 11))
#define TPM_PT_FIRMWARE_VERSION_2   ((TPM_PT)(PT_FIXED + 12))
#define TPM_PT_INPUT_BUFFER         ((TPM_PT)(PT_FIXED + 13))
#define TPM_PT_HR_TRANSIENT_MIN     ((TPM_PT)(PT_FIXED + 14))
#define TPM_PT_HR_PERSISTENT_MIN    ((TPM_PT)(PT_FIXED + 15))
#define TPM_PT_HR_LOADED_MIN        ((TPM_PT)(PT_FIXED + 16))
#define TPM_PT_ACTIVE_SESSIONS_MAX  ((TPM_PT)(PT_FIXED + 17))
#define TPM_PT_PCR_COUNT            ((TPM_PT)(PT_FIXED + 18))
#define TPM_PT_PCR_SELECT_MIN       ((TPM_PT)(PT_FIXED + 19))
#define TPM_PT_CONTEXT_GAP_MAX      ((TPM_PT)(PT_FIXED + 20))
#define TPM_PT_NV_COUNTERS_MAX      ((TPM_PT)(PT_FIXED + 22))
#define TPM_PT_NV_INDEX_MAX         ((TPM_PT)(PT_FIXED + 23))
#define TPM_PT_MEMORY               ((TPM_PT)(PT_FIXED + 24))
#define TPM_PT_CLOCK_UPDATE         ((TPM_PT)(PT_FIXED + 25))
#define TPM_PT_CONTEXT_HASH         ((TPM_PT)(PT_FIXED + 26))
#define TPM_PT_CONTEXT_SYM          ((TPM_PT)(PT_FIXED + 27))
#define TPM_PT_CONTEXT_SYM_SIZE     ((TPM_PT)(PT_FIXED + 28))
#define TPM_PT_ORDERLY_COUNT        ((TPM_PT)(PT_FIXED + 29))
#define TPM_PT_MAX_COMMAND_SIZE     ((TPM_PT)(PT_FIXED + 30))
#define TPM_PT_MAX_RESPONSE_SIZE    ((TPM_PT)(PT_FIXED + 31))
#define TPM_PT_MAX_DIGEST           ((TPM_PT)(PT_FIXED + 32))
#define TPM_PT_MAX_OBJECT_CONTEXT   ((TPM_PT)(PT_FIXED + 33))
#define TPM_PT_MAX_SESSION_CONTEXT  ((TPM_PT)(PT_FIXED + 34))
#define TPM_PT_PS_FAMILY_INDICATOR  ((TPM_PT)(PT_FIXED + 35))
#define TPM_PT_PS_LEVEL             ((TPM_PT)(PT_FIXED + 36))
#define TPM_PT_PS_REVISION          ((TPM_PT)(PT_FIXED + 37))
#define TPM_PT_PS_DAY_OF_YEAR       ((TPM_PT)(PT_FIXED + 38))
#define TPM_PT_PS_YEAR              ((TPM_PT)(PT_FIXED + 39))
#define TPM_PT_SPLIT_MAX            ((TPM_PT)(PT_FIXED + 40))
#define TPM_PT_TOTAL_COMMANDS       ((TPM_PT)(PT_FIXED + 41))
#define TPM_PT_LIBRARY_COMMANDS     ((TPM_PT)(PT_FIXED + 42))
#define TPM_PT_VENDOR_COMMANDS      ((TPM_PT)(PT_FIXED + 43))
#define TPM_PT_NV_BUFFER_MAX        ((TPM_PT)(PT_FIXED + 44))
#define PT_VAR                                 (PT_GROUP * 2)
#define TPM_PT_PERMANENT               ((TPM_PT)(PT_VAR + 0))
#define TPM_PT_STARTUP_CLEAR           ((TPM_PT)(PT_VAR + 1))
#define TPM_PT_HR_NV_INDEX             ((TPM_PT)(PT_VAR + 2))
#define TPM_PT_HR_LOADED               ((TPM_PT)(PT_VAR + 3))
#define TPM_PT_HR_LOADED_AVAIL         ((TPM_PT)(PT_VAR + 4))
#define TPM_PT_HR_ACTIVE               ((TPM_PT)(PT_VAR + 5))
#define TPM_PT_HR_ACTIVE_AVAIL         ((TPM_PT)(PT_VAR + 6))
#define TPM_PT_HR_TRANSIENT_AVAIL      ((TPM_PT)(PT_VAR + 7))
#define TPM_PT_HR_PERSISTENT           ((TPM_PT)(PT_VAR + 8))
#define TPM_PT_HR_PERSISTENT_AVAIL     ((TPM_PT)(PT_VAR + 9))
#define TPM_PT_NV_COUNTERS            ((TPM_PT)(PT_VAR + 10))
#define TPM_PT_NV_COUNTERS_AVAIL      ((TPM_PT)(PT_VAR + 11))
#define TPM_PT_ALGORITHM_SET          ((TPM_PT)(PT_VAR + 12))
#define TPM_PT_LOADED_CURVES          ((TPM_PT)(PT_VAR + 13))
#define TPM_PT_LOCKOUT_COUNTER        ((TPM_PT)(PT_VAR + 14))
#define TPM_PT_MAX_AUTH_FAIL          ((TPM_PT)(PT_VAR + 15))
#define TPM_PT_LOCKOUT_INTERVAL       ((TPM_PT)(PT_VAR + 16))
#define TPM_PT_LOCKOUT_RECOVERY       ((TPM_PT)(PT_VAR + 17))
#define TPM_PT_NV_WRITE_RECOVERY      ((TPM_PT)(PT_VAR + 18))
#define TPM_PT_AUDIT_COUNTER_0        ((TPM_PT)(PT_VAR + 19))
#define TPM_PT_AUDIT_COUNTER_1        ((TPM_PT)(PT_VAR + 20))

// Table 25  Definition of TPM_PT_PCR Constants <  IN/OUT, S>
typedef UINT32 TPM_PT_PCR;
#define TPM_PT_PCR_FIRST         0x00000000
#define TPM_PT_PCR_SAVE          0x00000000
#define TPM_PT_PCR_EXTEND_L0     0x00000001
#define TPM_PT_PCR_RESET_L0      0x00000002
#define TPM_PT_PCR_EXTEND_L1     0x00000003
#define TPM_PT_PCR_RESET_L1      0x00000004
#define TPM_PT_PCR_EXTEND_L2     0x00000005
#define TPM_PT_PCR_RESET_L2      0x00000006
#define TPM_PT_PCR_EXTEND_L3     0x00000007
#define TPM_PT_PCR_RESET_L3      0x00000008
#define TPM_PT_PCR_EXTEND_L4     0x00000009
#define TPM_PT_PCR_RESET_L4      0x0000000A
#define TPM_PT_PCR_NO_INCREMENT  0x00000011
#define TPM_PT_PCR_DRTM_RESET    0x00000012
#define TPM_PT_PCR_POLICY        0x00000013
#define TPM_PT_PCR_AUTH          0x00000014
#define TPM_PT_PCR_LAST          0x00000014

// Table 26  Definition of TPM_PS Constants <  OUT>
typedef UINT32 TPM_PS;
#define TPM_PS_MAIN            0x00000000
#define TPM_PS_PC              0x00000001
#define TPM_PS_PDA             0x00000002
#define TPM_PS_CELL_PHONE      0x00000003
#define TPM_PS_SERVER          0x00000004
#define TPM_PS_PERIPHERAL      0x00000005
#define TPM_PS_TSS             0x00000006
#define TPM_PS_STORAGE         0x00000007
#define TPM_PS_AUTHENTICATION  0x00000008
#define TPM_PS_EMBEDDED        0x00000009
#define TPM_PS_HARDCOPY        0x0000000A
#define TPM_PS_INFRASTRUCTURE  0x0000000B
#define TPM_PS_VIRTUALIZATION  0x0000000C
#define TPM_PS_TNC             0x0000000D
#define TPM_PS_MULTI_TENANT    0x0000000E
#define TPM_PS_TC              0x0000000F

// Table 27  Definition of Types for Handles
typedef UINT32 TPM_HANDLE;

// Table 28  Definition of TPM_HT Constants <  S>
typedef UINT8 TPM_HT;
#define TPM_HT_PCR             0x00
#define TPM_HT_NV_INDEX        0x01
#define TPM_HT_HMAC_SESSION    0x02
#define TPM_HT_LOADED_SESSION  0x02
#define TPM_HT_POLICY_SESSION  0x03
#define TPM_HT_ACTIVE_SESSION  0x03
#define TPM_HT_PERMANENT       0x40
#define TPM_HT_TRANSIENT       0x80
#define TPM_HT_PERSISTENT      0x81

// Table 29  Definition of TPM_RH Constants <  S>
typedef TPM_HANDLE TPM_RH;
#define TPM_RH_FIRST        0x40000000
#define TPM_RH_SRK          0x40000000
#define TPM_RH_OWNER        0x40000001
#define TPM_RH_REVOKE       0x40000002
#define TPM_RH_TRANSPORT    0x40000003
#define TPM_RH_OPERATOR     0x40000004
#define TPM_RH_ADMIN        0x40000005
#define TPM_RH_EK           0x40000006
#define TPM_RH_NULL         0x40000007
#define TPM_RH_UNASSIGNED   0x40000008
#define TPM_RS_PW           0x40000009
#define TPM_RH_LOCKOUT      0x4000000A
#define TPM_RH_ENDORSEMENT  0x4000000B
#define TPM_RH_PLATFORM     0x4000000C
#define TPM_RH_PLATFORM_NV  0x4000000D
#define TPM_RH_AUTH_00      0x40000010
#define TPM_RH_AUTH_FF      0x4000010F
#define TPM_RH_LAST         0x4000010F

// Table 30  Definition of TPM_HC Constants <  S>
typedef TPM_HANDLE TPM_HC;
#define HR_HANDLE_MASK                                            0x00FFFFFF
#define HR_RANGE_MASK                                             0xFF000000
#define HR_SHIFT                                                          24
#define HR_PCR                                     (TPM_HT_PCR <<  HR_SHIFT)
#define HR_HMAC_SESSION                   (TPM_HT_HMAC_SESSION <<  HR_SHIFT)
#define HR_POLICY_SESSION               (TPM_HT_POLICY_SESSION <<  HR_SHIFT)
#define HR_TRANSIENT                         (TPM_HT_TRANSIENT <<  HR_SHIFT)
#define HR_PERSISTENT                       (TPM_HT_PERSISTENT <<  HR_SHIFT)
#define HR_NV_INDEX                           (TPM_HT_NV_INDEX <<  HR_SHIFT)
#define HR_PERMANENT                         (TPM_HT_PERMANENT <<  HR_SHIFT)
#define PCR_FIRST                                               (HR_PCR + 0)
#define PCR_LAST                          (PCR_FIRST + IMPLEMENTATION_PCR-1)
#define HMAC_SESSION_FIRST                             (HR_HMAC_SESSION + 0)
#define HMAC_SESSION_LAST         (HMAC_SESSION_FIRST+MAX_ACTIVE_SESSIONS-1)
#define LOADED_SESSION_FIRST                              HMAC_SESSION_FIRST
#define LOADED_SESSION_LAST                                HMAC_SESSION_LAST
#define POLICY_SESSION_FIRST                         (HR_POLICY_SESSION + 0)
#define POLICY_SESSION_LAST   (POLICY_SESSION_FIRST + MAX_ACTIVE_SESSIONS-1)
#define TRANSIENT_FIRST                                   (HR_TRANSIENT + 0)
#define ACTIVE_SESSION_FIRST                            POLICY_SESSION_FIRST
#define ACTIVE_SESSION_LAST                              POLICY_SESSION_LAST
#define TRANSIENT_LAST                (TRANSIENT_FIRST+MAX_LOADED_OBJECTS-1)
#define PERSISTENT_FIRST                                 (HR_PERSISTENT + 0)
#define PERSISTENT_LAST                      (PERSISTENT_FIRST + 0x00FFFFFF)
#define PLATFORM_PERSISTENT                  (PERSISTENT_FIRST + 0x00800000)
#define NV_INDEX_FIRST                                     (HR_NV_INDEX + 0)
#define NV_INDEX_LAST                          (NV_INDEX_FIRST + 0x00FFFFFF)
#define PERMANENT_FIRST                                         TPM_RH_FIRST
#define PERMANENT_LAST                                           TPM_RH_LAST

// Table 31  Definition of TPMA_ALGORITHM Bits
typedef struct {
  UINT32 asymmetric    : 1;
  UINT32 symmetric     : 1;
  UINT32 hash          : 1;
  UINT32 object        : 1;
  UINT32 reserved4_7   : 4;
  UINT32 signing       : 1;
  UINT32 encrypting    : 1;
  UINT32 method        : 1;
  UINT32 reserved11_31 : 21;
} TPMA_ALGORITHM;

// Table 32  Definition of TPMA_OBJECT Bits
typedef struct {
  UINT32 reserved0            : 1;
  UINT32 fixedTPM             : 1;
  UINT32 stClear              : 1;
  UINT32 reserved3            : 1;
  UINT32 fixedParent          : 1;
  UINT32 sensitiveDataOrigin  : 1;
  UINT32 userWithAuth         : 1;
  UINT32 adminWithPolicy      : 1;
  UINT32 reserved8_9          : 2;
  UINT32 noDA                 : 1;
  UINT32 encryptedDuplication : 1;
  UINT32 reserved12_15        : 4;
  UINT32 restricted           : 1;
  UINT32 decrypt              : 1;
  UINT32 sign                 : 1;
  UINT32 reserved19_31        : 13;
} TPMA_OBJECT;

// Table 33  Definition of TPMA_SESSION Bits <  IN/OUT>
typedef struct {
  UINT8 continueSession : 1;
  UINT8 auditExclusive  : 1;
  UINT8 auditReset      : 1;
  UINT8 reserved3_4     : 2;
  UINT8 decrypt         : 1;
  UINT8 encrypt         : 1;
  UINT8 audit           : 1;
} TPMA_SESSION;

// Table 34  Definition of TPMA_LOCALITY Bits <  IN/OUT>
typedef struct {
  UINT8 locZero  : 1;
  UINT8 locOne   : 1;
  UINT8 locTwo   : 1;
  UINT8 locThree : 1;
  UINT8 locFour  : 1;
  UINT8 Extended : 3;
} TPMA_LOCALITY;

// Table 35  Definition of TPMA_PERMANENT Bits <  OUT>
typedef struct {
  UINT32 ownerAuthSet       : 1;
  UINT32 endorsementAuthSet : 1;
  UINT32 lockoutAuthSet     : 1;
  UINT32 reserved3_7        : 5;
  UINT32 disableClear       : 1;
  UINT32 inLockout          : 1;
  UINT32 tpmGeneratedEPS    : 1;
  UINT32 reserved11_31      : 21;
} TPMA_PERMANENT;

// Table 36  Definition of TPMA_STARTUP_CLEAR Bits <  OUT>
typedef struct {
  UINT32 phEnable     : 1;
  UINT32 shEnable     : 1;
  UINT32 ehEnable     : 1;
  UINT32 phEnableNV   : 1;
  UINT32 reserved4_30 : 27;
  UINT32 orderly      : 1;
} TPMA_STARTUP_CLEAR;

// Table 37  Definition of TPMA_MEMORY Bits <  Out>
typedef struct {
  UINT32 sharedRAM         : 1;
  UINT32 sharedNV          : 1;
  UINT32 objectCopiedToRam : 1;
  UINT32 reserved3_31      : 29;
} TPMA_MEMORY;

// Table 38  Definition of TPMA_CC Bits <  OUT>
typedef struct {
  TPM_CC commandIndex  : 16;
  TPM_CC reserved16_21 : 6;
  TPM_CC nv            : 1;
  TPM_CC extensive     : 1;
  TPM_CC flushed       : 1;
  TPM_CC cHandles      : 3;
  TPM_CC rHandle       : 1;
  TPM_CC V             : 1;
  TPM_CC Res           : 2;
} TPMA_CC;

// Table 39  Definition of TPMI_YES_NO Type
typedef BYTE TPMI_YES_NO;
// Table 40  Definition of TPMI_DH_OBJECT Type
typedef TPM_HANDLE TPMI_DH_OBJECT;
// Table 41  Definition of TPMI_DH_PERSISTENT Type
typedef TPM_HANDLE TPMI_DH_PERSISTENT;
// Table 42  Definition of TPMI_DH_ENTITY Type <  IN>
typedef TPM_HANDLE TPMI_DH_ENTITY;
// Table 43  Definition of TPMI_DH_PCR Type <  IN>
typedef TPM_HANDLE TPMI_DH_PCR;
// Table 44  Definition of TPMI_SH_AUTH_SESSION Type <  IN/OUT>
typedef TPM_HANDLE TPMI_SH_AUTH_SESSION;
// Table 45  Definition of TPMI_SH_HMAC Type <  IN/OUT>
typedef TPM_HANDLE TPMI_SH_HMAC;
// Table 46  Definition of TPMI_SH_POLICY Type <  IN/OUT>
typedef TPM_HANDLE TPMI_SH_POLICY;
// Table 47  Definition of TPMI_DH_CONTEXT Type
typedef TPM_HANDLE TPMI_DH_CONTEXT;
// Table 48  Definition of TPMI_RH_HIERARCHY Type
typedef TPM_HANDLE TPMI_RH_HIERARCHY;
// Table 49  Definition of TPMI_RH_ENABLES Type
typedef TPM_HANDLE TPMI_RH_ENABLES;
// Table 50  Definition of TPMI_RH_HIERARCHY_AUTH Type <  IN>
typedef TPM_HANDLE TPMI_RH_HIERARCHY_AUTH;
// Table 51  Definition of TPMI_RH_PLATFORM Type <  IN>
typedef TPM_HANDLE TPMI_RH_PLATFORM;
// Table 52  Definition of TPMI_RH_OWNER Type <  IN>
typedef TPM_HANDLE TPMI_RH_OWNER;
// Table 53  Definition of TPMI_RH_ENDORSEMENT Type <  IN>
typedef TPM_HANDLE TPMI_RH_ENDORSEMENT;
// Table 54  Definition of TPMI_RH_PROVISION Type <  IN>
typedef TPM_HANDLE TPMI_RH_PROVISION;
// Table 55  Definition of TPMI_RH_CLEAR Type <  IN>
typedef TPM_HANDLE TPMI_RH_CLEAR;
// Table 56  Definition of TPMI_RH_NV_AUTH Type <  IN>
typedef TPM_HANDLE TPMI_RH_NV_AUTH;
// Table 57  Definition of TPMI_RH_LOCKOUT Type <  IN>
typedef TPM_HANDLE TPMI_RH_LOCKOUT;
// Table 58  Definition of TPMI_RH_NV_INDEX Type <  IN/OUT>
typedef TPM_HANDLE TPMI_RH_NV_INDEX;
// Table 59  Definition of TPMI_ALG_HASH Type
typedef TPM_ALG_ID TPMI_ALG_HASH;
// Table 60  Definition of TPMI_ALG_ASYM Type
typedef TPM_ALG_ID TPMI_ALG_ASYM;
// Table 61  Definition of TPMI_ALG_SYM Type
typedef TPM_ALG_ID TPMI_ALG_SYM;
// Table 62  Definition of TPMI_ALG_SYM_OBJECT Type
typedef TPM_ALG_ID TPMI_ALG_SYM_OBJECT;
// Table 63  Definition of TPMI_ALG_SYM_MODE Type
typedef TPM_ALG_ID TPMI_ALG_SYM_MODE;
// Table 64  Definition of TPMI_ALG_KDF Type
typedef TPM_ALG_ID TPMI_ALG_KDF;
// Table 65  Definition of TPMI_ALG_SIG_SCHEME Type
typedef TPM_ALG_ID TPMI_ALG_SIG_SCHEME;
// Table 66  Definition of TPMI_ECC_KEY_EXCHANGE Type
typedef TPM_ALG_ID TPMI_ECC_KEY_EXCHANGE;
// Table 67  Definition of TPMI_ST_COMMAND_TAG Type
typedef TPM_ST TPMI_ST_COMMAND_TAG;
// Table 68  Definition of TPMS_EMPTY Structure <  IN/OUT>
typedef struct {
} TPMS_EMPTY;

// Table 69  Definition of TPMS_ALGORITHM_DESCRIPTION Structure <  OUT>
typedef struct {
  TPM_ALG_ID      alg;
  TPMA_ALGORITHM  attributes;
} TPMS_ALGORITHM_DESCRIPTION;

// Table 70  Definition of TPMU_HA Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_SHA
  BYTE  sha[SHA_DIGEST_SIZE];
#endif
#ifdef TPM_ALG_SHA1
  BYTE  sha1[SHA1_DIGEST_SIZE];
#endif
#ifdef TPM_ALG_SHA256
  BYTE  sha256[SHA256_DIGEST_SIZE];
#endif
#ifdef TPM_ALG_SHA384
  BYTE  sha384[SHA384_DIGEST_SIZE];
#endif
#ifdef TPM_ALG_SHA512
  BYTE  sha512[SHA512_DIGEST_SIZE];
#endif
#ifdef TPM_ALG_SM3_256
  BYTE  sm3_256[SM3_256_DIGEST_SIZE];
#endif
} TPMU_HA;

// Table 71  Definition of TPMT_HA Structure <  IN/OUT>
typedef struct {
  TPMI_ALG_HASH  hashAlg;
  TPMU_HA        digest;
} TPMT_HA;

// Table 72  Definition of TPM2B_DIGEST Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[sizeof(TPMU_HA)];
  } t;
  TPM2B b;
} TPM2B_DIGEST;

// Table 73  Definition of TPM2B_DATA Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[sizeof(TPMT_HA)];
  } t;
  TPM2B b;
} TPM2B_DATA;

// Table 74  Definition of Types for TPM2B_NONCE
typedef TPM2B_DIGEST TPM2B_NONCE;

// Table 75  Definition of Types for TPM2B_AUTH
typedef TPM2B_DIGEST TPM2B_AUTH;

// Table 76  Definition of Types for TPM2B_OPERAND
typedef TPM2B_DIGEST TPM2B_OPERAND;

// Table 77  Definition of TPM2B_EVENT Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[1024];
  } t;
  TPM2B b;
} TPM2B_EVENT;

// Table 78  Definition of TPM2B_MAX_BUFFER Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_DIGEST_BUFFER];
  } t;
  TPM2B b;
} TPM2B_MAX_BUFFER;

// Table 79  Definition of TPM2B_MAX_NV_BUFFER Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_NV_BUFFER_SIZE];
  } t;
  TPM2B b;
} TPM2B_MAX_NV_BUFFER;

// Table 80  Definition of TPM2B_TIMEOUT Structure <  IN/OUT>
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[sizeof(UINT64)];
  } t;
  TPM2B b;
} TPM2B_TIMEOUT;

// Table 81  Definition of TPM2B_IV Structure <  IN/OUT>
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_SYM_BLOCK_SIZE];
  } t;
  TPM2B b;
} TPM2B_IV;

// Table 82  Definition of TPMU_NAME Union <>
typedef union {
  TPMT_HA     digest;
  TPM_HANDLE  handle;
} TPMU_NAME;

// Table 83  Definition of TPM2B_NAME Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    name[sizeof(TPMU_NAME)];
  } t;
  TPM2B b;
} TPM2B_NAME;

// Table 84  Definition of TPMS_PCR_SELECT Structure
typedef struct {
  UINT8  sizeofSelect;
  BYTE   pcrSelect[PCR_SELECT_MAX];
} TPMS_PCR_SELECT;

// Table 85  Definition of TPMS_PCR_SELECTION Structure
typedef struct {
  TPMI_ALG_HASH  hash;
  UINT8          sizeofSelect;
  BYTE           pcrSelect[PCR_SELECT_MAX];
} TPMS_PCR_SELECTION;

// Unprocessed: Table 86  Values for   proof   Used in Tickets
// Unprocessed: Table 87  General Format of a Ticket
// Table 88  Definition of TPMT_TK_CREATION Structure
typedef struct {
  TPM_ST             tag;
  TPMI_RH_HIERARCHY  hierarchy;
  TPM2B_DIGEST       digest;
} TPMT_TK_CREATION;

// Table 89  Definition of TPMT_TK_VERIFIED Structure
typedef struct {
  TPM_ST             tag;
  TPMI_RH_HIERARCHY  hierarchy;
  TPM2B_DIGEST       digest;
} TPMT_TK_VERIFIED;

// Table 90  Definition of TPMT_TK_AUTH Structure
typedef struct {
  TPM_ST             tag;
  TPMI_RH_HIERARCHY  hierarchy;
  TPM2B_DIGEST       digest;
} TPMT_TK_AUTH;

// Table 91  Definition of TPMT_TK_HASHCHECK Structure
typedef struct {
  TPM_ST             tag;
  TPMI_RH_HIERARCHY  hierarchy;
  TPM2B_DIGEST       digest;
} TPMT_TK_HASHCHECK;

// Table 92  Definition of TPMS_ALG_PROPERTY Structure <  OUT>
typedef struct {
  TPM_ALG_ID      alg;
  TPMA_ALGORITHM  algProperties;
} TPMS_ALG_PROPERTY;

// Table 93  Definition of TPMS_TAGGED_PROPERTY Structure <  OUT>
typedef struct {
  TPM_PT  property;
  UINT32  value;
} TPMS_TAGGED_PROPERTY;

// Table 94  Definition of TPMS_TAGGED_PCR_SELECT Structure <  OUT>
typedef struct {
  TPM_PT  tag;
  UINT8   sizeofSelect;
  BYTE    pcrSelect[PCR_SELECT_MAX];
} TPMS_TAGGED_PCR_SELECT;

// Table 95  Definition of TPML_CC Structure
typedef struct {
  UINT32  count;
  TPM_CC  commandCodes[MAX_CAP_CC];
} TPML_CC;

// Table 96  Definition of TPML_CCA Structure <  OUT>
typedef struct {
  UINT32   count;
  TPMA_CC  commandAttributes[MAX_CAP_CC];
} TPML_CCA;

// Table 97  Definition of TPML_ALG Structure
typedef struct {
  UINT32      count;
  TPM_ALG_ID  algorithms[MAX_ALG_LIST_SIZE];
} TPML_ALG;

// Table 98  Definition of TPML_HANDLE Structure <  OUT>
typedef struct {
  UINT32      count;
  TPM_HANDLE  handle[MAX_CAP_HANDLES];
} TPML_HANDLE;

// Table 99  Definition of TPML_DIGEST Structure
typedef struct {
  UINT32        count;
  TPM2B_DIGEST  digests[8];
} TPML_DIGEST;

// Table 100  Definition of TPML_DIGEST_VALUES Structure
typedef struct {
  UINT32   count;
  TPMT_HA  digests[HASH_COUNT];
} TPML_DIGEST_VALUES;

// Table 101  Definition of TPM2B_DIGEST_VALUES Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[sizeof(TPML_DIGEST_VALUES)];
  } t;
  TPM2B b;
} TPM2B_DIGEST_VALUES;

// Table 102  Definition of TPML_PCR_SELECTION Structure
typedef struct {
  UINT32              count;
  TPMS_PCR_SELECTION  pcrSelections[HASH_COUNT];
} TPML_PCR_SELECTION;

// Table 103  Definition of TPML_ALG_PROPERTY Structure <  OUT>
typedef struct {
  UINT32             count;
  TPMS_ALG_PROPERTY  algProperties[MAX_CAP_ALGS];
} TPML_ALG_PROPERTY;

// Table 104  Definition of TPML_TAGGED_TPM_PROPERTY Structure <  OUT>
typedef struct {
  UINT32                count;
  TPMS_TAGGED_PROPERTY  tpmProperty[MAX_TPM_PROPERTIES];
} TPML_TAGGED_TPM_PROPERTY;

// Table 105  Definition of TPML_TAGGED_PCR_PROPERTY Structure <  OUT>
typedef struct {
  UINT32                  count;
  TPMS_TAGGED_PCR_SELECT  pcrProperty[MAX_PCR_PROPERTIES];
} TPML_TAGGED_PCR_PROPERTY;

// Table 106  Definition of TPML_ECC_CURVE Structure <  OUT>
typedef struct {
  UINT32         count;
  TPM_ECC_CURVE  eccCurves[MAX_ECC_CURVES];
} TPML_ECC_CURVE;

// Table 107  Definition of TPMU_CAPABILITIES Union <  OUT>
typedef union {
  TPML_ALG_PROPERTY         algorithms;
  TPML_HANDLE               handles;
  TPML_CCA                  command;
  TPML_CC                   ppCommands;
  TPML_CC                   auditCommands;
  TPML_PCR_SELECTION        assignedPCR;
  TPML_TAGGED_TPM_PROPERTY  tpmProperties;
  TPML_TAGGED_PCR_PROPERTY  pcrProperties;
  TPML_ECC_CURVE            eccCurves;
} TPMU_CAPABILITIES;

// Table 108  Definition of TPMS_CAPABILITY_DATA Structure <  OUT>
typedef struct {
  TPM_CAP            capability;
  TPMU_CAPABILITIES  data;
} TPMS_CAPABILITY_DATA;

// Table 109  Definition of TPMS_CLOCK_INFO Structure
typedef struct {
  UINT64       clock;
  UINT32       resetCount;
  UINT32       restartCount;
  TPMI_YES_NO  safe;
} TPMS_CLOCK_INFO;

// Table 110  Definition of TPMS_TIME_INFO Structure
typedef struct {
  UINT64           time;
  TPMS_CLOCK_INFO  clockInfo;
} TPMS_TIME_INFO;

// Table 111  Definition of TPMS_TIME_ATTEST_INFO Structure <  OUT>
typedef struct {
  TPMS_TIME_INFO  time;
  UINT64          firmwareVersion;
} TPMS_TIME_ATTEST_INFO;

// Table 112  Definition of TPMS_CERTIFY_INFO Structure <  OUT>
typedef struct {
  TPM2B_NAME  name;
  TPM2B_NAME  qualifiedName;
} TPMS_CERTIFY_INFO;

// Table 113  Definition of TPMS_QUOTE_INFO Structure <  OUT>
typedef struct {
  TPML_PCR_SELECTION  pcrSelect;
  TPM2B_DIGEST        pcrDigest;
} TPMS_QUOTE_INFO;

// Table 114  Definition of TPMS_COMMAND_AUDIT_INFO Structure <  OUT>
typedef struct {
  UINT64        auditCounter;
  TPM_ALG_ID    digestAlg;
  TPM2B_DIGEST  auditDigest;
  TPM2B_DIGEST  commandDigest;
} TPMS_COMMAND_AUDIT_INFO;

// Table 115  Definition of TPMS_SESSION_AUDIT_INFO Structure <  OUT>
typedef struct {
  TPMI_YES_NO   exclusiveSession;
  TPM2B_DIGEST  sessionDigest;
} TPMS_SESSION_AUDIT_INFO;

// Table 116  Definition of TPMS_CREATION_INFO Structure <  OUT>
typedef struct {
  TPM2B_NAME    objectName;
  TPM2B_DIGEST  creationHash;
} TPMS_CREATION_INFO;

// Table 117  Definition of TPMS_NV_CERTIFY_INFO Structure <  OUT>
typedef struct {
  TPM2B_NAME           indexName;
  UINT16               offset;
  TPM2B_MAX_NV_BUFFER  nvContents;
} TPMS_NV_CERTIFY_INFO;

// Table 118  Definition of TPMI_ST_ATTEST Type <  OUT>
typedef TPM_ST TPMI_ST_ATTEST;
// Table 119  Definition of TPMU_ATTEST Union <  OUT>
typedef union {
  TPMS_CERTIFY_INFO        certify;
  TPMS_CREATION_INFO       creation;
  TPMS_QUOTE_INFO          quote;
  TPMS_COMMAND_AUDIT_INFO  commandAudit;
  TPMS_SESSION_AUDIT_INFO  sessionAudit;
  TPMS_TIME_ATTEST_INFO    time;
  TPMS_NV_CERTIFY_INFO     nv;
} TPMU_ATTEST;

// Table 120  Definition of TPMS_ATTEST Structure <  OUT>
typedef struct {
  TPM_GENERATED    magic;
  TPMI_ST_ATTEST   type;
  TPM2B_NAME       qualifiedSigner;
  TPM2B_DATA       extraData;
  TPMS_CLOCK_INFO  clockInfo;
  UINT64           firmwareVersion;
  TPMU_ATTEST      attested;
} TPMS_ATTEST;

// Table 121  Definition of TPM2B_ATTEST Structure <  OUT>
typedef union {
  struct {
    UINT16  size;
    BYTE    attestationData[sizeof(TPMS_ATTEST)];
  } t;
  TPM2B b;
} TPM2B_ATTEST;

// Table 122  Definition of TPMS_AUTH_COMMAND Structure <  IN>
typedef struct {
  TPMI_SH_AUTH_SESSION  sessionHandle;
  TPM2B_NONCE           nonce;
  TPMA_SESSION          sessionAttributes;
  TPM2B_AUTH            hmac;
} TPMS_AUTH_COMMAND;

// Table 123  Definition of TPMS_AUTH_RESPONSE Structure <  OUT>
typedef struct {
  TPM2B_NONCE   nonce;
  TPMA_SESSION  sessionAttributes;
  TPM2B_AUTH    hmac;
} TPMS_AUTH_RESPONSE;

// Table 124  Definition of   TPMI_!ALG.S_KEY_BITS Type
typedef TPM_KEY_BITS TPMI_AES_KEY_BITS;
typedef TPM_KEY_BITS TPMI_SM4_KEY_BITS;
typedef TPM_KEY_BITS TPMI_CAMELLIA_KEY_BITS;


// Table 125  Definition of TPMU_SYM_KEY_BITS Union
typedef union {
#ifdef TPM_ALG_AES
  TPMI_AES_KEY_BITS       aes;
#endif
#ifdef TPM_ALG_SM4
  TPMI_SM4_KEY_BITS       sm4;
#endif
#ifdef TPM_ALG_CAMELLIA
  TPMI_CAMELLIA_KEY_BITS  camellia;
#endif
  TPM_KEY_BITS            sym;
#ifdef TPM_ALG_XOR
  TPMI_ALG_HASH           xor_;
#endif
} TPMU_SYM_KEY_BITS;

// Table 126  Definition of TPMU_SYM_MODE Union
typedef union {
#ifdef TPM_ALG_AES
  TPMI_ALG_SYM_MODE  aes;
#endif
#ifdef TPM_ALG_SM4
  TPMI_ALG_SYM_MODE  sm4;
#endif
#ifdef TPM_ALG_CAMELLIA
  TPMI_ALG_SYM_MODE  camellia;
#endif
  TPMI_ALG_SYM_MODE  sym;
} TPMU_SYM_MODE;

// Table 127 xDefinition of TPMU_SYM_DETAILS Union
typedef union {
} TPMU_SYM_DETAILS;

// Table 128  Definition of TPMT_SYM_DEF Structure
typedef struct {
  TPMI_ALG_SYM       algorithm;
  TPMU_SYM_KEY_BITS  keyBits;
  TPMU_SYM_MODE      mode;
} TPMT_SYM_DEF;

// Table 129  Definition of TPMT_SYM_DEF_OBJECT Structure
typedef struct {
  TPMI_ALG_SYM_OBJECT  algorithm;
  TPMU_SYM_KEY_BITS    keyBits;
  TPMU_SYM_MODE        mode;
} TPMT_SYM_DEF_OBJECT;

// Table 130  Definition of TPM2B_SYM_KEY Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_SYM_KEY_BYTES];
  } t;
  TPM2B b;
} TPM2B_SYM_KEY;

// Table 131  Definition of TPMS_SYMCIPHER_PARMS Structure
typedef struct {
  TPMT_SYM_DEF_OBJECT  sym;
} TPMS_SYMCIPHER_PARMS;

// Table 132  Definition of TPM2B_SENSITIVE_DATA Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_SYM_DATA];
  } t;
  TPM2B b;
} TPM2B_SENSITIVE_DATA;

// Table 133  Definition of TPMS_SENSITIVE_CREATE Structure <  IN>
typedef struct {
  TPM2B_AUTH            userAuth;
  TPM2B_SENSITIVE_DATA  data;
} TPMS_SENSITIVE_CREATE;

// Table 134  Definition of TPM2B_SENSITIVE_CREATE Structure <  IN, S>
typedef union {
  struct {
    UINT16                 size;
    TPMS_SENSITIVE_CREATE  sensitive;
  } t;
  TPM2B b;
} TPM2B_SENSITIVE_CREATE;

// Table 135  Definition of TPMS_SCHEME_HASH Structure
typedef struct {
  TPMI_ALG_HASH  hashAlg;
} TPMS_SCHEME_HASH;

// Table 136  Definition of TPMS_SCHEME_ECDAA Structure
typedef struct {
  TPMI_ALG_HASH  hashAlg;
  UINT16         count;
} TPMS_SCHEME_ECDAA;

// Table 137  Definition of TPMI_ALG_KEYEDHASH_SCHEME Type
typedef TPM_ALG_ID TPMI_ALG_KEYEDHASH_SCHEME;
// Table 138  Definition of Types for HMAC_SIG_SCHEME
typedef TPMS_SCHEME_HASH TPMS_SCHEME_HMAC;

// Table 139  Definition of TPMS_SCHEME_XOR Structure
typedef struct {
  TPMI_ALG_HASH  hashAlg;
  TPMI_ALG_KDF   kdf;
} TPMS_SCHEME_XOR;

// Table 140  Definition of TPMU_SCHEME_KEYEDHASH Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_HMAC
  TPMS_SCHEME_HMAC  hmac;
#endif
#ifdef TPM_ALG_XOR
  TPMS_SCHEME_XOR   xor_;
#endif
} TPMU_SCHEME_KEYEDHASH;

// Table 141  Definition of TPMT_KEYEDHASH_SCHEME Structure
typedef struct {
  TPMI_ALG_KEYEDHASH_SCHEME  scheme;
  TPMU_SCHEME_KEYEDHASH      details;
} TPMT_KEYEDHASH_SCHEME;

// Table 142  Definition of Types for RSA Signature Schemes
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSASSA;
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSAPSS;

// Table 143  Definition of Types for ECC Signature Schemes
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECDSA;
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_SM2;
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECSCHNORR;
typedef TPMS_SCHEME_ECDAA TPMS_SIG_SCHEME_ECDAA;

// Table 144  Definition of TPMU_SIG_SCHEME Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_RSASSA
  TPMS_SIG_SCHEME_RSASSA     rsassa;
#endif
#ifdef TPM_ALG_RSAPSS
  TPMS_SIG_SCHEME_RSAPSS     rsapss;
#endif
#ifdef TPM_ALG_ECDSA
  TPMS_SIG_SCHEME_ECDSA      ecdsa;
#endif
#ifdef TPM_ALG_ECDAA
  TPMS_SIG_SCHEME_ECDAA      ecdaa;
#endif
#ifdef TPM_ALG_SM2
  TPMS_SIG_SCHEME_SM2        sm2;
#endif
#ifdef TPM_ALG_ECSCHNORR
  TPMS_SIG_SCHEME_ECSCHNORR  ecschnorr;
#endif
#ifdef TPM_ALG_HMAC
  TPMS_SCHEME_HMAC           hmac;
#endif
  TPMS_SCHEME_HASH           any;
} TPMU_SIG_SCHEME;

// Table 145  Definition of TPMT_SIG_SCHEME Structure
typedef struct {
  TPMI_ALG_SIG_SCHEME  scheme;
  TPMU_SIG_SCHEME      details;
} TPMT_SIG_SCHEME;

// Table 146  Definition of Types for Encryption Schemes
typedef TPMS_SCHEME_HASH TPMS_ENC_SCHEME_OAEP;
typedef TPMS_EMPTY TPMS_ENC_SCHEME_RSAES;

// Table 147  Definition of Types for ECC Key Exchange
typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECDH;
typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECMQV;

// Table 148  Definition of Types for KDF Schemes
typedef TPMS_SCHEME_HASH TPMS_SCHEME_MGF1;
typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF1_SP800_56A;
typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF2;
typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF1_SP800_108;

// Table 149  Definition of TPMU_KDF_SCHEME Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_MGF1
  TPMS_SCHEME_MGF1            mgf1;
#endif
#ifdef TPM_ALG_KDF1_SP800_56A
  TPMS_SCHEME_KDF1_SP800_56A  kdf1_sp800_56a;
#endif
#ifdef TPM_ALG_KDF2
  TPMS_SCHEME_KDF2            kdf2;
#endif
#ifdef TPM_ALG_KDF1_SP800_108
  TPMS_SCHEME_KDF1_SP800_108  kdf1_sp800_108;
#endif
} TPMU_KDF_SCHEME;

// Table 150  Definition of TPMT_KDF_SCHEME Structure
typedef struct {
  TPMI_ALG_KDF     scheme;
  TPMU_KDF_SCHEME  details;
} TPMT_KDF_SCHEME;

// Table 151  Definition of TPMI_ALG_ASYM_SCHEME Type <>
typedef TPM_ALG_ID TPMI_ALG_ASYM_SCHEME;
// Table 152  Definition of TPMU_ASYM_SCHEME Union
typedef union {
#ifdef TPM_ALG_ECDH
  TPMS_KEY_SCHEME_ECDH       ecdh;
#endif
#ifdef TPM_ALG_ECMQV
  TPMS_KEY_SCHEME_ECMQV      ecmqv;
#endif
#ifdef TPM_ALG_RSASSA
  TPMS_SIG_SCHEME_RSASSA     rsassa;
#endif
#ifdef TPM_ALG_RSAPSS
  TPMS_SIG_SCHEME_RSAPSS     rsapss;
#endif
#ifdef TPM_ALG_ECDSA
  TPMS_SIG_SCHEME_ECDSA      ecdsa;
#endif
#ifdef TPM_ALG_ECDAA
  TPMS_SIG_SCHEME_ECDAA      ecdaa;
#endif
#ifdef TPM_ALG_SM2
  TPMS_SIG_SCHEME_SM2        sm2;
#endif
#ifdef TPM_ALG_ECSCHNORR
  TPMS_SIG_SCHEME_ECSCHNORR  ecschnorr;
#endif
#ifdef TPM_ALG_RSAES
  TPMS_ENC_SCHEME_RSAES      rsaes;
#endif
#ifdef TPM_ALG_OAEP
  TPMS_ENC_SCHEME_OAEP       oaep;
#endif
  TPMS_SCHEME_HASH           anySig;
} TPMU_ASYM_SCHEME;

// Table 153  Definition of TPMT_ASYM_SCHEME Structure <>
typedef struct {
  TPMI_ALG_ASYM_SCHEME  scheme;
  TPMU_ASYM_SCHEME      details;
} TPMT_ASYM_SCHEME;

// Table 154  Definition of TPMI_ALG_RSA_SCHEME Type
typedef TPM_ALG_ID TPMI_ALG_RSA_SCHEME;
// Table 155  Definition of TPMT_RSA_SCHEME Structure
typedef struct {
  TPMI_ALG_RSA_SCHEME  scheme;
  TPMU_ASYM_SCHEME     details;
} TPMT_RSA_SCHEME;

// Table 156  Definition of TPMI_ALG_RSA_DECRYPT Type
typedef TPM_ALG_ID TPMI_ALG_RSA_DECRYPT;
// Table 157  Definition of TPMT_RSA_DECRYPT Structure
typedef struct {
  TPMI_ALG_RSA_DECRYPT  scheme;
  TPMU_ASYM_SCHEME      details;
} TPMT_RSA_DECRYPT;

// Table 158  Definition of TPM2B_PUBLIC_KEY_RSA Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_RSA_KEY_BYTES];
  } t;
  TPM2B b;
} TPM2B_PUBLIC_KEY_RSA;

// Table 159  Definition of TPMI_RSA_KEY_BITS Type
typedef TPM_KEY_BITS TPMI_RSA_KEY_BITS;
// Table 160  Definition of TPM2B_PRIVATE_KEY_RSA Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_RSA_KEY_BYTES/2];
  } t;
  TPM2B b;
} TPM2B_PRIVATE_KEY_RSA;

// Table 161  Definition of TPM2B_ECC_PARAMETER Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_ECC_KEY_BYTES];
  } t;
  TPM2B b;
} TPM2B_ECC_PARAMETER;

// Table 162  Definition of TPMS_ECC_POINT Structure
// TODO(ngm): To be fixed in the generator, crbug.com/49770.
typedef struct {
  UINT16 unused_pad1;
  TPM2B_ECC_PARAMETER  x;
  UINT16 unused_pad2;
  TPM2B_ECC_PARAMETER  y;
} TPMS_ECC_POINT __attribute__ ((aligned (4)));

// Table   163    Definition of TPM2B_ECC_POINT Structure
typedef union {
  struct {
    UINT16          size;
    TPMS_ECC_POINT  point;
  } t;
  TPM2B b;
} TPM2B_ECC_POINT;

// Table 164  Definition of TPMI_ALG_ECC_SCHEME Type
typedef TPM_ALG_ID TPMI_ALG_ECC_SCHEME;
// Table 165  Definition of TPMI_ECC_CURVE Type
typedef TPM_ECC_CURVE TPMI_ECC_CURVE;
// Table 166  Definition of TPMT_ECC_SCHEME Structure
typedef struct {
  TPMI_ALG_ECC_SCHEME  scheme;
  TPMU_ASYM_SCHEME     details;
} TPMT_ECC_SCHEME;

// Table 167  Definition of TPMS_ALGORITHM_DETAIL_ECC Structure <  OUT>
typedef struct {
  TPM_ECC_CURVE        curveID;
  UINT16               keySize;
  TPMT_KDF_SCHEME      kdf;
  TPMT_ECC_SCHEME      sign;
  TPM2B_ECC_PARAMETER  p;
  TPM2B_ECC_PARAMETER  a;
  TPM2B_ECC_PARAMETER  b;
  TPM2B_ECC_PARAMETER  gX;
  TPM2B_ECC_PARAMETER  gY;
  TPM2B_ECC_PARAMETER  n;
  TPM2B_ECC_PARAMETER  h;
} TPMS_ALGORITHM_DETAIL_ECC;

// Table 168  Definition of TPMS_SIGNATURE_RSA Structure
typedef struct {
  TPMI_ALG_HASH         hash;
  TPM2B_PUBLIC_KEY_RSA  sig;
} TPMS_SIGNATURE_RSA;

// Table 169  Definition of Types for Signature
typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSASSA;
typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSAPSS;

// Table 170  Definition of TPMS_SIGNATURE_ECC Structure
typedef struct {
  TPMI_ALG_HASH        hash;
  TPM2B_ECC_PARAMETER  signatureR;
  TPM2B_ECC_PARAMETER  signatureS;
} TPMS_SIGNATURE_ECC;

// Table 171  Definition of Types for TPMS_SIGNATUE_ECC
typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDSA;
typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDAA;
typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_SM2;
typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECSCHNORR;

// Table 172  Definition of TPMU_SIGNATURE Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_RSASSA
  TPMS_SIGNATURE_RSASSA     rsassa;
#endif
#ifdef TPM_ALG_RSAPSS
  TPMS_SIGNATURE_RSAPSS     rsapss;
#endif
#ifdef TPM_ALG_ECDSA
  TPMS_SIGNATURE_ECDSA      ecdsa;
#endif
#ifdef TPM_ALG_ECDAA
  TPMS_SIGNATURE_ECDAA      ecdaa;
#endif
#ifdef TPM_ALG_SM2
  TPMS_SIGNATURE_SM2        sm2;
#endif
#ifdef TPM_ALG_ECSCHNORR
  TPMS_SIGNATURE_ECSCHNORR  ecschnorr;
#endif
#ifdef TPM_ALG_HMAC
  TPMT_HA                   hmac;
#endif
  TPMS_SCHEME_HASH          any;
} TPMU_SIGNATURE;

// Table 173  Definition of TPMT_SIGNATURE Structure
typedef struct {
  TPMI_ALG_SIG_SCHEME  sigAlg;
  TPMU_SIGNATURE       signature;
} TPMT_SIGNATURE;

// Table 174  Definition of TPMU_ENCRYPTED_SECRET Union <  S>
typedef union {
#ifdef TPM_ALG_ECC
  BYTE  ecc[sizeof(TPMS_ECC_POINT)];
#endif
#ifdef TPM_ALG_RSA
  BYTE  rsa[MAX_RSA_KEY_BYTES];
#endif
#ifdef TPM_ALG_SYMCIPHER
  BYTE  symmetric[sizeof(TPM2B_DIGEST)];
#endif
#ifdef TPM_ALG_KEYEDHASH
  BYTE  keyedHash[sizeof(TPM2B_DIGEST)];
#endif
} TPMU_ENCRYPTED_SECRET;

// Table 175  Definition of TPM2B_ENCRYPTED_SECRET Structure
typedef union {
  struct {
    UINT16  size;
    BYTE    secret[sizeof(TPMU_ENCRYPTED_SECRET)];
  } t;
  TPM2B b;
} TPM2B_ENCRYPTED_SECRET;

// Table 176  Definition of TPMI_ALG_PUBLIC Type
typedef TPM_ALG_ID TPMI_ALG_PUBLIC;
// Table 177  Definition of TPMU_PUBLIC_ID Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_KEYEDHASH
  TPM2B_DIGEST          keyedHash;
#endif
#ifdef TPM_ALG_SYMCIPHER
  TPM2B_DIGEST          sym;
#endif
#ifdef TPM_ALG_RSA
  TPM2B_PUBLIC_KEY_RSA  rsa;
#endif
#ifdef TPM_ALG_ECC
  TPMS_ECC_POINT        ecc;
#endif
} TPMU_PUBLIC_ID;

// Table 178  Definition of TPMS_KEYEDHASH_PARMS Structure
typedef struct {
  TPMT_KEYEDHASH_SCHEME  scheme;
} TPMS_KEYEDHASH_PARMS;

// Table 179  Definition of TPMS_ASYM_PARMS Structure <>
typedef struct {
  TPMT_SYM_DEF_OBJECT  symmetric;
  TPMT_ASYM_SCHEME     scheme;
} TPMS_ASYM_PARMS;

// Table 180  Definition of TPMS_RSA_PARMS Structure
typedef struct {
  TPMT_SYM_DEF_OBJECT  symmetric;
  TPMT_RSA_SCHEME      scheme;
  TPMI_RSA_KEY_BITS    keyBits;
  UINT32               exponent;
} TPMS_RSA_PARMS;

// Table 181  Definition of TPMS_ECC_PARMS Structure
typedef struct {
  TPMT_SYM_DEF_OBJECT  symmetric;
  TPMT_ECC_SCHEME      scheme;
  TPMI_ECC_CURVE       curveID;
  TPMT_KDF_SCHEME      kdf;
} TPMS_ECC_PARMS;

// Table 182  Definition of TPMU_PUBLIC_PARMS Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_KEYEDHASH
  TPMS_KEYEDHASH_PARMS  keyedHashDetail;
#endif
#ifdef TPM_ALG_SYMCIPHER
  TPMS_SYMCIPHER_PARMS  symDetail;
#endif
#ifdef TPM_ALG_RSA
  TPMS_RSA_PARMS        rsaDetail;
#endif
#ifdef TPM_ALG_ECC
  TPMS_ECC_PARMS        eccDetail;
#endif
  TPMS_ASYM_PARMS       asymDetail;
} TPMU_PUBLIC_PARMS;

// Table 183  Definition of TPMT_PUBLIC_PARMS Structure
typedef struct {
  TPMI_ALG_PUBLIC    type;
  TPMU_PUBLIC_PARMS  parameters;
} TPMT_PUBLIC_PARMS;

// Table 184  Definition of TPMT_PUBLIC Structure
typedef struct {
  TPMI_ALG_PUBLIC    type;
  TPMI_ALG_HASH      nameAlg;
  TPMA_OBJECT        objectAttributes;
  TPM2B_DIGEST       authPolicy;
  TPMU_PUBLIC_PARMS  parameters;
  TPMU_PUBLIC_ID     unique;
} TPMT_PUBLIC;

// Table 185  Definition of TPM2B_PUBLIC Structure
typedef union {
  struct {
    UINT16       size;
    TPMT_PUBLIC  publicArea;
  } t;
  TPM2B b;
} TPM2B_PUBLIC;

// Table 186  Definition of TPM2B_PRIVATE_VENDOR_SPECIFIC Structure<>
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[PRIVATE_VENDOR_SPECIFIC_BYTES];
  } t;
  TPM2B b;
} TPM2B_PRIVATE_VENDOR_SPECIFIC;

// Table 187  Definition of TPMU_SENSITIVE_COMPOSITE Union <  IN/OUT, S>
typedef union {
#ifdef TPM_ALG_RSA
  TPM2B_PRIVATE_KEY_RSA          rsa;
#endif
#ifdef TPM_ALG_ECC
  TPM2B_ECC_PARAMETER            ecc;
#endif
#ifdef TPM_ALG_KEYEDHASH
  TPM2B_SENSITIVE_DATA           bits;
#endif
#ifdef TPM_ALG_SYMCIPHER
  TPM2B_SYM_KEY                  sym;
#endif
  TPM2B_PRIVATE_VENDOR_SPECIFIC  any;
} TPMU_SENSITIVE_COMPOSITE;

// Table 188  Definition of TPMT_SENSITIVE Structure
typedef struct {
  TPMI_ALG_PUBLIC           sensitiveType;
  TPM2B_AUTH                authValue;
  TPM2B_DIGEST              seedValue;
  TPMU_SENSITIVE_COMPOSITE  sensitive;
} TPMT_SENSITIVE;

// Table 189  Definition of TPM2B_SENSITIVE Structure <  IN/OUT>
typedef union {
  struct {
    UINT16          size;
    TPMT_SENSITIVE  sensitiveArea;
  } t;
  TPM2B b;
} TPM2B_SENSITIVE;

// Table 190  Definition of _PRIVATE Structure <>
typedef struct {
  TPM2B_DIGEST    integrityOuter;
  TPM2B_DIGEST    integrityInner;
  TPMT_SENSITIVE  sensitive;
} _PRIVATE;

// Table 191  Definition of TPM2B_PRIVATE Structure <  IN/OUT, S>
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[sizeof(_PRIVATE)];
  } t;
  TPM2B b;
} TPM2B_PRIVATE;

// Table 192  Definition of _ID_OBJECT Structure <>
typedef struct {
  TPM2B_DIGEST  integrityHMAC;
  TPM2B_DIGEST  encIdentity;
} _ID_OBJECT;

// Table 193  Definition of TPM2B_ID_OBJECT Structure <  IN/OUT>
typedef union {
  struct {
    UINT16  size;
    BYTE    credential[sizeof(_ID_OBJECT)];
  } t;
  TPM2B b;
} TPM2B_ID_OBJECT;

// Table 194  Definition of TPM_NV_INDEX Bits <>
typedef struct {
  UINT32 index : 24;
  UINT32 RH_NV : 8;
} TPM_NV_INDEX;

// Table 195  Definition of TPMA_NV Bits
typedef struct {
  UINT32 TPMA_NV_PPWRITE        : 1;
  UINT32 TPMA_NV_OWNERWRITE     : 1;
  UINT32 TPMA_NV_AUTHWRITE      : 1;
  UINT32 TPMA_NV_POLICYWRITE    : 1;
  UINT32 TPMA_NV_COUNTER        : 1;
  UINT32 TPMA_NV_BITS           : 1;
  UINT32 TPMA_NV_EXTEND         : 1;
  UINT32 reserved7_9            : 3;
  UINT32 TPMA_NV_POLICY_DELETE  : 1;
  UINT32 TPMA_NV_WRITELOCKED    : 1;
  UINT32 TPMA_NV_WRITEALL       : 1;
  UINT32 TPMA_NV_WRITEDEFINE    : 1;
  UINT32 TPMA_NV_WRITE_STCLEAR  : 1;
  UINT32 TPMA_NV_GLOBALLOCK     : 1;
  UINT32 TPMA_NV_PPREAD         : 1;
  UINT32 TPMA_NV_OWNERREAD      : 1;
  UINT32 TPMA_NV_AUTHREAD       : 1;
  UINT32 TPMA_NV_POLICYREAD     : 1;
  UINT32 reserved20_24          : 5;
  UINT32 TPMA_NV_NO_DA          : 1;
  UINT32 TPMA_NV_ORDERLY        : 1;
  UINT32 TPMA_NV_CLEAR_STCLEAR  : 1;
  UINT32 TPMA_NV_READLOCKED     : 1;
  UINT32 TPMA_NV_WRITTEN        : 1;
  UINT32 TPMA_NV_PLATFORMCREATE : 1;
  UINT32 TPMA_NV_READ_STCLEAR   : 1;
} TPMA_NV;

// Table 196  Definition of TPMS_NV_PUBLIC Structure
typedef struct {
  TPMI_RH_NV_INDEX  nvIndex;
  TPMI_ALG_HASH     nameAlg;
  TPMA_NV           attributes;
  TPM2B_DIGEST      authPolicy;
  UINT16            dataSize;
} TPMS_NV_PUBLIC;

// Table 197  Definition of TPM2B_NV_PUBLIC Structure
typedef union {
  struct {
    UINT16          size;
    TPMS_NV_PUBLIC  nvPublic;
  } t;
  TPM2B b;
} TPM2B_NV_PUBLIC;

// Table 198  Definition of TPM2B_CONTEXT_SENSITIVE Structure <  IN/OUT>
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[MAX_CONTEXT_SIZE];
  } t;
  TPM2B b;
} TPM2B_CONTEXT_SENSITIVE;

// Table 199  Definition of TPMS_CONTEXT_DATA Structure <  IN/OUT, S>
typedef struct {
  TPM2B_DIGEST             integrity;
  TPM2B_CONTEXT_SENSITIVE  encrypted;
} TPMS_CONTEXT_DATA;

// Table 200  Definition of TPM2B_CONTEXT_DATA Structure <  IN/OUT>
typedef union {
  struct {
    UINT16  size;
    BYTE    buffer[sizeof(TPMS_CONTEXT_DATA)];
  } t;
  TPM2B b;
} TPM2B_CONTEXT_DATA;

// Table 201  Definition of TPMS_CONTEXT Structure
typedef struct {
  UINT64              sequence;
  TPMI_DH_CONTEXT     savedHandle;
  TPMI_RH_HIERARCHY   hierarchy;
  TPM2B_CONTEXT_DATA  contextBlob;
} TPMS_CONTEXT;

// Unprocessed: Table 202  Context Handle Values
// Table 203  Definition of TPMS_CREATION_DATA Structure <  OUT>
typedef struct {
  TPML_PCR_SELECTION  pcrSelect;
  TPM2B_DIGEST        pcrDigest;
  TPMA_LOCALITY       locality;
  TPM_ALG_ID          parentNameAlg;
  TPM2B_NAME          parentName;
  TPM2B_NAME          parentQualifiedName;
  TPM2B_DATA          outsideInfo;
} TPMS_CREATION_DATA;

// Table 204  Definition of TPM2B_CREATION_DATA Structure <  OUT>
typedef union {
  struct {
    UINT16              size;
    TPMS_CREATION_DATA  creationData;
  } t;
  TPM2B b;
} TPM2B_CREATION_DATA;


#endif  // TPM2_TPM_TYPES_H_