bos-key-utility-20020112
[openafs.git] / src / bozo / bos_util.c
1 /* 
2  *  Copyright (C) 1989 by the Massachusetts Institute of Technology
3  * 
4  *    Export of software employing encryption from the United States of
5  *    America is assumed to require a specific license from the United
6  *    States Government.  It is the responsibility of any person or
7  *    organization contemplating export to obtain such a license before
8  *    exporting.
9  * 
10  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
11  * distribute this software and its documentation for any purpose and
12  * without fee is hereby granted, provided that the above copyright
13  * notice appear in all copies and that both that copyright notice and
14  * this permission notice appear in supporting documentation, and that
15  * the name of M.I.T. not be used in advertising or publicity pertaining
16  * to distribution of the software without specific, written prior
17  * permission.  M.I.T. makes no representations about the suitability of
18  * this software for any purpose.  It is provided "as is" without express
19  * or implied warranty.
20  */
21
22 #include <afsconfig.h>
23 #include <afs/param.h>
24
25 RCSID("$Header$");
26
27 #include <sys/types.h>
28 #include <netinet/in.h>
29 #include <netdb.h>
30
31 #include <afs/stds.h>
32 #include <afs/afsutil.h>
33 #include <rx/rxkad.h>
34 #include <afs/keys.h>
35 #include <afs/cellconfig.h>
36
37 int 
38 main(int argc, char **argv)
39 {
40     struct afsconf_dir *tdir;
41     register afs_int32 code;
42
43     if (argc == 1) {
44         printf("bos_util: usage is 'bos_util <opcode> options, e.g.\n");
45         printf("    bos_util add <kvno>\n");
46         printf("    bos_util adddes <kvno>\n");
47 #ifdef KERBEROS
48         printf("    bos_util srvtab2keyfile <kvno> <keyfile> <princ>\n");
49 #endif
50         printf("    bos_util delete <kvno>\n");
51         printf("    bos_util list\n");
52         exit(1);
53     }
54
55     tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIR);
56     if (!tdir) {
57         printf("bos_util: can't initialize conf dir '%s'\n", AFSDIR_SERVER_ETC_DIR);
58         exit(1);
59     }
60     if (strcmp(argv[1], "add")==0) {
61         struct ktc_encryptionKey tkey;
62         int kvno;
63         char buf[BUFSIZ], ver[BUFSIZ];
64         char *tcell = (char *) 0;
65
66         if (argc != 3) {
67             printf("bos_util add: usage is 'bos_util add <kvno>\n");
68             exit(1);
69         }
70         kvno = atoi(argv[2]);
71         memset(&tkey, 0, sizeof(struct ktc_encryptionKey));
72
73         /* prompt for key */
74         code=des_read_pw_string(buf,sizeof(buf),"input key: ",0);
75         if(code || strlen(buf)==0) {
76             printf("Bad key: \n");
77             exit(1);
78         }
79         code=des_read_pw_string(ver,sizeof(ver),"Retype input key: ",0);
80         if(code || strlen(ver)==0) {
81             printf("Bad key: \n");
82             exit(1);
83         }
84         if (strcmp (ver, buf) != 0) {
85             printf ("\nInput key mismatch\n");
86             exit(1);
87         }
88         ka_StringToKey(buf,tcell,&tkey);
89         code = afsconf_AddKey(tdir, kvno, &tkey);
90         if (code) {
91             printf("bos_util: failed to set key, code %d.\n", code);
92             exit(1);
93         }
94     }
95     else if (strcmp(argv[1], "adddes")==0) {
96         struct ktc_encryptionKey tkey;
97         int kvno;
98         register afs_int32 code;
99         char buf[BUFSIZ], ver[BUFSIZ];
100         char *tcell = (char *) 0;
101
102         if (argc != 3) {
103             printf("bos_util adddes: usage is 'bos_util adddes <kvno>\n");
104             exit(1);
105         }
106         kvno = atoi(argv[2]);
107         memset(&tkey, 0, sizeof(struct ktc_encryptionKey));
108
109         /* prompt for key */
110         code=des_read_pw_string(buf,sizeof(buf),"input key: ",0);
111         if(code || strlen(buf)==0) {
112             printf("Bad key: \n");
113             exit(1);
114         }
115         code=des_read_pw_string(ver,sizeof(ver),"Retype input key: ",0);
116         if(code || strlen(ver)==0) {
117             printf("Bad key: \n");
118             exit(1);
119         }
120         if (strcmp (ver, buf) != 0) {
121             printf ("\nInput key mismatch\n");
122             exit(1);
123         }
124         des_string_to_key(buf,&tkey);
125         code = afsconf_AddKey(tdir, kvno, &tkey);
126         if (code) {
127             printf("bos_util: failed to set key, code %d.\n", code);
128             exit(1);
129         }
130     }
131 #ifdef KERBEROS
132     else if (strcmp(argv[1], "srvtab2keyfile")==0) {
133         char tkey[8], name[255], inst[255], realm[255];
134         int kvno;
135         if (argc != 5) {
136             printf("bos_util add: usage is 'bos_util srvtab2keyfile <kvno> <keyfile> <princ>\n");
137             exit(1);
138         }
139         kvno = atoi(argv[2]);
140         bzero(tkey, sizeof(tkey));
141         code = kname_parse(name, inst, realm, argv[4]);
142         if (code != 0) {
143                 printf("Invalid kerberos name\n");
144                 exit(1);
145         }
146         code = read_service_key(name, inst, realm, kvno, argv[3], tkey);
147         if (code != 0) {
148                 printf("Can't find key in %s\n", argv[3]);
149                 exit(1);
150         }
151         code = afsconf_AddKey(tdir, kvno, tkey);
152         if (code) {
153             printf("bos_util: failed to set key, code %d.\n", code);
154             exit(1);
155         }
156     }
157 #endif
158     else if (strcmp(argv[1], "delete")==0) {
159         long kvno;
160         if (argc != 3) {
161             printf("bos_util delete: usage is 'bos_util delete <kvno>\n");
162             exit(1);
163         }
164         kvno = atoi(argv[2]);
165         code = afsconf_DeleteKey(tdir, kvno);
166         if (code) {
167             printf("bos_util: failed to delete key %d, (code %d)\n", kvno, code);
168             exit(1);
169         }
170     }
171     else if (strcmp(argv[1], "list") == 0) {
172         struct afsconf_keys tkeys;
173         register int i;
174         unsigned char tbuffer[9];
175         
176         code = afsconf_GetKeys(tdir, &tkeys);
177         if (code) {
178             printf("bos_util: failed to get keys, code %d\n", code);
179             exit(1);
180         }
181         for(i=0;i<tkeys.nkeys;i++) {
182             if (tkeys.key[i].kvno != -1) {
183                 int count;
184                 unsigned char x[8];
185                 memcpy(tbuffer, tkeys.key[i].key, 8);
186                 tbuffer[8] = 0;
187                 printf("kvno %4d: key is '%s' '", tkeys.key[i].kvno, tbuffer);
188                 strcpy(x,(char *)tbuffer);
189                 for(count=0;count<8;count++)
190                     printf("\\%03o",(unsigned char *)x[count]);
191                 printf("'\n");
192             }
193         }
194         printf("All done.\n");
195     }
196     else {
197         printf("bos_util: unknown operation '%s', type 'bos_util' for assistance\n");
198         exit(1);
199     }
200     exit(0);
201 }