diff --git a/wolfCLU/clu_include/clu_optargs.h b/wolfCLU/clu_include/clu_optargs.h index 1d4a4889..d85c1d2e 100644 --- a/wolfCLU/clu_include/clu_optargs.h +++ b/wolfCLU/clu_include/clu_optargs.h @@ -22,10 +22,15 @@ /* Enumerated types for long arguments */ enum { + /* @temporary: implement modes as arguments */ ENCRYPT = 1000, DECRYPT, BENCHMARK, HASH, + X509, + REQUEST, + GEN_KEY, + INFILE, OUTFILE, PASSWORD, @@ -37,26 +42,27 @@ enum { TIME, VERIFY, VERBOSE, - X509, INFORM, OUTFORM, NOOUT, TEXT_OUT, SILENT, - REQUEST, - GEN_KEY, OUTPUT, - HELP1, /* "-help" */ - HELP2, /* "-h" */ + HELP, }; /* Structure for holding long arguments */ static struct option long_options[] = { - {"encrypt", required_argument, 0, ENCRYPT }, - {"decrypt", required_argument, 0, DECRYPT }, - {"bench", required_argument, 0, BENCHMARK }, - {"hash", required_argument, 0, HASH }, + /* @temporary: implement modes as flags */ + {"encrypt", optional_argument, 0, ENCRYPT }, + {"decrypt", optional_argument, 0, DECRYPT }, + {"bench", optional_argument, 0, BENCHMARK }, + {"hash", optional_argument, 0, HASH }, + {"x509", no_argument, 0, X509 }, + {"req", optional_argument, 0, REQUEST }, + {"genkey", optional_argument, 0, GEN_KEY }, + {"in", required_argument, 0, INFILE }, {"out", required_argument, 0, OUTFILE }, {"pwd", required_argument, 0, PASSWORD }, @@ -68,21 +74,18 @@ static struct option long_options[] = { {"time", required_argument, 0, TIME }, {"verify", 0, 0, VERIFY }, {"verbose", 0, 0, VERBOSE }, - {"x509", 0, 0, X509 }, {"inform", required_argument, 0, INFORM }, {"outform", required_argument, 0, OUTFORM }, {"noout", 0, 0, NOOUT }, {"text", 0, 0, TEXT_OUT }, {"silent", 0, 0, SILENT }, - {"req", 0, 0, REQUEST }, - {"genkey", 0, 0, GEN_KEY }, {"output", 0, 0, OUTPUT }, - {"help", 0, 0, HELP1 }, - {"h", 0, 0, HELP2 }, + {"help", 0, 0, HELP }, + {"h", 0, 0, HELP }, {"v", 0, 0, 'v' }, {"version", 0, 0, 'v' }, - {0, 0, 0, 0} + {0, 0, 0, 0} /* terminal element */ }; /* method for converting arguments to lower case */ diff --git a/wolfCLU/clu_src/clu_main.c b/wolfCLU/clu_src/clu_main.c index 9c4aa861..16dc9676 100644 --- a/wolfCLU/clu_src/clu_main.c +++ b/wolfCLU/clu_src/clu_main.c @@ -31,6 +31,8 @@ int main(int argc, char** argv) { + int flag = 0; + char* mode = ""; int ret = 0; int option = 0; int ignoreIn = 0; @@ -42,6 +44,7 @@ int main(int argc, char** argv) printf("Main Help.\n"); wolfCLU_help(); } + /* Set ignore variables for -in and -out files */ ret = wolfCLU_checkForArg("-in", 3, argc, argv); if (ret > 0) { @@ -52,9 +55,8 @@ int main(int argc, char** argv) ignoreOut = ret + 1; } - - /* flexibility: allow users to input any CAPS or lower case, - * we will do all processing on lower case only. */ + /* flexibility: allow users to input any CAPS or lower case, we will do all + * processing on lower case only. except where ignored */ for (i = 0; i < argc; i++) { if (i != ignoreIn && i != ignoreOut) { convert_to_lower(argv[i], (int) XSTRLEN(argv[i])); @@ -65,86 +67,107 @@ int main(int argc, char** argv) long_options, &long_index )) != -1) { switch (option) { - /* Encrypt */ - case ENCRYPT: ret = wolfCLU_setup(argc, argv, 'e'); - break; - /* Decrypt */ - case DECRYPT: ret = wolfCLU_setup(argc, argv, 'd');; - break; - /* Benchmark */ - case BENCHMARK:ret = wolfCLU_benchSetup(argc, argv); - break; - /* Hash */ - case HASH: ret = wolfCLU_hashSetup(argc, argv); - break; - /* x509 Certificate processing */ - case X509: ret = wolfCLU_certSetup(argc, argv); - break; - /* x509 Certificate request */ - case REQUEST: ret = wolfCLU_requestSetup(argc, argv); - break; - case GEN_KEY: ret = wolfCLU_genKeySetup(argc, argv); - break; -/* Ignore the following arguments for now. Will be handled by their respective - * setups IE Crypto setup, Benchmark setup, or Hash Setup */ - /* File passed in by user */ - case INFILE: break; - /* Output file */ - case OUTFILE: break; - /* Password */ - case PASSWORD: break; - /* Key if used must be in hex */ - case KEY: break; - /* IV if used must be in hex */ - case IV: break; - /* Opt to benchmark all available algorithms */ - case ALL: break; - /* size for hash or key to output */ - case SIZE: break; - /* exponent for generating RSA key */ - case EXPONENT: break; - /* Time to benchmark for 1-10 seconds optional default: 3s */ - case TIME: break; - /* Verify results, used with -iv and -key */ - case VERIFY: break; - /* Certificate Stuff*/ - case INFORM: break; - case OUTFORM: break; - case OUTPUT: break; - case NOOUT: break; - case TEXT_OUT: break; - case SILENT: break; - case HELP1: - if (argc == 2) { - printf("Main help menu:\n"); - wolfCLU_help(); - return 0; - } - break; - case HELP2: - if (argc == 2) { - printf("Main help menu:\n"); - wolfCLU_help(); - return 0; - } - break; - /* which version of clu am I using */ - case VERBOSE: - wolfCLU_verboseHelp(); - return 0; -/*End of ignored arguments */ + /* @temporary: implement the modes as arguments */ + case ENCRYPT: + case DECRYPT: + case BENCHMARK: + case HASH: + case X509: + case REQUEST: + case GEN_KEY: + if (!flag) flag = option; + break; - case 'v': wolfCLU_version(); - return 0; + /* + * Ignore the following arguments for now. They will be handled by + * their respective setups (e.g. Crypto setup, Benchmark setup, or + * Hash Setup) + */ - default: - printf("Main help default.\n"); - wolfCLU_help(); - return 0; + case INFILE: /* File passed in by user */ + case OUTFILE: /* Output file */ + case PASSWORD: /* Password */ + case KEY: /* Key if used must be in hex */ + case IV: /* IV if used must be in hex */ + case ALL: /* Opt to benchmark all available algorithms */ + case SIZE: /* size for hash or key to output */ + case EXPONENT: /* exponent for generating RSA key */ + case TIME: /* Time to benchmark for */ + case VERIFY: /* Verify results, used with -iv and -key */ + case INFORM: /* Certificate Stuff */ + case OUTFORM: + case OUTPUT: + case NOOUT: + case TEXT_OUT: + case SILENT: + /* do nothing. */ + break; + + /* + * End of ignored arguments + */ + + case HELP: + /* only print for -help if no mode has been declared */ + if (!flag) { + printf("Main help menu:\n"); + wolfCLU_help(); + return 0; + } + break; + + case VERBOSE: + wolfCLU_verboseHelp(); + return 0; + + case 'v': + wolfCLU_version(); + return 0; + + default: + printf("Main help default.\n"); + wolfCLU_help(); + return 0; } } + /* @temporary: implement mode as a flag */ + switch (flag) { + case 0: + printf("No mode provided.\n"); + ret = 0; + break; + + case ENCRYPT: + ret = wolfCLU_setup(argc, argv, 'e'); + break; + + case DECRYPT: + ret = wolfCLU_setup(argc, argv, 'd'); + break; + + case BENCHMARK: + ret = wolfCLU_benchSetup(argc, argv); + break; + + case HASH: + ret = wolfCLU_hashSetup(argc, argv); + break; + + case X509: + ret = wolfCLU_certSetup(argc, argv); + break; + + case REQUEST: + ret = wolfCLU_requestSetup(argc, argv); + break; + + case GEN_KEY: + ret = wolfCLU_genKeySetup(argc, argv); + break; + } + if (ret != 0) printf("Error returned: %d.\n", ret);