tlcl: implement clear, startup, shutdown, self test
[vboot.git] / firmware / include / tpm2_tss_constants.h
1 /*
2  * Copyright 2016 The Chromium OS Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  *
6  * Some TPM constants and type definitions for standalone compilation for use
7  * in the firmware
8  */
9
10 #ifndef __VBOOT_REFERENCE_FIRMWARE_INCLUDE_TPM2_TSS_CONSTANTS_H
11 #define __VBOOT_REFERENCE_FIRMWARE_INCLUDE_TPM2_TSS_CONSTANTS_H
12
13 #define TPM_BUFFER_SIZE 256
14
15 /* Tpm2 command tags. */
16 #define TPM_ST_NO_SESSIONS 0x8001
17 #define TPM_ST_SESSIONS    0x8002
18
19 /* TPM2 command codes. */
20 #define TPM2_Hierarchy_Control ((TPM_CC)0x00000121)
21 #define TPM2_Clear             ((TPM_CC)0x00000126)
22 #define TPM2_NV_Write          ((TPM_CC)0x00000137)
23 #define TPM2_NV_WriteLock      ((TPM_CC)0x00000138)
24 #define TPM2_SelfTest          ((TPM_CC)0x00000143)
25 #define TPM2_Startup           ((TPM_CC)0x00000144)
26 #define TPM2_Shutdown          ((TPM_CC)0x00000145)
27 #define TPM2_NV_Read           ((TPM_CC)0x0000014E)
28 #define TPM2_GetCapability     ((TPM_CC)0x0000017A)
29
30 /* TCG Spec defined, verify for TPM2.
31  * TODO(apronin): find TPM2 RC substitutes for TPM1.2 error codes.
32  */
33 #define TPM_E_BADINDEX              ((uint32_t) 0x00000002)
34 #define TPM_E_INVALID_POSTINIT      ((uint32_t) 0x00000026)
35 #define TPM_E_BADTAG                ((uint32_t) 0x0000001E)
36 #define TPM_E_IOERROR               ((uint32_t) 0x0000001F)
37 #define TPM_E_MAXNVWRITES           ((uint32_t) 0x00000048)
38
39 #define HR_SHIFT               24
40 #define TPM_HT_NV_INDEX        0x01
41 #define HR_NV_INDEX           (TPM_HT_NV_INDEX <<  HR_SHIFT)
42 #define TPM_RH_PLATFORM     0x4000000C
43 #define TPM_RS_PW           0x40000009
44
45 /* TPM2 capabilities. */
46 #define TPM_CAP_FIRST                   ((TPM_CAP)0x00000000)
47 #define TPM_CAP_TPM_PROPERTIES          ((TPM_CAP)0x00000006)
48
49 /* TPM properties */
50 #define TPM_PT_NONE                     ((TPM_PT)0x00000000)
51 #define PT_GROUP                        ((TPM_PT)0x00000100)
52 #define PT_FIXED                        PT_GROUP
53 #define PT_VAR                          (PT_GROUP * 2)
54 #define TPM_PT_PERMANENT                (PT_VAR + 0)
55 #define TPM_PT_STARTUP_CLEAR            (PT_VAR + 1)
56
57 /* TPM startup types. */
58 #define TPM_SU_CLEAR                    ((TPM_SU)0x0000)
59 #define TPM_SU_STATE                    ((TPM_SU)0x0001)
60
61 typedef uint8_t TPMI_YES_NO;
62 typedef uint32_t TPM_CC;
63 typedef uint32_t TPM_HANDLE;
64 typedef TPM_HANDLE TPMI_RH_NV_INDEX;
65 typedef TPM_HANDLE TPMI_RH_ENABLES;
66 typedef uint32_t TPM_CAP;
67 typedef uint32_t TPM_PT;
68 typedef uint16_t TPM_SU;
69
70 typedef struct {
71         uint16_t      size;
72         uint8_t       *buffer;
73 } TPM2B;
74
75 typedef union {
76         struct {
77                 uint16_t  size;
78                 const uint8_t   *buffer;
79         } t;
80         TPM2B b;
81 } TPM2B_MAX_NV_BUFFER;
82
83 typedef struct {
84         TPM_PT property;
85         uint32_t value;
86 } TPMS_TAGGED_PROPERTY;
87
88 typedef struct {
89         uint32_t count;
90         TPMS_TAGGED_PROPERTY tpm_property[1];
91 } TPML_TAGGED_TPM_PROPERTY;
92
93 typedef union {
94         TPML_TAGGED_TPM_PROPERTY tpm_properties;
95 } TPMU_CAPABILITIES;
96
97 typedef struct {
98         TPM_CAP capability;
99         TPMU_CAPABILITIES data;
100 } TPMS_CAPABILITY_DATA;
101
102 struct tpm2_nv_read_cmd {
103         TPMI_RH_NV_INDEX nvIndex;
104         uint16_t size;
105         uint16_t offset;
106 };
107
108 struct tpm2_nv_write_cmd {
109         TPMI_RH_NV_INDEX nvIndex;
110         TPM2B_MAX_NV_BUFFER data;
111         uint16_t offset;
112 };
113
114 struct tpm2_nv_write_lock_cmd {
115         TPMI_RH_NV_INDEX nvIndex;
116 };
117
118 struct tpm2_hierarchy_control_cmd {
119         TPMI_RH_ENABLES enable;
120         TPMI_YES_NO state;
121 };
122
123 struct tpm2_get_capability_cmd {
124         TPM_CAP capability;
125         uint32_t property;
126         uint32_t property_count;
127 };
128
129 struct tpm2_self_test_cmd {
130         TPMI_YES_NO full_test;
131 };
132
133 struct tpm2_startup_cmd {
134         TPM_SU startup_type;
135 };
136
137 struct tpm2_shutdown_cmd {
138         TPM_SU shutdown_type;
139 };
140
141 /* Common command/response header. */
142 struct tpm_header {
143         uint16_t tpm_tag;
144         uint32_t tpm_size;
145         TPM_CC tpm_code;
146 } __attribute__((packed));
147
148 struct nv_read_response {
149         uint32_t params_size;
150         TPM2B_MAX_NV_BUFFER buffer;
151 };
152
153 struct tpm2_session_attrs {
154         uint8_t continueSession : 1;
155         uint8_t auditExclusive  : 1;
156         uint8_t auditReset      : 1;
157         uint8_t reserved3_4     : 2;
158         uint8_t decrypt         : 1;
159         uint8_t encrypt         : 1;
160         uint8_t audit           : 1;
161 };
162
163 struct tpm2_session_header {
164         uint32_t session_handle;
165         uint16_t nonce_size;
166         uint8_t *nonce;
167         union {
168                 struct tpm2_session_attrs session_attr_bits;
169                 uint8_t session_attrs;
170         }  __attribute__((packed));
171         uint16_t auth_size;
172         uint8_t *auth;
173 };
174
175 struct get_capability_response {
176         TPMI_YES_NO more_data;
177         TPMS_CAPABILITY_DATA capability_data;
178 } __attribute__((packed));
179
180 struct tpm2_response {
181         struct tpm_header hdr;
182         union {
183                 struct nv_read_response nvr;
184                 struct tpm2_session_header def_space;
185                 struct get_capability_response cap;
186         };
187 };
188
189 typedef struct {
190         uint32_t ownerAuthSet : 1;
191         uint32_t endorsementAuthSet : 1;
192         uint32_t lockoutAuthSet : 1;
193         uint32_t reserved3_7 : 5;
194         uint32_t disableClear : 1;
195         uint32_t inLockout : 1;
196         uint32_t tpmGeneratedEPS : 1;
197         uint32_t reserved11_31 : 21;
198 } TPM_PERMANENT_FLAGS;
199
200 typedef struct {
201         uint32_t phEnable : 1;
202         uint32_t shEnable : 1;
203         uint32_t ehEnable : 1;
204         uint32_t phEnableNV : 1;
205         uint32_t reserved4_30 : 27;
206         uint32_t orderly : 1;
207 } TPM_STCLEAR_FLAGS;
208
209 /* TODO(apronin): For TPM2 certain properties must be received using
210  * TPM2_GetCapability instead of being hardcoded as they are now:
211  * TPM_MAX_COMMAND_SIZE -> use TPM_PT_MAX_COMMAND_SIZE for TPM2.
212  * TPM_PCR_DIGEST -> use TPM_PT_MAX_DIGEST for TPM2.
213  */
214 #define TPM_MAX_COMMAND_SIZE    4096
215 #define TPM_PCR_DIGEST          32
216
217 #endif  /* ! __VBOOT_REFERENCE_FIRMWARE_INCLUDE_TPM2_TSS_CONSTANTS_H */