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 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#include <getopt.h> 22#include <stdlib.h> //for def. exit 23#include "tpm_tspi.h" 24 25 26//Controlled by input options 27static int resultFlag = FALSE; 28TSS_HCONTEXT hContext = 0; 29 30TSS_RESULT selfTestFull(TSS_HTPM a_hTpm) 31{ 32 TSS_RESULT result = Tspi_TPM_SelfTestFull(a_hTpm); 33 tspiResult("Tspi_TPM_SelfTestFull", result); 34 35 return result; 36} 37 38TSS_RESULT selfTestResult(TSS_HTPM a_hTpm, 39 UINT32 * a_uiResultLen, BYTE ** a_pResult) 40{ 41 42 TSS_RESULT result = Tspi_TPM_GetTestResult(a_hTpm, a_uiResultLen, 43 a_pResult); 44 tspiResult("Tspi_TPM_GetTestResult", result); 45 46 return result; 47} 48 49int cmdSelfTest(const char *a_szCmd) 50{ 51 TSS_HTPM hTpm; 52 UINT32 uiResultLen; 53 BYTE *pResult; 54 int iRc = -1; 55 56 if (contextCreate(&hContext) != TSS_SUCCESS) 57 goto out; 58 59 if (contextConnect(hContext) != TSS_SUCCESS) 60 goto out_close; 61 62 if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) 63 goto out_close; 64 65 if ((!resultFlag) && (selfTestFull(hTpm) != TSS_SUCCESS)) 66 goto out_close; 67 68 if (selfTestResult(hTpm, &uiResultLen, &pResult) != TSS_SUCCESS) 69 goto out_close; 70 logMsg(_(" TPM Test Results: ")); 71 logHex(uiResultLen, pResult); 72 73 iRc = 0; 74 logSuccess(a_szCmd); 75 76 out_close: 77 contextClose(hContext); 78 79 out: 80 return iRc; 81} 82 83void selftestUsage(const char *a_szCmd) 84{ 85 logCmdHelp(a_szCmd); 86 logCmdOption("-r, --results", _("Report results of last test without retesting.")); 87} 88 89static int parse(const int aOpt, const char *aArg) 90{ 91 92 switch (aOpt) { 93 case 'r': 94 logDebug(_("Results only\n")); 95 resultFlag = TRUE; 96 break; 97 default: 98 return -1; 99 } 100 return 0; 101} 102 103 104int main(int argc, char *argv[]) 105{ 106 int rc; 107 struct option opts[] = { 108 {"results", no_argument, NULL, 'r'}, 109 }; 110 111 initIntlSys(); 112 113 rc = genericOptHandler(argc, argv, "r", opts, 114 sizeof(opts) / sizeof(struct option), parse, 115 selftestUsage); 116 if (rc) 117 exit(0); 118 119 rc = cmdSelfTest(argv[0]); 120 121 return rc; 122} 123