1/*
2 * The Initial Developer of the Original Code is International
3 * Business Machines Corporation. Portions created by IBM
4 * Corporation are Copyright (C) 2005, 2007 International Business
5 * Machines Corporation. All Rights Reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the Common Public License as published by
9 * IBM Corporation; either version 1 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * Common Public License for more details.
16 *
17 * You should have received a copy of the Common Public License
18 * along with this program; if not, a copy can be viewed at
19 * http://www.opensource.org/licenses/cpl1.0.php.
20 */
21
22#include "tpm_tspi.h"
23#include "tpm_utils.h"
24
25
26static BOOL isWellKnown = FALSE;
27TSS_HCONTEXT hContext = 0;
28
29
30static void help(const char* aCmd)
31{
32	logCmdHelp(aCmd);
33	logCmdOption("-z, --well-known", _("Use TSS_WELL_KNOWN_SECRET (20 zero bytes) as the owner secret."));
34}
35
36static int parse(const int aOpt, const char *aArg)
37{
38
39	switch (aOpt) {
40	case 'z':
41		isWellKnown = TRUE;
42		break;
43	default:
44		return -1;
45	}
46
47	return 0;
48}
49
50int
51main( int argc, char **argv )
52{
53	char *szTpmPasswd = NULL;
54	int tpm_len;
55	TSS_HTPM hTpm;
56	TSS_HPOLICY hTpmPolicy;
57	TSS_BOOL bValue = TRUE;
58	int iRc = -1;
59	struct option opts[] = {
60		{"well-known", no_argument, NULL, 'z'},
61	};
62	BYTE wellKnown[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET;
63
64	initIntlSys();
65
66	if (genericOptHandler(argc, argv, "z", opts, sizeof(opts) / sizeof(struct option), parse,
67			      help) != 0)
68		goto out;
69
70	if (contextCreate(&hContext) != TSS_SUCCESS)
71		goto out;
72
73	if (!isWellKnown) {
74		// Prompt for owner password
75		szTpmPasswd = GETPASSWD(_("Enter owner password: "), &tpm_len, FALSE);
76		if (!szTpmPasswd) {
77			logError(_("Failed to get Owner password\n"));
78			goto out;
79		}
80	} else {
81		szTpmPasswd = (char *)wellKnown;
82		tpm_len = sizeof(wellKnown);
83	}
84
85	if (contextConnect(hContext) != TSS_SUCCESS)
86		goto out_close;
87
88	if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS)
89		goto out_close;
90
91	if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS)
92		goto out_close;
93
94	if (policySetSecret(hTpmPolicy, tpm_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS)
95		goto out_close;
96
97	if (tpmSetStatus(hTpm, TSS_TPMSTATUS_RESETLOCK, bValue) != TSS_SUCCESS)
98		goto out_close;
99
100	iRc = 0;
101	logSuccess(argv[0]);
102
103	out_close:
104		contextClose(hContext);
105
106	out:
107	if (!isWellKnown && szTpmPasswd)
108		shredPasswd(szTpmPasswd);
109
110	return iRc;
111}
112