bos-key-utility-20020112
authorDerrick Brashear <shadow@dementia.org>
Sat, 12 Jan 2002 21:35:59 +0000 (21:35 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 12 Jan 2002 21:35:59 +0000 (21:35 +0000)
modification of asetkey to allow manipulation of key files without
a running bosserver (asetkey requires krb4; this does not)

src/bozo/Makefile.in
src/bozo/bos_util.c [new file with mode: 0644]

index ee65164..656f947 100644 (file)
@@ -40,7 +40,7 @@ LIBS=${TOP_LIBDIR}/librx.a \
 OBJS=bosserver.o bnode.o ezbnodeops.o fsbnodeops.o bosint.ss.o bosint.xdr.o \
 bosoprocs.o cronbnodeops.o
 
-all: bosserver ${TOP_INCDIR}/afs/bosint.h bos ${TOP_LIBDIR}/libbos.a ${TOP_INCDIR}/afs/bnode.h
+all: bosserver ${TOP_INCDIR}/afs/bosint.h bos ${TOP_LIBDIR}/libbos.a ${TOP_INCDIR}/afs/bnode.h bos_util
 
 $(OBJS) bosint.xdr.o bosint.cs.o boserr.o: $(INCLS)
 
@@ -81,6 +81,11 @@ bos.o: bos.c ${INCLS} AFS_component_version_number.o
 bos: bos.o $(LIBS) libbos.a
        ${CC} ${CFLAGS} -o bos bos.o libbos.a $(LIBS)  ${XLIBS}
 
+bos_util.o: bos_util.c ${INCLS} AFS_component_version_number.o
+
+bos_util: bos_util.o $(LIBS) 
+       ${CC} ${CFLAGS} -o bos_util bos_util.o $(LIBS)  ${XLIBS}
+
 ezbnodeops.o: ezbnodeops.c ${INCLS}
 
 fsbnodeops.o: fsbnodeops.c ${INCLS}
@@ -101,6 +106,7 @@ install: \
        ${DESTDIR}${includedir}/afs/bosint.h \
        ${DESTDIR}${bindir}/bos \
        ${DESTDIR}${afssrvbindir}/bos \
+       ${DESTDIR}${afssrvsbindir}/bos_util \
        ${DESTDIR}${libdir}/afs/libbos.a \
        ${DESTDIR}${includedir}/afs/bnode.h
 
@@ -116,6 +122,9 @@ ${DEST}/bin/bos: bos
 ${DEST}/root.server/usr/afs/bin/bos: bos
        ${INSTALL} $? $@
 
+${DEST}/root.server/usr/afs/bin/bos_util: bos_util
+       ${INSTALL} $? $@
+
 ${DEST}/lib/afs/libbos.a: libbos.a
        ${INSTALL} $? $@
 
@@ -148,6 +157,9 @@ ${DESTDIR}${bindir}/bos: bos
 ${DESTDIR}${afssrvbindir}/bos: bos
        ${INSTALL} $? $@
 
+${DESTDIR}${afssrvbindir}/bos_util: bos_util
+       ${INSTALL} $? $@
+
 ${DESTDIR}${libdir}/afs/libbos.a: libbos.a
        ${INSTALL} $? $@
 
@@ -165,6 +177,6 @@ dest: \
        ${DEST}/include/afs/bosint.h \
        ${DEST}/bin/bos \
        ${DEST}/root.server/usr/afs/bin/bos \
+       ${DEST}/root.server/usr/afs/bin/bos_util \
        ${DEST}/lib/afs/libbos.a \
        ${DEST}/include/afs/bnode.h
-
diff --git a/src/bozo/bos_util.c b/src/bozo/bos_util.c
new file mode 100644 (file)
index 0000000..17152aa
--- /dev/null
@@ -0,0 +1,201 @@
+/* 
+ *  Copyright (C) 1989 by the Massachusetts Institute of Technology
+ * 
+ *    Export of software employing encryption from the United States of
+ *    America is assumed to require a specific license from the United
+ *    States Government.  It is the responsibility of any person or
+ *    organization contemplating export to obtain such a license before
+ *    exporting.
+ * 
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ */
+
+#include <afsconfig.h>
+#include <afs/param.h>
+
+RCSID("$Header$");
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#include <afs/stds.h>
+#include <afs/afsutil.h>
+#include <rx/rxkad.h>
+#include <afs/keys.h>
+#include <afs/cellconfig.h>
+
+int 
+main(int argc, char **argv)
+{
+    struct afsconf_dir *tdir;
+    register afs_int32 code;
+
+    if (argc == 1) {
+       printf("bos_util: usage is 'bos_util <opcode> options, e.g.\n");
+       printf("    bos_util add <kvno>\n");
+       printf("    bos_util adddes <kvno>\n");
+#ifdef KERBEROS
+       printf("    bos_util srvtab2keyfile <kvno> <keyfile> <princ>\n");
+#endif
+       printf("    bos_util delete <kvno>\n");
+       printf("    bos_util list\n");
+       exit(1);
+    }
+
+    tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIR);
+    if (!tdir) {
+       printf("bos_util: can't initialize conf dir '%s'\n", AFSDIR_SERVER_ETC_DIR);
+       exit(1);
+    }
+    if (strcmp(argv[1], "add")==0) {
+       struct ktc_encryptionKey tkey;
+       int kvno;
+       char buf[BUFSIZ], ver[BUFSIZ];
+       char *tcell = (char *) 0;
+
+       if (argc != 3) {
+           printf("bos_util add: usage is 'bos_util add <kvno>\n");
+           exit(1);
+       }
+       kvno = atoi(argv[2]);
+       memset(&tkey, 0, sizeof(struct ktc_encryptionKey));
+
+       /* prompt for key */
+       code=des_read_pw_string(buf,sizeof(buf),"input key: ",0);
+       if(code || strlen(buf)==0) {
+           printf("Bad key: \n");
+           exit(1);
+       }
+       code=des_read_pw_string(ver,sizeof(ver),"Retype input key: ",0);
+       if(code || strlen(ver)==0) {
+           printf("Bad key: \n");
+           exit(1);
+       }
+       if (strcmp (ver, buf) != 0) {
+           printf ("\nInput key mismatch\n");
+           exit(1);
+       }
+       ka_StringToKey(buf,tcell,&tkey);
+       code = afsconf_AddKey(tdir, kvno, &tkey);
+       if (code) {
+           printf("bos_util: failed to set key, code %d.\n", code);
+           exit(1);
+       }
+    }
+    else if (strcmp(argv[1], "adddes")==0) {
+       struct ktc_encryptionKey tkey;
+       int kvno;
+       register afs_int32 code;
+       char buf[BUFSIZ], ver[BUFSIZ];
+       char *tcell = (char *) 0;
+
+       if (argc != 3) {
+           printf("bos_util adddes: usage is 'bos_util adddes <kvno>\n");
+           exit(1);
+       }
+       kvno = atoi(argv[2]);
+       memset(&tkey, 0, sizeof(struct ktc_encryptionKey));
+
+       /* prompt for key */
+       code=des_read_pw_string(buf,sizeof(buf),"input key: ",0);
+       if(code || strlen(buf)==0) {
+           printf("Bad key: \n");
+           exit(1);
+       }
+       code=des_read_pw_string(ver,sizeof(ver),"Retype input key: ",0);
+       if(code || strlen(ver)==0) {
+           printf("Bad key: \n");
+           exit(1);
+       }
+       if (strcmp (ver, buf) != 0) {
+           printf ("\nInput key mismatch\n");
+           exit(1);
+       }
+       des_string_to_key(buf,&tkey);
+       code = afsconf_AddKey(tdir, kvno, &tkey);
+       if (code) {
+           printf("bos_util: failed to set key, code %d.\n", code);
+           exit(1);
+       }
+    }
+#ifdef KERBEROS
+    else if (strcmp(argv[1], "srvtab2keyfile")==0) {
+       char tkey[8], name[255], inst[255], realm[255];
+       int kvno;
+       if (argc != 5) {
+           printf("bos_util add: usage is 'bos_util srvtab2keyfile <kvno> <keyfile> <princ>\n");
+           exit(1);
+       }
+       kvno = atoi(argv[2]);
+       bzero(tkey, sizeof(tkey));
+       code = kname_parse(name, inst, realm, argv[4]);
+       if (code != 0) {
+               printf("Invalid kerberos name\n");
+               exit(1);
+       }
+       code = read_service_key(name, inst, realm, kvno, argv[3], tkey);
+       if (code != 0) {
+               printf("Can't find key in %s\n", argv[3]);
+               exit(1);
+       }
+       code = afsconf_AddKey(tdir, kvno, tkey);
+       if (code) {
+           printf("bos_util: failed to set key, code %d.\n", code);
+           exit(1);
+       }
+    }
+#endif
+    else if (strcmp(argv[1], "delete")==0) {
+       long kvno;
+       if (argc != 3) {
+           printf("bos_util delete: usage is 'bos_util delete <kvno>\n");
+           exit(1);
+       }
+       kvno = atoi(argv[2]);
+       code = afsconf_DeleteKey(tdir, kvno);
+       if (code) {
+           printf("bos_util: failed to delete key %d, (code %d)\n", kvno, code);
+           exit(1);
+       }
+    }
+    else if (strcmp(argv[1], "list") == 0) {
+       struct afsconf_keys tkeys;
+       register int i;
+       unsigned char tbuffer[9];
+       
+       code = afsconf_GetKeys(tdir, &tkeys);
+       if (code) {
+           printf("bos_util: failed to get keys, code %d\n", code);
+           exit(1);
+       }
+       for(i=0;i<tkeys.nkeys;i++) {
+           if (tkeys.key[i].kvno != -1) {
+               int count;
+               unsigned char x[8];
+               memcpy(tbuffer, tkeys.key[i].key, 8);
+               tbuffer[8] = 0;
+               printf("kvno %4d: key is '%s' '", tkeys.key[i].kvno, tbuffer);
+               strcpy(x,(char *)tbuffer);
+               for(count=0;count<8;count++)
+                   printf("\\%03o",(unsigned char *)x[count]);
+               printf("'\n");
+           }
+       }
+       printf("All done.\n");
+    }
+    else {
+       printf("bos_util: unknown operation '%s', type 'bos_util' for assistance\n");
+       exit(1);
+    }
+    exit(0);
+}