version 1.29, 2015/10/09 20:14:35 |
version 1.30, 2015/10/09 20:24:37 |
|
|
#include <readpassphrase.h> |
#include <readpassphrase.h> |
#include <skey.h> |
#include <skey.h> |
|
|
void usage(char *); |
void usage(); |
|
|
|
extern char *__progname; |
|
|
int |
int |
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
int n, i, cnt = 1, pass = 0, hexmode = 0; |
int n, i, cnt = 1, pass = 0, hexmode = 0; |
char passwd[SKEY_MAX_PW_LEN+1], key[SKEY_BINKEY_SIZE]; |
char passwd[SKEY_MAX_PW_LEN+1], key[SKEY_BINKEY_SIZE]; |
char buf[33], *seed, *slash; |
char buf[33], *seed, *slash, *algo; |
const char *errstr; |
const char *errstr; |
|
|
/* If we were called as otp-METHOD, set algorithm based on that */ |
/* If we were called as otp-METHOD, set algorithm based on that */ |
if ((slash = strrchr(argv[0], '/'))) |
if (strncmp(__progname, "otp-", 4) == 0) { |
slash++; |
algo = __progname + 4; |
else |
if (skey_set_algorithm(algo) == NULL) |
slash = argv[0]; |
errx(1, "Unknown hash algorithm %s", algo); |
if (strncmp(slash, "otp-", 4) == 0) { |
|
slash += 4; |
|
if (skey_set_algorithm(slash) == NULL) |
|
errx(1, "Unknown hash algorithm %s", slash); |
|
} |
} |
|
|
for (i = 1; i < argc && argv[i][0] == '-' && strcmp(argv[i], "--");) { |
for (i = 1; i < argc && argv[i][0] == '-' && strcmp(argv[i], "--");) { |
|
|
switch (argv[i][1]) { |
switch (argv[i][1]) { |
case 'n': |
case 'n': |
if (++i == argc) |
if (++i == argc) |
usage(argv[0]); |
usage(); |
cnt = strtonum(argv[i], 1, SKEY_MAX_SEQ -1, &errstr); |
cnt = strtonum(argv[i], 1, SKEY_MAX_SEQ -1, &errstr); |
if (errstr) |
if (errstr) |
usage(argv[0]); |
usage(); |
break; |
break; |
case 'p': |
case 'p': |
if (++i == argc) |
if (++i == argc) |
usage(argv[0]); |
usage(); |
if (strlcpy(passwd, argv[i], sizeof(passwd)) >= |
if (strlcpy(passwd, argv[i], sizeof(passwd)) >= |
sizeof(passwd)) |
sizeof(passwd)) |
errx(1, "Password too long"); |
errx(1, "Password too long"); |
|
|
hexmode = 1; |
hexmode = 1; |
break; |
break; |
default: |
default: |
usage(argv[0]); |
usage(); |
} |
} |
} else { |
} else { |
/* Multi character switches are hash types */ |
/* Multi character switches are hash types */ |
if (skey_set_algorithm(&argv[i][1]) == NULL) { |
if (skey_set_algorithm(&argv[i][1]) == NULL) { |
warnx("Unknown hash algorithm %s", &argv[i][1]); |
warnx("Unknown hash algorithm %s", &argv[i][1]); |
usage(argv[0]); |
usage(); |
} |
} |
} |
} |
i++; |
i++; |
} |
} |
|
|
if (argc > i + 2) |
if (argc > i + 2) |
usage(argv[0]); |
usage(); |
|
|
/* Could be in the form <number>/<seed> */ |
/* Could be in the form <number>/<seed> */ |
if (argc <= i + 1) { |
if (argc <= i + 1) { |
/* look for / in it */ |
/* look for / in it */ |
if (argc <= i) |
if (argc <= i) |
usage(argv[0]); |
usage(); |
slash = strchr(argv[i], '/'); |
slash = strchr(argv[i], '/'); |
if (slash == NULL) |
if (slash == NULL) |
usage(argv[0]); |
usage(); |
*slash++ = '\0'; |
*slash++ = '\0'; |
seed = slash; |
seed = slash; |
|
|
n = strtonum(argv[i], 0, SKEY_MAX_SEQ, &errstr); |
n = strtonum(argv[i], 0, SKEY_MAX_SEQ, &errstr); |
if (errstr) { |
if (errstr) { |
warnx("%s: %s", argv[i], errstr); |
warnx("%s: %s", argv[i], errstr); |
usage(argv[0]); |
usage(); |
} |
} |
} else { |
} else { |
n = strtonum(argv[i], 0, SKEY_MAX_SEQ, &errstr); |
n = strtonum(argv[i], 0, SKEY_MAX_SEQ, &errstr); |
if (errstr) { |
if (errstr) { |
warnx("%s: %s", argv[i], errstr); |
warnx("%s: %s", argv[i], errstr); |
usage(argv[0]); |
usage(); |
} |
} |
seed = argv[++i]; |
seed = argv[++i]; |
} |
} |
|
|
} |
} |
|
|
void |
void |
usage(char *s) |
usage(void) |
{ |
{ |
fprintf(stderr, |
fprintf(stderr, |
"usage: %s [-x] [-md5 | -rmd160 | -sha1] [-n count]\n\t" |
"usage: %s [-x] [-md5 | -rmd160 | -sha1] [-n count]\n\t" |
"[-p passphrase] <sequence#>[/] key\n", s); |
"[-p passphrase] <sequence#>[/] key\n", __progname); |
exit(1); |
exit(1); |
} |
} |