Annotation of src/usr.bin/skey/skey.c, Revision 1.5
1.5 ! millert 1: /* * $OpenBSD: skey.c,v 1.4 1996/09/29 04:33:58 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.1 deraadt 39: char passwd[256], key[8], buf[33], *seed, *slash;
40:
1.5 ! millert 41: /* If we were called as otp-METHOD, set algorithm based on that */
! 42: if (strncmp(argv[0], "otp-", 4) == 0) {
! 43: if (skey_set_algorithm(&argv[0][4]) == NULL)
! 44: errx(1, "Unknown hash algorithm %s", &argv[0][4]);
1.1 deraadt 45: }
46:
1.5 ! millert 47: for (i = 1; i < argc && argv[i][0] == '-' && strcmp(argv[i], "--");) {
! 48: if (argv[i][2] == '\0') {
! 49: /* Single character switch */
! 50: switch (argv[i][1]) {
! 51: case 'n':
! 52: if (i + 1 == argc)
! 53: usage(argv[0]);
! 54: cnt = atoi(argv[++i]);
! 55: break;
! 56: case 'p':
! 57: if (i + 1 == argc)
! 58: usage(argv[0]);
! 59: (void)strcpy(passwd, argv[++i]);
! 60: pass = 1;
! 61: break;
! 62: case 'x':
! 63: hexmode = 1;
! 64: break;
! 65: default:
! 66: usage(argv[0]);
! 67: }
! 68: } else {
! 69: /* Multi character switches are hash types */
! 70: if (skey_set_algorithm(&argv[i][1]) == NULL) {
! 71: warnx("Unknown hash algorithm %s", &argv[i][1]);
! 72: usage(argv[0]);
! 73: }
1.4 millert 74: }
1.5 ! millert 75: i++;
1.4 millert 76: }
77:
1.5 ! millert 78: /* Could be in the form <number>/<seed> */
! 79: if (argc <= i + 1) {
1.1 deraadt 80: /* look for / in it */
1.5 ! millert 81: if (argc <= i)
1.1 deraadt 82: usage(argv[0]);
1.5 ! millert 83: slash = strchr(argv[i], '/');
1.1 deraadt 84: if (slash == NULL)
85: usage(argv[0]);
86: *slash++ = '\0';
87: seed = slash;
88:
1.5 ! millert 89: if ((n = atoi(argv[i])) < 0) {
! 90: warnx("%s not positive", argv[i]);
1.1 deraadt 91: usage(argv[0]);
92: }
93: } else {
1.5 ! millert 94: if ((n = atoi(argv[i])) < 0) {
! 95: warnx("%s not positive", argv[i]);
1.1 deraadt 96: usage(argv[0]);
97: }
1.5 ! millert 98: seed = argv[++i];
1.1 deraadt 99: }
100:
101: /* Get user's secret password */
102: if (!pass) {
1.3 millert 103: (void)fputs("Reminder - Do not use this program while logged in via telnet or rlogin.\n", stderr);
104: (void)fputs("Enter secret password: ", stderr);
1.1 deraadt 105: readpass(passwd, sizeof(passwd));
106: }
107: rip(passwd);
108:
109: /* Crunch seed and password into starting key */
1.3 millert 110: if (keycrunch(key, seed, passwd) != 0)
111: errx(1, "key crunch failed");
112:
1.1 deraadt 113: if (cnt == 1) {
114: while (n-- != 0)
115: f(key);
1.3 millert 116: (void)puts(hexmode ? put8(buf, key) : btoe(buf, key));
1.1 deraadt 117: } else {
118: for (i = 0; i <= n - cnt; i++)
119: f(key);
120: for (; i <= n; i++) {
1.3 millert 121: if (hexmode)
122: (void)printf("%d: %-29s %s\n", i,
123: btoe(buf, key), put8(buf, key));
124: else
125: (void)printf("%d: %-29s\n", i, btoe(buf, key));
1.1 deraadt 126: f(key);
127: }
128: }
129: exit(0);
130: }
131:
132: void
133: usage(s)
134: char *s;
135: {
1.5 ! millert 136: (void)fprintf(stderr, "Usage: %s [-x] [-md4|-md5|-sha1] [-n count] [-p password] <sequence#>[/] key\n", s);
1.1 deraadt 137: exit(1);
138: }