xref: /openbmc/u-boot/cmd/tpm-v1.c (revision ddca9f09)
1d677bfe2SMiquel Raynal // SPDX-License-Identifier: GPL-2.0+
2d677bfe2SMiquel Raynal /*
3d677bfe2SMiquel Raynal  * Copyright (c) 2013 The Chromium OS Authors.
4d677bfe2SMiquel Raynal  */
5d677bfe2SMiquel Raynal 
6d677bfe2SMiquel Raynal #include <common.h>
7*ddca9f09SEddie James #include <command.h>
8*ddca9f09SEddie James #include <env.h>
9d677bfe2SMiquel Raynal #include <malloc.h>
10d677bfe2SMiquel Raynal #include <asm/unaligned.h>
11d677bfe2SMiquel Raynal #include <tpm-common.h>
12d677bfe2SMiquel Raynal #include <tpm-v1.h>
13d677bfe2SMiquel Raynal #include "tpm-user-utils.h"
14*ddca9f09SEddie James #include <tpm_api.h>
15d677bfe2SMiquel Raynal 
do_tpm_startup(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])16d677bfe2SMiquel Raynal static int do_tpm_startup(cmd_tbl_t *cmdtp, int flag, int argc,
17d677bfe2SMiquel Raynal 			  char *const argv[])
18d677bfe2SMiquel Raynal {
19d677bfe2SMiquel Raynal 	enum tpm_startup_type mode;
20abdc7b8aSSimon Glass 	struct udevice *dev;
21abdc7b8aSSimon Glass 	int rc;
22d677bfe2SMiquel Raynal 
23abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
24abdc7b8aSSimon Glass 	if (rc)
25abdc7b8aSSimon Glass 		return rc;
26d677bfe2SMiquel Raynal 	if (argc != 2)
27d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
28d677bfe2SMiquel Raynal 	if (!strcasecmp("TPM_ST_CLEAR", argv[1])) {
29d677bfe2SMiquel Raynal 		mode = TPM_ST_CLEAR;
30d677bfe2SMiquel Raynal 	} else if (!strcasecmp("TPM_ST_STATE", argv[1])) {
31d677bfe2SMiquel Raynal 		mode = TPM_ST_STATE;
32d677bfe2SMiquel Raynal 	} else if (!strcasecmp("TPM_ST_DEACTIVATED", argv[1])) {
33d677bfe2SMiquel Raynal 		mode = TPM_ST_DEACTIVATED;
34d677bfe2SMiquel Raynal 	} else {
35d677bfe2SMiquel Raynal 		printf("Couldn't recognize mode string: %s\n", argv[1]);
36d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
37d677bfe2SMiquel Raynal 	}
38d677bfe2SMiquel Raynal 
39abdc7b8aSSimon Glass 	return report_return_code(tpm_startup(dev, mode));
40d677bfe2SMiquel Raynal }
41d677bfe2SMiquel Raynal 
do_tpm_nv_define_space(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])42d677bfe2SMiquel Raynal static int do_tpm_nv_define_space(cmd_tbl_t *cmdtp, int flag, int argc,
43d677bfe2SMiquel Raynal 				  char *const argv[])
44d677bfe2SMiquel Raynal {
45d677bfe2SMiquel Raynal 	u32 index, perm, size;
46abdc7b8aSSimon Glass 	struct udevice *dev;
47abdc7b8aSSimon Glass 	int rc;
48abdc7b8aSSimon Glass 
49abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
50abdc7b8aSSimon Glass 	if (rc)
51abdc7b8aSSimon Glass 		return rc;
52d677bfe2SMiquel Raynal 
53d677bfe2SMiquel Raynal 	if (argc != 4)
54d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
55d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[1], NULL, 0);
56d677bfe2SMiquel Raynal 	perm = simple_strtoul(argv[2], NULL, 0);
57d677bfe2SMiquel Raynal 	size = simple_strtoul(argv[3], NULL, 0);
58d677bfe2SMiquel Raynal 
59*ddca9f09SEddie James 	return report_return_code(tpm1_nv_define_space(dev, index, perm, size));
60d677bfe2SMiquel Raynal }
61d677bfe2SMiquel Raynal 
do_tpm_nv_read_value(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])62d677bfe2SMiquel Raynal static int do_tpm_nv_read_value(cmd_tbl_t *cmdtp, int flag, int argc,
63d677bfe2SMiquel Raynal 				char *const argv[])
64d677bfe2SMiquel Raynal {
65d677bfe2SMiquel Raynal 	u32 index, count, rc;
66abdc7b8aSSimon Glass 	struct udevice *dev;
67d677bfe2SMiquel Raynal 	void *data;
68d677bfe2SMiquel Raynal 
69abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
70abdc7b8aSSimon Glass 	if (rc)
71abdc7b8aSSimon Glass 		return rc;
72abdc7b8aSSimon Glass 
73d677bfe2SMiquel Raynal 	if (argc != 4)
74d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
75d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[1], NULL, 0);
76d677bfe2SMiquel Raynal 	data = (void *)simple_strtoul(argv[2], NULL, 0);
77d677bfe2SMiquel Raynal 	count = simple_strtoul(argv[3], NULL, 0);
78d677bfe2SMiquel Raynal 
79abdc7b8aSSimon Glass 	rc = tpm_nv_read_value(dev, index, data, count);
80d677bfe2SMiquel Raynal 	if (!rc) {
81d677bfe2SMiquel Raynal 		puts("area content:\n");
82d677bfe2SMiquel Raynal 		print_byte_string(data, count);
83d677bfe2SMiquel Raynal 	}
84d677bfe2SMiquel Raynal 
85d677bfe2SMiquel Raynal 	return report_return_code(rc);
86d677bfe2SMiquel Raynal }
87d677bfe2SMiquel Raynal 
do_tpm_nv_write_value(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])88d677bfe2SMiquel Raynal static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag, int argc,
89d677bfe2SMiquel Raynal 				 char *const argv[])
90d677bfe2SMiquel Raynal {
91abdc7b8aSSimon Glass 	struct udevice *dev;
92d677bfe2SMiquel Raynal 	u32 index, rc;
93d677bfe2SMiquel Raynal 	size_t count;
94d677bfe2SMiquel Raynal 	void *data;
95d677bfe2SMiquel Raynal 
96abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
97abdc7b8aSSimon Glass 	if (rc)
98abdc7b8aSSimon Glass 		return rc;
99abdc7b8aSSimon Glass 
100d677bfe2SMiquel Raynal 	if (argc != 3)
101d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
102d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[1], NULL, 0);
103d677bfe2SMiquel Raynal 	data = parse_byte_string(argv[2], NULL, &count);
104d677bfe2SMiquel Raynal 	if (!data) {
105d677bfe2SMiquel Raynal 		printf("Couldn't parse byte string %s\n", argv[2]);
106d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
107d677bfe2SMiquel Raynal 	}
108d677bfe2SMiquel Raynal 
109abdc7b8aSSimon Glass 	rc = tpm_nv_write_value(dev, index, data, count);
110d677bfe2SMiquel Raynal 	free(data);
111d677bfe2SMiquel Raynal 
112d677bfe2SMiquel Raynal 	return report_return_code(rc);
113d677bfe2SMiquel Raynal }
114d677bfe2SMiquel Raynal 
do_tpm_extend(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])115d677bfe2SMiquel Raynal static int do_tpm_extend(cmd_tbl_t *cmdtp, int flag, int argc,
116d677bfe2SMiquel Raynal 			 char *const argv[])
117d677bfe2SMiquel Raynal {
118d677bfe2SMiquel Raynal 	u8 in_digest[20], out_digest[20];
119abdc7b8aSSimon Glass 	struct udevice *dev;
120abdc7b8aSSimon Glass 	u32 index, rc;
121abdc7b8aSSimon Glass 
122abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
123abdc7b8aSSimon Glass 	if (rc)
124abdc7b8aSSimon Glass 		return rc;
125d677bfe2SMiquel Raynal 
126d677bfe2SMiquel Raynal 	if (argc != 3)
127d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
128d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[1], NULL, 0);
129d677bfe2SMiquel Raynal 	if (!parse_byte_string(argv[2], in_digest, NULL)) {
130d677bfe2SMiquel Raynal 		printf("Couldn't parse byte string %s\n", argv[2]);
131d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
132d677bfe2SMiquel Raynal 	}
133d677bfe2SMiquel Raynal 
134*ddca9f09SEddie James 	rc = tpm_pcr_extend(dev, index, in_digest, sizeof(in_digest),
135*ddca9f09SEddie James 			    out_digest, "cmd");
136d677bfe2SMiquel Raynal 	if (!rc) {
137d677bfe2SMiquel Raynal 		puts("PCR value after execution of the command:\n");
138d677bfe2SMiquel Raynal 		print_byte_string(out_digest, sizeof(out_digest));
139d677bfe2SMiquel Raynal 	}
140d677bfe2SMiquel Raynal 
141d677bfe2SMiquel Raynal 	return report_return_code(rc);
142d677bfe2SMiquel Raynal }
143d677bfe2SMiquel Raynal 
do_tpm_pcr_read(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])144d677bfe2SMiquel Raynal static int do_tpm_pcr_read(cmd_tbl_t *cmdtp, int flag, int argc,
145d677bfe2SMiquel Raynal 			   char *const argv[])
146d677bfe2SMiquel Raynal {
147d677bfe2SMiquel Raynal 	u32 index, count, rc;
148abdc7b8aSSimon Glass 	struct udevice *dev;
149d677bfe2SMiquel Raynal 	void *data;
150d677bfe2SMiquel Raynal 
151abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
152abdc7b8aSSimon Glass 	if (rc)
153abdc7b8aSSimon Glass 		return rc;
154abdc7b8aSSimon Glass 
155d677bfe2SMiquel Raynal 	if (argc != 4)
156d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
157d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[1], NULL, 0);
158d677bfe2SMiquel Raynal 	data = (void *)simple_strtoul(argv[2], NULL, 0);
159d677bfe2SMiquel Raynal 	count = simple_strtoul(argv[3], NULL, 0);
160d677bfe2SMiquel Raynal 
161abdc7b8aSSimon Glass 	rc = tpm_pcr_read(dev, index, data, count);
162d677bfe2SMiquel Raynal 	if (!rc) {
163d677bfe2SMiquel Raynal 		puts("Named PCR content:\n");
164d677bfe2SMiquel Raynal 		print_byte_string(data, count);
165d677bfe2SMiquel Raynal 	}
166d677bfe2SMiquel Raynal 
167d677bfe2SMiquel Raynal 	return report_return_code(rc);
168d677bfe2SMiquel Raynal }
169d677bfe2SMiquel Raynal 
do_tpm_tsc_physical_presence(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])170*ddca9f09SEddie James static int do_tpm_tsc_physical_presence(cmd_tbl_t *cmdtp, int flag,
171*ddca9f09SEddie James 					int argc, char *const argv[])
172d677bfe2SMiquel Raynal {
173abdc7b8aSSimon Glass 	struct udevice *dev;
174d677bfe2SMiquel Raynal 	u16 presence;
175abdc7b8aSSimon Glass 	int rc;
176abdc7b8aSSimon Glass 
177abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
178abdc7b8aSSimon Glass 	if (rc)
179abdc7b8aSSimon Glass 		return rc;
180d677bfe2SMiquel Raynal 
181d677bfe2SMiquel Raynal 	if (argc != 2)
182d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
183d677bfe2SMiquel Raynal 	presence = (u16)simple_strtoul(argv[1], NULL, 0);
184d677bfe2SMiquel Raynal 
185abdc7b8aSSimon Glass 	return report_return_code(tpm_tsc_physical_presence(dev, presence));
186d677bfe2SMiquel Raynal }
187d677bfe2SMiquel Raynal 
do_tpm_read_pubek(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])188d677bfe2SMiquel Raynal static int do_tpm_read_pubek(cmd_tbl_t *cmdtp, int flag, int argc,
189d677bfe2SMiquel Raynal 			     char *const argv[])
190d677bfe2SMiquel Raynal {
191abdc7b8aSSimon Glass 	struct udevice *dev;
192d677bfe2SMiquel Raynal 	u32 count, rc;
193d677bfe2SMiquel Raynal 	void *data;
194d677bfe2SMiquel Raynal 
195abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
196abdc7b8aSSimon Glass 	if (rc)
197abdc7b8aSSimon Glass 		return rc;
198abdc7b8aSSimon Glass 
199d677bfe2SMiquel Raynal 	if (argc != 3)
200d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
201d677bfe2SMiquel Raynal 	data = (void *)simple_strtoul(argv[1], NULL, 0);
202d677bfe2SMiquel Raynal 	count = simple_strtoul(argv[2], NULL, 0);
203d677bfe2SMiquel Raynal 
204abdc7b8aSSimon Glass 	rc = tpm_read_pubek(dev, data, count);
205d677bfe2SMiquel Raynal 	if (!rc) {
206d677bfe2SMiquel Raynal 		puts("pubek value:\n");
207d677bfe2SMiquel Raynal 		print_byte_string(data, count);
208d677bfe2SMiquel Raynal 	}
209d677bfe2SMiquel Raynal 
210d677bfe2SMiquel Raynal 	return report_return_code(rc);
211d677bfe2SMiquel Raynal }
212d677bfe2SMiquel Raynal 
do_tpm_physical_set_deactivated(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])213*ddca9f09SEddie James static int do_tpm_physical_set_deactivated(cmd_tbl_t *cmdtp, int flag,
214*ddca9f09SEddie James 					   int argc, char *const argv[])
215d677bfe2SMiquel Raynal {
216abdc7b8aSSimon Glass 	struct udevice *dev;
217d677bfe2SMiquel Raynal 	u8 state;
218abdc7b8aSSimon Glass 	int rc;
219abdc7b8aSSimon Glass 
220abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
221abdc7b8aSSimon Glass 	if (rc)
222abdc7b8aSSimon Glass 		return rc;
223d677bfe2SMiquel Raynal 
224d677bfe2SMiquel Raynal 	if (argc != 2)
225d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
226d677bfe2SMiquel Raynal 	state = (u8)simple_strtoul(argv[1], NULL, 0);
227d677bfe2SMiquel Raynal 
228abdc7b8aSSimon Glass 	return report_return_code(tpm_physical_set_deactivated(dev, state));
229d677bfe2SMiquel Raynal }
230d677bfe2SMiquel Raynal 
do_tpm_get_capability(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])231d677bfe2SMiquel Raynal static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc,
232d677bfe2SMiquel Raynal 				 char *const argv[])
233d677bfe2SMiquel Raynal {
234d677bfe2SMiquel Raynal 	u32 cap_area, sub_cap, rc;
235d677bfe2SMiquel Raynal 	void *cap;
236d677bfe2SMiquel Raynal 	size_t count;
237abdc7b8aSSimon Glass 	struct udevice *dev;
238abdc7b8aSSimon Glass 
239abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
240abdc7b8aSSimon Glass 	if (rc)
241abdc7b8aSSimon Glass 		return rc;
242d677bfe2SMiquel Raynal 
243d677bfe2SMiquel Raynal 	if (argc != 5)
244d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
245d677bfe2SMiquel Raynal 	cap_area = simple_strtoul(argv[1], NULL, 0);
246d677bfe2SMiquel Raynal 	sub_cap = simple_strtoul(argv[2], NULL, 0);
247d677bfe2SMiquel Raynal 	cap = (void *)simple_strtoul(argv[3], NULL, 0);
248d677bfe2SMiquel Raynal 	count = simple_strtoul(argv[4], NULL, 0);
249d677bfe2SMiquel Raynal 
250abdc7b8aSSimon Glass 	rc = tpm_get_capability(dev, cap_area, sub_cap, cap, count);
251d677bfe2SMiquel Raynal 	if (!rc) {
252d677bfe2SMiquel Raynal 		puts("capability information:\n");
253d677bfe2SMiquel Raynal 		print_byte_string(cap, count);
254d677bfe2SMiquel Raynal 	}
255d677bfe2SMiquel Raynal 
256d677bfe2SMiquel Raynal 	return report_return_code(rc);
257d677bfe2SMiquel Raynal }
258d677bfe2SMiquel Raynal 
do_tpm_raw_transfer(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])259d677bfe2SMiquel Raynal static int do_tpm_raw_transfer(cmd_tbl_t *cmdtp, int flag, int argc,
260d677bfe2SMiquel Raynal 			       char *const argv[])
261d677bfe2SMiquel Raynal {
262d677bfe2SMiquel Raynal 	struct udevice *dev;
263d677bfe2SMiquel Raynal 	void *command;
264d677bfe2SMiquel Raynal 	u8 response[1024];
265d677bfe2SMiquel Raynal 	size_t count, response_length = sizeof(response);
266d677bfe2SMiquel Raynal 	u32 rc;
267d677bfe2SMiquel Raynal 
268d677bfe2SMiquel Raynal 	command = parse_byte_string(argv[1], NULL, &count);
269d677bfe2SMiquel Raynal 	if (!command) {
270d677bfe2SMiquel Raynal 		printf("Couldn't parse byte string %s\n", argv[1]);
271d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
272d677bfe2SMiquel Raynal 	}
273d677bfe2SMiquel Raynal 
274d677bfe2SMiquel Raynal 	rc = get_tpm(&dev);
275d677bfe2SMiquel Raynal 	if (rc)
276d677bfe2SMiquel Raynal 		return rc;
277d677bfe2SMiquel Raynal 
278d677bfe2SMiquel Raynal 	rc = tpm_xfer(dev, command, count, response, &response_length);
279d677bfe2SMiquel Raynal 	free(command);
280d677bfe2SMiquel Raynal 	if (!rc) {
281d677bfe2SMiquel Raynal 		puts("tpm response:\n");
282d677bfe2SMiquel Raynal 		print_byte_string(response, response_length);
283d677bfe2SMiquel Raynal 	}
284d677bfe2SMiquel Raynal 
285d677bfe2SMiquel Raynal 	return report_return_code(rc);
286d677bfe2SMiquel Raynal }
287d677bfe2SMiquel Raynal 
do_tpm_nv_define(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])288d677bfe2SMiquel Raynal static int do_tpm_nv_define(cmd_tbl_t *cmdtp, int flag, int argc,
289d677bfe2SMiquel Raynal 			    char *const argv[])
290d677bfe2SMiquel Raynal {
291d677bfe2SMiquel Raynal 	u32 index, perm, size;
292abdc7b8aSSimon Glass 	struct udevice *dev;
293abdc7b8aSSimon Glass 	int rc;
294abdc7b8aSSimon Glass 
295abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
296abdc7b8aSSimon Glass 	if (rc)
297abdc7b8aSSimon Glass 		return rc;
298d677bfe2SMiquel Raynal 
299d677bfe2SMiquel Raynal 	if (argc != 4)
300d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
301d677bfe2SMiquel Raynal 	size = type_string_get_space_size(argv[1]);
302d677bfe2SMiquel Raynal 	if (!size) {
303d677bfe2SMiquel Raynal 		printf("Couldn't parse arguments\n");
304d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
305d677bfe2SMiquel Raynal 	}
306d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[2], NULL, 0);
307d677bfe2SMiquel Raynal 	perm = simple_strtoul(argv[3], NULL, 0);
308d677bfe2SMiquel Raynal 
309*ddca9f09SEddie James 	return report_return_code(tpm1_nv_define_space(dev, index, perm, size));
310d677bfe2SMiquel Raynal }
311d677bfe2SMiquel Raynal 
do_tpm_nv_read(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])312d677bfe2SMiquel Raynal static int do_tpm_nv_read(cmd_tbl_t *cmdtp, int flag, int argc,
313d677bfe2SMiquel Raynal 			  char *const argv[])
314d677bfe2SMiquel Raynal {
315d677bfe2SMiquel Raynal 	u32 index, count, err;
316abdc7b8aSSimon Glass 	struct udevice *dev;
317d677bfe2SMiquel Raynal 	void *data;
318abdc7b8aSSimon Glass 	int rc;
319abdc7b8aSSimon Glass 
320abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
321abdc7b8aSSimon Glass 	if (rc)
322abdc7b8aSSimon Glass 		return rc;
323d677bfe2SMiquel Raynal 
324d677bfe2SMiquel Raynal 	if (argc < 3)
325d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
326d677bfe2SMiquel Raynal 	if (argc != 3 + type_string_get_num_values(argv[1]))
327d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
328d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[2], NULL, 0);
329d677bfe2SMiquel Raynal 	data = type_string_alloc(argv[1], &count);
330d677bfe2SMiquel Raynal 	if (!data) {
331d677bfe2SMiquel Raynal 		printf("Couldn't parse arguments\n");
332d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
333d677bfe2SMiquel Raynal 	}
334d677bfe2SMiquel Raynal 
335abdc7b8aSSimon Glass 	err = tpm_nv_read_value(dev, index, data, count);
336d677bfe2SMiquel Raynal 	if (!err) {
337d677bfe2SMiquel Raynal 		if (type_string_write_vars(argv[1], data, argv + 3)) {
338d677bfe2SMiquel Raynal 			printf("Couldn't write to variables\n");
339d677bfe2SMiquel Raynal 			err = ~0;
340d677bfe2SMiquel Raynal 		}
341d677bfe2SMiquel Raynal 	}
342d677bfe2SMiquel Raynal 	free(data);
343d677bfe2SMiquel Raynal 
344d677bfe2SMiquel Raynal 	return report_return_code(err);
345d677bfe2SMiquel Raynal }
346d677bfe2SMiquel Raynal 
do_tpm_nv_write(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])347d677bfe2SMiquel Raynal static int do_tpm_nv_write(cmd_tbl_t *cmdtp, int flag, int argc,
348d677bfe2SMiquel Raynal 			   char *const argv[])
349d677bfe2SMiquel Raynal {
350d677bfe2SMiquel Raynal 	u32 index, count, err;
351abdc7b8aSSimon Glass 	struct udevice *dev;
352d677bfe2SMiquel Raynal 	void *data;
353abdc7b8aSSimon Glass 	int rc;
354abdc7b8aSSimon Glass 
355abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
356abdc7b8aSSimon Glass 	if (rc)
357abdc7b8aSSimon Glass 		return rc;
358d677bfe2SMiquel Raynal 
359d677bfe2SMiquel Raynal 	if (argc < 3)
360d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
361d677bfe2SMiquel Raynal 	if (argc != 3 + type_string_get_num_values(argv[1]))
362d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
363d677bfe2SMiquel Raynal 	index = simple_strtoul(argv[2], NULL, 0);
364d677bfe2SMiquel Raynal 	data = type_string_alloc(argv[1], &count);
365d677bfe2SMiquel Raynal 	if (!data) {
366d677bfe2SMiquel Raynal 		printf("Couldn't parse arguments\n");
367d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
368d677bfe2SMiquel Raynal 	}
369d677bfe2SMiquel Raynal 	if (type_string_pack(argv[1], argv + 3, data)) {
370d677bfe2SMiquel Raynal 		printf("Couldn't parse arguments\n");
371d677bfe2SMiquel Raynal 		free(data);
372d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
373d677bfe2SMiquel Raynal 	}
374d677bfe2SMiquel Raynal 
375abdc7b8aSSimon Glass 	err = tpm_nv_write_value(dev, index, data, count);
376d677bfe2SMiquel Raynal 	free(data);
377d677bfe2SMiquel Raynal 
378d677bfe2SMiquel Raynal 	return report_return_code(err);
379d677bfe2SMiquel Raynal }
380d677bfe2SMiquel Raynal 
381d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_AUTH_SESSIONS
382d677bfe2SMiquel Raynal 
do_tpm_oiap(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])383d677bfe2SMiquel Raynal static int do_tpm_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
384d677bfe2SMiquel Raynal 		       char *const argv[])
385d677bfe2SMiquel Raynal {
386d677bfe2SMiquel Raynal 	u32 auth_handle, err;
387abdc7b8aSSimon Glass 	struct udevice *dev;
388abdc7b8aSSimon Glass 	int rc;
389d677bfe2SMiquel Raynal 
390abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
391abdc7b8aSSimon Glass 	if (rc)
392abdc7b8aSSimon Glass 		return rc;
393abdc7b8aSSimon Glass 
394*ddca9f09SEddie James 	err = tpm1_oiap(dev, &auth_handle);
395d677bfe2SMiquel Raynal 
396d677bfe2SMiquel Raynal 	return report_return_code(err);
397d677bfe2SMiquel Raynal }
398d677bfe2SMiquel Raynal 
399d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
do_tpm_load_key_by_sha1(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])400*ddca9f09SEddie James static int do_tpm_load_key_by_sha1(cmd_tbl_t *cmdtp, int flag, int argc,
401*ddca9f09SEddie James 				   char *const argv[])
402d677bfe2SMiquel Raynal {
403d677bfe2SMiquel Raynal 	u32 parent_handle = 0;
404d677bfe2SMiquel Raynal 	u32 key_len, key_handle, err;
405d677bfe2SMiquel Raynal 	u8 usage_auth[DIGEST_LENGTH];
406d677bfe2SMiquel Raynal 	u8 parent_hash[DIGEST_LENGTH];
407d677bfe2SMiquel Raynal 	void *key;
408abdc7b8aSSimon Glass 	struct udevice *dev;
409abdc7b8aSSimon Glass 
410*ddca9f09SEddie James 	err = get_tpm(&dev);
411*ddca9f09SEddie James 	if (err)
412*ddca9f09SEddie James 		return err;
413d677bfe2SMiquel Raynal 
414d677bfe2SMiquel Raynal 	if (argc < 5)
415d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
416d677bfe2SMiquel Raynal 
417d677bfe2SMiquel Raynal 	parse_byte_string(argv[1], parent_hash, NULL);
418d677bfe2SMiquel Raynal 	key = (void *)simple_strtoul(argv[2], NULL, 0);
419d677bfe2SMiquel Raynal 	key_len = simple_strtoul(argv[3], NULL, 0);
420d677bfe2SMiquel Raynal 	if (strlen(argv[4]) != 2 * DIGEST_LENGTH)
421d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
422d677bfe2SMiquel Raynal 	parse_byte_string(argv[4], usage_auth, NULL);
423d677bfe2SMiquel Raynal 
424*ddca9f09SEddie James 	err = tpm1_find_key_sha1(dev, usage_auth, parent_hash, &parent_handle);
425d677bfe2SMiquel Raynal 	if (err) {
426d677bfe2SMiquel Raynal 		printf("Could not find matching parent key (err = %d)\n", err);
427d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
428d677bfe2SMiquel Raynal 	}
429d677bfe2SMiquel Raynal 
430d677bfe2SMiquel Raynal 	printf("Found parent key %08x\n", parent_handle);
431d677bfe2SMiquel Raynal 
432*ddca9f09SEddie James 	err = tpm1_load_key2_oiap(dev, parent_handle, key, key_len, usage_auth,
433d677bfe2SMiquel Raynal 				 &key_handle);
434d677bfe2SMiquel Raynal 	if (!err) {
435d677bfe2SMiquel Raynal 		printf("Key handle is 0x%x\n", key_handle);
436d677bfe2SMiquel Raynal 		env_set_hex("key_handle", key_handle);
437d677bfe2SMiquel Raynal 	}
438d677bfe2SMiquel Raynal 
439d677bfe2SMiquel Raynal 	return report_return_code(err);
440d677bfe2SMiquel Raynal }
441d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
442d677bfe2SMiquel Raynal 
do_tpm_load_key2_oiap(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])443d677bfe2SMiquel Raynal static int do_tpm_load_key2_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
444d677bfe2SMiquel Raynal 				 char *const argv[])
445d677bfe2SMiquel Raynal {
446d677bfe2SMiquel Raynal 	u32 parent_handle, key_len, key_handle, err;
447d677bfe2SMiquel Raynal 	u8 usage_auth[DIGEST_LENGTH];
448d677bfe2SMiquel Raynal 	void *key;
449abdc7b8aSSimon Glass 	struct udevice *dev;
450abdc7b8aSSimon Glass 	int rc;
451abdc7b8aSSimon Glass 
452abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
453abdc7b8aSSimon Glass 	if (rc)
454abdc7b8aSSimon Glass 		return rc;
455d677bfe2SMiquel Raynal 
456d677bfe2SMiquel Raynal 	if (argc < 5)
457d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
458d677bfe2SMiquel Raynal 
459d677bfe2SMiquel Raynal 	parent_handle = simple_strtoul(argv[1], NULL, 0);
460d677bfe2SMiquel Raynal 	key = (void *)simple_strtoul(argv[2], NULL, 0);
461d677bfe2SMiquel Raynal 	key_len = simple_strtoul(argv[3], NULL, 0);
462d677bfe2SMiquel Raynal 	if (strlen(argv[4]) != 2 * DIGEST_LENGTH)
463d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
464d677bfe2SMiquel Raynal 	parse_byte_string(argv[4], usage_auth, NULL);
465d677bfe2SMiquel Raynal 
466*ddca9f09SEddie James 	err = tpm1_load_key2_oiap(dev, parent_handle, key, key_len, usage_auth,
467d677bfe2SMiquel Raynal 				  &key_handle);
468d677bfe2SMiquel Raynal 	if (!err)
469d677bfe2SMiquel Raynal 		printf("Key handle is 0x%x\n", key_handle);
470d677bfe2SMiquel Raynal 
471d677bfe2SMiquel Raynal 	return report_return_code(err);
472d677bfe2SMiquel Raynal }
473d677bfe2SMiquel Raynal 
do_tpm_get_pub_key_oiap(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])474d677bfe2SMiquel Raynal static int do_tpm_get_pub_key_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
475d677bfe2SMiquel Raynal 				   char *const argv[])
476d677bfe2SMiquel Raynal {
477d677bfe2SMiquel Raynal 	u32 key_handle, err;
478d677bfe2SMiquel Raynal 	u8 usage_auth[DIGEST_LENGTH];
479d677bfe2SMiquel Raynal 	u8 pub_key_buffer[TPM_PUBKEY_MAX_LENGTH];
480d677bfe2SMiquel Raynal 	size_t pub_key_len = sizeof(pub_key_buffer);
481abdc7b8aSSimon Glass 	struct udevice *dev;
482abdc7b8aSSimon Glass 	int rc;
483abdc7b8aSSimon Glass 
484abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
485abdc7b8aSSimon Glass 	if (rc)
486abdc7b8aSSimon Glass 		return rc;
487d677bfe2SMiquel Raynal 
488d677bfe2SMiquel Raynal 	if (argc < 3)
489d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
490d677bfe2SMiquel Raynal 
491d677bfe2SMiquel Raynal 	key_handle = simple_strtoul(argv[1], NULL, 0);
492d677bfe2SMiquel Raynal 	if (strlen(argv[2]) != 2 * DIGEST_LENGTH)
493d677bfe2SMiquel Raynal 		return CMD_RET_FAILURE;
494d677bfe2SMiquel Raynal 	parse_byte_string(argv[2], usage_auth, NULL);
495d677bfe2SMiquel Raynal 
496*ddca9f09SEddie James 	err = tpm1_get_pub_key_oiap(dev, key_handle, usage_auth, pub_key_buffer,
497d677bfe2SMiquel Raynal 				    &pub_key_len);
498d677bfe2SMiquel Raynal 	if (!err) {
499d677bfe2SMiquel Raynal 		printf("dump of received pub key structure:\n");
500d677bfe2SMiquel Raynal 		print_byte_string(pub_key_buffer, pub_key_len);
501d677bfe2SMiquel Raynal 	}
502d677bfe2SMiquel Raynal 	return report_return_code(err);
503d677bfe2SMiquel Raynal }
504d677bfe2SMiquel Raynal 
TPM_COMMAND_NO_ARG(tpm1_end_oiap)505*ddca9f09SEddie James TPM_COMMAND_NO_ARG(tpm1_end_oiap)
506d677bfe2SMiquel Raynal 
507d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_AUTH_SESSIONS */
508d677bfe2SMiquel Raynal 
509d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_FLUSH_RESOURCES
510d677bfe2SMiquel Raynal static int do_tpm_flush(cmd_tbl_t *cmdtp, int flag, int argc,
511d677bfe2SMiquel Raynal 			char *const argv[])
512d677bfe2SMiquel Raynal {
513abdc7b8aSSimon Glass 	struct udevice *dev;
514d677bfe2SMiquel Raynal 	int type = 0;
515abdc7b8aSSimon Glass 	int rc;
516abdc7b8aSSimon Glass 
517abdc7b8aSSimon Glass 	rc = get_tpm(&dev);
518abdc7b8aSSimon Glass 	if (rc)
519abdc7b8aSSimon Glass 		return rc;
520d677bfe2SMiquel Raynal 
521d677bfe2SMiquel Raynal 	if (argc != 3)
522d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
523d677bfe2SMiquel Raynal 
524d677bfe2SMiquel Raynal 	if (!strcasecmp(argv[1], "key"))
525d677bfe2SMiquel Raynal 		type = TPM_RT_KEY;
526d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "auth"))
527d677bfe2SMiquel Raynal 		type = TPM_RT_AUTH;
528d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "hash"))
529d677bfe2SMiquel Raynal 		type = TPM_RT_HASH;
530d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "trans"))
531d677bfe2SMiquel Raynal 		type = TPM_RT_TRANS;
532d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "context"))
533d677bfe2SMiquel Raynal 		type = TPM_RT_CONTEXT;
534d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "counter"))
535d677bfe2SMiquel Raynal 		type = TPM_RT_COUNTER;
536d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "delegate"))
537d677bfe2SMiquel Raynal 		type = TPM_RT_DELEGATE;
538d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "daa_tpm"))
539d677bfe2SMiquel Raynal 		type = TPM_RT_DAA_TPM;
540d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "daa_v0"))
541d677bfe2SMiquel Raynal 		type = TPM_RT_DAA_V0;
542d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "daa_v1"))
543d677bfe2SMiquel Raynal 		type = TPM_RT_DAA_V1;
544d677bfe2SMiquel Raynal 
545d677bfe2SMiquel Raynal 	if (!type) {
546d677bfe2SMiquel Raynal 		printf("Resource type %s unknown.\n", argv[1]);
547d677bfe2SMiquel Raynal 		return -1;
548d677bfe2SMiquel Raynal 	}
549d677bfe2SMiquel Raynal 
550d677bfe2SMiquel Raynal 	if (!strcasecmp(argv[2], "all")) {
551d677bfe2SMiquel Raynal 		u16 res_count;
552d677bfe2SMiquel Raynal 		u8 buf[288];
553d677bfe2SMiquel Raynal 		u8 *ptr;
554d677bfe2SMiquel Raynal 		int err;
555d677bfe2SMiquel Raynal 		uint i;
556d677bfe2SMiquel Raynal 
557d677bfe2SMiquel Raynal 		/* fetch list of already loaded resources in the TPM */
558abdc7b8aSSimon Glass 		err = tpm_get_capability(dev, TPM_CAP_HANDLE, type, buf,
559d677bfe2SMiquel Raynal 					 sizeof(buf));
560d677bfe2SMiquel Raynal 		if (err) {
561d677bfe2SMiquel Raynal 			printf("tpm_get_capability returned error %d.\n", err);
562d677bfe2SMiquel Raynal 			return -1;
563d677bfe2SMiquel Raynal 		}
564d677bfe2SMiquel Raynal 		res_count = get_unaligned_be16(buf);
565d677bfe2SMiquel Raynal 		ptr = buf + 2;
566d677bfe2SMiquel Raynal 		for (i = 0; i < res_count; ++i, ptr += 4)
567*ddca9f09SEddie James 			tpm1_flush_specific(dev, get_unaligned_be32(ptr), type);
568d677bfe2SMiquel Raynal 	} else {
569d677bfe2SMiquel Raynal 		u32 handle = simple_strtoul(argv[2], NULL, 0);
570d677bfe2SMiquel Raynal 
571d677bfe2SMiquel Raynal 		if (!handle) {
572d677bfe2SMiquel Raynal 			printf("Illegal resource handle %s\n", argv[2]);
573d677bfe2SMiquel Raynal 			return -1;
574d677bfe2SMiquel Raynal 		}
575*ddca9f09SEddie James 		tpm1_flush_specific(dev, cpu_to_be32(handle), type);
576d677bfe2SMiquel Raynal 	}
577d677bfe2SMiquel Raynal 
578d677bfe2SMiquel Raynal 	return 0;
579d677bfe2SMiquel Raynal }
580d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_FLUSH_RESOURCES */
581d677bfe2SMiquel Raynal 
582d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_LIST_RESOURCES
do_tpm_list(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])583d677bfe2SMiquel Raynal static int do_tpm_list(cmd_tbl_t *cmdtp, int flag, int argc,
584d677bfe2SMiquel Raynal 		       char *const argv[])
585d677bfe2SMiquel Raynal {
586*ddca9f09SEddie James 	struct udevice *dev;
587d677bfe2SMiquel Raynal 	int type = 0;
588d677bfe2SMiquel Raynal 	u16 res_count;
589d677bfe2SMiquel Raynal 	u8 buf[288];
590d677bfe2SMiquel Raynal 	u8 *ptr;
591d677bfe2SMiquel Raynal 	int err;
592d677bfe2SMiquel Raynal 	uint i;
593d677bfe2SMiquel Raynal 
594*ddca9f09SEddie James 	err = get_tpm(&dev);
595*ddca9f09SEddie James 	if (err)
596*ddca9f09SEddie James 		return err;
597*ddca9f09SEddie James 
598d677bfe2SMiquel Raynal 	if (argc != 2)
599d677bfe2SMiquel Raynal 		return CMD_RET_USAGE;
600d677bfe2SMiquel Raynal 
601d677bfe2SMiquel Raynal 	if (!strcasecmp(argv[1], "key"))
602d677bfe2SMiquel Raynal 		type = TPM_RT_KEY;
603d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "auth"))
604d677bfe2SMiquel Raynal 		type = TPM_RT_AUTH;
605d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "hash"))
606d677bfe2SMiquel Raynal 		type = TPM_RT_HASH;
607d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "trans"))
608d677bfe2SMiquel Raynal 		type = TPM_RT_TRANS;
609d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "context"))
610d677bfe2SMiquel Raynal 		type = TPM_RT_CONTEXT;
611d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "counter"))
612d677bfe2SMiquel Raynal 		type = TPM_RT_COUNTER;
613d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "delegate"))
614d677bfe2SMiquel Raynal 		type = TPM_RT_DELEGATE;
615d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "daa_tpm"))
616d677bfe2SMiquel Raynal 		type = TPM_RT_DAA_TPM;
617d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "daa_v0"))
618d677bfe2SMiquel Raynal 		type = TPM_RT_DAA_V0;
619d677bfe2SMiquel Raynal 	else if (!strcasecmp(argv[1], "daa_v1"))
620d677bfe2SMiquel Raynal 		type = TPM_RT_DAA_V1;
621d677bfe2SMiquel Raynal 
622d677bfe2SMiquel Raynal 	if (!type) {
623d677bfe2SMiquel Raynal 		printf("Resource type %s unknown.\n", argv[1]);
624d677bfe2SMiquel Raynal 		return -1;
625d677bfe2SMiquel Raynal 	}
626d677bfe2SMiquel Raynal 
627d677bfe2SMiquel Raynal 	/* fetch list of already loaded resources in the TPM */
628*ddca9f09SEddie James 	err = tpm_get_capability(dev, TPM_CAP_HANDLE, type, buf,
629d677bfe2SMiquel Raynal 				 sizeof(buf));
630d677bfe2SMiquel Raynal 	if (err) {
631d677bfe2SMiquel Raynal 		printf("tpm_get_capability returned error %d.\n", err);
632d677bfe2SMiquel Raynal 		return -1;
633d677bfe2SMiquel Raynal 	}
634d677bfe2SMiquel Raynal 	res_count = get_unaligned_be16(buf);
635d677bfe2SMiquel Raynal 	ptr = buf + 2;
636d677bfe2SMiquel Raynal 
637d677bfe2SMiquel Raynal 	printf("Resources of type %s (%02x):\n", argv[1], type);
638d677bfe2SMiquel Raynal 	if (!res_count) {
639d677bfe2SMiquel Raynal 		puts("None\n");
640d677bfe2SMiquel Raynal 	} else {
641d677bfe2SMiquel Raynal 		for (i = 0; i < res_count; ++i, ptr += 4)
642d677bfe2SMiquel Raynal 			printf("Index %d: %08x\n", i, get_unaligned_be32(ptr));
643d677bfe2SMiquel Raynal 	}
644d677bfe2SMiquel Raynal 
645d677bfe2SMiquel Raynal 	return 0;
646d677bfe2SMiquel Raynal }
647d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_LIST_RESOURCES */
648d677bfe2SMiquel Raynal 
649d677bfe2SMiquel Raynal TPM_COMMAND_NO_ARG(tpm_self_test_full)
650d677bfe2SMiquel Raynal TPM_COMMAND_NO_ARG(tpm_continue_self_test)
651d677bfe2SMiquel Raynal TPM_COMMAND_NO_ARG(tpm_force_clear)
652d677bfe2SMiquel Raynal TPM_COMMAND_NO_ARG(tpm_physical_enable)
653d677bfe2SMiquel Raynal TPM_COMMAND_NO_ARG(tpm_physical_disable)
654d677bfe2SMiquel Raynal 
655d677bfe2SMiquel Raynal static cmd_tbl_t tpm1_commands[] = {
656*ddca9f09SEddie James 	U_BOOT_CMD_MKENT(device, 0, 1, do_tpm_device, "", ""),
657d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""),
658d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""),
659d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(startup, 0, 1,
660d677bfe2SMiquel Raynal 			 do_tpm_startup, "", ""),
661d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(self_test_full, 0, 1,
662d677bfe2SMiquel Raynal 			 do_tpm_self_test_full, "", ""),
663d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(continue_self_test, 0, 1,
664d677bfe2SMiquel Raynal 			 do_tpm_continue_self_test, "", ""),
665d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(force_clear, 0, 1,
666d677bfe2SMiquel Raynal 			 do_tpm_force_clear, "", ""),
667d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(physical_enable, 0, 1,
668d677bfe2SMiquel Raynal 			 do_tpm_physical_enable, "", ""),
669d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(physical_disable, 0, 1,
670d677bfe2SMiquel Raynal 			 do_tpm_physical_disable, "", ""),
671d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(nv_define_space, 0, 1,
672d677bfe2SMiquel Raynal 			 do_tpm_nv_define_space, "", ""),
673d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(nv_read_value, 0, 1,
674d677bfe2SMiquel Raynal 			 do_tpm_nv_read_value, "", ""),
675d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(nv_write_value, 0, 1,
676d677bfe2SMiquel Raynal 			 do_tpm_nv_write_value, "", ""),
677d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(extend, 0, 1,
678d677bfe2SMiquel Raynal 			 do_tpm_extend, "", ""),
679d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(pcr_read, 0, 1,
680d677bfe2SMiquel Raynal 			 do_tpm_pcr_read, "", ""),
681d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(tsc_physical_presence, 0, 1,
682d677bfe2SMiquel Raynal 			 do_tpm_tsc_physical_presence, "", ""),
683d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(read_pubek, 0, 1,
684d677bfe2SMiquel Raynal 			 do_tpm_read_pubek, "", ""),
685d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(physical_set_deactivated, 0, 1,
686d677bfe2SMiquel Raynal 			 do_tpm_physical_set_deactivated, "", ""),
687d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(get_capability, 0, 1,
688d677bfe2SMiquel Raynal 			 do_tpm_get_capability, "", ""),
689d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(raw_transfer, 0, 1,
690d677bfe2SMiquel Raynal 			 do_tpm_raw_transfer, "", ""),
691d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(nv_define, 0, 1,
692d677bfe2SMiquel Raynal 			 do_tpm_nv_define, "", ""),
693d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(nv_read, 0, 1,
694d677bfe2SMiquel Raynal 			 do_tpm_nv_read, "", ""),
695d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(nv_write, 0, 1,
696d677bfe2SMiquel Raynal 			 do_tpm_nv_write, "", ""),
697d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_AUTH_SESSIONS
698d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(oiap, 0, 1,
699d677bfe2SMiquel Raynal 			 do_tpm_oiap, "", ""),
700d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(end_oiap, 0, 1,
701*ddca9f09SEddie James 			 do_tpm1_end_oiap, "", ""),
702d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(load_key2_oiap, 0, 1,
703d677bfe2SMiquel Raynal 			 do_tpm_load_key2_oiap, "", ""),
704d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
705d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(load_key_by_sha1, 0, 1,
706d677bfe2SMiquel Raynal 			 do_tpm_load_key_by_sha1, "", ""),
707d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
708d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(get_pub_key_oiap, 0, 1,
709d677bfe2SMiquel Raynal 			 do_tpm_get_pub_key_oiap, "", ""),
710d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_AUTH_SESSIONS */
711d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_FLUSH_RESOURCES
712d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(flush, 0, 1,
713d677bfe2SMiquel Raynal 			 do_tpm_flush, "", ""),
714d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_FLUSH_RESOURCES */
715d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_LIST_RESOURCES
716d677bfe2SMiquel Raynal 	U_BOOT_CMD_MKENT(list, 0, 1,
717d677bfe2SMiquel Raynal 			 do_tpm_list, "", ""),
718d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_LIST_RESOURCES */
719d677bfe2SMiquel Raynal };
720d677bfe2SMiquel Raynal 
get_tpm1_commands(unsigned int * size)7212a2096eaSMiquel Raynal cmd_tbl_t *get_tpm1_commands(unsigned int *size)
722d677bfe2SMiquel Raynal {
723d677bfe2SMiquel Raynal 	*size = ARRAY_SIZE(tpm1_commands);
724d677bfe2SMiquel Raynal 
725d677bfe2SMiquel Raynal 	return tpm1_commands;
726d677bfe2SMiquel Raynal }
727d677bfe2SMiquel Raynal 
728d677bfe2SMiquel Raynal U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm,
729d677bfe2SMiquel Raynal "Issue a TPMv1.x command",
730d677bfe2SMiquel Raynal "cmd args...\n"
731d677bfe2SMiquel Raynal "    - Issue TPM command <cmd> with arguments <args...>.\n"
732d677bfe2SMiquel Raynal "Admin Startup and State Commands:\n"
733*ddca9f09SEddie James "  device [num device]\n"
734*ddca9f09SEddie James "    - Show all devices or set the specified device\n"
735d677bfe2SMiquel Raynal "  info - Show information about the TPM\n"
736d677bfe2SMiquel Raynal "  init\n"
737d677bfe2SMiquel Raynal "    - Put TPM into a state where it waits for 'startup' command.\n"
738d677bfe2SMiquel Raynal "  startup mode\n"
739d677bfe2SMiquel Raynal "    - Issue TPM_Starup command.  <mode> is one of TPM_ST_CLEAR,\n"
740d677bfe2SMiquel Raynal "      TPM_ST_STATE, and TPM_ST_DEACTIVATED.\n"
741d677bfe2SMiquel Raynal "Admin Testing Commands:\n"
742d677bfe2SMiquel Raynal "  self_test_full\n"
743d677bfe2SMiquel Raynal "    - Test all of the TPM capabilities.\n"
744d677bfe2SMiquel Raynal "  continue_self_test\n"
745d677bfe2SMiquel Raynal "    - Inform TPM that it should complete the self-test.\n"
746d677bfe2SMiquel Raynal "Admin Opt-in Commands:\n"
747d677bfe2SMiquel Raynal "  physical_enable\n"
748d677bfe2SMiquel Raynal "    - Set the PERMANENT disable flag to FALSE using physical presence as\n"
749d677bfe2SMiquel Raynal "      authorization.\n"
750d677bfe2SMiquel Raynal "  physical_disable\n"
751d677bfe2SMiquel Raynal "    - Set the PERMANENT disable flag to TRUE using physical presence as\n"
752d677bfe2SMiquel Raynal "      authorization.\n"
753d677bfe2SMiquel Raynal "  physical_set_deactivated 0|1\n"
754d677bfe2SMiquel Raynal "    - Set deactivated flag.\n"
755d677bfe2SMiquel Raynal "Admin Ownership Commands:\n"
756d677bfe2SMiquel Raynal "  force_clear\n"
757d677bfe2SMiquel Raynal "    - Issue TPM_ForceClear command.\n"
758d677bfe2SMiquel Raynal "  tsc_physical_presence flags\n"
759d677bfe2SMiquel Raynal "    - Set TPM device's Physical Presence flags to <flags>.\n"
760d677bfe2SMiquel Raynal "The Capability Commands:\n"
761d677bfe2SMiquel Raynal "  get_capability cap_area sub_cap addr count\n"
762d677bfe2SMiquel Raynal "    - Read <count> bytes of TPM capability indexed by <cap_area> and\n"
763d677bfe2SMiquel Raynal "      <sub_cap> to memory address <addr>.\n"
764d677bfe2SMiquel Raynal #if defined(CONFIG_TPM_FLUSH_RESOURCES) || defined(CONFIG_TPM_LIST_RESOURCES)
765d677bfe2SMiquel Raynal "Resource management functions\n"
766d677bfe2SMiquel Raynal #endif
767d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_FLUSH_RESOURCES
768d677bfe2SMiquel Raynal "  flush resource_type id\n"
769d677bfe2SMiquel Raynal "    - flushes a resource of type <resource_type> (may be one of key, auth,\n"
770d677bfe2SMiquel Raynal "      hash, trans, context, counter, delegate, daa_tpm, daa_v0, daa_v1),\n"
771d677bfe2SMiquel Raynal "      and id <id> from the TPM. Use an <id> of \"all\" to flush all\n"
772d677bfe2SMiquel Raynal "      resources of that type.\n"
773d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_FLUSH_RESOURCES */
774d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_LIST_RESOURCES
775d677bfe2SMiquel Raynal "  list resource_type\n"
776d677bfe2SMiquel Raynal "    - lists resources of type <resource_type> (may be one of key, auth,\n"
777d677bfe2SMiquel Raynal "      hash, trans, context, counter, delegate, daa_tpm, daa_v0, daa_v1),\n"
778d677bfe2SMiquel Raynal "      contained in the TPM.\n"
779d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_LIST_RESOURCES */
780d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_AUTH_SESSIONS
781d677bfe2SMiquel Raynal "Storage functions\n"
782d677bfe2SMiquel Raynal "  loadkey2_oiap parent_handle key_addr key_len usage_auth\n"
783d677bfe2SMiquel Raynal "    - loads a key data from memory address <key_addr>, <key_len> bytes\n"
784d677bfe2SMiquel Raynal "      into TPM using the parent key <parent_handle> with authorization\n"
785d677bfe2SMiquel Raynal "      <usage_auth> (20 bytes hex string).\n"
786d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
787d677bfe2SMiquel Raynal "  load_key_by_sha1 parent_hash key_addr key_len usage_auth\n"
788d677bfe2SMiquel Raynal "    - loads a key data from memory address <key_addr>, <key_len> bytes\n"
789d677bfe2SMiquel Raynal "      into TPM using the parent hash <parent_hash> (20 bytes hex string)\n"
790d677bfe2SMiquel Raynal "      with authorization <usage_auth> (20 bytes hex string).\n"
791d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
792d677bfe2SMiquel Raynal "  get_pub_key_oiap key_handle usage_auth\n"
793d677bfe2SMiquel Raynal "    - get the public key portion of a loaded key <key_handle> using\n"
794d677bfe2SMiquel Raynal "      authorization <usage auth> (20 bytes hex string)\n"
795d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_AUTH_SESSIONS */
796d677bfe2SMiquel Raynal "Endorsement Key Handling Commands:\n"
797d677bfe2SMiquel Raynal "  read_pubek addr count\n"
798d677bfe2SMiquel Raynal "    - Read <count> bytes of the public endorsement key to memory\n"
799d677bfe2SMiquel Raynal "      address <addr>\n"
800d677bfe2SMiquel Raynal "Integrity Collection and Reporting Commands:\n"
801d677bfe2SMiquel Raynal "  extend index digest_hex_string\n"
802d677bfe2SMiquel Raynal "    - Add a new measurement to a PCR.  Update PCR <index> with the 20-bytes\n"
803d677bfe2SMiquel Raynal "      <digest_hex_string>\n"
804d677bfe2SMiquel Raynal "  pcr_read index addr count\n"
805d677bfe2SMiquel Raynal "    - Read <count> bytes from PCR <index> to memory address <addr>.\n"
806d677bfe2SMiquel Raynal #ifdef CONFIG_TPM_AUTH_SESSIONS
807d677bfe2SMiquel Raynal "Authorization Sessions\n"
808d677bfe2SMiquel Raynal "  oiap\n"
809d677bfe2SMiquel Raynal "    - setup an OIAP session\n"
810d677bfe2SMiquel Raynal "  end_oiap\n"
811d677bfe2SMiquel Raynal "    - terminates an active OIAP session\n"
812d677bfe2SMiquel Raynal #endif /* CONFIG_TPM_AUTH_SESSIONS */
813d677bfe2SMiquel Raynal "Non-volatile Storage Commands:\n"
814d677bfe2SMiquel Raynal "  nv_define_space index permission size\n"
815d677bfe2SMiquel Raynal "    - Establish a space at index <index> with <permission> of <size> bytes.\n"
816d677bfe2SMiquel Raynal "  nv_read_value index addr count\n"
817d677bfe2SMiquel Raynal "    - Read <count> bytes from space <index> to memory address <addr>.\n"
818d677bfe2SMiquel Raynal "  nv_write_value index addr count\n"
819d677bfe2SMiquel Raynal "    - Write <count> bytes from memory address <addr> to space <index>.\n"
820d677bfe2SMiquel Raynal "Miscellaneous helper functions:\n"
821d677bfe2SMiquel Raynal "  raw_transfer byte_string\n"
822d677bfe2SMiquel Raynal "    - Send a byte string <byte_string> to TPM and print the response.\n"
823d677bfe2SMiquel Raynal " Non-volatile storage helper functions:\n"
824d677bfe2SMiquel Raynal "    These helper functions treat a non-volatile space as a non-padded\n"
825d677bfe2SMiquel Raynal "    sequence of integer values.  These integer values are defined by a type\n"
826d677bfe2SMiquel Raynal "    string, which is a text string of 'bwd' characters: 'b' means a 8-bit\n"
827d677bfe2SMiquel Raynal "    value, 'w' 16-bit value, 'd' 32-bit value.  All helper functions take\n"
828d677bfe2SMiquel Raynal "    a type string as their first argument.\n"
829d677bfe2SMiquel Raynal "  nv_define type_string index perm\n"
830d677bfe2SMiquel Raynal "    - Define a space <index> with permission <perm>.\n"
831d677bfe2SMiquel Raynal "  nv_read types_string index vars...\n"
832d677bfe2SMiquel Raynal "    - Read from space <index> to environment variables <vars...>.\n"
833d677bfe2SMiquel Raynal "  nv_write types_string index values...\n"
834d677bfe2SMiquel Raynal "    - Write to space <index> from values <values...>.\n"
835d677bfe2SMiquel Raynal );
836