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