DEVEL15-aklog-stds-krb5-order-20060802
[openafs.git] / src / aklog / asetkey.c
1 /*
2  * $Id$
3  *
4  * asetkey - Manipulates an AFS KeyFile
5  *
6  * Updated for Kerberos 5
7  */
8
9 #include <afsconfig.h>
10 #include <stdio.h>
11 #include <sys/types.h>
12 #include <netinet/in.h>
13 #include <netdb.h>
14 #ifdef HAVE_MEMORY_H
15 #include <memory.h>
16 #endif /* HAVE_MEMORY_H */
17 #ifdef HAVE_STRING_H
18 #include <string.h>
19 #else /* HAVE_STRING_H */
20 #ifdef HAVE_STRINGS_H
21 #include <strings.h>
22 #endif /* HAVE_STRINGS_H */
23 #endif /* HAVE_STRING_H */
24
25 #include <afs/stds.h>
26 #include <krb5.h>
27
28 #include <afs/com_err.h>
29 #include <afs/cellconfig.h>
30 #include <afs/keys.h>
31 #include <afs/dirpath.h>
32
33 int
34 main(int argc, char *argv[])
35 {
36     struct afsconf_dir *tdir;
37     register long code;
38     const char *confdir;
39
40     if (argc == 1) {
41         fprintf(stderr, "%s: usage is '%s <opcode> options, e.g.\n",
42                 argv[0], argv[0]);
43         fprintf(stderr, "\t%s add <kvno> <keyfile> <princ>\n", argv[0]);
44         fprintf(stderr, "\t%s delete <kvno>\n", argv[0]);
45         fprintf(stderr, "\t%s list\n", argv[0]);
46         exit(1);
47     }
48
49     confdir = AFSDIR_SERVER_ETC_DIRPATH;
50
51     tdir = afsconf_Open(confdir);
52     if (!tdir) {
53         fprintf(stderr, "%s: can't initialize conf dir '%s'\n", argv[0],
54                 confdir);
55         exit(1);
56     }
57     if (strcmp(argv[1], "add")==0) {
58         krb5_context context;
59         krb5_principal principal;
60         krb5_keyblock *key;
61         krb5_error_code retval;
62         int kvno;
63
64         if (argc != 5) {
65             fprintf(stderr, "%s add: usage is '%s add <kvno> <keyfile> "
66                     "<princ>\n", argv[0], argv[0]);
67             exit(1);
68         }
69
70         krb5_init_context(&context);
71
72         kvno = atoi(argv[2]);
73         retval = krb5_parse_name(context, argv[4], &principal);
74         if (retval != 0) {
75                 com_err(argv[0], retval, "while parsing AFS principal");
76                 exit(1);
77         }
78         retval = krb5_kt_read_service_key(context, argv[3], principal, kvno,
79                                           ENCTYPE_DES_CBC_CRC, &key);
80         if (retval != 0) {
81                 com_err(argv[0], retval, "while extracting AFS service key");
82                 exit(1);
83         }
84
85         if (key->length != 8) {
86                 fprintf(stderr, "Key length should be 8, but is really %d!\n",
87                        key->length);
88                 exit(1);
89         }
90
91         code = afsconf_AddKey(tdir, kvno, (char *) key->contents, 1);
92         if (code) {
93             fprintf(stderr, "%s: failed to set key, code %d.\n", argv[0], code);
94             exit(1);
95         }
96         krb5_free_principal(context, principal);
97         krb5_free_keyblock(context, key);
98     }
99     else if (strcmp(argv[1], "delete")==0) {
100         long kvno;
101         if (argc != 3) {
102             fprintf(stderr, "%s delete: usage is '%s delete <kvno>\n",
103                     argv[0], argv[0]);
104             exit(1);
105         }
106         kvno = atoi(argv[2]);
107         code = afsconf_DeleteKey(tdir, kvno);
108         if (code) {
109             fprintf(stderr, "%s: failed to delete key %d, (code %d)\n",
110                     argv[0], kvno, code);
111             exit(1);
112         }
113     }
114     else if (strcmp(argv[1], "list") == 0) {
115         struct afsconf_keys tkeys;
116         register int i, j;
117         
118         code = afsconf_GetKeys(tdir, &tkeys);
119         if (code) {
120             fprintf(stderr, "%s: failed to get keys, code %d\n", argv[0], code);
121             exit(1);
122         }
123         for(i=0;i<tkeys.nkeys;i++) {
124             if (tkeys.key[i].kvno != -1) {
125                 printf("kvno %4d: key is: ", tkeys.key[i].kvno);
126                 for (j = 0; j < 8; j++)
127                         printf("%02x", (unsigned char) tkeys.key[i].key[j]);
128                 printf("\n");
129             }
130         }
131         printf("All done.\n");
132     }
133     else {
134         fprintf(stderr, "%s: unknown operation '%s', type '%s' for "
135                 "assistance\n", argv[0], argv[1], argv[0]);
136         exit(1);
137     }
138     exit(0);
139 }