File: tss2_structs.h

package info (click to toggle)
grub2 2.14~git20250718.0e36779-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 60,688 kB
  • sloc: ansic: 541,811; asm: 68,074; sh: 9,803; cpp: 2,095; makefile: 1,895; python: 1,518; sed: 446; lex: 393; yacc: 268; awk: 85; lisp: 54; perl: 31
file content (833 lines) | stat: -rw-r--r-- 20,704 bytes parent folder | download
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
/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2022 Microsoft Corporation
 *  Copyright (C) 2024 Free Software Foundation, Inc.
 *
 *  GRUB is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_TPM2_INTERNAL_STRUCTS_HEADER
#define GRUB_TPM2_INTERNAL_STRUCTS_HEADER 1

#include <tss2_types.h>

/*
 * TPM response header
 *   This struct is used to calculate the minimum size of the TPM 2.0 response.
 *   The format of the response:
 *
 *   +----------------------+
 *   | UINT16 tag           |
 *   +----------------------+
 *   | UINT32 repsonse_size |
 *   +----------------------+
 *   | UINT32 response_code |
 *   +======================+
 *   | response_data        | (optional)
 *   +======================+
 */
struct __attribute__ ((__packed__)) TPM_RESPONSE_HEADER
{
  grub_uint16_t tag;
  grub_uint32_t response_size;
  TPM_RC_t response_code;
};
typedef struct TPM_RESPONSE_HEADER TPM_RESPONSE_HEADER_t;

/* TPMS_TAGGED_PROPERTY Structure */
struct TPMS_TAGGED_PROPERTY
{
  TPM_PT_t property;
  grub_uint32_t value;
};
typedef struct TPMS_TAGGED_PROPERTY TPMS_TAGGED_PROPERTY_t;

/* TPML_TAGGED_TPM_PROPERTY Structure */
struct TPML_TAGGED_TPM_PROPERTY
{
  grub_uint32_t count;
  TPMS_TAGGED_PROPERTY_t tpmProperty[TPM_MAX_TPM_PROPERTIES];
};
typedef struct TPML_TAGGED_TPM_PROPERTY TPML_TAGGED_TPM_PROPERTY_t;

/* TPMU_CAPABILITIES Structure */
union TPMU_CAPABILITIES
{
  TPML_TAGGED_TPM_PROPERTY_t tpmProperties;
};
typedef union TPMU_CAPABILITIES TPMU_CAPABILITIES_t;

/* TPMS_CAPABILITY_DATA Structure */
struct TPMS_CAPABILITY_DATA
{
  TPM_CAP_t capability;
  TPMU_CAPABILITIES_t data;
};
typedef struct TPMS_CAPABILITY_DATA TPMS_CAPABILITY_DATA_t;

/* TPMS_PCR_SELECT Structure */
struct TPMS_PCR_SELECT
{
  grub_uint8_t sizeOfSelect;
  grub_uint8_t pcrSelect[TPM_PCR_SELECT_MAX];
};
typedef struct TPMS_PCR_SELECT TPMS_PCR_SELECT_t;

/* TPMS_PCR_SELECTION Structure */
struct TPMS_PCR_SELECTION
{
  TPMI_ALG_HASH_t hash;
  grub_uint8_t sizeOfSelect;
  grub_uint8_t pcrSelect[TPM_PCR_SELECT_MAX];
};
typedef struct TPMS_PCR_SELECTION TPMS_PCR_SELECTION_t;

static inline void TPMS_PCR_SELECTION_SelectPCR(TPMS_PCR_SELECTION_t *self, grub_uint32_t n)
{
  self->pcrSelect[(n / 8)] |= (1 << (n % 8));
}

/* TPML_PCR_SELECTION Structure */
struct TPML_PCR_SELECTION
{
  grub_uint32_t count;
  TPMS_PCR_SELECTION_t pcrSelections[TPM_NUM_PCR_BANKS];
};
typedef struct TPML_PCR_SELECTION TPML_PCR_SELECTION_t;

/* TPMU_HA Structure */
union TPMU_HA
{
  grub_uint8_t sha1[TPM_SHA1_DIGEST_SIZE];
  grub_uint8_t sha256[TPM_SHA256_DIGEST_SIZE];
  grub_uint8_t sha384[TPM_SHA384_DIGEST_SIZE];
  grub_uint8_t sha512[TPM_SHA512_DIGEST_SIZE];
  grub_uint8_t sm3_256[TPM_SM3_256_DIGEST_SIZE];
};
typedef union TPMU_HA TPMU_HA_t;

/* TPM2B Structure */
struct TPM2B
{
  grub_uint16_t size;
  grub_uint8_t buffer[1];
};
typedef struct TPM2B TPM2B_t;

/* TPM2B_DIGEST Structure */
struct TPM2B_DIGEST
{
  grub_uint16_t size;
  grub_uint8_t buffer[sizeof(TPMU_HA_t)];
};
typedef struct TPM2B_DIGEST TPM2B_DIGEST_t;

/* TPML_DIGEST Structure */
struct TPML_DIGEST
{
  grub_uint32_t count;
  TPM2B_DIGEST_t digests[8];
};
typedef struct TPML_DIGEST TPML_DIGEST_t;

/* TPM2B_NONCE Type */
typedef TPM2B_DIGEST_t TPM2B_NONCE_t;

/* TPMA_SESSION Structure */
struct TPMA_SESSION
{
#ifdef GRUB_TARGET_WORDS_BIGENDIAN
  grub_uint8_t audit:1;
  grub_uint8_t encrypt:1;
  grub_uint8_t decrypt:1;
  grub_uint8_t reserved:2;
  grub_uint8_t auditReset:1;
  grub_uint8_t auditExclusive:1;
  grub_uint8_t continueSession:1;
#else
  grub_uint8_t continueSession:1;
  grub_uint8_t auditExclusive:1;
  grub_uint8_t auditReset:1;
  grub_uint8_t reserved:2;
  grub_uint8_t decrypt:1;
  grub_uint8_t encrypt:1;
  grub_uint8_t audit:1;
#endif
};
typedef struct TPMA_SESSION TPMA_SESSION_t;

/* TPM2B_AUTH Type */
typedef TPM2B_DIGEST_t TPM2B_AUTH_t;

/* TPMS_AUTH_COMMAND Structure */
struct TPMS_AUTH_COMMAND
{
  TPMI_SH_AUTH_SESSION_t sessionHandle;
  TPM2B_NONCE_t nonce;
  TPMA_SESSION_t sessionAttributes;
  TPM2B_AUTH_t hmac;
};
typedef struct TPMS_AUTH_COMMAND TPMS_AUTH_COMMAND_t;

/* TPMS_AUTH_RESPONSE Structure */
struct TPMS_AUTH_RESPONSE
{
  TPM2B_NONCE_t nonce;
  TPMA_SESSION_t sessionAttributes;
  TPM2B_AUTH_t hmac;
};
typedef struct TPMS_AUTH_RESPONSE TPMS_AUTH_RESPONSE_t;

/* TPM2B_SENSITIVE_DATA Structure */
struct TPM2B_SENSITIVE_DATA
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_SYM_DATA];
};
typedef struct TPM2B_SENSITIVE_DATA TPM2B_SENSITIVE_DATA_t;

/* TPMS_SENSITIVE_CREATE Structure */
struct TPMS_SENSITIVE_CREATE
{
  TPM2B_AUTH_t userAuth;
  TPM2B_SENSITIVE_DATA_t data;
};
typedef struct TPMS_SENSITIVE_CREATE TPMS_SENSITIVE_CREATE_t;

/* TPM2B_SENSITIVE_CREATE Structure */
struct TPM2B_SENSITIVE_CREATE
{
  grub_uint16_t size;
  TPMS_SENSITIVE_CREATE_t sensitive;
};
typedef struct TPM2B_SENSITIVE_CREATE TPM2B_SENSITIVE_CREATE_t;

/* TPMA_OBJECT Structure */
struct TPMA_OBJECT
{
#ifdef GRUB_TARGET_WORDS_BIGENDIAN
  grub_uint32_t reserved5:13;
  grub_uint32_t sign:1;
  grub_uint32_t decrypt:1;
  grub_uint32_t restricted:1;
  grub_uint32_t reserved4:4;
  grub_uint32_t encryptedDuplication:1;
  grub_uint32_t noDA:1;
  grub_uint32_t reserved3:2;
  grub_uint32_t adminWithPolicy:1;
  grub_uint32_t userWithAuth:1;
  grub_uint32_t sensitiveDataOrigin:1;
  grub_uint32_t fixedParent:1;
  grub_uint32_t reserved2:1;
  grub_uint32_t stClear:1;
  grub_uint32_t fixedTPM:1;
  grub_uint32_t reserved1:1;
#else
  grub_uint32_t reserved1:1;
  grub_uint32_t fixedTPM:1;
  grub_uint32_t stClear:1;
  grub_uint32_t reserved2:1;
  grub_uint32_t fixedParent:1;
  grub_uint32_t sensitiveDataOrigin:1;
  grub_uint32_t userWithAuth:1;
  grub_uint32_t adminWithPolicy:1;
  grub_uint32_t reserved3:2;
  grub_uint32_t noDA:1;
  grub_uint32_t encryptedDuplication:1;
  grub_uint32_t reserved4:4;
  grub_uint32_t restricted:1;
  grub_uint32_t decrypt:1;
  grub_uint32_t sign:1;
  grub_uint32_t reserved5:13;
#endif
};
typedef struct TPMA_OBJECT TPMA_OBJECT_t;

/* TPMS_SCHEME_HASH Structure */
struct TPMS_SCHEME_HASH
{
  TPMI_ALG_HASH_t hashAlg;
};
typedef struct TPMS_SCHEME_HASH TPMS_SCHEME_HASH_t;

/* TPMS_SCHEME_HASH Types */
typedef TPMS_SCHEME_HASH_t TPMS_KEY_SCHEME_ECDH_t;
typedef TPMS_SCHEME_HASH_t TPMS_KEY_SCHEME_ECMQV_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_RSASSA_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_RSAPSS_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECDSA_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECDAA_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_SM2_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECSCHNORR_t;
typedef TPMS_SCHEME_HASH_t TPMS_ENC_SCHEME_RSAES_t;
typedef TPMS_SCHEME_HASH_t TPMS_ENC_SCHEME_OAEP_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF2_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_MGF1_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF1_SP800_56A_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF1_SP800_108_t;

/* TPMS_SCHEME_HMAC Type */
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_HMAC_t;

/* TPMS_SCHEME_XOR Structure */
struct TPMS_SCHEME_XOR
{
  TPMI_ALG_HASH_t hashAlg;
  TPMI_ALG_KDF_t kdf;
};
typedef struct TPMS_SCHEME_XOR TPMS_SCHEME_XOR_t;

/* TPMU_SCHEME_KEYEDHASH Union */
union TPMU_SCHEME_KEYEDHASH
{
  TPMS_SCHEME_HMAC_t hmac;
  TPMS_SCHEME_XOR_t exclusiveOr;
};
typedef union TPMU_SCHEME_KEYEDHASH TPMU_SCHEME_KEYEDHASH_t;

/* TPMT_KEYEDHASH_SCHEME Structure */
struct TPMT_KEYEDHASH_SCHEME
{
  TPMI_ALG_KEYEDHASH_SCHEME_t scheme;
  TPMU_SCHEME_KEYEDHASH_t details;
};
typedef struct TPMT_KEYEDHASH_SCHEME TPMT_KEYEDHASH_SCHEME_t;

/* TPMS_KEYEDHASH_PARMS Structure */
struct TPMS_KEYEDHASH_PARMS
{
  TPMT_KEYEDHASH_SCHEME_t scheme;
};
typedef struct TPMS_KEYEDHASH_PARMS TPMS_KEYEDHASH_PARMS_t;

/* TPMU_SYM_KEY_BITS Union */
union TPMU_SYM_KEY_BITS
{
  TPM_KEY_BITS_t aes;
  TPM_KEY_BITS_t exclusiveOr;
  TPM_KEY_BITS_t sm4;
  TPM_KEY_BITS_t camellia;
};
typedef union TPMU_SYM_KEY_BITS TPMU_SYM_KEY_BITS_t;

/* TPMU_SYM_MODE Union */
union TPMU_SYM_MODE
{
  TPMI_ALG_SYM_MODE_t aes;
  TPMI_ALG_SYM_MODE_t sm4;
  TPMI_ALG_SYM_MODE_t camellia;
  TPMI_ALG_SYM_MODE_t sym;
};
typedef union TPMU_SYM_MODE TPMU_SYM_MODE_t;

/* TPMT_SYM_DEF_OBJECT Structure */
struct TPMT_SYM_DEF_OBJECT
{
  TPMI_ALG_SYM_OBJECT_t algorithm;
  TPMU_SYM_KEY_BITS_t keyBits;
  TPMU_SYM_MODE_t mode;
};
typedef struct TPMT_SYM_DEF_OBJECT TPMT_SYM_DEF_OBJECT_t;

/* TPMS_SYMCIPHER_PARMS Structure */
struct TPMS_SYMCIPHER_PARMS
{
  TPMT_SYM_DEF_OBJECT_t sym;
};
typedef struct TPMS_SYMCIPHER_PARMS TPMS_SYMCIPHER_PARMS_t;

/* TPMU_ASYM_SCHEME Union */
union TPMU_ASYM_SCHEME
{
  TPMS_KEY_SCHEME_ECDH_t ecdh;
  TPMS_KEY_SCHEME_ECMQV_t ecmqv;
  TPMS_SIG_SCHEME_RSASSA_t rsassa;
  TPMS_SIG_SCHEME_RSAPSS_t rsapss;
  TPMS_SIG_SCHEME_ECDSA_t ecdsa;
  TPMS_SIG_SCHEME_ECDAA_t ecdaa;
  TPMS_SIG_SCHEME_SM2_t sm2;
  TPMS_SIG_SCHEME_ECSCHNORR_t ecschnorr;
  TPMS_ENC_SCHEME_RSAES_t rsaes;
  TPMS_ENC_SCHEME_OAEP_t oaep;
  TPMS_SCHEME_HASH_t anySig;
  unsigned char padding[4];
};
typedef union TPMU_ASYM_SCHEME TPMU_ASYM_SCHEME_t;

/* TPMT_RSA_SCHEME Structure */
struct TPMT_RSA_SCHEME
{
  TPMI_ALG_RSA_SCHEME_t scheme;
  TPMU_ASYM_SCHEME_t details;
};
typedef struct TPMT_RSA_SCHEME TPMT_RSA_SCHEME_t;

/* TPMS_RSA_PARMS Structure */
struct TPMS_RSA_PARMS
{
  TPMT_SYM_DEF_OBJECT_t symmetric;
  TPMT_RSA_SCHEME_t scheme;
  TPM_KEY_BITS_t keyBits;
  grub_uint32_t exponent;
};
typedef struct TPMS_RSA_PARMS TPMS_RSA_PARMS_t;

/* TPMT_ECC_SCHEME Structure */
struct TPMT_ECC_SCHEME
{
  TPMI_ALG_ECC_SCHEME_t scheme;
  TPMU_ASYM_SCHEME_t details;
};
typedef struct TPMT_ECC_SCHEME TPMT_ECC_SCHEME_t;

/* TPMU_KDF_SCHEME Union */
union TPMU_KDF_SCHEME
{
  TPMS_SCHEME_MGF1_t mgf1;
  TPMS_SCHEME_KDF1_SP800_56A_t kdf1_sp800_56a;
  TPMS_SCHEME_KDF2_t kdf2;
  TPMS_SCHEME_KDF1_SP800_108_t kdf1_sp800_108;
};
typedef union TPMU_KDF_SCHEME TPMU_KDF_SCHEME_t;

/* TPMT_KDF_SCHEME Structure */
struct TPMT_KDF_SCHEME
{
  TPMI_ALG_KDF_t scheme;
  TPMU_KDF_SCHEME_t details;
};
typedef struct TPMT_KDF_SCHEME TPMT_KDF_SCHEME_t;

/* TPMS_ECC_PARMS Structure */
struct TPMS_ECC_PARMS
{
  TPMT_SYM_DEF_OBJECT_t symmetric;
  TPMT_ECC_SCHEME_t scheme;
  TPMI_ECC_CURVE_t curveID;
  TPMT_KDF_SCHEME_t kdf;
};
typedef struct TPMS_ECC_PARMS TPMS_ECC_PARMS_t;

/* TPMT_ASYM_SCHEME Structure */
struct TPMT_ASYM_SCHEME
{
  TPMI_ALG_ASYM_SCHEME_t scheme;
  TPMU_ASYM_SCHEME_t details;
};
typedef struct TPMT_ASYM_SCHEME TPMT_ASYM_SCHEME_t;

/* TPMS_ASYM_PARMS Structure */
struct TPMS_ASYM_PARMS
{
  TPMT_SYM_DEF_OBJECT_t symmetric;
  TPMT_ASYM_SCHEME_t scheme;
};
typedef struct TPMS_ASYM_PARMS TPMS_ASYM_PARMS_t;

/* TPMU_PUBLIC_PARMS Union */
union TPMU_PUBLIC_PARMS
{
  TPMS_KEYEDHASH_PARMS_t keyedHashDetail;
  TPMS_SYMCIPHER_PARMS_t symDetail;
  TPMS_RSA_PARMS_t rsaDetail;
  TPMS_ECC_PARMS_t eccDetail;
  TPMS_ASYM_PARMS_t asymDetail;
};
typedef union TPMU_PUBLIC_PARMS TPMU_PUBLIC_PARMS_t;

/* TPMT_PUBLIC_PARMS Structure */
struct TPMT_PUBLIC_PARMS {
    TPMI_ALG_PUBLIC_t type;
    TPMU_PUBLIC_PARMS_t parameters;
};
typedef struct TPMT_PUBLIC_PARMS TPMT_PUBLIC_PARMS_t;

/* TPM2B_PUBLIC_KEY_RSA Structure */
struct TPM2B_PUBLIC_KEY_RSA
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_RSA_KEY_BYTES];
};
typedef struct TPM2B_PUBLIC_KEY_RSA TPM2B_PUBLIC_KEY_RSA_t;

/* TPM2B_ECC_PARAMETER Structure */
struct TPM2B_ECC_PARAMETER
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_ECC_KEY_BYTES];
};
typedef struct TPM2B_ECC_PARAMETER TPM2B_ECC_PARAMETER_t;

/* TPMS_ECC_POINT Structure */
struct TPMS_ECC_POINT
{
  TPM2B_ECC_PARAMETER_t x;
  TPM2B_ECC_PARAMETER_t y;
};
typedef struct TPMS_ECC_POINT TPMS_ECC_POINT_t;

/* TPMU_ENCRYPTED_SECRET Union */
union TPMU_ENCRYPTED_SECRET
{
  grub_uint8_t ecc[sizeof(TPMS_ECC_POINT_t)];
  grub_uint8_t rsa[TPM_MAX_RSA_KEY_BYTES];
  grub_uint8_t symmetric[sizeof(TPM2B_DIGEST_t)];
  grub_uint8_t keyedHash[sizeof(TPM2B_DIGEST_t)];
};
typedef union TPMU_ENCRYPTED_SECRET TPMU_ENCRYPTED_SECRET_t;

/* TPM2B_ENCRYPTED_SECRET Structure */
struct TPM2B_ENCRYPTED_SECRET
{
  grub_uint16_t size;
  grub_uint8_t secret[sizeof(TPMU_ENCRYPTED_SECRET_t)];
};
typedef struct TPM2B_ENCRYPTED_SECRET TPM2B_ENCRYPTED_SECRET_t;

/* TPMU_PUBLIC_ID Union */
union TPMU_PUBLIC_ID
{
  TPM2B_DIGEST_t keyedHash;
  TPM2B_DIGEST_t sym;
  TPM2B_PUBLIC_KEY_RSA_t rsa;
  TPMS_ECC_POINT_t ecc;
};
typedef union TPMU_PUBLIC_ID TPMU_PUBLIC_ID_t;

/* TPMT_PUBLIC Structure */
struct TPMT_PUBLIC
{
  TPMI_ALG_PUBLIC_t type;
  TPMI_ALG_HASH_t nameAlg;
  TPMA_OBJECT_t objectAttributes;
  TPM2B_DIGEST_t authPolicy;
  TPMU_PUBLIC_PARMS_t parameters;
  TPMU_PUBLIC_ID_t unique;
};
typedef struct TPMT_PUBLIC TPMT_PUBLIC_t;

/* TPM2B_PUBLIC Structure */
struct TPM2B_PUBLIC
{
  grub_uint16_t size;
  TPMT_PUBLIC_t publicArea;
};
typedef struct TPM2B_PUBLIC TPM2B_PUBLIC_t;

/* TPMT_HA Structure */
struct TPMT_HA
{
  TPMI_ALG_HASH_t hashAlg;
  TPMU_HA_t digest;
};
typedef struct TPMT_HA TPMT_HA_t;

/* TPM2B_DATA Structure */
struct TPM2B_DATA
{
  grub_uint16_t size;
  grub_uint8_t buffer[sizeof(TPMT_HA_t)];
};
typedef struct TPM2B_DATA TPM2B_DATA_t;

/* TPMA_LOCALITY Structure */
struct TPMA_LOCALITY
{
#ifdef GRUB_TARGET_WORDS_BIGENDIAN
  grub_uint8_t Extended:3;
  grub_uint8_t TPM_LOC_FOUR:1;
  grub_uint8_t TPM_LOC_THREE:1;
  grub_uint8_t TPM_LOC_TWO:1;
  grub_uint8_t TPM_LOC_ONE:1;
  grub_uint8_t TPM_LOC_ZERO:1;
#else
  grub_uint8_t TPM_LOC_ZERO:1;
  grub_uint8_t TPM_LOC_ONE:1;
  grub_uint8_t TPM_LOC_TWO:1;
  grub_uint8_t TPM_LOC_THREE:1;
  grub_uint8_t TPM_LOC_FOUR:1;
  grub_uint8_t Extended:3;
#endif
};
typedef struct TPMA_LOCALITY TPMA_LOCALITY_t;

/* TPMU_NAME Union */
union TPMU_NAME
{
  TPMT_HA_t digest;
  TPM_HANDLE_t handle;
};
typedef union TPMU_NAME TPMU_NAME_t;

/* TPM2B_NAME Structure */
struct TPM2B_NAME
{
  grub_uint16_t size;
  grub_uint8_t name[sizeof(TPMU_NAME_t)];
};
typedef struct TPM2B_NAME TPM2B_NAME_t;

/* TPMS_CREATION_DATA Structure */
struct TPMS_CREATION_DATA
{
  TPML_PCR_SELECTION_t pcrSelect;
  TPM2B_DIGEST_t pcrDigest;
  TPMA_LOCALITY_t locality;
  TPM_ALG_ID_t parentNameAlg;
  TPM2B_NAME_t parentName;
  TPM2B_NAME_t parentQualifiedName;
  TPM2B_DATA_t outsideInfo;
};
typedef struct TPMS_CREATION_DATA TPMS_CREATION_DATA_t;

/* TPM2B_CREATION_DATA Structure */
struct TPM2B_CREATION_DATA
{
  grub_uint16_t size;
  TPMS_CREATION_DATA_t creationData;
};
typedef struct TPM2B_CREATION_DATA TPM2B_CREATION_DATA_t;

/* TPMT_SYM_DEF Structure */
struct TPMT_SYM_DEF
{
  TPMI_ALG_SYM_t algorithm;
  TPMU_SYM_KEY_BITS_t keyBits;
  TPMU_SYM_MODE_t mode;
};
typedef struct TPMT_SYM_DEF TPMT_SYM_DEF_t;

/* TPM2B_MAX_BUFFER Structure */
struct TPM2B_MAX_BUFFER
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_DIGEST_BUFFER];
};
typedef struct TPM2B_MAX_BUFFER TPM2B_MAX_BUFFER_t;

/* TPMT_TK_HASHCHECK Structure */
struct TPMT_TK_HASHCHECK
{
  TPM_ST_t tag;
  TPMI_RH_HIERARCHY_t hierarchy;
  TPM2B_DIGEST_t digest;
};
typedef struct TPMT_TK_HASHCHECK TPMT_TK_HASHCHECK_t;

/* TPM2B_SYM_KEY Structure */
struct TPM2B_SYM_KEY
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_SYM_KEY_BYTES];
};
typedef struct TPM2B_SYM_KEY TPM2B_SYM_KEY_t;

/* TPM2B_PRIVATE_KEY_RSA Structure */
struct TPM2B_PRIVATE_KEY_RSA
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_RSA_KEY_BYTES/2];
};
typedef struct TPM2B_PRIVATE_KEY_RSA TPM2B_PRIVATE_KEY_RSA_t;

/* TPM2B_PRIVATE_VENDOR_SPECIFIC Structure */
struct TPM2B_PRIVATE_VENDOR_SPECIFIC
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_PRIVATE_VENDOR_SPECIFIC_BYTES];
};
typedef struct TPM2B_PRIVATE_VENDOR_SPECIFIC TPM2B_PRIVATE_VENDOR_SPECIFIC_t;

/* TPM2B_PRIVATE_VENDOR_SPECIFIC Union */
union TPMU_SENSITIVE_COMPOSITE
{
  TPM2B_PRIVATE_KEY_RSA_t rsa;
  TPM2B_ECC_PARAMETER_t ecc;
  TPM2B_SENSITIVE_DATA_t bits;
  TPM2B_SYM_KEY_t sym;
  TPM2B_PRIVATE_VENDOR_SPECIFIC_t any;
};
typedef union TPMU_SENSITIVE_COMPOSITE TPMU_SENSITIVE_COMPOSITE_t;

/* TPMT_SENSITIVE Structure */
struct TPMT_SENSITIVE
{
  TPMI_ALG_PUBLIC_t sensitiveType;
  TPM2B_AUTH_t authValue;
  TPM2B_DIGEST_t seedValue;
  TPMU_SENSITIVE_COMPOSITE_t sensitive;
};
typedef struct TPMT_SENSITIVE TPMT_SENSITIVE_t;

/* TPM2B_SENSITIVE Structure */
struct TPM2B_SENSITIVE
{
  grub_uint16_t size;
  TPMT_SENSITIVE_t sensitiveArea;
};
typedef struct TPM2B_SENSITIVE TPM2B_SENSITIVE_t;

/*
 * _PRIVATE Structure
 *
 * Although '_PRIVATE' is the name defined in the TPM2 SPEC, it is too generic,
 * so here we add the '__TPM2B' prefix to make the struct specific for 'TPM2B_PRIVATE'.
 */
struct __TPM2B_PRIVATE
{
  TPM2B_DIGEST_t integrityOuter;
  TPM2B_DIGEST_t integrityInner;
  TPM2B_SENSITIVE_t sensitive;
};
typedef struct __TPM2B_PRIVATE __TPM2B_PRIVATE_t;

/* TPM2B_PRIVATE Structure */
struct TPM2B_PRIVATE
{
  grub_uint16_t size;
  grub_uint8_t buffer[sizeof(__TPM2B_PRIVATE_t)];
};
typedef struct TPM2B_PRIVATE TPM2B_PRIVATE_t;

/* TPML_DIGEST_VALUES Structure */
struct TPML_DIGEST_VALUES
{
  grub_uint32_t count;
  TPMT_HA_t digests[TPM_NUM_PCR_BANKS];
};
typedef struct TPML_DIGEST_VALUES TPML_DIGEST_VALUES_t;

/* TPM2B_MAX_NV_BUFFER Structure */
struct TPM2B_MAX_NV_BUFFER
{
  grub_uint16_t size;
  grub_uint8_t buffer[TPM_MAX_NV_BUFFER_SIZE];
};
typedef struct TPM2B_MAX_NV_BUFFER TPM2B_MAX_NV_BUFFER_t;

/* TPMS_NV_PUBLIC Structure */
struct TPMS_NV_PUBLIC
{
    TPMI_RH_NV_INDEX_t nvIndex;
    TPMI_ALG_HASH_t nameAlg;
    TPMA_NV_t attributes;
    TPM2B_DIGEST_t authPolicy;
    grub_uint16_t dataSize;
};
typedef struct TPMS_NV_PUBLIC TPMS_NV_PUBLIC_t;

/* TPM2B_NV_PUBLIC Structure */
struct TPM2B_NV_PUBLIC
{
    grub_uint16_t size;
    TPMS_NV_PUBLIC_t nvPublic;
};
typedef struct TPM2B_NV_PUBLIC TPM2B_NV_PUBLIC_t;

/* TPMT_TK_CREATION Structure */
struct TPMT_TK_CREATION
{
    TPM_ST_t tag;
    TPMI_RH_HIERARCHY_t hierarchy;
    TPM2B_DIGEST_t digest;
};
typedef struct TPMT_TK_CREATION TPMT_TK_CREATION_t;

/* TPMS_EMPTY Structure */
struct TPMS_EMPTY {
  grub_uint8_t empty[1]; /* a structure with no member */
};
typedef struct TPMS_EMPTY TPMS_EMPTY_t;

/* TPMS_SIGNATURE_RSA Structure */
struct TPMS_SIGNATURE_RSA {
  TPMI_ALG_HASH_t hash;
  TPM2B_PUBLIC_KEY_RSA_t sig;
};
typedef struct TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSA_t;

/* Definition of Types for RSA Signature */
typedef TPMS_SIGNATURE_RSA_t TPMS_SIGNATURE_RSASSA_t;
typedef TPMS_SIGNATURE_RSA_t TPMS_SIGNATURE_RSAPSS_t;

/* TPMS_SIGNATURE_ECC Structure */
struct TPMS_SIGNATURE_ECC {
  TPMI_ALG_HASH_t hash;
  TPM2B_ECC_PARAMETER_t signatureR;
  TPM2B_ECC_PARAMETER_t signatureS;
};
typedef struct TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECC_t;

/* Definition of Types for ECC TPMS_SIGNATURE_ECC */
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECDSA_t;
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECDAA_t;
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_SM2_t;
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECSCHNORR_t;

/* TPMU_SIGNATURE Structure */
union TPMU_SIGNATURE {
  TPMS_SIGNATURE_RSASSA_t rsassa;
  TPMS_SIGNATURE_RSAPSS_t rsapss;
  TPMS_SIGNATURE_ECDSA_t ecdsa;
  TPMS_SIGNATURE_ECDAA_t ecdaa;
  TPMS_SIGNATURE_SM2_t sm2;
  TPMS_SIGNATURE_ECSCHNORR_t ecschnorr;
  TPMT_HA_t hmac;
  TPMS_SCHEME_HASH_t any;
  TPMS_EMPTY_t null;
};
typedef union TPMU_SIGNATURE TPMU_SIGNATURE_t;

/* TPMT_SIGNATURE Structure */
struct TPMT_SIGNATURE {
  TPMI_ALG_SIG_SCHEME_t sigAlg;
  TPMU_SIGNATURE_t signature;
};
typedef struct TPMT_SIGNATURE TPMT_SIGNATURE_t;

static inline TPMI_ALG_HASH_t
TPMT_SIGNATURE_get_hash_alg (TPMT_SIGNATURE_t *sig)
{
  switch (sig->sigAlg)
    {
    case TPM_ALG_RSASSA:
      return sig->signature.rsassa.hash;
    case TPM_ALG_RSAPSS:
      return sig->signature.rsapss.hash;
    case TPM_ALG_ECDSA:
      return sig->signature.ecdsa.hash;
    case TPM_ALG_ECDAA:
      return sig->signature.ecdaa.hash;
    case TPM_ALG_SM2:
      return sig->signature.sm2.hash;
    case TPM_ALG_ECSCHNORR:
      return sig->signature.ecschnorr.hash;
    case TPM_ALG_HMAC:
      return sig->signature.hmac.hashAlg;
    default:
      break;
    }

  return TPM_ALG_NULL;
}

/* TPMT_TK_VERIFIED Structure */
struct TPMT_TK_VERIFIED {
  TPM_ST_t tag;
  TPMI_RH_HIERARCHY_t hierarchy;
  TPM2B_DIGEST_t digest;
};
typedef struct TPMT_TK_VERIFIED TPMT_TK_VERIFIED_t;

#endif /* ! GRUB_TPM2_INTERNAL_STRUCTS_HEADER */