Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Unified Diff: utility/tpmc.c

Issue 3149001: Command-line utility to execute TPM commands bypassing the TSS stack. (Closed) Base URL: ssh://git@chromiumos-git/vboot_reference.git
Patch Set: . Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utility/Makefile ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
+ }
+}
« no previous file with comments | « utility/Makefile ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698