diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /usr.bin/skey/skey.c |
initial import of NetBSD tree
Diffstat (limited to 'usr.bin/skey/skey.c')
-rw-r--r-- | usr.bin/skey/skey.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/usr.bin/skey/skey.c b/usr.bin/skey/skey.c new file mode 100644 index 00000000000..a3cbf078d36 --- /dev/null +++ b/usr.bin/skey/skey.c @@ -0,0 +1,126 @@ +/* + * S/KEY v1.1b (skey.c) + * + * Authors: + * Neil M. Haller <nmh@thumper.bellcore.com> + * Philip R. Karn <karn@chicago.qualcomm.com> + * John S. Walden <jsw@thumper.bellcore.com> + * Scott Chasin <chasin@crimelab.com> + * + * + * Stand-alone program for computing responses to S/Key challenges. + * Takes the iteration count and seed as command line args, prompts + * for the user's key, and produces both word and hex format responses. + * + * Usage example: + * >skey 88 ka9q2 + * Enter password: + * OMEN US HORN OMIT BACK AHOY + * > + * + * $Id: skey.c,v 1.1 1995/10/18 08:46:07 deraadt Exp $ + */ + +#include <sys/cdefs.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <sgtty.h> +#include "md4.h" +#include "skey.h" + +void usage __P((char *)); + +int +main(argc, argv) + int argc; + char *argv[]; +{ + int n, cnt, i, pass = 0; + char passwd[256], key[8], buf[33], *seed, *slash; + extern int optind; + extern char *optarg; + + cnt = 1; + + while ((i = getopt(argc, argv, "n:p:")) != EOF) { + switch (i) { + case 'n': + cnt = atoi(optarg); + break; + case 'p': + strcpy(passwd, optarg); + pass = 1; + break; + } + } + + /* could be in the form <number>/<seed> */ + + if (argc <= optind + 1) { + /* look for / in it */ + if (argc <= optind) + usage(argv[0]); + slash = strchr(argv[optind], '/'); + if (slash == NULL) + usage(argv[0]); + *slash++ = '\0'; + seed = slash; + + if ((n = atoi(argv[optind])) < 0) { + fprintf(stderr, "%s not positive\n", argv[optind]); + usage(argv[0]); + } + } else { + + if ((n = atoi(argv[optind])) < 0) { + fprintf(stderr, "%s not positive\n", argv[optind]); + usage(argv[0]); + } + seed = argv[++optind]; + } + + /* Get user's secret password */ + if (!pass) { + fprintf(stderr, "Enter secret password: "); + readpass(passwd, sizeof(passwd)); + } + rip(passwd); + + /* Crunch seed and password into starting key */ + if (keycrunch(key, seed, passwd) != 0) { + fprintf(stderr, "%s: key crunch failed\n", argv[0]); + exit(1); + } + if (cnt == 1) { + while (n-- != 0) + f(key); + printf("%s\n", btoe(buf, key)); +#ifdef HEXIN + printf("%s\n", put8(buf, key)); +#endif + } else { + for (i = 0; i <= n - cnt; i++) + f(key); + for (; i <= n; i++) { +#ifdef HEXIN + printf("%d: %-29s %s\n", i, btoe(buf, key), put8(buf, key)); +#else + printf("%d: %-29s\n", i, btoe(buf, key)); +#endif + f(key); + } + } + exit(0); +} + +void +usage(s) + char *s; +{ + + fprintf(stderr, + "Usage: %s [-n count] [-p password ] sequence# [/] key\n", s); + exit(1); +} |