Annotation of src/usr.bin/skey/skey.c, Revision 1.15
1.15 ! millert 1: /* $OpenBSD: skey.c,v 1.14 1999/12/04 21:27:18 deraadt Exp $ */
1.1 deraadt 2: /*
1.15 ! millert 3: * OpenBSD S/Key (skey.c)
1.1 deraadt 4: *
5: * Authors:
6: * Neil M. Haller <nmh@thumper.bellcore.com>
7: * Philip R. Karn <karn@chicago.qualcomm.com>
8: * John S. Walden <jsw@thumper.bellcore.com>
9: * Scott Chasin <chasin@crimelab.com>
1.15 ! millert 10: * Todd C. Miller <Todd.Miller@courtesan.com>
1.1 deraadt 11: *
12: *
13: * Stand-alone program for computing responses to S/Key challenges.
14: * Takes the iteration count and seed as command line args, prompts
15: * for the user's key, and produces both word and hex format responses.
16: *
17: * Usage example:
18: * >skey 88 ka9q2
19: * Enter password:
20: * OMEN US HORN OMIT BACK AHOY
21: * >
22: *
23: */
24:
25: #include <stdio.h>
26: #include <stdlib.h>
27: #include <string.h>
1.3 millert 28: #include <err.h>
29: #include <unistd.h>
30: #include <skey.h>
1.1 deraadt 31:
32: void usage __P((char *));
33:
34: int
35: main(argc, argv)
36: int argc;
37: char *argv[];
38: {
1.3 millert 39: int n, i, cnt = 1, pass = 0, hexmode = 0;
1.8 millert 40: char passwd[SKEY_MAX_PW_LEN+1], key[SKEY_BINKEY_SIZE];
1.12 millert 41: char buf[33], *seed, *slash;
1.1 deraadt 42:
1.5 millert 43: /* If we were called as otp-METHOD, set algorithm based on that */
1.9 millert 44: if ((slash = strrchr(argv[0], '/')))
1.15 ! millert 45: slash++;
1.9 millert 46: else
1.15 ! millert 47: slash = argv[0];
1.9 millert 48: if (strncmp(slash, "otp-", 4) == 0) {
49: slash += 4;
50: if (skey_set_algorithm(slash) == NULL)
51: errx(1, "Unknown hash algorithm %s", slash);
1.1 deraadt 52: }
53:
1.5 millert 54: for (i = 1; i < argc && argv[i][0] == '-' && strcmp(argv[i], "--");) {
55: if (argv[i][2] == '\0') {
56: /* Single character switch */
57: switch (argv[i][1]) {
58: case 'n':
1.15 ! millert 59: if (++i == argc)
1.5 millert 60: usage(argv[0]);
1.15 ! millert 61: cnt = atoi(argv[i]);
1.5 millert 62: break;
63: case 'p':
1.15 ! millert 64: if (++i == argc)
1.5 millert 65: usage(argv[0]);
1.15 ! millert 66: if (strlcpy(passwd, argv[i], sizeof(passwd)) >=
1.13 deraadt 67: sizeof(passwd))
68: errx(1, "Password too long");
1.5 millert 69: pass = 1;
70: break;
71: case 'x':
72: hexmode = 1;
73: break;
74: default:
75: usage(argv[0]);
76: }
77: } else {
78: /* Multi character switches are hash types */
79: if (skey_set_algorithm(&argv[i][1]) == NULL) {
80: warnx("Unknown hash algorithm %s", &argv[i][1]);
81: usage(argv[0]);
82: }
1.4 millert 83: }
1.5 millert 84: i++;
1.4 millert 85: }
1.7 millert 86:
87: if (argc > i + 2)
88: usage(argv[0]);
1.4 millert 89:
1.5 millert 90: /* Could be in the form <number>/<seed> */
91: if (argc <= i + 1) {
1.1 deraadt 92: /* look for / in it */
1.5 millert 93: if (argc <= i)
1.1 deraadt 94: usage(argv[0]);
1.5 millert 95: slash = strchr(argv[i], '/');
1.1 deraadt 96: if (slash == NULL)
97: usage(argv[0]);
98: *slash++ = '\0';
99: seed = slash;
100:
1.5 millert 101: if ((n = atoi(argv[i])) < 0) {
1.8 millert 102: warnx("%d not positive", n);
103: usage(argv[0]);
104: } else if (n > SKEY_MAX_SEQ) {
105: warnx("%d is larger than max (%d)", n, SKEY_MAX_SEQ);
1.1 deraadt 106: usage(argv[0]);
107: }
108: } else {
1.5 millert 109: if ((n = atoi(argv[i])) < 0) {
1.9 millert 110: warnx("%d not positive", n);
1.8 millert 111: usage(argv[0]);
112: } else if (n > SKEY_MAX_SEQ) {
113: warnx("%d is larger than max (%d)", n, SKEY_MAX_SEQ);
1.1 deraadt 114: usage(argv[0]);
115: }
1.5 millert 116: seed = argv[++i];
1.1 deraadt 117: }
118:
119: /* Get user's secret password */
120: if (!pass) {
1.3 millert 121: (void)fputs("Reminder - Do not use this program while logged in via telnet or rlogin.\n", stderr);
122: (void)fputs("Enter secret password: ", stderr);
1.1 deraadt 123: readpass(passwd, sizeof(passwd));
1.6 millert 124: if (passwd[0] == '\0')
125: exit(1);
1.1 deraadt 126: }
127:
128: /* Crunch seed and password into starting key */
1.3 millert 129: if (keycrunch(key, seed, passwd) != 0)
130: errx(1, "key crunch failed");
131:
1.1 deraadt 132: if (cnt == 1) {
133: while (n-- != 0)
134: f(key);
1.12 millert 135: (void)puts(hexmode ? put8(buf, key) : btoe(buf, key));
1.1 deraadt 136: } else {
137: for (i = 0; i <= n - cnt; i++)
138: f(key);
139: for (; i <= n; i++) {
1.3 millert 140: if (hexmode)
141: (void)printf("%d: %-29s %s\n", i,
1.12 millert 142: btoe(buf, key), put8(buf, key));
1.3 millert 143: else
1.12 millert 144: (void)printf("%d: %-29s\n", i, btoe(buf, key));
1.1 deraadt 145: f(key);
146: }
147: }
148: exit(0);
149: }
150:
151: void
152: usage(s)
1.15 ! millert 153: char *s;
1.1 deraadt 154: {
1.10 millert 155: (void)fprintf(stderr, "Usage: %s [-x] [-md4|-md5|-sha1|-rmd160] [-n count] [-p password] <sequence#>[/] key\n", s);
1.1 deraadt 156: exit(1);
157: }