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