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