xref: /aosp_15_r20/external/vboot_reference/utility/tlcl_generator.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2012 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  */
5*8617a60dSAndroid Build Coastguard Worker 
6*8617a60dSAndroid Build Coastguard Worker /* This program generates partially filled TPM datagrams and other compile-time
7*8617a60dSAndroid Build Coastguard Worker  * constants (e.g. structure sizes and offsets).  Compile this file---and ONLY
8*8617a60dSAndroid Build Coastguard Worker  * this file---with -fpack-struct.  We take advantage of the fact that the
9*8617a60dSAndroid Build Coastguard Worker  * (packed) TPM structures layout (mostly) match the TPM request and response
10*8617a60dSAndroid Build Coastguard Worker  * datagram layout.  When they don't completely match, some fixing is necessary
11*8617a60dSAndroid Build Coastguard Worker  * (see PCR_SELECTION_FIX below).
12*8617a60dSAndroid Build Coastguard Worker  */
13*8617a60dSAndroid Build Coastguard Worker 
14*8617a60dSAndroid Build Coastguard Worker #include <assert.h>
15*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
16*8617a60dSAndroid Build Coastguard Worker 
17*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
18*8617a60dSAndroid Build Coastguard Worker #include "tlcl_internal.h"
19*8617a60dSAndroid Build Coastguard Worker #include "tpmextras.h"
20*8617a60dSAndroid Build Coastguard Worker #include "tss_constants.h"
21*8617a60dSAndroid Build Coastguard Worker 
22*8617a60dSAndroid Build Coastguard Worker /* See struct Command below.  This structure represent a field in a TPM
23*8617a60dSAndroid Build Coastguard Worker  * command.  [name] is the field name.  [visible] is 1 if the field is
24*8617a60dSAndroid Build Coastguard Worker  * modified by the run-time.  Non-visible fields are initialized at build time
25*8617a60dSAndroid Build Coastguard Worker  * and remain constant.  [size] is the field size in bytes.  [value] is the
26*8617a60dSAndroid Build Coastguard Worker  * fixed value of non-visible fields.
27*8617a60dSAndroid Build Coastguard Worker  */
28*8617a60dSAndroid Build Coastguard Worker typedef struct Field {
29*8617a60dSAndroid Build Coastguard Worker   const char* name;
30*8617a60dSAndroid Build Coastguard Worker   int visible;
31*8617a60dSAndroid Build Coastguard Worker   int offset;
32*8617a60dSAndroid Build Coastguard Worker   int size;
33*8617a60dSAndroid Build Coastguard Worker   uint32_t value;     /* large enough for all initializers */
34*8617a60dSAndroid Build Coastguard Worker   struct Field* next;
35*8617a60dSAndroid Build Coastguard Worker } Field;
36*8617a60dSAndroid Build Coastguard Worker 
37*8617a60dSAndroid Build Coastguard Worker /* This structure is used to build (at build time) and manipulate (at firmware
38*8617a60dSAndroid Build Coastguard Worker  * or emulation run time) buffers containing TPM datagrams.  [name] is the name
39*8617a60dSAndroid Build Coastguard Worker  * of a TPM command.  [size] is the size of the command buffer in bytes, when
40*8617a60dSAndroid Build Coastguard Worker  * known.  [max_size] is the maximum size allowed for variable-length commands
41*8617a60dSAndroid Build Coastguard Worker  * (such as Read and Write).  [fields] is a link-list of command fields.
42*8617a60dSAndroid Build Coastguard Worker  */
43*8617a60dSAndroid Build Coastguard Worker typedef struct Command {
44*8617a60dSAndroid Build Coastguard Worker   const char* name;
45*8617a60dSAndroid Build Coastguard Worker   int size;
46*8617a60dSAndroid Build Coastguard Worker   int max_size;
47*8617a60dSAndroid Build Coastguard Worker   Field* fields;
48*8617a60dSAndroid Build Coastguard Worker   struct Command* next;
49*8617a60dSAndroid Build Coastguard Worker } Command;
50*8617a60dSAndroid Build Coastguard Worker 
51*8617a60dSAndroid Build Coastguard Worker /* Adds a field to a command, and makes its offset visible.  The fields must be
52*8617a60dSAndroid Build Coastguard Worker  * added at increasing offsets.
53*8617a60dSAndroid Build Coastguard Worker  */
AddVisibleField(Command * cmd,const char * name,int offset)54*8617a60dSAndroid Build Coastguard Worker static void AddVisibleField(Command* cmd, const char* name, int offset) {
55*8617a60dSAndroid Build Coastguard Worker   Field* fld = (Field*) calloc(1, sizeof(Field));
56*8617a60dSAndroid Build Coastguard Worker   if (cmd->fields != NULL) {
57*8617a60dSAndroid Build Coastguard Worker     assert(offset > fn->offset);
58*8617a60dSAndroid Build Coastguard Worker   }
59*8617a60dSAndroid Build Coastguard Worker   fld->next = cmd->fields;
60*8617a60dSAndroid Build Coastguard Worker   cmd->fields = fld;
61*8617a60dSAndroid Build Coastguard Worker   fld->name = name;
62*8617a60dSAndroid Build Coastguard Worker   fld->visible = 1;
63*8617a60dSAndroid Build Coastguard Worker   fld->offset = offset;
64*8617a60dSAndroid Build Coastguard Worker }
65*8617a60dSAndroid Build Coastguard Worker 
66*8617a60dSAndroid Build Coastguard Worker /* Adds a constant field with its value.  The fields must be added at
67*8617a60dSAndroid Build Coastguard Worker  * increasing offsets.
68*8617a60dSAndroid Build Coastguard Worker  */
AddInitializedField(Command * cmd,int offset,int size,uint32_t value)69*8617a60dSAndroid Build Coastguard Worker static void AddInitializedField(Command* cmd, int offset,
70*8617a60dSAndroid Build Coastguard Worker                                 int size, uint32_t value) {
71*8617a60dSAndroid Build Coastguard Worker   Field* fld = (Field*) calloc(1, sizeof(Field));
72*8617a60dSAndroid Build Coastguard Worker   fld->next = cmd->fields;
73*8617a60dSAndroid Build Coastguard Worker   cmd->fields = fld;
74*8617a60dSAndroid Build Coastguard Worker   fld->name = NULL;
75*8617a60dSAndroid Build Coastguard Worker   fld->visible = 0;
76*8617a60dSAndroid Build Coastguard Worker   fld->size = size;
77*8617a60dSAndroid Build Coastguard Worker   fld->offset = offset;
78*8617a60dSAndroid Build Coastguard Worker   fld->value = value;
79*8617a60dSAndroid Build Coastguard Worker }
80*8617a60dSAndroid Build Coastguard Worker 
81*8617a60dSAndroid Build Coastguard Worker /* Create a structure representing a TPM command datagram.
82*8617a60dSAndroid Build Coastguard Worker  */
newCommandWithTag(TPM_COMMAND_CODE code,int size,TPM_TAG tag)83*8617a60dSAndroid Build Coastguard Worker Command* newCommandWithTag(TPM_COMMAND_CODE code, int size, TPM_TAG tag) {
84*8617a60dSAndroid Build Coastguard Worker   Command* cmd = (Command*) calloc(1, sizeof(Command));
85*8617a60dSAndroid Build Coastguard Worker   cmd->size = size;
86*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, 0, sizeof(TPM_TAG), tag);
87*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, sizeof(TPM_TAG), sizeof(uint32_t), size);
88*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, sizeof(TPM_TAG) + sizeof(uint32_t),
89*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_COMMAND_CODE), code);
90*8617a60dSAndroid Build Coastguard Worker   return cmd;
91*8617a60dSAndroid Build Coastguard Worker }
92*8617a60dSAndroid Build Coastguard Worker 
newCommand(TPM_COMMAND_CODE code,int size)93*8617a60dSAndroid Build Coastguard Worker Command* newCommand(TPM_COMMAND_CODE code, int size) {
94*8617a60dSAndroid Build Coastguard Worker   return newCommandWithTag(code, size, TPM_TAG_RQU_COMMAND);
95*8617a60dSAndroid Build Coastguard Worker }
96*8617a60dSAndroid Build Coastguard Worker 
97*8617a60dSAndroid Build Coastguard Worker /* BuildXXX builds TPM command XXX.
98*8617a60dSAndroid Build Coastguard Worker  */
BuildDefineSpaceCommand(void)99*8617a60dSAndroid Build Coastguard Worker Command* BuildDefineSpaceCommand(void) {
100*8617a60dSAndroid Build Coastguard Worker   int nv_data_public = kTpmRequestHeaderLength;
101*8617a60dSAndroid Build Coastguard Worker   int nv_index = nv_data_public + offsetof(TPM_NV_DATA_PUBLIC, nvIndex);
102*8617a60dSAndroid Build Coastguard Worker   int nv_pcr_info_read = nv_data_public +
103*8617a60dSAndroid Build Coastguard Worker     offsetof(TPM_NV_DATA_PUBLIC, pcrInfoRead);
104*8617a60dSAndroid Build Coastguard Worker   int read_locality = nv_pcr_info_read +
105*8617a60dSAndroid Build Coastguard Worker     offsetof(TPM_PCR_INFO_SHORT, localityAtRelease);
106*8617a60dSAndroid Build Coastguard Worker   int nv_pcr_info_write = nv_data_public +
107*8617a60dSAndroid Build Coastguard Worker     offsetof(TPM_NV_DATA_PUBLIC, pcrInfoWrite);
108*8617a60dSAndroid Build Coastguard Worker   int write_locality = nv_pcr_info_write +
109*8617a60dSAndroid Build Coastguard Worker     offsetof(TPM_PCR_INFO_SHORT, localityAtRelease);
110*8617a60dSAndroid Build Coastguard Worker   int nv_permission = nv_data_public +
111*8617a60dSAndroid Build Coastguard Worker     offsetof(TPM_NV_DATA_PUBLIC, permission);
112*8617a60dSAndroid Build Coastguard Worker   int nv_permission_tag =
113*8617a60dSAndroid Build Coastguard Worker     nv_permission + offsetof(TPM_NV_ATTRIBUTES, tag);
114*8617a60dSAndroid Build Coastguard Worker   int nv_permission_attributes =
115*8617a60dSAndroid Build Coastguard Worker     nv_permission + offsetof(TPM_NV_ATTRIBUTES, attributes);
116*8617a60dSAndroid Build Coastguard Worker   int nv_datasize = nv_data_public +
117*8617a60dSAndroid Build Coastguard Worker     offsetof(TPM_NV_DATA_PUBLIC, dataSize);
118*8617a60dSAndroid Build Coastguard Worker 
119*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_NV_DATA_PUBLIC) +
120*8617a60dSAndroid Build Coastguard Worker       kEncAuthLength;
121*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_NV_DefineSpace, size);
122*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_nv_definespace_cmd";
123*8617a60dSAndroid Build Coastguard Worker 
124*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "index", nv_index);
125*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "pcr_info_read", nv_pcr_info_read);
126*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "pcr_info_write", nv_pcr_info_write);
127*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "perm", nv_permission_attributes);
128*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "size", nv_datasize);
129*8617a60dSAndroid Build Coastguard Worker 
130*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, nv_data_public, sizeof(uint16_t),
131*8617a60dSAndroid Build Coastguard Worker                       TPM_TAG_NV_DATA_PUBLIC);
132*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, nv_pcr_info_read, sizeof(uint16_t), 3);
133*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, read_locality, sizeof(TPM_LOCALITY_SELECTION),
134*8617a60dSAndroid Build Coastguard Worker                       TPM_ALL_LOCALITIES);
135*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, nv_pcr_info_write, sizeof(uint16_t), 3);
136*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, write_locality, sizeof(TPM_LOCALITY_SELECTION),
137*8617a60dSAndroid Build Coastguard Worker                       TPM_ALL_LOCALITIES);
138*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, nv_permission_tag, sizeof(TPM_STRUCTURE_TAG),
139*8617a60dSAndroid Build Coastguard Worker                       TPM_TAG_NV_ATTRIBUTES);
140*8617a60dSAndroid Build Coastguard Worker   return cmd;
141*8617a60dSAndroid Build Coastguard Worker }
142*8617a60dSAndroid Build Coastguard Worker 
143*8617a60dSAndroid Build Coastguard Worker /* BuildXXX builds TPM command XXX.
144*8617a60dSAndroid Build Coastguard Worker  */
BuildWriteCommand(void)145*8617a60dSAndroid Build Coastguard Worker Command* BuildWriteCommand(void) {
146*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_NV_WriteValue, 0);
147*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_nv_write_cmd";
148*8617a60dSAndroid Build Coastguard Worker   cmd->max_size = TPM_LARGE_ENOUGH_COMMAND_SIZE;
149*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "index", kTpmRequestHeaderLength);
150*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "length", kTpmRequestHeaderLength + 8);
151*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "data", kTpmRequestHeaderLength + 12);
152*8617a60dSAndroid Build Coastguard Worker   return cmd;
153*8617a60dSAndroid Build Coastguard Worker }
154*8617a60dSAndroid Build Coastguard Worker 
BuildReadCommand(void)155*8617a60dSAndroid Build Coastguard Worker Command* BuildReadCommand(void) {
156*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + kTpmReadInfoLength;
157*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_NV_ReadValue, size);
158*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_nv_read_cmd";
159*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "index", kTpmRequestHeaderLength);
160*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "length", kTpmRequestHeaderLength + 8);
161*8617a60dSAndroid Build Coastguard Worker   return cmd;
162*8617a60dSAndroid Build Coastguard Worker }
163*8617a60dSAndroid Build Coastguard Worker 
BuildPCRReadCommand(void)164*8617a60dSAndroid Build Coastguard Worker Command* BuildPCRReadCommand(void) {
165*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(uint32_t);
166*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_PcrRead, size);
167*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_pcr_read_cmd";
168*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "pcrNum", kTpmRequestHeaderLength);
169*8617a60dSAndroid Build Coastguard Worker   return cmd;
170*8617a60dSAndroid Build Coastguard Worker }
171*8617a60dSAndroid Build Coastguard Worker 
BuildPPAssertCommand(void)172*8617a60dSAndroid Build Coastguard Worker Command* BuildPPAssertCommand(void) {
173*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_PHYSICAL_PRESENCE);
174*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TSC_ORD_PhysicalPresence, size);
175*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_ppassert_cmd";
176*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
177*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_PHYSICAL_PRESENCE),
178*8617a60dSAndroid Build Coastguard Worker                       TPM_PHYSICAL_PRESENCE_PRESENT);
179*8617a60dSAndroid Build Coastguard Worker   return cmd;
180*8617a60dSAndroid Build Coastguard Worker }
181*8617a60dSAndroid Build Coastguard Worker 
BuildPPEnableCommand(void)182*8617a60dSAndroid Build Coastguard Worker Command* BuildPPEnableCommand(void) {
183*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_PHYSICAL_PRESENCE);
184*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TSC_ORD_PhysicalPresence, size);
185*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_ppenable_cmd";
186*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
187*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_PHYSICAL_PRESENCE),
188*8617a60dSAndroid Build Coastguard Worker                       TPM_PHYSICAL_PRESENCE_CMD_ENABLE);
189*8617a60dSAndroid Build Coastguard Worker   return cmd;
190*8617a60dSAndroid Build Coastguard Worker }
191*8617a60dSAndroid Build Coastguard Worker 
BuildFinalizePPCommand(void)192*8617a60dSAndroid Build Coastguard Worker Command* BuildFinalizePPCommand(void) {
193*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_PHYSICAL_PRESENCE);
194*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TSC_ORD_PhysicalPresence, size);
195*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_finalizepp_cmd";
196*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
197*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_PHYSICAL_PRESENCE),
198*8617a60dSAndroid Build Coastguard Worker                       TPM_PHYSICAL_PRESENCE_CMD_ENABLE |
199*8617a60dSAndroid Build Coastguard Worker                       TPM_PHYSICAL_PRESENCE_HW_DISABLE |
200*8617a60dSAndroid Build Coastguard Worker                       TPM_PHYSICAL_PRESENCE_LIFETIME_LOCK);
201*8617a60dSAndroid Build Coastguard Worker   return cmd;
202*8617a60dSAndroid Build Coastguard Worker }
203*8617a60dSAndroid Build Coastguard Worker 
BuildPPLockCommand(void)204*8617a60dSAndroid Build Coastguard Worker Command* BuildPPLockCommand(void) {
205*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_PHYSICAL_PRESENCE);
206*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TSC_ORD_PhysicalPresence, size);
207*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_pplock_cmd";
208*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
209*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_PHYSICAL_PRESENCE),
210*8617a60dSAndroid Build Coastguard Worker                       TPM_PHYSICAL_PRESENCE_LOCK);
211*8617a60dSAndroid Build Coastguard Worker   return cmd;
212*8617a60dSAndroid Build Coastguard Worker }
213*8617a60dSAndroid Build Coastguard Worker 
BuildStartupCommand(void)214*8617a60dSAndroid Build Coastguard Worker Command* BuildStartupCommand(void) {
215*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_STARTUP_TYPE);
216*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_Startup, size);
217*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_startup_cmd";
218*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
219*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_STARTUP_TYPE),
220*8617a60dSAndroid Build Coastguard Worker                       TPM_ST_CLEAR);
221*8617a60dSAndroid Build Coastguard Worker   return cmd;
222*8617a60dSAndroid Build Coastguard Worker }
223*8617a60dSAndroid Build Coastguard Worker 
BuildSaveStateCommand(void)224*8617a60dSAndroid Build Coastguard Worker Command* BuildSaveStateCommand(void) {
225*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
226*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_SaveState, size);
227*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_savestate_cmd";
228*8617a60dSAndroid Build Coastguard Worker   return cmd;
229*8617a60dSAndroid Build Coastguard Worker }
230*8617a60dSAndroid Build Coastguard Worker 
BuildResumeCommand(void)231*8617a60dSAndroid Build Coastguard Worker Command* BuildResumeCommand(void) {
232*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_STARTUP_TYPE);
233*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_Startup, size);
234*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_resume_cmd";
235*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
236*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_STARTUP_TYPE),
237*8617a60dSAndroid Build Coastguard Worker                       TPM_ST_STATE);
238*8617a60dSAndroid Build Coastguard Worker   return cmd;
239*8617a60dSAndroid Build Coastguard Worker }
240*8617a60dSAndroid Build Coastguard Worker 
BuildSelftestfullCommand(void)241*8617a60dSAndroid Build Coastguard Worker Command* BuildSelftestfullCommand(void) {
242*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
243*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_SelfTestFull, size);
244*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_selftestfull_cmd";
245*8617a60dSAndroid Build Coastguard Worker   return cmd;
246*8617a60dSAndroid Build Coastguard Worker }
247*8617a60dSAndroid Build Coastguard Worker 
BuildContinueSelfTestCommand(void)248*8617a60dSAndroid Build Coastguard Worker Command* BuildContinueSelfTestCommand(void) {
249*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
250*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_ContinueSelfTest, size);
251*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_continueselftest_cmd";
252*8617a60dSAndroid Build Coastguard Worker   return cmd;
253*8617a60dSAndroid Build Coastguard Worker }
254*8617a60dSAndroid Build Coastguard Worker 
BuildReadPubekCommand(void)255*8617a60dSAndroid Build Coastguard Worker Command* BuildReadPubekCommand(void) {
256*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(TPM_NONCE);
257*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_ReadPubek, size);
258*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_readpubek_cmd";
259*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "antiReplay", kTpmRequestHeaderLength);
260*8617a60dSAndroid Build Coastguard Worker   return cmd;
261*8617a60dSAndroid Build Coastguard Worker }
262*8617a60dSAndroid Build Coastguard Worker 
BuildForceClearCommand(void)263*8617a60dSAndroid Build Coastguard Worker Command* BuildForceClearCommand(void) {
264*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
265*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_ForceClear, size);
266*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_forceclear_cmd";
267*8617a60dSAndroid Build Coastguard Worker   return cmd;
268*8617a60dSAndroid Build Coastguard Worker }
269*8617a60dSAndroid Build Coastguard Worker 
BuildPhysicalEnableCommand(void)270*8617a60dSAndroid Build Coastguard Worker Command* BuildPhysicalEnableCommand(void) {
271*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
272*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_PhysicalEnable, size);
273*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_physicalenable_cmd";
274*8617a60dSAndroid Build Coastguard Worker   return cmd;
275*8617a60dSAndroid Build Coastguard Worker }
276*8617a60dSAndroid Build Coastguard Worker 
BuildPhysicalDisableCommand(void)277*8617a60dSAndroid Build Coastguard Worker Command* BuildPhysicalDisableCommand(void) {
278*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
279*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_PhysicalDisable, size);
280*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_physicaldisable_cmd";
281*8617a60dSAndroid Build Coastguard Worker   return cmd;
282*8617a60dSAndroid Build Coastguard Worker }
283*8617a60dSAndroid Build Coastguard Worker 
BuildPhysicalSetDeactivatedCommand(void)284*8617a60dSAndroid Build Coastguard Worker Command* BuildPhysicalSetDeactivatedCommand(void) {
285*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(uint8_t);
286*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_PhysicalSetDeactivated, size);
287*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_physicalsetdeactivated_cmd";
288*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "deactivated", kTpmRequestHeaderLength);
289*8617a60dSAndroid Build Coastguard Worker   return cmd;
290*8617a60dSAndroid Build Coastguard Worker }
291*8617a60dSAndroid Build Coastguard Worker 
BuildExtendCommand(void)292*8617a60dSAndroid Build Coastguard Worker Command* BuildExtendCommand(void) {
293*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(uint32_t) + kPcrDigestLength;
294*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_Extend, size);
295*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_extend_cmd";
296*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "pcrNum", kTpmRequestHeaderLength);
297*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "inDigest", kTpmRequestHeaderLength + sizeof(uint32_t));
298*8617a60dSAndroid Build Coastguard Worker   return cmd;
299*8617a60dSAndroid Build Coastguard Worker }
300*8617a60dSAndroid Build Coastguard Worker 
BuildGetFlagsCommand(void)301*8617a60dSAndroid Build Coastguard Worker Command* BuildGetFlagsCommand(void) {
302*8617a60dSAndroid Build Coastguard Worker   int size = (kTpmRequestHeaderLength +
303*8617a60dSAndroid Build Coastguard Worker               sizeof(TPM_CAPABILITY_AREA) +   /* capArea */
304*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t) +              /* subCapSize */
305*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t));              /* subCap */
306*8617a60dSAndroid Build Coastguard Worker 
307*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_GetCapability, size);
308*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_getflags_cmd";
309*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
310*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA), TPM_CAP_FLAG);
311*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
312*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA),
313*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), sizeof(uint32_t));
314*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
315*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA) + sizeof(uint32_t),
316*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), TPM_CAP_FLAG_PERMANENT);
317*8617a60dSAndroid Build Coastguard Worker   return cmd;
318*8617a60dSAndroid Build Coastguard Worker }
319*8617a60dSAndroid Build Coastguard Worker 
BuildGetSTClearFlagsCommand(void)320*8617a60dSAndroid Build Coastguard Worker Command* BuildGetSTClearFlagsCommand(void) {
321*8617a60dSAndroid Build Coastguard Worker   int size = (kTpmRequestHeaderLength +
322*8617a60dSAndroid Build Coastguard Worker               sizeof(TPM_CAPABILITY_AREA) +   /* capArea */
323*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t) +              /* subCapSize */
324*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t));              /* subCap */
325*8617a60dSAndroid Build Coastguard Worker 
326*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_GetCapability, size);
327*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_getstclearflags_cmd";
328*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
329*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA), TPM_CAP_FLAG);
330*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
331*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA),
332*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), sizeof(uint32_t));
333*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
334*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA) + sizeof(uint32_t),
335*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), TPM_CAP_FLAG_VOLATILE);
336*8617a60dSAndroid Build Coastguard Worker   return cmd;
337*8617a60dSAndroid Build Coastguard Worker }
338*8617a60dSAndroid Build Coastguard Worker 
BuildGetSpaceInfoCommand(void)339*8617a60dSAndroid Build Coastguard Worker Command* BuildGetSpaceInfoCommand(void) {
340*8617a60dSAndroid Build Coastguard Worker   int size = (kTpmRequestHeaderLength +
341*8617a60dSAndroid Build Coastguard Worker               sizeof(TPM_CAPABILITY_AREA) +   /* capArea */
342*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t) +              /* subCapSize */
343*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t));              /* subCap */
344*8617a60dSAndroid Build Coastguard Worker 
345*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_GetCapability, size);
346*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_getspaceinfo_cmd";
347*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
348*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA), TPM_CAP_NV_INDEX);
349*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
350*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA),
351*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), sizeof(uint32_t));
352*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "index", kTpmRequestHeaderLength +
353*8617a60dSAndroid Build Coastguard Worker                   sizeof(TPM_CAPABILITY_AREA) + sizeof(uint32_t));
354*8617a60dSAndroid Build Coastguard Worker   return cmd;
355*8617a60dSAndroid Build Coastguard Worker }
356*8617a60dSAndroid Build Coastguard Worker 
BuildGetOwnershipCommand(void)357*8617a60dSAndroid Build Coastguard Worker Command* BuildGetOwnershipCommand(void) {
358*8617a60dSAndroid Build Coastguard Worker   int size = (kTpmRequestHeaderLength +
359*8617a60dSAndroid Build Coastguard Worker               sizeof(TPM_CAPABILITY_AREA) +   /* capArea */
360*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t) +              /* subCapSize */
361*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t));              /* subCap */
362*8617a60dSAndroid Build Coastguard Worker 
363*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_GetCapability, size);
364*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_getownership_cmd";
365*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
366*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA), TPM_CAP_PROPERTY);
367*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
368*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA),
369*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), sizeof(uint32_t));
370*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
371*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA) + sizeof(uint32_t),
372*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), TPM_CAP_PROP_OWNER);
373*8617a60dSAndroid Build Coastguard Worker   return cmd;
374*8617a60dSAndroid Build Coastguard Worker }
375*8617a60dSAndroid Build Coastguard Worker 
BuildGetRandomCommand(void)376*8617a60dSAndroid Build Coastguard Worker Command* BuildGetRandomCommand(void) {
377*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(uint32_t);
378*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_GetRandom, size);
379*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_get_random_cmd";
380*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "bytesRequested", kTpmRequestHeaderLength);
381*8617a60dSAndroid Build Coastguard Worker   return cmd;
382*8617a60dSAndroid Build Coastguard Worker }
383*8617a60dSAndroid Build Coastguard Worker 
BuildGetVersionValCommand(void)384*8617a60dSAndroid Build Coastguard Worker Command* BuildGetVersionValCommand(void) {
385*8617a60dSAndroid Build Coastguard Worker   int size = (kTpmRequestHeaderLength +
386*8617a60dSAndroid Build Coastguard Worker               sizeof(TPM_CAPABILITY_AREA) +   /* capArea */
387*8617a60dSAndroid Build Coastguard Worker               sizeof(uint32_t));              /* subCapSize */
388*8617a60dSAndroid Build Coastguard Worker 
389*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_GetCapability, size);
390*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_getversionval_cmd";
391*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
392*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA), TPM_CAP_GET_VERSION_VAL);
393*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
394*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_CAPABILITY_AREA),
395*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), 0);
396*8617a60dSAndroid Build Coastguard Worker   return cmd;
397*8617a60dSAndroid Build Coastguard Worker }
398*8617a60dSAndroid Build Coastguard Worker 
BuildIFXFieldUpgradeInfoRequest2Command(void)399*8617a60dSAndroid Build Coastguard Worker Command* BuildIFXFieldUpgradeInfoRequest2Command(void) {
400*8617a60dSAndroid Build Coastguard Worker   int size = (kTpmRequestHeaderLength +
401*8617a60dSAndroid Build Coastguard Worker               sizeof(TPM_IFX_FieldUpgradeInfoRequest2) +
402*8617a60dSAndroid Build Coastguard Worker               sizeof(uint16_t));
403*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_FieldUpgrade, size);
404*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_ifx_fieldupgradeinforequest2_cmd";
405*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength,
406*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_IFX_FieldUpgradeInfoRequest2),
407*8617a60dSAndroid Build Coastguard Worker                       TPM_IFX_FieldUpgradeInfoRequest2);
408*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength +
409*8617a60dSAndroid Build Coastguard Worker                       sizeof(TPM_IFX_FieldUpgradeInfoRequest2),
410*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint16_t), 0);
411*8617a60dSAndroid Build Coastguard Worker   return cmd;
412*8617a60dSAndroid Build Coastguard Worker }
413*8617a60dSAndroid Build Coastguard Worker 
BuildOIAPCommand(void)414*8617a60dSAndroid Build Coastguard Worker Command* BuildOIAPCommand(void) {
415*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength;
416*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_OIAP, size);
417*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_oiap_cmd";
418*8617a60dSAndroid Build Coastguard Worker   return cmd;
419*8617a60dSAndroid Build Coastguard Worker }
420*8617a60dSAndroid Build Coastguard Worker 
BuildOSAPCommand(void)421*8617a60dSAndroid Build Coastguard Worker Command* BuildOSAPCommand(void) {
422*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + sizeof(uint16_t) + sizeof(uint32_t) +
423*8617a60dSAndroid Build Coastguard Worker              sizeof(TPM_NONCE);
424*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_OSAP, size);
425*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_osap_cmd";
426*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "entityType", kTpmRequestHeaderLength);
427*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "entityValue",
428*8617a60dSAndroid Build Coastguard Worker                   kTpmRequestHeaderLength + sizeof(uint16_t));
429*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(
430*8617a60dSAndroid Build Coastguard Worker       cmd, "nonceOddOSAP",
431*8617a60dSAndroid Build Coastguard Worker       kTpmRequestHeaderLength + sizeof(uint16_t) + sizeof(uint32_t));
432*8617a60dSAndroid Build Coastguard Worker   return cmd;
433*8617a60dSAndroid Build Coastguard Worker }
434*8617a60dSAndroid Build Coastguard Worker 
BuildTakeOwnershipCommand(void)435*8617a60dSAndroid Build Coastguard Worker Command* BuildTakeOwnershipCommand(void) {
436*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommandWithTag(TPM_ORD_TakeOwnership, 624,
437*8617a60dSAndroid Build Coastguard Worker                                    TPM_TAG_RQU_AUTH1_COMMAND);
438*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_takeownership_cmd";
439*8617a60dSAndroid Build Coastguard Worker   int offset = kTpmRequestHeaderLength;
440*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint16_t), TPM_PID_OWNER);
441*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint16_t);
442*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), TPM_RSA_2048_LEN);
443*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
444*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "encOwnerAuth", offset);
445*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint8_t[TPM_RSA_2048_LEN]);
446*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), TPM_RSA_2048_LEN);
447*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
448*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "encSrkAuth", offset);
449*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint8_t[TPM_RSA_2048_LEN]);
450*8617a60dSAndroid Build Coastguard Worker 
451*8617a60dSAndroid Build Coastguard Worker   /* The remainder are the srkParams struct TPM_KEY12 contents. */
452*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint16_t), TPM_TAG_KEY12);
453*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint16_t);
454*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint16_t), 0);
455*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint16_t);
456*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint16_t), TPM_KEY_USAGE_STORAGE);
457*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint16_t);
458*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), 0 /* keyFlags */);
459*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
460*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint8_t), TPM_AUTH_ALWAYS);
461*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint8_t);
462*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), TPM_ALG_RSA);
463*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
464*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint16_t),
465*8617a60dSAndroid Build Coastguard Worker                       TPM_ES_RSAESOAEP_SHA1_MGF1);
466*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint16_t);
467*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint16_t), TPM_SS_NONE);
468*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint16_t);
469*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t),
470*8617a60dSAndroid Build Coastguard Worker                       3 * sizeof(uint32_t) /* algorithmParams.parmSize */);
471*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
472*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t),
473*8617a60dSAndroid Build Coastguard Worker                       2048 /* algorithmParms.parms.keyLength */);
474*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
475*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t),
476*8617a60dSAndroid Build Coastguard Worker                       2 /* algorithmParms.parms.numPrimes */);
477*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
478*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t),
479*8617a60dSAndroid Build Coastguard Worker                       0 /* algorithmParms.parms.exponentSize */);
480*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
481*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), 0 /* PCRInfoSize */);
482*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
483*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), 0 /* pubkey.keyLength */);
484*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
485*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, offset, sizeof(uint32_t), 0 /* encDataSize */);
486*8617a60dSAndroid Build Coastguard Worker   offset += sizeof(uint32_t);
487*8617a60dSAndroid Build Coastguard Worker 
488*8617a60dSAndroid Build Coastguard Worker   /* Allocate space for the auth block. */
489*8617a60dSAndroid Build Coastguard Worker   offset += kTpmRequestAuthBlockLength;
490*8617a60dSAndroid Build Coastguard Worker 
491*8617a60dSAndroid Build Coastguard Worker   assert(offset == cmd->size);
492*8617a60dSAndroid Build Coastguard Worker 
493*8617a60dSAndroid Build Coastguard Worker   return cmd;
494*8617a60dSAndroid Build Coastguard Worker }
495*8617a60dSAndroid Build Coastguard Worker 
BuildCreateDelegationFamilyCommand(void)496*8617a60dSAndroid Build Coastguard Worker Command* BuildCreateDelegationFamilyCommand(void) {
497*8617a60dSAndroid Build Coastguard Worker   int size = kTpmRequestHeaderLength + 3 * sizeof(uint32_t) + sizeof(uint8_t);
498*8617a60dSAndroid Build Coastguard Worker   Command* cmd = newCommand(TPM_ORD_Delegate_Manage, size);
499*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_create_delegation_family_cmd";
500*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength, sizeof(uint32_t),
501*8617a60dSAndroid Build Coastguard Worker                       0 /* familyID */);
502*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength + sizeof(uint32_t),
503*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), TPM_FAMILY_CREATE);
504*8617a60dSAndroid Build Coastguard Worker   AddInitializedField(cmd, kTpmRequestHeaderLength + 2 * sizeof(uint32_t),
505*8617a60dSAndroid Build Coastguard Worker                       sizeof(uint32_t), sizeof(uint8_t) /* opDataSize */);
506*8617a60dSAndroid Build Coastguard Worker   AddVisibleField(cmd, "familyLabel",
507*8617a60dSAndroid Build Coastguard Worker                   kTpmRequestHeaderLength + 3 * sizeof(uint32_t));
508*8617a60dSAndroid Build Coastguard Worker   return cmd;
509*8617a60dSAndroid Build Coastguard Worker }
510*8617a60dSAndroid Build Coastguard Worker 
BuildReadDelegationFamilyTableCommand(void)511*8617a60dSAndroid Build Coastguard Worker Command* BuildReadDelegationFamilyTableCommand(void) {
512*8617a60dSAndroid Build Coastguard Worker   Command* cmd =
513*8617a60dSAndroid Build Coastguard Worker       newCommand(TPM_ORD_Delegate_ReadTable, kTpmRequestHeaderLength);
514*8617a60dSAndroid Build Coastguard Worker   cmd->name = "tpm_delegate_read_table_cmd";
515*8617a60dSAndroid Build Coastguard Worker   return cmd;
516*8617a60dSAndroid Build Coastguard Worker }
517*8617a60dSAndroid Build Coastguard Worker 
518*8617a60dSAndroid Build Coastguard Worker /* Output the fields of a structure.
519*8617a60dSAndroid Build Coastguard Worker  */
OutputFields(Field * fld)520*8617a60dSAndroid Build Coastguard Worker void OutputFields(Field* fld) {
521*8617a60dSAndroid Build Coastguard Worker   /*
522*8617a60dSAndroid Build Coastguard Worker    * Field order is reversed.
523*8617a60dSAndroid Build Coastguard Worker    */
524*8617a60dSAndroid Build Coastguard Worker   if (fld != NULL) {
525*8617a60dSAndroid Build Coastguard Worker     OutputFields(fld->next);
526*8617a60dSAndroid Build Coastguard Worker     if (fld->visible) {
527*8617a60dSAndroid Build Coastguard Worker       printf("  uint16_t %s;\n", fld->name);
528*8617a60dSAndroid Build Coastguard Worker     }
529*8617a60dSAndroid Build Coastguard Worker   }
530*8617a60dSAndroid Build Coastguard Worker }
531*8617a60dSAndroid Build Coastguard Worker 
532*8617a60dSAndroid Build Coastguard Worker /* Outputs a structure initializer.
533*8617a60dSAndroid Build Coastguard Worker  */
OutputBytes_(Command * cmd,Field * fld)534*8617a60dSAndroid Build Coastguard Worker int OutputBytes_(Command* cmd, Field* fld) {
535*8617a60dSAndroid Build Coastguard Worker   int cursor = 0;
536*8617a60dSAndroid Build Coastguard Worker   int i;
537*8617a60dSAndroid Build Coastguard Worker   /*
538*8617a60dSAndroid Build Coastguard Worker    * Field order is reversed.
539*8617a60dSAndroid Build Coastguard Worker    */
540*8617a60dSAndroid Build Coastguard Worker   if (fld != NULL) {
541*8617a60dSAndroid Build Coastguard Worker     cursor = OutputBytes_(cmd, fld->next);
542*8617a60dSAndroid Build Coastguard Worker   } else {
543*8617a60dSAndroid Build Coastguard Worker     return 0;
544*8617a60dSAndroid Build Coastguard Worker   }
545*8617a60dSAndroid Build Coastguard Worker   if (!fld->visible) {
546*8617a60dSAndroid Build Coastguard Worker     /*
547*8617a60dSAndroid Build Coastguard Worker      * Catch up missing fields.
548*8617a60dSAndroid Build Coastguard Worker      */
549*8617a60dSAndroid Build Coastguard Worker     assert(fld->offset >= cursor);
550*8617a60dSAndroid Build Coastguard Worker     for (i = 0; i < fld->offset - cursor; i++) {
551*8617a60dSAndroid Build Coastguard Worker       printf("0, ");
552*8617a60dSAndroid Build Coastguard Worker     }
553*8617a60dSAndroid Build Coastguard Worker     cursor = fld->offset;
554*8617a60dSAndroid Build Coastguard Worker     switch (fld->size) {
555*8617a60dSAndroid Build Coastguard Worker     case 1:
556*8617a60dSAndroid Build Coastguard Worker       printf("%#x, ", fld->value);
557*8617a60dSAndroid Build Coastguard Worker       cursor += 1;
558*8617a60dSAndroid Build Coastguard Worker       break;
559*8617a60dSAndroid Build Coastguard Worker     case 2:
560*8617a60dSAndroid Build Coastguard Worker       printf("%#x, %#x, ", fld->value >> 8, fld->value & 0xff);
561*8617a60dSAndroid Build Coastguard Worker       cursor += 2;
562*8617a60dSAndroid Build Coastguard Worker       break;
563*8617a60dSAndroid Build Coastguard Worker     case 4:
564*8617a60dSAndroid Build Coastguard Worker       printf("%#x, %#x, %#x, %#x, ", fld->value >> 24,
565*8617a60dSAndroid Build Coastguard Worker              (fld->value >> 16) & 0xff,
566*8617a60dSAndroid Build Coastguard Worker              (fld->value >> 8) & 0xff,
567*8617a60dSAndroid Build Coastguard Worker              fld->value & 0xff);
568*8617a60dSAndroid Build Coastguard Worker       cursor += 4;
569*8617a60dSAndroid Build Coastguard Worker       break;
570*8617a60dSAndroid Build Coastguard Worker     default:
571*8617a60dSAndroid Build Coastguard Worker       fprintf(stderr, "invalid field size %d\n", fld->size);
572*8617a60dSAndroid Build Coastguard Worker       exit(1);
573*8617a60dSAndroid Build Coastguard Worker       break;
574*8617a60dSAndroid Build Coastguard Worker     }
575*8617a60dSAndroid Build Coastguard Worker   }
576*8617a60dSAndroid Build Coastguard Worker   return cursor;
577*8617a60dSAndroid Build Coastguard Worker }
578*8617a60dSAndroid Build Coastguard Worker 
579*8617a60dSAndroid Build Coastguard Worker /* Helper to output a structure initializer.
580*8617a60dSAndroid Build Coastguard Worker  */
OutputBytes(Command * cmd)581*8617a60dSAndroid Build Coastguard Worker void OutputBytes(Command* cmd) {
582*8617a60dSAndroid Build Coastguard Worker   (void) OutputBytes_(cmd, cmd->fields);
583*8617a60dSAndroid Build Coastguard Worker }
584*8617a60dSAndroid Build Coastguard Worker 
OutputFieldPointers(Command * cmd,Field * fld)585*8617a60dSAndroid Build Coastguard Worker void OutputFieldPointers(Command* cmd, Field* fld) {
586*8617a60dSAndroid Build Coastguard Worker   if (fld == NULL) {
587*8617a60dSAndroid Build Coastguard Worker     return;
588*8617a60dSAndroid Build Coastguard Worker   } else {
589*8617a60dSAndroid Build Coastguard Worker     OutputFieldPointers(cmd, fld->next);
590*8617a60dSAndroid Build Coastguard Worker     if (fld->visible) {
591*8617a60dSAndroid Build Coastguard Worker       printf("%d, ", fld->offset);
592*8617a60dSAndroid Build Coastguard Worker     }
593*8617a60dSAndroid Build Coastguard Worker   }
594*8617a60dSAndroid Build Coastguard Worker }
595*8617a60dSAndroid Build Coastguard Worker 
596*8617a60dSAndroid Build Coastguard Worker /* Outputs the structure initializers for all commands.
597*8617a60dSAndroid Build Coastguard Worker  */
OutputCommands(Command * cmd)598*8617a60dSAndroid Build Coastguard Worker void OutputCommands(Command* cmd) {
599*8617a60dSAndroid Build Coastguard Worker   if (cmd == NULL) {
600*8617a60dSAndroid Build Coastguard Worker     return;
601*8617a60dSAndroid Build Coastguard Worker   } else {
602*8617a60dSAndroid Build Coastguard Worker     printf("const struct s_%s{\n  uint8_t buffer[%d];\n",
603*8617a60dSAndroid Build Coastguard Worker            cmd->name, cmd->size == 0 ? cmd->max_size : cmd->size);
604*8617a60dSAndroid Build Coastguard Worker     OutputFields(cmd->fields);
605*8617a60dSAndroid Build Coastguard Worker     printf("} %s = {{", cmd->name);
606*8617a60dSAndroid Build Coastguard Worker     OutputBytes(cmd);
607*8617a60dSAndroid Build Coastguard Worker     printf("},\n");
608*8617a60dSAndroid Build Coastguard Worker     OutputFieldPointers(cmd, cmd->fields);
609*8617a60dSAndroid Build Coastguard Worker     printf("};\n\n");
610*8617a60dSAndroid Build Coastguard Worker   }
611*8617a60dSAndroid Build Coastguard Worker   OutputCommands(cmd->next);
612*8617a60dSAndroid Build Coastguard Worker }
613*8617a60dSAndroid Build Coastguard Worker 
614*8617a60dSAndroid Build Coastguard Worker Command* (*builders[])(void) = {
615*8617a60dSAndroid Build Coastguard Worker   BuildDefineSpaceCommand,
616*8617a60dSAndroid Build Coastguard Worker   BuildWriteCommand,
617*8617a60dSAndroid Build Coastguard Worker   BuildReadCommand,
618*8617a60dSAndroid Build Coastguard Worker   BuildPCRReadCommand,
619*8617a60dSAndroid Build Coastguard Worker   BuildPPAssertCommand,
620*8617a60dSAndroid Build Coastguard Worker   BuildPPEnableCommand,
621*8617a60dSAndroid Build Coastguard Worker   BuildPPLockCommand,
622*8617a60dSAndroid Build Coastguard Worker   BuildFinalizePPCommand,
623*8617a60dSAndroid Build Coastguard Worker   BuildStartupCommand,
624*8617a60dSAndroid Build Coastguard Worker   BuildSaveStateCommand,
625*8617a60dSAndroid Build Coastguard Worker   BuildResumeCommand,
626*8617a60dSAndroid Build Coastguard Worker   BuildSelftestfullCommand,
627*8617a60dSAndroid Build Coastguard Worker   BuildContinueSelfTestCommand,
628*8617a60dSAndroid Build Coastguard Worker   BuildReadPubekCommand,
629*8617a60dSAndroid Build Coastguard Worker   BuildForceClearCommand,
630*8617a60dSAndroid Build Coastguard Worker   BuildPhysicalDisableCommand,
631*8617a60dSAndroid Build Coastguard Worker   BuildPhysicalEnableCommand,
632*8617a60dSAndroid Build Coastguard Worker   BuildPhysicalSetDeactivatedCommand,
633*8617a60dSAndroid Build Coastguard Worker   BuildGetFlagsCommand,
634*8617a60dSAndroid Build Coastguard Worker   BuildGetSTClearFlagsCommand,
635*8617a60dSAndroid Build Coastguard Worker   BuildGetSpaceInfoCommand,
636*8617a60dSAndroid Build Coastguard Worker   BuildGetOwnershipCommand,
637*8617a60dSAndroid Build Coastguard Worker   BuildGetRandomCommand,
638*8617a60dSAndroid Build Coastguard Worker   BuildExtendCommand,
639*8617a60dSAndroid Build Coastguard Worker   BuildGetVersionValCommand,
640*8617a60dSAndroid Build Coastguard Worker   BuildIFXFieldUpgradeInfoRequest2Command,
641*8617a60dSAndroid Build Coastguard Worker   BuildOIAPCommand,
642*8617a60dSAndroid Build Coastguard Worker   BuildOSAPCommand,
643*8617a60dSAndroid Build Coastguard Worker   BuildTakeOwnershipCommand,
644*8617a60dSAndroid Build Coastguard Worker   BuildCreateDelegationFamilyCommand,
645*8617a60dSAndroid Build Coastguard Worker   BuildReadDelegationFamilyTableCommand,
646*8617a60dSAndroid Build Coastguard Worker };
647*8617a60dSAndroid Build Coastguard Worker 
FreeFields(Field * fld)648*8617a60dSAndroid Build Coastguard Worker static void FreeFields(Field* fld) {
649*8617a60dSAndroid Build Coastguard Worker   if (fld != NULL) {
650*8617a60dSAndroid Build Coastguard Worker     Field* next_field = fld->next;
651*8617a60dSAndroid Build Coastguard Worker     free(fld);
652*8617a60dSAndroid Build Coastguard Worker     FreeFields(next_field);
653*8617a60dSAndroid Build Coastguard Worker   }
654*8617a60dSAndroid Build Coastguard Worker }
655*8617a60dSAndroid Build Coastguard Worker 
FreeCommands(Command * cmd)656*8617a60dSAndroid Build Coastguard Worker static void FreeCommands(Command* cmd) {
657*8617a60dSAndroid Build Coastguard Worker   if (cmd != NULL) {
658*8617a60dSAndroid Build Coastguard Worker     Command* next_command = cmd->next;
659*8617a60dSAndroid Build Coastguard Worker     FreeFields(cmd->fields);
660*8617a60dSAndroid Build Coastguard Worker     free(cmd);
661*8617a60dSAndroid Build Coastguard Worker     FreeCommands(next_command);
662*8617a60dSAndroid Build Coastguard Worker   }
663*8617a60dSAndroid Build Coastguard Worker }
664*8617a60dSAndroid Build Coastguard Worker 
main(void)665*8617a60dSAndroid Build Coastguard Worker int main(void) {
666*8617a60dSAndroid Build Coastguard Worker   Command* commands = NULL;
667*8617a60dSAndroid Build Coastguard Worker   int i;
668*8617a60dSAndroid Build Coastguard Worker   for (i = 0; i < sizeof(builders) / sizeof(builders[0]); i++) {
669*8617a60dSAndroid Build Coastguard Worker     Command* cmd = builders[i]();
670*8617a60dSAndroid Build Coastguard Worker     cmd->next = commands;
671*8617a60dSAndroid Build Coastguard Worker     commands = cmd;
672*8617a60dSAndroid Build Coastguard Worker   }
673*8617a60dSAndroid Build Coastguard Worker 
674*8617a60dSAndroid Build Coastguard Worker   printf("/* This file is automatically generated */\n\n");
675*8617a60dSAndroid Build Coastguard Worker   OutputCommands(commands);
676*8617a60dSAndroid Build Coastguard Worker   printf("const int kWriteInfoLength = %d;\n", (int) sizeof(TPM_WRITE_INFO));
677*8617a60dSAndroid Build Coastguard Worker 
678*8617a60dSAndroid Build Coastguard Worker   FreeCommands(commands);
679*8617a60dSAndroid Build Coastguard Worker   return 0;
680*8617a60dSAndroid Build Coastguard Worker }
681