Fix bug in V4 emulation where it was always assuming the master key
authorTheodore Tso <tytso@mit.edu>
Thu, 15 Sep 1994 04:24:09 +0000 (04:24 +0000)
committerTheodore Tso <tytso@mit.edu>
Thu, 15 Sep 1994 04:24:09 +0000 (04:24 +0000)
version number was zero.  Now it actually reads it in from the master
key database entry.

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

src/kdc/kerberos_v4.c
src/kdc/main.c

index b48ad04b59077fb09d6248df7dd66f99fbb7b4b1..6c4228947d2457f07a17e64f9fe1d779f2a135db 100644 (file)
@@ -93,7 +93,8 @@ static C_Block session_key;
 static C_Block user_key;
 static C_Block service_key;
 */
-static u_char master_key_version;
+extern u_char master_key_version;
+u_char master_key_version;
 /*
 static char k_instance[INST_SZ];
 */
index 55106f8a63392946423ad2a0a77ba95c324656b8..a3da6cf419d6cf95310b786b346f31e55d7b2b23 100644 (file)
@@ -291,6 +291,9 @@ krb5_keyblock *masterkeyblock;
     int nprincs;
     krb5_boolean more;
     krb5_db_entry server;
+#ifdef KRB4
+    extern unsigned char master_key_version;
+#endif
 
     /* set db name if appropriate */
     if (dbname && (retval = krb5_db_set_name(dbname)))
@@ -306,6 +309,26 @@ krb5_keyblock *masterkeyblock;
        return(retval);
     }
 
+#ifdef KRB4    
+    /* get the master key, to extract the master key version number */
+    nprincs = 1;
+    if (retval = krb5_db_get_principal(masterkeyname,
+                                      &server, &nprincs,
+                                      &more)) {
+       return(retval);
+    }
+    if (nprincs != 1) {
+       if (nprincs)
+           krb5_db_free_principal(&server, nprincs);
+       return(KRB5_KDB_NOMASTERKEY);
+    } else if (more) {
+       krb5_db_free_principal(&server, nprincs);
+       return(KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE);
+    }
+    master_key_version = server.kvno;
+    krb5_db_free_principal(&server, nprincs);
+#endif
+    
     /* do any necessary key pre-processing */
     if (retval = krb5_process_key(&master_encblock, masterkeyblock)) {
        master_encblock.crypto_entry = 0;