K&R style function removal. Update functions to ANSI style.
[dragonfly.git] / usr.bin / key / skey.c
1 /* Stand-alone program for computing responses to S/Key challenges.
2  * Takes the iteration count and seed as command line args, prompts
3  * for the user's key, and produces both word and hex format responses.
4  *
5  * Usage example:
6  *      >skey 88 ka9q2
7  *      Enter password:
8  *      OMEN US HORN OMIT BACK AHOY
9  *      C848 666B 6435 0A93
10  *      >
11  *
12  * $FreeBSD: src/usr.bin/key/skey.c,v 1.6.6.1 2001/03/04 08:35:48 kris Exp $
13  * $DragonFly: src/usr.bin/key/skey.c,v 1.3 2003/10/04 20:36:46 hmp Exp $
14  */
15
16 #include <err.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <unistd.h>
21
22 #ifdef  __MSDOS__
23 #include <dos.h>
24 #else   /* Assume BSD Unix */
25 #include <fcntl.h>
26 #endif
27
28 #include <skey.h>
29
30 static void usage(void);
31
32 int
33 main(int argc, char **argv)
34 {
35         int n,cnt,i;
36         char passwd[256] /* ,passwd2[256] */;
37         char key[8];
38         char *seed;
39         char buf[33];
40         char *slash;
41
42         cnt = 1;
43         while((i = getopt(argc,argv,"n:")) != -1){
44                 switch(i){
45                 case 'n':
46                         cnt = atoi(optarg);
47                         break;
48                 }
49         }
50         /* could be in the form <number>/<seed> */
51         if(argc <= optind + 1){
52                 /*look for / in it */
53                 if(argc <= optind)
54                         usage();
55
56                 slash = strchr(argv[optind], '/');
57                 if(slash == NULL)
58                         usage();
59                 *slash++ = '\0';
60                 seed = slash;
61
62                 if((n = atoi(argv[optind])) < 0){
63                         warnx("%s not positive",argv[optind]);
64                         usage();
65                 }
66         }
67         else {
68
69                 if((n = atoi(argv[optind])) < 0){
70                         warnx("%s not positive",argv[optind]);
71                         usage();
72                 }
73                 seed = argv[++optind];
74         }
75         fprintf(stderr,"Reminder - Do not use this program while logged in via telnet or rlogin.\n");
76
77         /* Get user's secret password */
78         for(;;){
79                 fprintf(stderr,"Enter secret password: ");
80                 readpass(passwd,sizeof(passwd));
81                 break;
82         /************
83                 fprintf(stderr,"Again secret password: ");
84                 readpass(passwd2,sizeof(passwd));
85                 if(strcmp(passwd,passwd2) == 0) break;
86                 fprintf(stderr, "Sorry no match\n");
87         **************/
88
89         }
90
91         /* Crunch seed and password into starting key */
92         if(keycrunch(key,seed,passwd) != 0)
93                 errx(1, "key crunch failed");
94         if(cnt == 1){
95                 while(n-- != 0)
96                         f(key);
97                 printf("%s\n",btoe(buf,key));
98 #ifdef  HEXIN
99                 printf("%s\n",put8(buf,key));
100 #endif
101         } else {
102                 for(i=0;i<=n-cnt;i++)
103                         f(key);
104                 for(;i<=n;i++){
105 #ifdef  HEXIN
106                         printf("%d: %-29s  %s\n",i,btoe(buf,key),put8(buf,key));
107 #else
108                         printf("%d: %-29s\n",i,btoe(buf,key));
109 #endif
110                         f(key);
111                 }
112         }
113         return 0;
114 }
115
116 static void
117 usage(void)
118 {
119         fprintf(stderr,"usage: key [-n count] <sequence #>[/] <key>\n");
120         exit(1);
121 }