299928145bb0d985ff72dddce03afc70d8eb488d
[openafs.git] / src / auth / setkey.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID
14     ("$Header$");
15
16 #include <sys/types.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #ifdef AFS_NT40_ENV
20 #include <winsock2.h>
21 #include <WINNT/afsreg.h>
22 #include <WINNT/afsevent.h>
23 #endif
24 #include <string.h>
25 #ifdef HAVE_NETINET_IN_H
26 #include <netinet/in.h>
27 #endif
28 #ifdef HAVE_NETDB_H
29 #include <netdb.h>
30 #endif
31 #include "cellconfig.h"
32 #include "keys.h"
33 #include <afs/afsutil.h>
34
35 #include "AFS_component_version_number.c"
36 static int char2hex(char c);
37 static int hex2char(char c);
38
39 int
40 main(argc, argv)
41      int argc;
42      char **argv;
43 {
44     struct afsconf_dir *tdir;
45     register afs_int32 code;
46     int i;
47     char *cp;
48
49     if (argc == 1) {
50         printf("setkey: usage is 'setkey <opcode> options, e.g.\n");
51         printf("    setkey add <kvno> <key>\n");
52         printf("      note: <key> should be an 8byte hex representation \n");
53         printf("            Ex: setkey add 0 \"80b6a7cd7a9dadb6\"\n");
54         printf("    setkey delete <kvno>\n");
55         printf("    setkey list\n");
56         exit(1);
57     }
58
59     tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
60     if (!tdir) {
61         printf("setkey: can't initialize conf dir '%s'\n",
62                AFSDIR_SERVER_ETC_DIRPATH);
63         exit(1);
64     }
65     if (strcmp(argv[1], "add") == 0) {
66         char tkey[8];
67         if (argc != 4) {
68             printf("setkey add: usage is 'setkey add <kvno> <key>\n");
69             exit(1);
70         }
71         if (strlen(argv[3]) != 16) {
72             printf("key %s is not in right format\n", argv[3]);
73             printf(" <key> should be an 8byte hex representation \n");
74             printf("  Ex: setkey add 0 \"80b6a7cd7a9dadb6\"\n");
75             exit(1);
76         }
77         memset(tkey, 0, sizeof(tkey));
78         for (i = 7, cp = argv[3] + 15; i >= 0; i--, cp -= 2)
79             tkey[i] = char2hex(*cp) + char2hex(*(cp - 1)) * 16;
80
81         code = afsconf_AddKey(tdir, atoi(argv[2]), tkey, 1);
82         if (code) {
83             printf("setkey: failed to set key, code %d.\n", (int)code);
84             exit(1);
85         }
86     } else if (strcmp(argv[1], "delete") == 0) {
87         afs_int32 kvno;
88         if (argc != 3) {
89             printf("setkey delete: usage is 'setkey delete <kvno>\n");
90             exit(1);
91         }
92         kvno = atoi(argv[2]);
93         code = afsconf_DeleteKey(tdir, kvno);
94         if (code) {
95             printf("setkey: failed to delete key %d, (code %d)\n", (int)kvno,
96                    (int)code);
97             exit(1);
98         }
99     } else if (strcmp(argv[1], "list") == 0) {
100         struct afsconf_keys tkeys;
101         register int i;
102         char tbuffer[9];
103
104         code = afsconf_GetKeys(tdir, &tkeys);
105         if (code) {
106             printf("setkey: failed to get keys, code %d\n", (int)code);
107             exit(1);
108         }
109         for (i = 0; i < tkeys.nkeys; i++) {
110             if (tkeys.key[i].kvno != -1) {
111                 char hexbuf[17];
112                 unsigned char c;
113                 int j;
114                 memcpy(tbuffer, tkeys.key[i].key, 8);
115                 tbuffer[8] = 0;
116                 for (j = 0; j < 8; j++) {
117                     c = tbuffer[j];
118                     hexbuf[j * 2] = hex2char(c / 16);
119                     hexbuf[j * 2 + 1] = hex2char(c % 16);
120                 }
121                 hexbuf[16] = '\0';
122                 printf("kvno %4d: key is '%s' (0x%s)\n",
123                        (int)tkeys.key[i].kvno, tbuffer, hexbuf);
124             }
125         }
126         printf("All done.\n");
127     } else {
128         printf
129             ("setkey: unknown operation '%s', type 'setkey' for assistance\n",
130              argv[1]);
131         exit(1);
132     }
133     exit(0);
134 }
135
136 static int
137 char2hex(char c)
138 {
139     if (c >= '0' && c <= '9')
140         return (c - 48);
141     if ((c >= 'a') && (c <= 'f'))
142         return (c - 'a' + 10);
143
144     if ((c >= 'A') && (c <= 'F'))
145         return (c - 'A' + 10);
146
147     return -1;
148 }
149
150 static int
151 hex2char(char c)
152 {
153     if (c <= 9)
154         return (c + 48);
155
156     return (c - 10 + 'a');
157 }