[2433] in Kerberos

home help back first fref pref prev next nref lref last post

kdb5_edit extract_srvtab brain-damaged

daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Mon Dec 7 18:31:39 1992

Date: 7 Dec 1992 20:48:57 GMT
From: jik@Athena.MIT.EDU (Jonathan I. Kamens)
To: kerberos@shelby.Stanford.EDU

The kdb5_edit version of extract_srvtab is broken in two different ways: (1) It
thinks that principals contain a single-component aname and single-component
instance, a la V4; (2) It doesn't allow keys for different "instances" to be
written to the same file.  The latter is especially necessary if you're going
to be running V4 compatibility mode in the server and therefore need some
V4-style keys in the default srvtab and some V5-style keys (i.e.,
first-hostname-component instances vs. FDQN instances).

This patch adds a new function, new_extract_srvtab.  I think it should actually
be the default, but I'm not going to replace the default because that might
mess people up.

Apply in src/admin/edit.

*** 1.2	1992/12/07 15:13:07
--- kdb5_edit.c	1992/12/07 20:36:28
***************
*** 740,745 ****
--- 740,882 ----
  }
  
  void
+ new_extract_srvtab(argc, argv)
+ int argc;
+ char *argv[];
+ {
+     char ktname[MAXPATHLEN+sizeof("WRFILE:")+1], *ktnameptr = 0;
+     krb5_keytab ktid;
+     krb5_error_code retval;
+     krb5_principal princ;
+     krb5_db_entry dbentry;
+     char *pname;
+     register int i;
+     int nentries;
+     krb5_boolean more;
+     krb5_keytab_entry newentry;
+     char *subsysname = argv[0];
+     static int srvtab_number = 0;
+ 
+     argv++, argc--;
+ 
+     while (argc && **argv == '-') {
+ 	 if (! strcmp(&argv[0][1], "file")) {
+ 	      argv++, argc--;
+ 	      if (! argc) {
+ 		   com_err(subsysname, 0, "Missing argument after '-file'");
+ 		   goto usage;
+ 	      }
+ 	      ktnameptr = argv[0];
+ 	      argv++, argc--;
+ 	 }
+ 	 else {
+ 	      goto usage;
+ 	 }
+     }
+ 
+     if (! argc) {
+ 	 goto usage;
+     }
+ 
+     if (!dbactive) {
+ 	    com_err(subsysname, 0, Err_no_database);
+ 	    return;
+     }
+     if (!valid_master_key) {
+ 	    com_err(subsysname, 0, Err_no_master_msg);
+ 	    return;
+     }
+ 
+     memset(ktname, 0, sizeof(ktname));
+     strcpy(ktname, "WRFILE:");
+     if (ktnameptr) {
+ 	 if (strlen(ktnameptr) + strlen(ktname) + 1 > sizeof(ktname)) {
+ 	      com_err(subsysname, 0, "File name '%s' is too long",
+ 		      ktnameptr);
+ 	      return;
+ 	 }
+ 	 strcat(ktname, ktnameptr);
+     }
+     else {
+ 	 (void) sprintf(&ktname[strlen(ktname)], "new-srvtab-%d",
+ 			srvtab_number++);
+     }
+ 
+     if (retval = krb5_kt_resolve(ktname, &ktid)) {
+ 	com_err(subsysname, retval, "while resolving keytab name '%s'",
+ 		ktname);
+ 	return;
+     }
+ 
+     for (; argc; argc--, argv++) {
+ 	/* iterate over the names */
+ 	pname = malloc(strlen(*argv) + strlen(cur_realm)+2);
+ 	if (!pname) {
+ 	    com_err(subsysname, ENOMEM,
+ 		    "while preparing to extract key for %s", *argv);
+ 	    continue;
+ 	}
+ 	strcpy(pname, *argv);
+ 	if (!strchr(*argv, REALM_SEP)) {
+ 	    strcat(pname, REALM_SEP_STR);
+ 	    strcat(pname, cur_realm);
+ 	}
+ 
+ 	if (retval = krb5_parse_name(pname, &princ)) {
+ 	    com_err(subsysname, retval, "while parsing '%s'", pname);
+ 	    free(pname);
+ 	    continue;
+ 	}
+ 	nentries = 1;
+ 	if (retval = krb5_db_get_principal(princ, &dbentry, &nentries,
+ 					   &more)) {
+ 	    com_err(subsysname, retval, "while retrieving '%s'", pname);
+ 	    goto cleanmost;
+ 	} else if (more) {
+ 	    com_err(subsysname, KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE,
+ 		    "while retrieving '%s'", pname);
+ 	    if (nentries)
+ 		krb5_db_free_principal(&dbentry, nentries);
+ 	    goto cleanmost;
+ 	} else if (!nentries) {
+ 	    com_err(subsysname, KRB5_KDB_NOENTRY, "while retrieving '%s'",
+ 		    pname);
+ 	    goto cleanmost;
+ 	}
+ 	if (retval = krb5_kdb_decrypt_key(&master_encblock,
+ 					  &dbentry.key,
+ 					  &newentry.key)) {
+ 	    com_err(subsysname, retval, "while decrypting key for '%s'",
+ 		    pname);
+ 	    goto cleanall;
+ 	}
+ 	newentry.principal = princ;
+ 	newentry.vno = dbentry.kvno;
+ 	if (retval = krb5_kt_add_entry(ktid, &newentry)) {
+ 	    com_err(subsysname, retval, "while adding key to keytab '%s'",
+ 		    ktname);
+ 	} else
+ 	    printf("'%s' added to keytab '%s'\n",
+ 		   pname, ktname);
+ 	memset((char *)newentry.key.contents, 0, newentry.key.length);
+ 	xfree(newentry.key.contents);
+     cleanall:
+ 	    krb5_db_free_principal(&dbentry, nentries);
+     cleanmost:
+ 	    free(pname);
+ 	    krb5_free_principal(princ);
+     }
+     if (retval = krb5_kt_close(ktid))
+ 	com_err(subsysname, retval, "while closing keytab");
+     return;
+ 
+ usage:
+     com_err(subsysname, 0, "Usage: %s [ -file srvtab-file ] principal ...",
+ 	    subsysname);
+     return;
+ }
+ 
+ void
  extract_v4_srvtab(argc, argv)
  int argc;
  char *argv[];
*** 5.11	1991/06/06 09:25:28
--- kdb5_ed_ct.ct	1992/12/07 20:32:30
***************
*** 51,56 ****
--- 51,59 ----
  request extract_srvtab, "Extract service key table",
  	extract_srvtab, xst, ex_st;
  
+ request new_extract_srvtab, "Extract service key table",
+ 	new_extract_srvtab, nxst, n_ex_st;
+ 
  request extract_v4_srvtab, "Extract service key table",
  	extract_v4_srvtab, xst4;
  

-- 
Jonathan Kamens                                         jik@MIT.Edu
MIT Information Systems/Athena              Moderator, news.answers

home help back first fref pref prev next nref lref last post