int main(int argc, char* argv[]) { char hostName[200] = DEFAULT_HOSTNAME; int port = DEFAULT_RESMGR_TPM_PORT; TPMI_RH_HIERARCHY hierarchyValue; TPM2B_PUBLIC inPublic; TPM2B_SENSITIVE inPrivate; UINT16 size; memset(&inPublic,0,sizeof(TPM2B_PUBLIC)); memset(&inPrivate,0,sizeof(TPM2B_SENSITIVE)); setbuf(stdout, NULL); setvbuf (stdout, NULL, _IONBF, BUFSIZ); int opt = -1; const char *optstring = "hvH:u:r:p:d:C:"; static struct option long_options[] = { {"help",0,NULL,'h'}, {"version",0,NULL,'v'}, {"Hierachy",1,NULL,'H'}, {"pubfile",1,NULL,'u'}, {"privfile",1,NULL,'r'}, {"port",1,NULL,'p'}, {"debugLevel",1,NULL,'d'}, {"context",1,NULL,'C'}, {0,0,0,0} }; int returnVal = 0; int flagCnt = 0; int h_flag = 0, v_flag = 0, H_flag = 0, u_flag = 0, C_flag = 0, r_flag = 0; char *contextFile = NULL; if(argc == 1) { showHelp(argv[0]); return 0; } while((opt = getopt_long(argc,argv,optstring,long_options,NULL)) != -1) { switch(opt) { case 'h': h_flag = 1; break; case 'v': v_flag = 1; break; case 'H': if(getHierarchyValue(optarg,&hierarchyValue) != 0) { returnVal = -1; break; } printf("\nhierarchyValue: 0x%x\n\n",hierarchyValue); H_flag = 1; break; case 'u': size = sizeof(inPublic); if(loadDataFromFile(optarg, (UINT8 *)&inPublic, &size) != 0) { returnVal = -2; break; } u_flag = 1; break; case 'r': size = sizeof(inPrivate); if(loadDataFromFile(optarg, (UINT8 *)&inPrivate, &size) != 0) { returnVal = -3; break; } r_flag = 1; break; case 'p': if( getPort(optarg, &port) ) { printf("Incorrect port number.\n"); returnVal = -4; } break; case 'd': if( getDebugLevel(optarg, &debugLevel) ) { printf("Incorrect debug level.\n"); returnVal = -5; } break; case 'C': contextFile = optarg; if(contextFile == NULL || contextFile[0] == '\0') { returnVal = -6; break; } printf("contextFile = %s\n", contextFile); C_flag = 1; break; case ':': // printf("Argument %c needs a value!\n",optopt); returnVal = -7; break; case '?': // printf("Unknown Argument: %c\n",optopt); returnVal = -8; break; //default: // break; } if(returnVal) break; }; if(returnVal != 0) return returnVal; flagCnt = h_flag + v_flag + H_flag + u_flag ; if(flagCnt == 1) { if(h_flag == 1) showHelp(argv[0]); else if(v_flag == 1) showVersion(argv[0]); else { showArgMismatch(argv[0]); return -9; } } else if(flagCnt == 2 && H_flag == 1 && u_flag == 1) { prepareTest(hostName, port, debugLevel); returnVal = loadExternal(hierarchyValue, &inPublic, &inPrivate, r_flag); if(returnVal == 0 && C_flag) returnVal = saveTpmContextToFile(sysContext, handle2048rsa, contextFile); finishTest(); if(returnVal) return -10; } else { showArgMismatch(argv[0]); return -11; } return 0; }
int main(int argc, char* argv[]) { char hostName[200] = DEFAULT_HOSTNAME; int port = DEFAULT_RESMGR_TPM_PORT; TPMI_RH_HIERARCHY hierarchyValue; TPM2B_MAX_BUFFER data; TPMI_ALG_HASH halg; char outHashFilePath[PATH_MAX] = {0}; char outTicketFilePath[PATH_MAX] = {0}; long fileSize = 0; setbuf(stdout, NULL); setvbuf (stdout, NULL, _IONBF, BUFSIZ); int opt = -1; const char *optstring = "hvH:g:I:o:t:p:d:"; static struct option long_options[] = { {"help",0,NULL,'h'}, {"version",0,NULL,'v'}, {"Hierachy",1,NULL,'H'}, {"halg",1,NULL,'g'}, {"infile",1,NULL,'I'}, {"outfile",1,NULL,'o'}, {"ticket",1,NULL,'t'}, {"port",1,NULL,'p'}, {"debugLevel",1,NULL,'d'}, {0,0,0,0} }; int returnVal = 0; int flagCnt = 0; int h_flag = 0, v_flag = 0, H_flag = 0, g_flag = 0, I_flag = 0, o_flag = 0, t_flag = 0; if(argc == 1) { showHelp(argv[0]); return 0; } while((opt = getopt_long(argc,argv,optstring,long_options,NULL)) != -1) { switch(opt) { case 'h': h_flag = 1; break; case 'v': v_flag = 1; break; case 'H': if(getHierarchyValue(optarg,&hierarchyValue) != 0) { returnVal = -1; break; } printf("\nhierarchyValue: 0x%x\n\n",hierarchyValue); H_flag = 1; break; case 'g': if(getSizeUint16Hex(optarg,&halg) != 0) { showArgError(optarg, argv[0]); returnVal = -2; break; } printf("halg = 0x%4.4x\n", halg); g_flag = 1; break; case 'I': if( getFileSize(optarg, &fileSize) != 0) { returnVal = -3; break; } if(fileSize > MAX_DIGEST_BUFFER) { printf("Input data too long: %ld, should be less than %d bytes\n", fileSize, MAX_DIGEST_BUFFER); returnVal = -4; break; } data.t.size = fileSize; if(loadDataFromFile(optarg, data.t.buffer, &data.t.size) != 0) { returnVal = -5; break; } I_flag = 1; break; case 'o': safeStrNCpy(outHashFilePath, optarg, sizeof(outHashFilePath)); if(checkOutFile(outHashFilePath) != 0) { returnVal = -6; break; } o_flag = 1; break; case 't': safeStrNCpy(outTicketFilePath, optarg, sizeof(outTicketFilePath)); if(checkOutFile(outTicketFilePath) != 0) { returnVal = -7; break; } t_flag = 1; break; case 'p': if( getPort(optarg, &port) ) { printf("Incorrect port number.\n"); returnVal = -8; } break; case 'd': if( getDebugLevel(optarg, &debugLevel) ) { printf("Incorrect debug level.\n"); returnVal = -9; } break; case ':': // printf("Argument %c needs a value!\n",optopt); returnVal = -10; break; case '?': // printf("Unknown Argument: %c\n",optopt); returnVal = -11; break; //default: // break; } if(returnVal) break; }; if(returnVal != 0) return returnVal; flagCnt = h_flag + v_flag + H_flag + g_flag + I_flag + o_flag + t_flag; if(flagCnt == 1) { if(h_flag == 1) showHelp(argv[0]); else if(v_flag == 1) showVersion(argv[0]); else { showArgMismatch(argv[0]); return -12; } } else if(flagCnt == 5 && h_flag != 1 && v_flag != 1) { prepareTest(hostName, port, debugLevel); returnVal = hash(hierarchyValue, &data, halg, outHashFilePath, outTicketFilePath); finishTest(); if(returnVal) return -13; } else { showArgMismatch(argv[0]); return -14; } return 0; }