1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2013 The Chromium OS Authors.
10 #include <asm/unaligned.h>
11 #include <tpm-common.h>
13 #include "tpm-user-utils.h"
16 static int do_tpm_startup(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
19 enum tpm_startup_type mode
;
28 if (!strcasecmp("TPM_ST_CLEAR", argv
[1])) {
30 } else if (!strcasecmp("TPM_ST_STATE", argv
[1])) {
32 } else if (!strcasecmp("TPM_ST_DEACTIVATED", argv
[1])) {
33 mode
= TPM_ST_DEACTIVATED
;
35 printf("Couldn't recognize mode string: %s\n", argv
[1]);
36 return CMD_RET_FAILURE
;
39 return report_return_code(tpm_startup(dev
, mode
));
42 static int do_tpm_nv_define_space(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
45 u32 index
, perm
, size
;
55 index
= simple_strtoul(argv
[1], NULL
, 0);
56 perm
= simple_strtoul(argv
[2], NULL
, 0);
57 size
= simple_strtoul(argv
[3], NULL
, 0);
59 return report_return_code(tpm1_nv_define_space(dev
, index
, perm
, size
));
62 static int do_tpm_nv_read_value(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
75 index
= simple_strtoul(argv
[1], NULL
, 0);
76 data
= (void *)simple_strtoul(argv
[2], NULL
, 0);
77 count
= simple_strtoul(argv
[3], NULL
, 0);
79 rc
= tpm_nv_read_value(dev
, index
, data
, count
);
81 puts("area content:\n");
82 print_byte_string(data
, count
);
85 return report_return_code(rc
);
88 static int do_tpm_nv_write_value(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
101 return CMD_RET_USAGE
;
102 index
= simple_strtoul(argv
[1], NULL
, 0);
103 data
= parse_byte_string(argv
[2], NULL
, &count
);
105 printf("Couldn't parse byte string %s\n", argv
[2]);
106 return CMD_RET_FAILURE
;
109 rc
= tpm_nv_write_value(dev
, index
, data
, count
);
112 return report_return_code(rc
);
115 static int do_tpm_extend(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
118 u8 in_digest
[20], out_digest
[20];
127 return CMD_RET_USAGE
;
128 index
= simple_strtoul(argv
[1], NULL
, 0);
129 if (!parse_byte_string(argv
[2], in_digest
, NULL
)) {
130 printf("Couldn't parse byte string %s\n", argv
[2]);
131 return CMD_RET_FAILURE
;
134 rc
= tpm_pcr_extend(dev
, index
, in_digest
, sizeof(in_digest
),
137 puts("PCR value after execution of the command:\n");
138 print_byte_string(out_digest
, sizeof(out_digest
));
141 return report_return_code(rc
);
144 static int do_tpm_pcr_read(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
147 u32 index
, count
, rc
;
156 return CMD_RET_USAGE
;
157 index
= simple_strtoul(argv
[1], NULL
, 0);
158 data
= (void *)simple_strtoul(argv
[2], NULL
, 0);
159 count
= simple_strtoul(argv
[3], NULL
, 0);
161 rc
= tpm_pcr_read(dev
, index
, data
, count
);
163 puts("Named PCR content:\n");
164 print_byte_string(data
, count
);
167 return report_return_code(rc
);
170 static int do_tpm_tsc_physical_presence(struct cmd_tbl
*cmdtp
, int flag
,
171 int argc
, char *const argv
[])
182 return CMD_RET_USAGE
;
183 presence
= (u16
)simple_strtoul(argv
[1], NULL
, 0);
185 return report_return_code(tpm_tsc_physical_presence(dev
, presence
));
188 static int do_tpm_read_pubek(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
200 return CMD_RET_USAGE
;
201 data
= (void *)simple_strtoul(argv
[1], NULL
, 0);
202 count
= simple_strtoul(argv
[2], NULL
, 0);
204 rc
= tpm_read_pubek(dev
, data
, count
);
206 puts("pubek value:\n");
207 print_byte_string(data
, count
);
210 return report_return_code(rc
);
213 static int do_tpm_physical_set_deactivated(struct cmd_tbl
*cmdtp
, int flag
,
214 int argc
, char *const argv
[])
225 return CMD_RET_USAGE
;
226 state
= (u8
)simple_strtoul(argv
[1], NULL
, 0);
228 return report_return_code(tpm_physical_set_deactivated(dev
, state
));
231 static int do_tpm_get_capability(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
234 u32 cap_area
, sub_cap
, rc
;
244 return CMD_RET_USAGE
;
245 cap_area
= simple_strtoul(argv
[1], NULL
, 0);
246 sub_cap
= simple_strtoul(argv
[2], NULL
, 0);
247 cap
= (void *)simple_strtoul(argv
[3], NULL
, 0);
248 count
= simple_strtoul(argv
[4], NULL
, 0);
250 rc
= tpm_get_capability(dev
, cap_area
, sub_cap
, cap
, count
);
252 puts("capability information:\n");
253 print_byte_string(cap
, count
);
256 return report_return_code(rc
);
259 static int do_tpm_raw_transfer(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
265 size_t count
, response_length
= sizeof(response
);
268 command
= parse_byte_string(argv
[1], NULL
, &count
);
270 printf("Couldn't parse byte string %s\n", argv
[1]);
271 return CMD_RET_FAILURE
;
278 rc
= tpm_xfer(dev
, command
, count
, response
, &response_length
);
281 puts("tpm response:\n");
282 print_byte_string(response
, response_length
);
285 return report_return_code(rc
);
288 static int do_tpm_nv_define(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
291 u32 index
, perm
, size
;
300 return CMD_RET_USAGE
;
301 size
= type_string_get_space_size(argv
[1]);
303 printf("Couldn't parse arguments\n");
304 return CMD_RET_USAGE
;
306 index
= simple_strtoul(argv
[2], NULL
, 0);
307 perm
= simple_strtoul(argv
[3], NULL
, 0);
309 return report_return_code(tpm1_nv_define_space(dev
, index
, perm
, size
));
312 static int do_tpm_nv_read(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
315 u32 index
, count
, err
;
325 return CMD_RET_USAGE
;
326 if (argc
!= 3 + type_string_get_num_values(argv
[1]))
327 return CMD_RET_USAGE
;
328 index
= simple_strtoul(argv
[2], NULL
, 0);
329 data
= type_string_alloc(argv
[1], &count
);
331 printf("Couldn't parse arguments\n");
332 return CMD_RET_USAGE
;
335 err
= tpm_nv_read_value(dev
, index
, data
, count
);
337 if (type_string_write_vars(argv
[1], data
, argv
+ 3)) {
338 printf("Couldn't write to variables\n");
344 return report_return_code(err
);
347 static int do_tpm_nv_write(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
350 u32 index
, count
, err
;
360 return CMD_RET_USAGE
;
361 if (argc
!= 3 + type_string_get_num_values(argv
[1]))
362 return CMD_RET_USAGE
;
363 index
= simple_strtoul(argv
[2], NULL
, 0);
364 data
= type_string_alloc(argv
[1], &count
);
366 printf("Couldn't parse arguments\n");
367 return CMD_RET_USAGE
;
369 if (type_string_pack(argv
[1], argv
+ 3, data
)) {
370 printf("Couldn't parse arguments\n");
372 return CMD_RET_USAGE
;
375 err
= tpm_nv_write_value(dev
, index
, data
, count
);
378 return report_return_code(err
);
381 #ifdef CONFIG_TPM_AUTH_SESSIONS
383 static int do_tpm_oiap(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
386 u32 auth_handle
, err
;
394 err
= tpm1_oiap(dev
, &auth_handle
);
396 return report_return_code(err
);
399 #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
400 static int do_tpm_load_key_by_sha1(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
403 u32 parent_handle
= 0;
404 u32 key_len
, key_handle
, err
;
405 u8 usage_auth
[DIGEST_LENGTH
];
406 u8 parent_hash
[DIGEST_LENGTH
];
415 return CMD_RET_USAGE
;
417 parse_byte_string(argv
[1], parent_hash
, NULL
);
418 key
= (void *)simple_strtoul(argv
[2], NULL
, 0);
419 key_len
= simple_strtoul(argv
[3], NULL
, 0);
420 if (strlen(argv
[4]) != 2 * DIGEST_LENGTH
)
421 return CMD_RET_FAILURE
;
422 parse_byte_string(argv
[4], usage_auth
, NULL
);
424 err
= tpm1_find_key_sha1(dev
, usage_auth
, parent_hash
, &parent_handle
);
426 printf("Could not find matching parent key (err = %d)\n", err
);
427 return CMD_RET_FAILURE
;
430 printf("Found parent key %08x\n", parent_handle
);
432 err
= tpm1_load_key2_oiap(dev
, parent_handle
, key
, key_len
, usage_auth
,
435 printf("Key handle is 0x%x\n", key_handle
);
436 env_set_hex("key_handle", key_handle
);
439 return report_return_code(err
);
441 #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
443 static int do_tpm_load_key2_oiap(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
446 u32 parent_handle
, key_len
, key_handle
, err
;
447 u8 usage_auth
[DIGEST_LENGTH
];
457 return CMD_RET_USAGE
;
459 parent_handle
= simple_strtoul(argv
[1], NULL
, 0);
460 key
= (void *)simple_strtoul(argv
[2], NULL
, 0);
461 key_len
= simple_strtoul(argv
[3], NULL
, 0);
462 if (strlen(argv
[4]) != 2 * DIGEST_LENGTH
)
463 return CMD_RET_FAILURE
;
464 parse_byte_string(argv
[4], usage_auth
, NULL
);
466 err
= tpm1_load_key2_oiap(dev
, parent_handle
, key
, key_len
, usage_auth
,
469 printf("Key handle is 0x%x\n", key_handle
);
471 return report_return_code(err
);
474 static int do_tpm_get_pub_key_oiap(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
478 u8 usage_auth
[DIGEST_LENGTH
];
479 u8 pub_key_buffer
[TPM_PUBKEY_MAX_LENGTH
];
480 size_t pub_key_len
= sizeof(pub_key_buffer
);
489 return CMD_RET_USAGE
;
491 key_handle
= simple_strtoul(argv
[1], NULL
, 0);
492 if (strlen(argv
[2]) != 2 * DIGEST_LENGTH
)
493 return CMD_RET_FAILURE
;
494 parse_byte_string(argv
[2], usage_auth
, NULL
);
496 err
= tpm1_get_pub_key_oiap(dev
, key_handle
, usage_auth
, pub_key_buffer
,
499 printf("dump of received pub key structure:\n");
500 print_byte_string(pub_key_buffer
, pub_key_len
);
502 return report_return_code(err
);
505 TPM_COMMAND_NO_ARG(tpm1_end_oiap
)
507 #endif /* CONFIG_TPM_AUTH_SESSIONS */
509 #ifdef CONFIG_TPM_FLUSH_RESOURCES
510 static int do_tpm_flush(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
522 return CMD_RET_USAGE
;
524 if (!strcasecmp(argv
[1], "key"))
526 else if (!strcasecmp(argv
[1], "auth"))
528 else if (!strcasecmp(argv
[1], "hash"))
530 else if (!strcasecmp(argv
[1], "trans"))
532 else if (!strcasecmp(argv
[1], "context"))
533 type
= TPM_RT_CONTEXT
;
534 else if (!strcasecmp(argv
[1], "counter"))
535 type
= TPM_RT_COUNTER
;
536 else if (!strcasecmp(argv
[1], "delegate"))
537 type
= TPM_RT_DELEGATE
;
538 else if (!strcasecmp(argv
[1], "daa_tpm"))
539 type
= TPM_RT_DAA_TPM
;
540 else if (!strcasecmp(argv
[1], "daa_v0"))
541 type
= TPM_RT_DAA_V0
;
542 else if (!strcasecmp(argv
[1], "daa_v1"))
543 type
= TPM_RT_DAA_V1
;
546 printf("Resource type %s unknown.\n", argv
[1]);
550 if (!strcasecmp(argv
[2], "all")) {
557 /* fetch list of already loaded resources in the TPM */
558 err
= tpm_get_capability(dev
, TPM_CAP_HANDLE
, type
, buf
,
561 printf("tpm_get_capability returned error %d.\n", err
);
564 res_count
= get_unaligned_be16(buf
);
566 for (i
= 0; i
< res_count
; ++i
, ptr
+= 4)
567 tpm1_flush_specific(dev
, get_unaligned_be32(ptr
), type
);
569 u32 handle
= simple_strtoul(argv
[2], NULL
, 0);
572 printf("Illegal resource handle %s\n", argv
[2]);
575 tpm1_flush_specific(dev
, cpu_to_be32(handle
), type
);
580 #endif /* CONFIG_TPM_FLUSH_RESOURCES */
582 #ifdef CONFIG_TPM_LIST_RESOURCES
583 static int do_tpm_list(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
599 return CMD_RET_USAGE
;
601 if (!strcasecmp(argv
[1], "key"))
603 else if (!strcasecmp(argv
[1], "auth"))
605 else if (!strcasecmp(argv
[1], "hash"))
607 else if (!strcasecmp(argv
[1], "trans"))
609 else if (!strcasecmp(argv
[1], "context"))
610 type
= TPM_RT_CONTEXT
;
611 else if (!strcasecmp(argv
[1], "counter"))
612 type
= TPM_RT_COUNTER
;
613 else if (!strcasecmp(argv
[1], "delegate"))
614 type
= TPM_RT_DELEGATE
;
615 else if (!strcasecmp(argv
[1], "daa_tpm"))
616 type
= TPM_RT_DAA_TPM
;
617 else if (!strcasecmp(argv
[1], "daa_v0"))
618 type
= TPM_RT_DAA_V0
;
619 else if (!strcasecmp(argv
[1], "daa_v1"))
620 type
= TPM_RT_DAA_V1
;
623 printf("Resource type %s unknown.\n", argv
[1]);
627 /* fetch list of already loaded resources in the TPM */
628 err
= tpm_get_capability(dev
, TPM_CAP_HANDLE
, type
, buf
,
631 printf("tpm_get_capability returned error %d.\n", err
);
634 res_count
= get_unaligned_be16(buf
);
637 printf("Resources of type %s (%02x):\n", argv
[1], type
);
641 for (i
= 0; i
< res_count
; ++i
, ptr
+= 4)
642 printf("Index %d: %08x\n", i
, get_unaligned_be32(ptr
));
647 #endif /* CONFIG_TPM_LIST_RESOURCES */
649 TPM_COMMAND_NO_ARG(tpm_self_test_full
)
650 TPM_COMMAND_NO_ARG(tpm_continue_self_test
)
651 TPM_COMMAND_NO_ARG(tpm_force_clear
)
652 TPM_COMMAND_NO_ARG(tpm_physical_enable
)
653 TPM_COMMAND_NO_ARG(tpm_physical_disable
)
655 static struct cmd_tbl tpm1_commands
[] = {
656 U_BOOT_CMD_MKENT(device
, 0, 1, do_tpm_device
, "", ""),
657 U_BOOT_CMD_MKENT(info
, 0, 1, do_tpm_info
, "", ""),
658 U_BOOT_CMD_MKENT(autostart
, 0, 1, do_tpm_autostart
, "", ""),
659 U_BOOT_CMD_MKENT(init
, 0, 1, do_tpm_init
, "", ""),
660 U_BOOT_CMD_MKENT(startup
, 0, 1,
661 do_tpm_startup
, "", ""),
662 U_BOOT_CMD_MKENT(self_test_full
, 0, 1,
663 do_tpm_self_test_full
, "", ""),
664 U_BOOT_CMD_MKENT(continue_self_test
, 0, 1,
665 do_tpm_continue_self_test
, "", ""),
666 U_BOOT_CMD_MKENT(force_clear
, 0, 1,
667 do_tpm_force_clear
, "", ""),
668 U_BOOT_CMD_MKENT(physical_enable
, 0, 1,
669 do_tpm_physical_enable
, "", ""),
670 U_BOOT_CMD_MKENT(physical_disable
, 0, 1,
671 do_tpm_physical_disable
, "", ""),
672 U_BOOT_CMD_MKENT(nv_define_space
, 0, 1,
673 do_tpm_nv_define_space
, "", ""),
674 U_BOOT_CMD_MKENT(nv_read_value
, 0, 1,
675 do_tpm_nv_read_value
, "", ""),
676 U_BOOT_CMD_MKENT(nv_write_value
, 0, 1,
677 do_tpm_nv_write_value
, "", ""),
678 U_BOOT_CMD_MKENT(extend
, 0, 1,
679 do_tpm_extend
, "", ""),
680 U_BOOT_CMD_MKENT(pcr_read
, 0, 1,
681 do_tpm_pcr_read
, "", ""),
682 U_BOOT_CMD_MKENT(tsc_physical_presence
, 0, 1,
683 do_tpm_tsc_physical_presence
, "", ""),
684 U_BOOT_CMD_MKENT(read_pubek
, 0, 1,
685 do_tpm_read_pubek
, "", ""),
686 U_BOOT_CMD_MKENT(physical_set_deactivated
, 0, 1,
687 do_tpm_physical_set_deactivated
, "", ""),
688 U_BOOT_CMD_MKENT(get_capability
, 0, 1,
689 do_tpm_get_capability
, "", ""),
690 U_BOOT_CMD_MKENT(raw_transfer
, 0, 1,
691 do_tpm_raw_transfer
, "", ""),
692 U_BOOT_CMD_MKENT(nv_define
, 0, 1,
693 do_tpm_nv_define
, "", ""),
694 U_BOOT_CMD_MKENT(nv_read
, 0, 1,
695 do_tpm_nv_read
, "", ""),
696 U_BOOT_CMD_MKENT(nv_write
, 0, 1,
697 do_tpm_nv_write
, "", ""),
698 #ifdef CONFIG_TPM_AUTH_SESSIONS
699 U_BOOT_CMD_MKENT(oiap
, 0, 1,
700 do_tpm_oiap
, "", ""),
701 U_BOOT_CMD_MKENT(end_oiap
, 0, 1,
702 do_tpm1_end_oiap
, "", ""),
703 U_BOOT_CMD_MKENT(load_key2_oiap
, 0, 1,
704 do_tpm_load_key2_oiap
, "", ""),
705 #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
706 U_BOOT_CMD_MKENT(load_key_by_sha1
, 0, 1,
707 do_tpm_load_key_by_sha1
, "", ""),
708 #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
709 U_BOOT_CMD_MKENT(get_pub_key_oiap
, 0, 1,
710 do_tpm_get_pub_key_oiap
, "", ""),
711 #endif /* CONFIG_TPM_AUTH_SESSIONS */
712 #ifdef CONFIG_TPM_FLUSH_RESOURCES
713 U_BOOT_CMD_MKENT(flush
, 0, 1,
714 do_tpm_flush
, "", ""),
715 #endif /* CONFIG_TPM_FLUSH_RESOURCES */
716 #ifdef CONFIG_TPM_LIST_RESOURCES
717 U_BOOT_CMD_MKENT(list
, 0, 1,
718 do_tpm_list
, "", ""),
719 #endif /* CONFIG_TPM_LIST_RESOURCES */
722 struct cmd_tbl
*get_tpm1_commands(unsigned int *size
)
724 *size
= ARRAY_SIZE(tpm1_commands
);
726 return tpm1_commands
;
729 U_BOOT_CMD(tpm
, CONFIG_SYS_MAXARGS
, 1, do_tpm
,
730 "Issue a TPMv1.x command",
732 " - Issue TPM command <cmd> with arguments <args...>.\n"
733 "Admin Startup and State Commands:\n"
734 " device [num device]\n"
735 " - Show all devices or set the specified device\n"
736 " info - Show information about the TPM\n"
738 " - Initalize the tpm, perform a Startup(clear) and run a full selftest\n"
741 " - Put TPM into a state where it waits for 'startup' command.\n"
743 " - Issue TPM_Starup command. <mode> is one of TPM_ST_CLEAR,\n"
744 " TPM_ST_STATE, and TPM_ST_DEACTIVATED.\n"
745 "Admin Testing Commands:\n"
747 " - Test all of the TPM capabilities.\n"
748 " continue_self_test\n"
749 " - Inform TPM that it should complete the self-test.\n"
750 "Admin Opt-in Commands:\n"
752 " - Set the PERMANENT disable flag to FALSE using physical presence as\n"
754 " physical_disable\n"
755 " - Set the PERMANENT disable flag to TRUE using physical presence as\n"
757 " physical_set_deactivated 0|1\n"
758 " - Set deactivated flag.\n"
759 "Admin Ownership Commands:\n"
761 " - Issue TPM_ForceClear command.\n"
762 " tsc_physical_presence flags\n"
763 " - Set TPM device's Physical Presence flags to <flags>.\n"
764 "The Capability Commands:\n"
765 " get_capability cap_area sub_cap addr count\n"
766 " - Read <count> bytes of TPM capability indexed by <cap_area> and\n"
767 " <sub_cap> to memory address <addr>.\n"
768 #if defined(CONFIG_TPM_FLUSH_RESOURCES) || defined(CONFIG_TPM_LIST_RESOURCES)
769 "Resource management functions\n"
771 #ifdef CONFIG_TPM_FLUSH_RESOURCES
772 " flush resource_type id\n"
773 " - flushes a resource of type <resource_type> (may be one of key, auth,\n"
774 " hash, trans, context, counter, delegate, daa_tpm, daa_v0, daa_v1),\n"
775 " and id <id> from the TPM. Use an <id> of \"all\" to flush all\n"
776 " resources of that type.\n"
777 #endif /* CONFIG_TPM_FLUSH_RESOURCES */
778 #ifdef CONFIG_TPM_LIST_RESOURCES
779 " list resource_type\n"
780 " - lists resources of type <resource_type> (may be one of key, auth,\n"
781 " hash, trans, context, counter, delegate, daa_tpm, daa_v0, daa_v1),\n"
782 " contained in the TPM.\n"
783 #endif /* CONFIG_TPM_LIST_RESOURCES */
784 #ifdef CONFIG_TPM_AUTH_SESSIONS
785 "Storage functions\n"
786 " loadkey2_oiap parent_handle key_addr key_len usage_auth\n"
787 " - loads a key data from memory address <key_addr>, <key_len> bytes\n"
788 " into TPM using the parent key <parent_handle> with authorization\n"
789 " <usage_auth> (20 bytes hex string).\n"
790 #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
791 " load_key_by_sha1 parent_hash key_addr key_len usage_auth\n"
792 " - loads a key data from memory address <key_addr>, <key_len> bytes\n"
793 " into TPM using the parent hash <parent_hash> (20 bytes hex string)\n"
794 " with authorization <usage_auth> (20 bytes hex string).\n"
795 #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
796 " get_pub_key_oiap key_handle usage_auth\n"
797 " - get the public key portion of a loaded key <key_handle> using\n"
798 " authorization <usage auth> (20 bytes hex string)\n"
799 #endif /* CONFIG_TPM_AUTH_SESSIONS */
800 "Endorsement Key Handling Commands:\n"
801 " read_pubek addr count\n"
802 " - Read <count> bytes of the public endorsement key to memory\n"
804 "Integrity Collection and Reporting Commands:\n"
805 " extend index digest_hex_string\n"
806 " - Add a new measurement to a PCR. Update PCR <index> with the 20-bytes\n"
807 " <digest_hex_string>\n"
808 " pcr_read index addr count\n"
809 " - Read <count> bytes from PCR <index> to memory address <addr>.\n"
810 #ifdef CONFIG_TPM_AUTH_SESSIONS
811 "Authorization Sessions\n"
813 " - setup an OIAP session\n"
815 " - terminates an active OIAP session\n"
816 #endif /* CONFIG_TPM_AUTH_SESSIONS */
817 "Non-volatile Storage Commands:\n"
818 " nv_define_space index permission size\n"
819 " - Establish a space at index <index> with <permission> of <size> bytes.\n"
820 " nv_read_value index addr count\n"
821 " - Read <count> bytes from space <index> to memory address <addr>.\n"
822 " nv_write_value index addr count\n"
823 " - Write <count> bytes from memory address <addr> to space <index>.\n"
824 "Miscellaneous helper functions:\n"
825 " raw_transfer byte_string\n"
826 " - Send a byte string <byte_string> to TPM and print the response.\n"
827 " Non-volatile storage helper functions:\n"
828 " These helper functions treat a non-volatile space as a non-padded\n"
829 " sequence of integer values. These integer values are defined by a type\n"
830 " string, which is a text string of 'bwd' characters: 'b' means a 8-bit\n"
831 " value, 'w' 16-bit value, 'd' 32-bit value. All helper functions take\n"
832 " a type string as their first argument.\n"
833 " nv_define type_string index perm\n"
834 " - Define a space <index> with permission <perm>.\n"
835 " nv_read types_string index vars...\n"
836 " - Read from space <index> to environment variables <vars...>.\n"
837 " nv_write types_string index values...\n"
838 " - Write to space <index> from values <values...>.\n"