blob: a6d57ee7c49689ff9029aa63198cc32227d74794 [file] [log] [blame]
Miquel Raynalf3b43502018-05-15 11:57:08 +02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (c) 2018 Bootlin
4 * Author: Miquel Raynal <miquel.raynal@bootlin.com>
5 */
6
Simon Glassed38aef2020-05-10 11:40:03 -06007#include <command.h>
Miquel Raynalf3b43502018-05-15 11:57:08 +02008#include <dm.h>
9#include <log.h>
Miquel Raynal14d72352018-05-15 11:57:15 +020010#include <mapmem.h>
Miquel Raynalf3b43502018-05-15 11:57:08 +020011#include <tpm-common.h>
12#include <tpm-v2.h>
13#include "tpm-user-utils.h"
14
Simon Glassed38aef2020-05-10 11:40:03 -060015static int do_tpm2_startup(struct cmd_tbl *cmdtp, int flag, int argc,
16 char *const argv[])
Miquel Raynal65a1a6c2018-05-15 11:57:12 +020017{
18 enum tpm2_startup_types mode;
Simon Glass8ceca1d2018-11-18 14:22:27 -070019 struct udevice *dev;
20 int ret;
Raymond Mao5187a642025-01-27 06:58:46 -080021 bool bon = true;
Miquel Raynal65a1a6c2018-05-15 11:57:12 +020022
Simon Glass8ceca1d2018-11-18 14:22:27 -070023 ret = get_tpm(&dev);
24 if (ret)
25 return ret;
Raymond Mao5187a642025-01-27 06:58:46 -080026
27 /* argv[2] is optional to perform a TPM2_CC_SHUTDOWN */
28 if (argc > 3 || (argc == 3 && strcasecmp("off", argv[2])))
Miquel Raynal65a1a6c2018-05-15 11:57:12 +020029 return CMD_RET_USAGE;
30
31 if (!strcasecmp("TPM2_SU_CLEAR", argv[1])) {
32 mode = TPM2_SU_CLEAR;
33 } else if (!strcasecmp("TPM2_SU_STATE", argv[1])) {
34 mode = TPM2_SU_STATE;
35 } else {
36 printf("Couldn't recognize mode string: %s\n", argv[1]);
37 return CMD_RET_FAILURE;
38 }
39
Raymond Mao5187a642025-01-27 06:58:46 -080040 if (argv[2])
41 bon = false;
42
43 return report_return_code(tpm2_startup(dev, bon, mode));
Miquel Raynal65a1a6c2018-05-15 11:57:12 +020044}
45
Simon Glassed38aef2020-05-10 11:40:03 -060046static int do_tpm2_self_test(struct cmd_tbl *cmdtp, int flag, int argc,
47 char *const argv[])
Miquel Raynal39c76082018-05-15 11:57:13 +020048{
49 enum tpm2_yes_no full_test;
Simon Glass8ceca1d2018-11-18 14:22:27 -070050 struct udevice *dev;
51 int ret;
Miquel Raynal39c76082018-05-15 11:57:13 +020052
Simon Glass8ceca1d2018-11-18 14:22:27 -070053 ret = get_tpm(&dev);
54 if (ret)
55 return ret;
Miquel Raynal39c76082018-05-15 11:57:13 +020056 if (argc != 2)
57 return CMD_RET_USAGE;
58
59 if (!strcasecmp("full", argv[1])) {
60 full_test = TPMI_YES;
61 } else if (!strcasecmp("continue", argv[1])) {
62 full_test = TPMI_NO;
63 } else {
64 printf("Couldn't recognize test mode: %s\n", argv[1]);
65 return CMD_RET_FAILURE;
66 }
67
Simon Glass8ceca1d2018-11-18 14:22:27 -070068 return report_return_code(tpm2_self_test(dev, full_test));
Miquel Raynal39c76082018-05-15 11:57:13 +020069}
70
Simon Glassed38aef2020-05-10 11:40:03 -060071static int do_tpm2_clear(struct cmd_tbl *cmdtp, int flag, int argc,
72 char *const argv[])
Miquel Raynal8df6f8d2018-05-15 11:57:14 +020073{
74 u32 handle = 0;
75 const char *pw = (argc < 3) ? NULL : argv[2];
76 const ssize_t pw_sz = pw ? strlen(pw) : 0;
Simon Glass8ceca1d2018-11-18 14:22:27 -070077 struct udevice *dev;
78 int ret;
79
80 ret = get_tpm(&dev);
81 if (ret)
82 return ret;
Miquel Raynal8df6f8d2018-05-15 11:57:14 +020083
84 if (argc < 2 || argc > 3)
85 return CMD_RET_USAGE;
86
87 if (pw_sz > TPM2_DIGEST_LEN)
88 return -EINVAL;
89
90 if (!strcasecmp("TPM2_RH_LOCKOUT", argv[1]))
91 handle = TPM2_RH_LOCKOUT;
92 else if (!strcasecmp("TPM2_RH_PLATFORM", argv[1]))
93 handle = TPM2_RH_PLATFORM;
94 else
95 return CMD_RET_USAGE;
96
Simon Glass8ceca1d2018-11-18 14:22:27 -070097 return report_return_code(tpm2_clear(dev, handle, pw, pw_sz));
Miquel Raynal8df6f8d2018-05-15 11:57:14 +020098}
99
Simon Glassed38aef2020-05-10 11:40:03 -0600100static int do_tpm2_pcr_extend(struct cmd_tbl *cmdtp, int flag, int argc,
101 char *const argv[])
Miquel Raynal14d72352018-05-15 11:57:15 +0200102{
103 struct udevice *dev;
104 struct tpm_chip_priv *priv;
105 u32 index = simple_strtoul(argv[1], NULL, 0);
106 void *digest = map_sysmem(simple_strtoul(argv[2], NULL, 0), 0);
Tim Harveybbfa6082024-05-25 13:00:49 -0700107 int algo = TPM2_ALG_SHA256;
108 int algo_len;
Miquel Raynal14d72352018-05-15 11:57:15 +0200109 int ret;
110 u32 rc;
111
Tim Harveybbfa6082024-05-25 13:00:49 -0700112 if (argc < 3 || argc > 4)
Miquel Raynal14d72352018-05-15 11:57:15 +0200113 return CMD_RET_USAGE;
Tim Harveybbfa6082024-05-25 13:00:49 -0700114 if (argc == 4) {
115 algo = tpm2_name_to_algorithm(argv[3]);
116 if (algo < 0)
117 return CMD_RET_FAILURE;
118 }
119 algo_len = tpm2_algorithm_to_len(algo);
Miquel Raynal14d72352018-05-15 11:57:15 +0200120
Simon Glass8ceca1d2018-11-18 14:22:27 -0700121 ret = get_tpm(&dev);
Miquel Raynal14d72352018-05-15 11:57:15 +0200122 if (ret)
123 return ret;
124
125 priv = dev_get_uclass_priv(dev);
126 if (!priv)
127 return -EINVAL;
128
129 if (index >= priv->pcr_count)
130 return -EINVAL;
131
Tim Harveybbfa6082024-05-25 13:00:49 -0700132 rc = tpm2_pcr_extend(dev, index, algo, digest, algo_len);
133 if (!rc) {
134 printf("PCR #%u extended with %d byte %s digest\n", index,
135 algo_len, tpm2_algorithm_name(algo));
136 print_byte_string(digest, algo_len);
137 }
Miquel Raynal14d72352018-05-15 11:57:15 +0200138
139 unmap_sysmem(digest);
140
141 return report_return_code(rc);
142}
143
Simon Glassed38aef2020-05-10 11:40:03 -0600144static int do_tpm_pcr_read(struct cmd_tbl *cmdtp, int flag, int argc,
145 char *const argv[])
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200146{
Tim Harveybbfa6082024-05-25 13:00:49 -0700147 enum tpm2_algorithms algo = TPM2_ALG_SHA256;
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200148 struct udevice *dev;
149 struct tpm_chip_priv *priv;
150 u32 index, rc;
Tim Harveybbfa6082024-05-25 13:00:49 -0700151 int algo_len;
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200152 unsigned int updates;
153 void *data;
154 int ret;
155
Tim Harveybbfa6082024-05-25 13:00:49 -0700156 if (argc < 3 || argc > 4)
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200157 return CMD_RET_USAGE;
Tim Harveybbfa6082024-05-25 13:00:49 -0700158 if (argc == 4) {
159 algo = tpm2_name_to_algorithm(argv[3]);
160 if (algo < 0)
161 return CMD_RET_FAILURE;
162 }
163 algo_len = tpm2_algorithm_to_len(algo);
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200164
Simon Glass8ceca1d2018-11-18 14:22:27 -0700165 ret = get_tpm(&dev);
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200166 if (ret)
167 return ret;
168
169 priv = dev_get_uclass_priv(dev);
170 if (!priv)
171 return -EINVAL;
172
173 index = simple_strtoul(argv[1], NULL, 0);
174 if (index >= priv->pcr_count)
175 return -EINVAL;
176
177 data = map_sysmem(simple_strtoul(argv[2], NULL, 0), 0);
178
Tim Harveybbfa6082024-05-25 13:00:49 -0700179 rc = tpm2_pcr_read(dev, index, priv->pcr_select_min, algo,
180 data, algo_len, &updates);
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200181 if (!rc) {
Tim Harveybbfa6082024-05-25 13:00:49 -0700182 printf("PCR #%u %s %d byte content (%u known updates):\n", index,
183 tpm2_algorithm_name(algo), algo_len, updates);
184 print_byte_string(data, algo_len);
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200185 }
186
187 unmap_sysmem(data);
188
189 return report_return_code(rc);
190}
191
Simon Glassed38aef2020-05-10 11:40:03 -0600192static int do_tpm_get_capability(struct cmd_tbl *cmdtp, int flag, int argc,
193 char *const argv[])
Miquel Raynal2e52c062018-05-15 11:57:17 +0200194{
195 u32 capability, property, rc;
196 u8 *data;
197 size_t count;
198 int i, j;
Simon Glass8ceca1d2018-11-18 14:22:27 -0700199 struct udevice *dev;
200 int ret;
201
202 ret = get_tpm(&dev);
203 if (ret)
204 return ret;
Miquel Raynal2e52c062018-05-15 11:57:17 +0200205
206 if (argc != 5)
207 return CMD_RET_USAGE;
208
209 capability = simple_strtoul(argv[1], NULL, 0);
210 property = simple_strtoul(argv[2], NULL, 0);
211 data = map_sysmem(simple_strtoul(argv[3], NULL, 0), 0);
212 count = simple_strtoul(argv[4], NULL, 0);
213
Simon Glass8ceca1d2018-11-18 14:22:27 -0700214 rc = tpm2_get_capability(dev, capability, property, data, count);
Miquel Raynal2e52c062018-05-15 11:57:17 +0200215 if (rc)
216 goto unmap_data;
217
218 printf("Capabilities read from TPM:\n");
219 for (i = 0; i < count; i++) {
220 printf("Property 0x");
221 for (j = 0; j < 4; j++)
Ilias Apalodimasa0789152020-11-05 23:58:43 +0200222 printf("%02x", data[(i * 8) + j + sizeof(u32)]);
Miquel Raynal2e52c062018-05-15 11:57:17 +0200223 printf(": 0x");
224 for (j = 4; j < 8; j++)
Ilias Apalodimasa0789152020-11-05 23:58:43 +0200225 printf("%02x", data[(i * 8) + j + sizeof(u32)]);
Miquel Raynal2e52c062018-05-15 11:57:17 +0200226 printf("\n");
227 }
228
229unmap_data:
230 unmap_sysmem(data);
231
232 return report_return_code(rc);
233}
234
Simon Glassed38aef2020-05-10 11:40:03 -0600235static int do_tpm_dam_reset(struct cmd_tbl *cmdtp, int flag, int argc,
Miquel Raynal228e9902018-05-15 11:57:18 +0200236 char *const argv[])
237{
238 const char *pw = (argc < 2) ? NULL : argv[1];
239 const ssize_t pw_sz = pw ? strlen(pw) : 0;
Simon Glass8ceca1d2018-11-18 14:22:27 -0700240 struct udevice *dev;
241 int ret;
242
243 ret = get_tpm(&dev);
244 if (ret)
245 return ret;
Miquel Raynal228e9902018-05-15 11:57:18 +0200246
247 if (argc > 2)
248 return CMD_RET_USAGE;
249
250 if (pw_sz > TPM2_DIGEST_LEN)
251 return -EINVAL;
252
Simon Glass8ceca1d2018-11-18 14:22:27 -0700253 return report_return_code(tpm2_dam_reset(dev, pw, pw_sz));
Miquel Raynal228e9902018-05-15 11:57:18 +0200254}
255
Simon Glassed38aef2020-05-10 11:40:03 -0600256static int do_tpm_dam_parameters(struct cmd_tbl *cmdtp, int flag, int argc,
Miquel Raynal228e9902018-05-15 11:57:18 +0200257 char *const argv[])
258{
259 const char *pw = (argc < 5) ? NULL : argv[4];
260 const ssize_t pw_sz = pw ? strlen(pw) : 0;
261 /*
262 * No Dictionary Attack Mitigation (DAM) means:
263 * maxtries = 0xFFFFFFFF, recovery_time = 1, lockout_recovery = 0
264 */
265 unsigned long int max_tries;
266 unsigned long int recovery_time;
267 unsigned long int lockout_recovery;
Simon Glass8ceca1d2018-11-18 14:22:27 -0700268 struct udevice *dev;
269 int ret;
270
271 ret = get_tpm(&dev);
272 if (ret)
273 return ret;
Miquel Raynal228e9902018-05-15 11:57:18 +0200274
275 if (argc < 4 || argc > 5)
276 return CMD_RET_USAGE;
277
278 if (pw_sz > TPM2_DIGEST_LEN)
279 return -EINVAL;
280
281 if (strict_strtoul(argv[1], 0, &max_tries))
282 return CMD_RET_USAGE;
283
284 if (strict_strtoul(argv[2], 0, &recovery_time))
285 return CMD_RET_USAGE;
286
287 if (strict_strtoul(argv[3], 0, &lockout_recovery))
288 return CMD_RET_USAGE;
289
290 log(LOGC_NONE, LOGL_INFO, "Changing dictionary attack parameters:\n");
291 log(LOGC_NONE, LOGL_INFO, "- maxTries: %lu", max_tries);
292 log(LOGC_NONE, LOGL_INFO, "- recoveryTime: %lu\n", recovery_time);
293 log(LOGC_NONE, LOGL_INFO, "- lockoutRecovery: %lu\n", lockout_recovery);
294
Simon Glass8ceca1d2018-11-18 14:22:27 -0700295 return report_return_code(tpm2_dam_parameters(dev, pw, pw_sz, max_tries,
Miquel Raynal228e9902018-05-15 11:57:18 +0200296 recovery_time,
297 lockout_recovery));
298}
299
Simon Glassed38aef2020-05-10 11:40:03 -0600300static int do_tpm_change_auth(struct cmd_tbl *cmdtp, int flag, int argc,
Miquel Raynal05d7be32018-05-15 11:57:19 +0200301 char *const argv[])
302{
303 u32 handle;
304 const char *newpw = argv[2];
305 const char *oldpw = (argc == 3) ? NULL : argv[3];
306 const ssize_t newpw_sz = strlen(newpw);
307 const ssize_t oldpw_sz = oldpw ? strlen(oldpw) : 0;
Simon Glass8ceca1d2018-11-18 14:22:27 -0700308 struct udevice *dev;
309 int ret;
310
311 ret = get_tpm(&dev);
312 if (ret)
313 return ret;
Miquel Raynal05d7be32018-05-15 11:57:19 +0200314
315 if (argc < 3 || argc > 4)
316 return CMD_RET_USAGE;
317
318 if (newpw_sz > TPM2_DIGEST_LEN || oldpw_sz > TPM2_DIGEST_LEN)
319 return -EINVAL;
320
321 if (!strcasecmp("TPM2_RH_LOCKOUT", argv[1]))
322 handle = TPM2_RH_LOCKOUT;
323 else if (!strcasecmp("TPM2_RH_ENDORSEMENT", argv[1]))
324 handle = TPM2_RH_ENDORSEMENT;
325 else if (!strcasecmp("TPM2_RH_OWNER", argv[1]))
326 handle = TPM2_RH_OWNER;
327 else if (!strcasecmp("TPM2_RH_PLATFORM", argv[1]))
328 handle = TPM2_RH_PLATFORM;
329 else
330 return CMD_RET_USAGE;
331
Simon Glass8ceca1d2018-11-18 14:22:27 -0700332 return report_return_code(tpm2_change_auth(dev, handle, newpw, newpw_sz,
Miquel Raynal05d7be32018-05-15 11:57:19 +0200333 oldpw, oldpw_sz));
334}
335
Simon Glassed38aef2020-05-10 11:40:03 -0600336static int do_tpm_pcr_setauthpolicy(struct cmd_tbl *cmdtp, int flag, int argc,
337 char *const argv[])
Miquel Raynal0b864f62018-05-15 11:57:20 +0200338{
339 u32 index = simple_strtoul(argv[1], NULL, 0);
340 char *key = argv[2];
341 const char *pw = (argc < 4) ? NULL : argv[3];
342 const ssize_t pw_sz = pw ? strlen(pw) : 0;
Simon Glass8ceca1d2018-11-18 14:22:27 -0700343 struct udevice *dev;
344 int ret;
345
346 ret = get_tpm(&dev);
347 if (ret)
348 return ret;
Miquel Raynal0b864f62018-05-15 11:57:20 +0200349
350 if (strlen(key) != TPM2_DIGEST_LEN)
351 return -EINVAL;
352
353 if (argc < 3 || argc > 4)
354 return CMD_RET_USAGE;
355
Simon Glass8ceca1d2018-11-18 14:22:27 -0700356 return report_return_code(tpm2_pcr_setauthpolicy(dev, pw, pw_sz, index,
Miquel Raynal0b864f62018-05-15 11:57:20 +0200357 key));
358}
359
Simon Glassed38aef2020-05-10 11:40:03 -0600360static int do_tpm_pcr_setauthvalue(struct cmd_tbl *cmdtp, int flag,
361 int argc, char *const argv[])
Miquel Raynal0b864f62018-05-15 11:57:20 +0200362{
363 u32 index = simple_strtoul(argv[1], NULL, 0);
364 char *key = argv[2];
365 const ssize_t key_sz = strlen(key);
366 const char *pw = (argc < 4) ? NULL : argv[3];
367 const ssize_t pw_sz = pw ? strlen(pw) : 0;
Simon Glass8ceca1d2018-11-18 14:22:27 -0700368 struct udevice *dev;
369 int ret;
370
371 ret = get_tpm(&dev);
372 if (ret)
373 return ret;
Miquel Raynal0b864f62018-05-15 11:57:20 +0200374
375 if (strlen(key) != TPM2_DIGEST_LEN)
376 return -EINVAL;
377
378 if (argc < 3 || argc > 4)
379 return CMD_RET_USAGE;
380
Simon Glass8ceca1d2018-11-18 14:22:27 -0700381 return report_return_code(tpm2_pcr_setauthvalue(dev, pw, pw_sz, index,
Miquel Raynal0b864f62018-05-15 11:57:20 +0200382 key, key_sz));
383}
384
Simon Glassed38aef2020-05-10 11:40:03 -0600385static struct cmd_tbl tpm2_commands[] = {
Philippe Reynescbe97392020-01-09 18:45:46 +0100386 U_BOOT_CMD_MKENT(device, 0, 1, do_tpm_device, "", ""),
Miquel Raynalf3b43502018-05-15 11:57:08 +0200387 U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""),
Simon Glass11a075c2022-08-30 21:05:36 -0600388 U_BOOT_CMD_MKENT(state, 0, 1, do_tpm_report_state, "", ""),
Miquel Raynalf3b43502018-05-15 11:57:08 +0200389 U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""),
Miquel Raynal65a1a6c2018-05-15 11:57:12 +0200390 U_BOOT_CMD_MKENT(startup, 0, 1, do_tpm2_startup, "", ""),
Miquel Raynal39c76082018-05-15 11:57:13 +0200391 U_BOOT_CMD_MKENT(self_test, 0, 1, do_tpm2_self_test, "", ""),
Miquel Raynal8df6f8d2018-05-15 11:57:14 +0200392 U_BOOT_CMD_MKENT(clear, 0, 1, do_tpm2_clear, "", ""),
Miquel Raynal14d72352018-05-15 11:57:15 +0200393 U_BOOT_CMD_MKENT(pcr_extend, 0, 1, do_tpm2_pcr_extend, "", ""),
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200394 U_BOOT_CMD_MKENT(pcr_read, 0, 1, do_tpm_pcr_read, "", ""),
Miquel Raynal2e52c062018-05-15 11:57:17 +0200395 U_BOOT_CMD_MKENT(get_capability, 0, 1, do_tpm_get_capability, "", ""),
Miquel Raynal228e9902018-05-15 11:57:18 +0200396 U_BOOT_CMD_MKENT(dam_reset, 0, 1, do_tpm_dam_reset, "", ""),
397 U_BOOT_CMD_MKENT(dam_parameters, 0, 1, do_tpm_dam_parameters, "", ""),
Miquel Raynal05d7be32018-05-15 11:57:19 +0200398 U_BOOT_CMD_MKENT(change_auth, 0, 1, do_tpm_change_auth, "", ""),
Ilias Apalodimas3be89262023-06-07 12:18:10 +0300399 U_BOOT_CMD_MKENT(autostart, 0, 1, do_tpm_autostart, "", ""),
Miquel Raynal0b864f62018-05-15 11:57:20 +0200400 U_BOOT_CMD_MKENT(pcr_setauthpolicy, 0, 1,
401 do_tpm_pcr_setauthpolicy, "", ""),
402 U_BOOT_CMD_MKENT(pcr_setauthvalue, 0, 1,
403 do_tpm_pcr_setauthvalue, "", ""),
Miquel Raynalf3b43502018-05-15 11:57:08 +0200404};
405
Simon Glassed38aef2020-05-10 11:40:03 -0600406struct cmd_tbl *get_tpm2_commands(unsigned int *size)
Miquel Raynalf3b43502018-05-15 11:57:08 +0200407{
408 *size = ARRAY_SIZE(tpm2_commands);
409
410 return tpm2_commands;
411}
412
Miquel Raynal79920d12018-07-19 22:35:09 +0200413U_BOOT_CMD(tpm2, CONFIG_SYS_MAXARGS, 1, do_tpm, "Issue a TPMv2.x command",
Miquel Raynalf3b43502018-05-15 11:57:08 +0200414"<command> [<arguments>]\n"
415"\n"
Philippe Reynescbe97392020-01-09 18:45:46 +0100416"device [num device]\n"
417" Show all devices or set the specified device\n"
Miquel Raynalf3b43502018-05-15 11:57:08 +0200418"info\n"
419" Show information about the TPM.\n"
Simon Glass11a075c2022-08-30 21:05:36 -0600420"state\n"
421" Show internal state from the TPM (if available)\n"
Ilias Apalodimas3be89262023-06-07 12:18:10 +0300422"autostart\n"
423" Initalize the tpm, perform a Startup(clear) and run a full selftest\n"
424" sequence\n"
Miquel Raynalf3b43502018-05-15 11:57:08 +0200425"init\n"
426" Initialize the software stack. Always the first command to issue.\n"
Ilias Apalodimas3be89262023-06-07 12:18:10 +0300427" 'tpm startup' is the only acceptable command after a 'tpm init' has been\n"
428" issued\n"
Raymond Mao5187a642025-01-27 06:58:46 -0800429"startup <mode> [<op>]\n"
Miquel Raynal65a1a6c2018-05-15 11:57:12 +0200430" Issue a TPM2_Startup command.\n"
431" <mode> is one of:\n"
432" * TPM2_SU_CLEAR (reset state)\n"
433" * TPM2_SU_STATE (preserved state)\n"
Raymond Mao5187a642025-01-27 06:58:46 -0800434" <op>:\n"
435" * off - To shutdown the TPM\n"
Miquel Raynal39c76082018-05-15 11:57:13 +0200436"self_test <type>\n"
437" Test the TPM capabilities.\n"
438" <type> is one of:\n"
439" * full (perform all tests)\n"
440" * continue (only check untested tests)\n"
Miquel Raynal8df6f8d2018-05-15 11:57:14 +0200441"clear <hierarchy>\n"
442" Issue a TPM2_Clear command.\n"
443" <hierarchy> is one of:\n"
444" * TPM2_RH_LOCKOUT\n"
445" * TPM2_RH_PLATFORM\n"
Tim Harveybbfa6082024-05-25 13:00:49 -0700446"pcr_extend <pcr> <digest_addr> [<digest_algo>]\n"
447" Extend PCR #<pcr> with digest at <digest_addr> with digest_algo.\n"
Miquel Raynal14d72352018-05-15 11:57:15 +0200448" <pcr>: index of the PCR\n"
Tim Harveybbfa6082024-05-25 13:00:49 -0700449" <digest_addr>: address of digest of digest_algo type (defaults to SHA256)\n"
450"pcr_read <pcr> <digest_addr> [<digest_algo>]\n"
451" Read PCR #<pcr> to memory address <digest_addr> with <digest_algo>.\n"
Miquel Raynal4c1a5852018-05-15 11:57:16 +0200452" <pcr>: index of the PCR\n"
Tim Harveybbfa6082024-05-25 13:00:49 -0700453" <digest_addr>: address of digest of digest_algo type (defaults to SHA256)\n"
Miquel Raynal2e52c062018-05-15 11:57:17 +0200454"get_capability <capability> <property> <addr> <count>\n"
455" Read and display <count> entries indexed by <capability>/<property>.\n"
456" Values are 4 bytes long and are written at <addr>.\n"
457" <capability>: capability\n"
458" <property>: property\n"
459" <addr>: address to store <count> entries of 4 bytes\n"
460" <count>: number of entries to retrieve\n"
Miquel Raynal05d7be32018-05-15 11:57:19 +0200461"dam_reset [<password>]\n"
462" If the TPM is not in a LOCKOUT state, reset the internal error counter.\n"
463" <password>: optional password\n"
464"dam_parameters <max_tries> <recovery_time> <lockout_recovery> [<password>]\n"
465" If the TPM is not in a LOCKOUT state, set the DAM parameters\n"
466" <maxTries>: maximum number of failures before lockout,\n"
467" 0 means always locking\n"
468" <recoveryTime>: time before decrement of the error counter,\n"
469" 0 means no lockout\n"
470" <lockoutRecovery>: time of a lockout (before the next try),\n"
471" 0 means a reboot is needed\n"
472" <password>: optional password of the LOCKOUT hierarchy\n"
473"change_auth <hierarchy> <new_pw> [<old_pw>]\n"
474" <hierarchy>: the hierarchy\n"
475" <new_pw>: new password for <hierarchy>\n"
476" <old_pw>: optional previous password of <hierarchy>\n"
Miquel Raynal0b864f62018-05-15 11:57:20 +0200477"pcr_setauthpolicy|pcr_setauthvalue <pcr> <key> [<password>]\n"
478" Change the <key> to access PCR #<pcr>.\n"
479" hierarchy and may be empty.\n"
480" /!\\WARNING: untested function, use at your own risks !\n"
481" <pcr>: index of the PCR\n"
482" <key>: secret to protect the access of PCR #<pcr>\n"
483" <password>: optional password of the PLATFORM hierarchy\n"
Miquel Raynalf3b43502018-05-15 11:57:08 +0200484);