* kdb5_stash.c (main): added -o option to read a Kerberos V4
authorMark Eichin <eichin@mit.edu>
Wed, 2 Nov 1994 01:43:48 +0000 (01:43 +0000)
committerMark Eichin <eichin@mit.edu>
Wed, 2 Nov 1994 01:43:48 +0000 (01:43 +0000)
kstash'ed master key.
(usage): mention it in the usage message.
* kdb5_stash.M: document it.

Necessary for practical conversion of a functioning v4 realm...

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@4609 dc483132-0cff-0310-8789-dd5450dbe970

src/admin/stash/ChangeLog
src/admin/stash/kdb5_stash.M
src/admin/stash/kdb5_stash.c

index 7e09d9375878e0c24e346f17a75cc96a85a41cae..516cdd791671d5ae0ca333f71a8da71a729391a3 100644 (file)
@@ -1,3 +1,10 @@
+Tue Nov  1 19:19:22 1994  Mark Eichin  (eichin@cygnus.com)
+
+       * kdb5_stash.c (main): added -o option to read a Kerberos V4
+       kstash'ed master key.
+       (usage): mention it in the usage message.
+       * kdb5_stash.M: document it.
+
 Mon Oct  3 19:11:08 1994  Theodore Y. Ts'o  (tytso@dcl)
 
        * Makefile.in: Use $(srcdir) to find manual page for make install.
index 06d02cc812b33fd9be9e21ea94a8bfcd031946c5..e45abb56e48678839e88500fa7fd7645c918ec9f 100644 (file)
@@ -43,6 +43,9 @@ kdb5_stash \- store a principal database master key on disk
 ] [
 .B \-f
 .I keyfile
+] [
+.B \-o
+.I v4-stash-file
 ]
 .br
 .SH DESCRIPTION
@@ -91,6 +94,11 @@ The
 .B \-f
 option specifies the file in which the master key should be stored; the
 default is DEFAULT_KEYFILE_STUB ("/.k5." concatenated with the realm name).
+.PP
+The
+.B \-o
+option specifies the file in which an old V4 master key was stored; this is
+usually the file "/.k".
 .SH SEE ALSO
 krb5(3), krb5kdc(8), kdb5_create(8)
 .SH BUGS
index a713e281a70c3819157ae02004d1a6d8648dfd55..7aceeb49cb38de4786308d253c49b33b82a3650a 100644 (file)
@@ -47,7 +47,7 @@ char *who;
 int status;
 {
     fprintf(stderr, "usage: %s [-d dbpathname] [-r realmname] [-k keytype]\n\
-\t[-e etype] [-M mkeyname] [-f keyfile]\n",
+\t[-e etype] [-M mkeyname] [-f keyfile] [-o v4-stash-file]\n",
            who);
     exit(status);
 }
@@ -67,6 +67,7 @@ char *argv[];
     char *mkey_name = 0;
     char *mkey_fullname;
     char *keyfile = 0;
+    char *v4_stashfile = 0;
 
     int keytypedone = 0;
     krb5_enctype etype = 0xffff;
@@ -76,7 +77,7 @@ char *argv[];
 
     krb5_init_ets();
 
-    while ((optchar = getopt(argc, argv, "d:r:k:M:e:f:")) != EOF) {
+    while ((optchar = getopt(argc, argv, "d:r:k:M:e:f:o:")) != EOF) {
        switch(optchar) {
        case 'd':                       /* set db name */
            dbname = optarg;
@@ -97,6 +98,9 @@ char *argv[];
        case 'f':
            keyfile = optarg;
            break;
+       case 'o':
+           v4_stashfile = optarg;
+           break;
        case '?':
        default:
            usage(argv[0], 1);
@@ -151,11 +155,44 @@ char *argv[];
     }
 
     /* TRUE here means read the keyboard, but only once */
-    if (retval = krb5_db_fetch_mkey(master_princ, &master_encblock, TRUE,
-                                   FALSE, 0, &master_keyblock)) {
-       com_err(argv[0], retval, "while reading master key");
-       (void) krb5_db_fini();
-       exit(1);
+    if (v4_stashfile) {
+       FILE *kf;
+       krb5_keyblock *key = &master_keyblock;
+
+       key->length = 8;
+
+#ifdef ANSI_STDIO
+#define STDIO_RB "rb"
+#else
+#define STDIO_RB "r"
+#endif
+       if (!(kf = fopen(v4_stashfile, STDIO_RB))) {
+           retval = errno;
+       } else if (!(key->contents = (krb5_octet *)malloc(key->length))) {
+           retval = ENOMEM;
+       } else if (fread((krb5_pointer) key->contents,
+                        sizeof(key->contents[0]), key->length, kf) != key->length) {
+           memset(key->contents, 0, key->length);
+           free(key->contents);
+           key->contents = 0;
+           retval = KRB5_KDB_CANTREAD_STORED;
+       }
+       
+       fclose(kf);
+
+       if (retval)
+       {
+           (void) krb5_db_fini();
+           com_err(argv[0], retval, "trying to open old kstash file");
+           exit(1);
+       }
+    } else {
+       if (retval = krb5_db_fetch_mkey(master_princ, &master_encblock, TRUE,
+                                       FALSE, 0, &master_keyblock)) {
+           com_err(argv[0], retval, "while reading master key");
+           (void) krb5_db_fini();
+           exit(1);
+       }
     }
     if (retval = krb5_db_verify_master_key(master_princ, &master_keyblock,
                                           &master_encblock)) {