411c04a6bf1a037f0459a57432dfa8fb76860aa5
[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 <afs/param.h>
11 #include <sys/types.h>
12 #ifdef AFS_NT40_ENV
13 #include <winsock2.h>
14 #include <stdio.h>
15 #include <WINNT/afsreg.h>
16 #include <WINNT/afsevent.h>
17 #else
18 #include <netinet/in.h>
19 #include <netdb.h>
20 #endif
21 #include "cellconfig.h"
22 #include "keys.h"
23 #include <afs/afsutil.h>
24
25 #include "AFS_component_version_number.c"
26 int char2hex(char c);
27 int hex2char(char c);
28
29 main(argc, argv)
30 int argc;
31 char **argv; {
32     struct afsconf_dir *tdir;
33     register afs_int32 code;
34     int i;
35     char *cp;
36
37     if (argc == 1) {
38         printf("setkey: usage is 'setkey <opcode> options, e.g.\n");
39         printf("    setkey add <kvno> <key>\n");
40         printf("      note: <key> should be an 8byte hex representation \n");
41         printf("            Ex: setkey add 0 \"80b6a7cd7a9dadb6\"\n");
42         printf("    setkey delete <kvno>\n");
43         printf("    setkey list\n");
44         exit(1);
45     }
46
47     tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
48     if (!tdir) {
49         printf("setkey: can't initialize conf dir '%s'\n", AFSDIR_SERVER_ETC_DIRPATH);
50         exit(1);
51     }
52     if (strcmp(argv[1], "add")==0) {
53         char tkey[8];
54         if (argc != 4) {
55             printf("setkey add: usage is 'setkey add <kvno> <key>\n");
56             exit(1);
57         }
58         if (strlen(argv[3]) != 16) {
59           printf("key %s is not in right format\n", argv[3]);
60           printf(" <key> should be an 8byte hex representation \n");
61           printf("  Ex: setkey add 0 \"80b6a7cd7a9dadb6\"\n");
62           exit(1);
63         }
64         bzero(tkey, sizeof(tkey));
65         for(i=7, cp = argv[3] + 15;i>=0; i--,cp-=2)
66           tkey[i] = char2hex(*cp) + char2hex(*(cp-1))*16;
67
68         code = afsconf_AddKey(tdir, atoi(argv[2]), tkey, 1);
69         if (code) {
70             printf("setkey: failed to set key, code %d.\n", code);
71             exit(1);
72         }
73     }
74     else if (strcmp(argv[1], "delete")==0) {
75         afs_int32 kvno;
76         if (argc != 3) {
77             printf("setkey delete: usage is 'setkey delete <kvno>\n");
78             exit(1);
79         }
80         kvno = atoi(argv[2]);
81         code = afsconf_DeleteKey(tdir, kvno);
82         if (code) {
83             printf("setkey: failed to delete key %d, (code %d)\n", kvno, code);
84             exit(1);
85         }
86     }
87     else if (strcmp(argv[1], "list") == 0) {
88         struct afsconf_keys tkeys;
89         register int i;
90         char tbuffer[9];
91         
92         code = afsconf_GetKeys(tdir, &tkeys);
93         if (code) {
94             printf("setkey: failed to get keys, code %d\n", code);
95             exit(1);
96         }
97         for(i=0;i<tkeys.nkeys;i++) {
98           if (tkeys.key[i].kvno != -1) {
99             char hexbuf[17];
100             unsigned char c;
101             int j;
102             bcopy(tkeys.key[i].key, tbuffer, 8);
103             tbuffer[8] = 0;
104             for(j=0;j<8;j++) {
105               c = tbuffer[j];
106               hexbuf[j*2] = hex2char( c / 16 );
107               hexbuf[j*2+1] =  hex2char( c  % 16);
108             }
109             hexbuf[16]='\0';
110             printf("kvno %4d: key is '%s' (0x%s)\n", tkeys.key[i].kvno, tbuffer, hexbuf);
111           }
112         }
113         printf("All done.\n");
114     }
115     else {
116         printf("setkey: unknown operation '%s', type 'setkey' for assistance\n");
117         exit(1);
118     }
119     exit(0);
120 }
121
122 int char2hex(char c)
123 {
124   if (c >= '0' && c <='9')
125     return ( c - 48);
126   if ( (c >= 'a') && (c <= 'f') )
127     return (c-'a' + 10);
128   
129   if ( (c >= 'A') && (c <='F') )
130     return (c-'A' + 10);
131   
132   return -1;
133 }
134
135 int hex2char(char c)
136 {
137   if (c <=9)
138     return (c+48);
139
140   return (c - 10 + 'a');
141 }