X-Git-Url: https://iam.tj/gitweb/gitweb.cgi?p=cfe_generate_password.git;a=blobdiff_plain;f=cfe_generate_password.c;h=cdfe823cc3aea21d2f5deac66db57b65cfdf5ed4;hp=c1378e4612236dff37050d8f52fab3ab87963e19;hb=5c8d839840597bbcef9ee5a125442a41b1f6b315;hpb=c9491adc74fd8da84ba0be76b1fefeac5b7488d5 diff --git a/cfe_generate_password.c b/cfe_generate_password.c index c1378e4..cdfe823 100644 --- a/cfe_generate_password.c +++ b/cfe_generate_password.c @@ -1,7 +1,7 @@ static const char *title = \ -"Generate Broadcom CFE seeds and passwords for many popular modem/router devices\n" +"Generate Broadcom CFE seeds and passwords for many popular modem/router devices" ; -static const float VERSION = 1.3f; +static const float VERSION = 1.4f; static const char *copyright = \ "Copyright 2015 TJ \n" @@ -57,9 +57,9 @@ static const char *help = \ "The tool can accept a timestamp as 8 hexadecimal characters (useful for testing the algorithm):\n\n" -" ./cfe_gen_pass -t 0FF020 -s ec:43:f6:46:c0:80 -p\n\n" +" ./cfe_gen_pass -t 56FA8C2B -s ec:43:f6:46:c0:80 -p\n\n" -"MAC address: ec:43:f6:46:c0:80 Timestamp: 0FF020 Seed: 0FF02046c080 Password: 110f65a3\n\n" +" MAC address: ec:43:f6:46:c0:80 Timestamp: 56FA8C2B (2016-03-29 14:07:39) Seed: FA8C2B46c080 Password: 1111bda5\n\n" ; #include @@ -80,13 +80,10 @@ pr_usage(int verbose) { fprintf(stderr, "Usage:\n" - " -v show version\n" " -s 00:01:02:03:04:05 create seed from MAC address\n" " -t [00000000] seconds since 1970-01-01 (defaults to NOW) \n" - " -p [SEED] generate password (with optional seed)\n\n" - " E.g. -s 01:02:03:04:05 \n" - " -s 01:02:03:04:05 -p\n" - " -p 000000030405\n" + " -p [SEED] generate password (with optional seed)\n" + " -h show additional help\n" "\n" "%s", verbose ? help : "" @@ -175,101 +172,100 @@ int main(int argc, char **argv, char **env) { int result = 0; - - if (argc == 1) { - pr_usage(0); - } - else { - unsigned int arg; - char *MAC_ADDR = NULL; - char timestamp[TIMESTAMP_SIZE + 1]; - char seed[SEED_SIZE + 1]; - char password[PASSWORD_SIZE + 1]; - char date_string[DATESTRING_SIZE + 1]; - unsigned int opt_seed, opt_pass, opt_ts; - time_t ts = 0; - struct tm *t = NULL; - seed[0] = password[0] = timestamp[0] = 0; - seed[SEED_SIZE] = password[PASSWORD_SIZE] = 0; - opt_seed = opt_pass = opt_ts = 0; - strncpy(timestamp, "00000000", TIMESTAMP_SIZE + 1); - - for (arg = 1; arg < (unsigned) argc; ++arg) { - size_t arg_len = strlen(argv[arg]); - - if (argv[arg][0] == '-') { - switch (argv[arg][1]) { - case 's': - opt_seed = 1; - break; - case 'p': - opt_pass = 1; - break; - case 't': - opt_ts = 1; - break; - case 'v': - fprintf(stderr, "Version: %0.2f\n", VERSION); - } - } else if (opt_seed == 1) { - MAC_ADDR = argv[arg]; - ++opt_seed; - } else if (opt_pass == 1 && opt_seed == 0) { - if (arg_len != SEED_SIZE) - pr_error_exit(1, "seed length must be %d characters", SEED_SIZE); - - strncpy(seed, argv[arg], SEED_SIZE); - ++opt_pass; - } else if (opt_ts == 1) { - if (arg_len != TIMESTAMP_SIZE) - pr_error_exit(1, "timestamp length must be %d hexadecimal characters", TIMESTAMP_SIZE); - - strncpy(timestamp, argv[arg], TIMESTAMP_SIZE); - ++opt_ts; + unsigned int arg; + char *MAC_ADDR = NULL; + char timestamp[TIMESTAMP_SIZE + 1]; + char seed[SEED_SIZE + 1]; + char password[PASSWORD_SIZE + 1]; + char date_string[DATESTRING_SIZE + 1]; + unsigned int opt_seed, opt_pass, opt_ts; + time_t ts = 0; + struct tm *t = NULL; + seed[0] = password[0] = timestamp[0] = 0; + seed[SEED_SIZE] = password[PASSWORD_SIZE] = 0; + opt_seed = opt_pass = opt_ts = 0; + strncpy(timestamp, "00000000", TIMESTAMP_SIZE + 1); + + fprintf(stderr, "%s\nVersion: %0.2f\n%s\n", title, VERSION, copyright); + + for (arg = 1; arg < (unsigned) argc; ++arg) { + size_t arg_len = strlen(argv[arg]); + + if (argv[arg][0] == '-') { + switch (argv[arg][1]) { + case 's': + opt_seed = 1; + break; + case 'p': + opt_pass = 1; + break; + case 't': + opt_ts = 1; + break; + case 'h': + pr_usage(1); + exit(0); } + } else if (opt_seed == 1) { + MAC_ADDR = argv[arg]; + ++opt_seed; + } else if (opt_pass == 1 && opt_seed == 0) { + if (arg_len != SEED_SIZE) + pr_error_exit(1, "seed length must be %d characters", SEED_SIZE); + + strncpy(seed, argv[arg], SEED_SIZE); + ++opt_pass; + } else if (opt_ts == 1) { + if (arg_len != TIMESTAMP_SIZE) + pr_error_exit(1, "timestamp length must be %d hexadecimal characters", TIMESTAMP_SIZE); + + strncpy(timestamp, argv[arg], TIMESTAMP_SIZE); + ++opt_ts; } - if (! opt_seed && ! opt_pass) - pr_usage(0); - else if (opt_seed && opt_seed != 2) - pr_error_exit(1, "seed requires MAC-ADDRESS"); - else if (! opt_seed && opt_pass && opt_pass != 2) - pr_error_exit(1, "password on its own requires a pre-generated seed"); - else if (opt_seed && opt_pass && opt_pass != 1) - pr_error_exit(1, "generating seed and password; cannot also accept pre-generated seed"); - else if (opt_pass == 2 && opt_ts) - pr_error_exit(1, "seed already contains a timestamp; cannot over-ride it"); - else if (opt_ts == 1 || opt_pass == 2) { // no timestamp provided; use NOW - ts = time(NULL); - if (ts) - snprintf(timestamp, TIMESTAMP_SIZE + 1, "%08lX", ts); - } + } + if (! opt_seed && ! opt_pass) { + pr_usage(0); + exit(0); + } + else if (opt_seed && opt_seed != 2) + pr_error_exit(1, "seed requires MAC-ADDRESS"); + else if (! opt_seed && opt_pass && opt_pass != 2) + pr_error_exit(1, "password on its own requires a pre-generated seed"); + else if (opt_seed && opt_pass && opt_pass != 1) + pr_error_exit(1, "generating seed and password; cannot also accept pre-generated seed"); + else if (opt_pass == 2 && opt_ts) + pr_error_exit(1, "seed already contains a timestamp; cannot over-ride it"); + else if (opt_ts == 1 || opt_pass == 2) { // no timestamp provided; use NOW + ts = time(NULL); + if (ts) + snprintf(timestamp, TIMESTAMP_SIZE + 1, "%08lX", ts); + } - if (opt_pass == 2) { // try to figure out the correct date-time from the seed - // inherits the most significant 2 characters from the NOW time - strncpy(timestamp+2, seed, 6); - time_t tmp; - if (sscanf(timestamp, "%08lx", &tmp)) - if (tmp > ts-3600 && tmp < ts+3600) // timestamps are so close they must be for the same date - ts = tmp; - } + if (opt_pass == 2) { // try to figure out the correct date-time from the seed + // inherits the most significant 2 characters from the NOW time + strncpy(timestamp+2, seed, 6); + time_t tmp; + if (sscanf(timestamp, "%08lx", &tmp)) + if (tmp > ts-3600 && tmp < ts+3600) // timestamps are so close they must be for the same date + ts = tmp; + } - if(opt_ts) { // ts needs to be valid to be converted to a time string - if(! sscanf(timestamp, "%08lx", &ts)) - pr_error_exit(1, "converting timestamp string ('%s') to number", timestamp); - } - t = gmtime(&ts); - strftime(date_string, DATESTRING_SIZE, "%F %T", t); - - if (opt_seed) - if (! generate_seed(MAC_ADDR, timestamp, seed)) - pr_error_exit(1, "unable to generate seed; aborting"); - if (opt_pass) - if (! generate_pass(seed, password)) - pr_error_exit(0, "unable to generate password"); - - if (opt_seed || opt_pass) - printf("MAC address: %s Timestamp: %s (%s) Seed: %s Password: %s\n", MAC_ADDR, timestamp, date_string, seed, password); + if(opt_ts) { // ts needs to be valid to be converted to a time string + if(! sscanf(timestamp, "%08lx", &ts)) + pr_error_exit(1, "converting timestamp string ('%s') to number", timestamp); } + t = gmtime(&ts); + strftime(date_string, DATESTRING_SIZE, "%F %T", t); + + if (opt_seed) + if (! generate_seed(MAC_ADDR, timestamp, seed)) + pr_error_exit(1, "unable to generate seed; aborting"); + if (opt_pass) + if (! generate_pass(seed, password)) + pr_error_exit(0, "unable to generate password"); + + if (opt_seed || opt_pass) + printf("MAC address: %s Timestamp: %s (%s) Seed: %s Password: %s\n", MAC_ADDR, timestamp, date_string, seed, password); return result; }