| Index: utility/tpmc.c
|
| diff --git a/utility/tpmc.c b/utility/tpmc.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d664ffbe3c54833b05092b5b98fafb9789c5f0b9
|
| --- /dev/null
|
| +++ b/utility/tpmc.c
|
| @@ -0,0 +1,114 @@
|
| +/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + *
|
| + * TPM command utility. Runs simple TPM commands. Mostly useful when physical
|
| + * presence has not been locked.
|
| + */
|
| +
|
| +#include <stdio.h>
|
| +#include <string.h>
|
| +#include <syslog.h>
|
| +
|
| +#include "tlcl.h"
|
| +#include "tpm_error_messages.h"
|
| +
|
| +typedef struct command_record {
|
| + const char* name;
|
| + const char* abbr;
|
| + const char* description;
|
| + uint32_t (*handler)(void);
|
| +} command_record;
|
| +
|
| +/* Handler functions. These wouldn't exist if C had closures.
|
| + */
|
| +
|
| +static uint32_t HandlerGetFlags(void) {
|
| + uint8_t disabled;
|
| + uint8_t deactivated;
|
| + uint8_t nvlocked;
|
| + uint32_t result = TlclGetFlags(&disabled, &deactivated, &nvlocked);
|
| + if (result == 0) {
|
| + printf("disabled: %d\ndeactivated: %d\nnvlocked: %d\n",
|
| + disabled, deactivated, nvlocked);
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +static uint32_t HandlerActivate(void) {
|
| + return TlclSetDeactivated(0);
|
| +}
|
| +
|
| +static uint32_t HandlerDeactivate(void) {
|
| + return TlclSetDeactivated(1);
|
| +}
|
| +
|
| +/* Table of TPM commands.
|
| + */
|
| +command_record command_table[] = {
|
| + { "getflags", "getf", "read and print the value of selected flags",
|
| + HandlerGetFlags },
|
| + { "startup", "sta", "issue a Startup command", TlclStartup },
|
| + { "selftestfull", "test", "issue a SelfTestFull command", TlclSelfTestFull },
|
| + { "continueselftest", "ctest", "issue a ContinueSelfTest command",
|
| + TlclContinueSelfTest },
|
| + { "assertphysicalpresence", "ppon", "assert Physical Presence",
|
| + TlclAssertPhysicalPresence },
|
| + { "enable", "ena", "enable the TPM (needs PP)", TlclSetEnable },
|
| + { "disable", "dis", "disable the TPM (needs PP)", TlclClearEnable },
|
| + { "activate", "act", "activate the TPM (needs PP, maybe reboot)",
|
| + HandlerActivate },
|
| + { "deactivate", "deact", "deactivate the TPM (needs PP, maybe reboot)",
|
| + HandlerDeactivate },
|
| +};
|
| +
|
| +static int n_commands = sizeof(command_table) / sizeof(command_table[0]);
|
| +
|
| +int main(int argc, char* argv[]) {
|
| + if (argc < 2) {
|
| + fprintf(stderr, "usage: %s <TPM command>\n or: %s help\n",
|
| + argv[0], argv[0]);
|
| + exit(1);
|
| + } else {
|
| + command_record* c;
|
| + const char* cmd = argv[1];
|
| +
|
| + if (strcmp(cmd, "help") == 0) {
|
| + printf("%23s %7s %s\n\n", "command", "abbr.", "description");
|
| + for (c = command_table; c < command_table + n_commands; c++) {
|
| + printf("%23s %7s %s\n", c->name, c->abbr, c->description);
|
| + }
|
| + return 0;
|
| + }
|
| +
|
| + TlclLibInit();
|
| +
|
| + for (c = command_table; c < command_table + n_commands; c++) {
|
| + if (strcmp(cmd, c->name) == 0 || strcmp(cmd, c->abbr) == 0) {
|
| + uint32_t result;
|
| + result = c->handler();
|
| + if (result == 0) {
|
| + return 0;
|
| + } else {
|
| + int i;
|
| + int n = sizeof(tpm_error_table) / sizeof(tpm_error_table[0]);
|
| + fprintf(stderr, "command \"%s\" failed with code 0x%x\n",
|
| + cmd, result);
|
| + for (i = 0; i < n; i++) {
|
| + if (tpm_error_table[i].code == result) {
|
| + fprintf(stderr, "%s\n%s\n", tpm_error_table[i].name,
|
| + tpm_error_table[i].description);
|
| + return 1;
|
| + }
|
| + }
|
| + fprintf(stderr, "the error code is unknown to this program\n");
|
| + return 1;
|
| + }
|
| + }
|
| + }
|
| +
|
| + /* No command matched. */
|
| + fprintf(stderr, "%s: unknown command: %s\n", argv[0], cmd);
|
| + return 1;
|
| + }
|
| +}
|
|
|