]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Added kdb5_util list_mkeys command, cleaned up some code formatting
authorWill Fiveash <will.fiveash@oracle.com>
Tue, 13 Jan 2009 01:17:16 +0000 (01:17 +0000)
committerWill Fiveash <will.fiveash@oracle.com>
Tue, 13 Jan 2009 01:17:16 +0000 (01:17 +0000)
(removed hard tabs), added logic to add default actkvno tl_data when
creating a new mkey princ.

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/mkey_migrate@21739 dc483132-0cff-0310-8789-dd5450dbe970

18 files changed:
src/include/kdb.h
src/include/krb5/krb5.hin
src/kadmin/dbutil/kdb5_create.c
src/kadmin/dbutil/kdb5_mkey.c
src/kadmin/dbutil/kdb5_util.c
src/kadmin/dbutil/kdb5_util.h
src/kadmin/server/ovsec_kadmd.c
src/kdc/extern.h
src/lib/kadm5/srv/server_kdb.c
src/lib/kadm5/srv/svr_principal.c
src/lib/kdb/kdb5.c
src/lib/kdb/kdb_default.c
src/lib/kdb/keytab.c
src/lib/kdb/libkdb5.exports
src/lib/krb5/libkrb5.exports
src/plugins/kdb/db2/db2_exp.c
src/plugins/kdb/db2/kdb_db2.c
src/plugins/kdb/db2/kdb_db2.h

index a95676b0375f998f9982322867ade60953664f42..f8ebc4ab1a9e4ce8ebbce22d91c4f0ebe2b3776c 100644 (file)
@@ -183,33 +183,15 @@ typedef struct __krb5_key_salt_tuple {
 /* version number for KRB5_TL_MKEY_AUX data */
 #define KRB5_TL_MKEY_AUX_VER_1 1
 
-/* XXX WAF: the indef. struct typedefs below may not be needed so ifdef'ing them
- * out for now */
-/*
- * Doing this because it this struct should be defined in k5-int.h but this
- * header file can't include that one.
- */
-#if 0 /************** Begin IFDEF'ed OUT *******************************/
-#ifndef _KRB5_INT_H
-struct _krb5_actkvno_node;
-typedef struct _krb5_actkvno_node krb5_actkvno_node;
-struct _krb5_mkey_aux_node;
-typedef struct _krb5_mkey_aux_node krb5_mkey_aux_node;
-#endif
-#endif /**************** END IFDEF'ed OUT *******************************/
-
 typedef struct _krb5_actkvno_node {
     struct _krb5_actkvno_node *next;
-    krb5_kvno act_kvno;
+    krb5_kvno      act_kvno;
     krb5_timestamp act_time;
 } krb5_actkvno_node;
 
 typedef struct _krb5_mkey_aux_node {
     struct _krb5_mkey_aux_node *next;
-    krb5_kvno    mkey_kvno; /* kvno of mkey protecting the latest_mkey */
-    /* XXX WAF: maybe krb5_data isn't adequate, the kvno and enctype is needed I
-     * think.  Perhaps krb5_key_data should be used?
-     */
+    krb5_kvno        mkey_kvno; /* kvno of mkey protecting the latest_mkey */
     krb5_key_data    latest_mkey; /* most recent mkey */
 } krb5_mkey_aux_node;
 
@@ -317,10 +299,10 @@ krb5_error_code krb5_db_get_mkey ( krb5_context kcontext,
                                   krb5_keyblock **key );
 
 krb5_error_code krb5_db_set_mkey_list( krb5_context context,
-                                       krb5_keyblock_node * keylist);
+                                       krb5_keylist_node * keylist);
 
 krb5_error_code krb5_db_get_mkey_list( krb5_context kcontext,
-                                       krb5_keyblock_node ** keylist);
+                                       krb5_keylist_node ** keylist);
 
 krb5_error_code krb5_db_free_master_key ( krb5_context kcontext,
                                          krb5_keyblock *key );
@@ -348,11 +330,11 @@ krb5_db_fetch_mkey_list( krb5_context    context,
                         krb5_principal  mname,
                         const krb5_keyblock * mkey,
                         krb5_kvno             mkvno,
-                        krb5_keyblock_node  **mkeys_list );
+                        krb5_keylist_node  **mkeys_list );
 
 krb5_error_code
 krb5_db_free_mkey_list( krb5_context         context,
-                       krb5_keyblock_node  *mkey_list );
+                       krb5_keylist_node  *mkey_list );
 
 krb5_error_code
 krb5_dbe_find_enctype( krb5_context    kcontext,
@@ -400,13 +382,14 @@ krb5_dbe_fetch_act_mkey_list(krb5_context        context,
 
 krb5_error_code
 krb5_dbe_find_act_mkey( krb5_context          context,
-                        krb5_keyblock_node  * mkey_list,
+                        krb5_keylist_node   * mkey_list,
                         krb5_actkvno_node   * act_mkey_list,
+                        krb5_kvno           * act_kvno,
                         krb5_keyblock      ** act_mkey);
 
 krb5_error_code
 krb5_dbe_find_mkey( krb5_context        context,
-                    krb5_keyblock_node * mkey_list,
+                    krb5_keylist_node * mkey_list,
                     krb5_db_entry      * entry,
                     krb5_keyblock      ** mkey);
 
@@ -570,20 +553,20 @@ krb5_def_fetch_mkey_list( krb5_context            context,
                            krb5_principal        mprinc,
                            const krb5_keyblock  *mkey,
                            krb5_kvno             mkvno,
-                           krb5_keyblock_node  **mkeys_list);
+                           krb5_keylist_node  **mkeys_list);
 
 krb5_error_code kdb_def_set_mkey ( krb5_context kcontext,
                                   char *pwd,
                                   krb5_keyblock *key );
 
 krb5_error_code kdb_def_set_mkey_list ( krb5_context kcontext,
-                                       krb5_keyblock_node *keylist );
+                                       krb5_keylist_node *keylist );
 
 krb5_error_code kdb_def_get_mkey ( krb5_context kcontext,
                                   krb5_keyblock **key );
 
 krb5_error_code kdb_def_get_mkey_list ( krb5_context kcontext,
-                                       krb5_keyblock_node **keylist );
+                                       krb5_keylist_node **keylist );
 
 krb5_error_code
 krb5_dbe_def_cpw( krb5_context   context,
@@ -791,10 +774,10 @@ typedef struct _kdb_vftabl {
                                           krb5_keyblock **key);
 
     krb5_error_code (*set_master_key_list) ( krb5_context kcontext,
-                                            krb5_keyblock_node *keylist);
+                                            krb5_keylist_node *keylist);
 
     krb5_error_code (*get_master_key_list) ( krb5_context kcontext,
-                                            krb5_keyblock_node **keylist);
+                                            krb5_keylist_node **keylist);
 
     krb5_error_code (*setup_master_key_name) ( krb5_context kcontext,
                                               char *keyname,
@@ -824,7 +807,7 @@ typedef struct _kdb_vftabl {
                                              krb5_principal mname,
                                              const krb5_keyblock *key,
                                              krb5_kvno            kvno,
-                                             krb5_keyblock_node  **mkeys_list);
+                                             krb5_keylist_node  **mkeys_list);
 
     krb5_error_code (*dbe_search_enctype) ( krb5_context kcontext, 
                                            krb5_db_entry *dbentp, 
index 913cc55ec34af1c369e9a13a220b1139f47ff310..d50457ca43e8ba3b150a1a40d043584513fc29c0 100644 (file)
@@ -349,10 +349,10 @@ typedef struct _krb5_keyblock {
 } krb5_keyblock;
 
 typedef struct _krb5_keylist_node {
-       krb5_keyblock keyblock;
-       krb5_kvno     kvno;
-       struct _krb5_keylist_node *next;
- } krb5_keyblock_node;
+    krb5_keyblock keyblock;
+    krb5_kvno     kvno;
+    struct _krb5_keylist_node *next;
+} krb5_keylist_node;
 
 #ifdef KRB5_OLD_CRYPTO
 typedef struct _krb5_encrypt_block {
index 5d7e0ebd23051a8aeb75031905c7136fbad1ca84..9448a352e70a883c078d389a7c118f9f1d173eb2 100644 (file)
@@ -319,6 +319,9 @@ master key name '%s'\n",
        com_err(progname, retval, "while adding entries to the database");
        exit_status++; return;
     }
+
+
+
     /*
      * Always stash the master key so kadm5_create does not prompt for
      * it; delete the file below if it was not requested.  DO NOT EXIT
@@ -418,11 +421,10 @@ add_principal(context, princ, op, pblock)
     krb5_error_code      retval;
     krb5_db_entry        entry;
     krb5_kvno             mkey_kvno;
-
     krb5_timestamp       now;
     struct iterate_args          iargs;
-
     int                          nentries = 1;
+    krb5_actkvno_node     actkvno;
 
     memset((char *) &entry, 0, sizeof(entry));
 
@@ -459,6 +461,16 @@ add_principal(context, princ, op, pblock)
                                                  &master_keyblock, NULL, 
                                                  mkey_kvno, entry.key_data)))
            return retval;
+        /*
+         * There should always be at least one "active" mkey so creating the
+         * KRB5_TL_ACTKVNO entry now so the initial mkey is active.
+         */
+        actkvno.next = NULL;
+        actkvno.act_kvno = mkey_kvno;
+        actkvno.act_time = now;
+        if ((retval = krb5_dbe_update_actkvno(context, &entry, &actkvno)))
+            return retval;
+
        break;
     case TGT_KEY:
        iargs.ctx = context;
index 679c8b7b1912bd3bf0f9a004b24f547121d21b50..2d489669051b9e670baa225a476d25609ff74912 100644 (file)
@@ -14,6 +14,7 @@
 
 extern krb5_keyblock master_keyblock; /* current mkey */
 extern krb5_principal master_princ;
+extern krb5_keylist_node *master_keylist;
 extern krb5_data master_salt;
 extern char *mkey_password;
 extern char *progname;
@@ -37,24 +38,24 @@ void
 kdb5_add_mkey(int argc, char *argv[])
 {
     int optchar;
-    krb5_error_code    retval;
-    char               *mkey_fullname;
-    char               *pw_str = 0;
-    unsigned int       pw_size = 0;
-    int                        do_stash = 0, nentries = 0;
-    int                        old_key_data_count, i, j;
-    krb5_boolean       more = 0;
-    krb5_data          pwd;
-    krb5_kvno          old_kvno, new_mkey_kvno;
-    krb5_keyblock      new_master_keyblock;
-    krb5_keyblock      plainkey;
-    krb5_key_data      tmp_key_data, *old_key_data, *key_data;
-    krb5_enctype       new_master_enctype = DEFAULT_KDC_ENCTYPE;
-    char               *new_mkey_password;
-    krb5_db_entry      master_entry;
-    krb5_timestamp     now;
+    krb5_error_code retval;
+    char *mkey_fullname;
+    char *pw_str = 0;
+    unsigned int pw_size = 0;
+    int do_stash = 0, nentries = 0;
+    int old_key_data_count, i, j;
+    krb5_boolean more = 0;
+    krb5_data pwd;
+    krb5_kvno old_kvno, new_mkey_kvno;
+    krb5_keyblock new_master_keyblock;
+    krb5_keyblock  plainkey;
+    krb5_key_data tmp_key_data, *old_key_data, *key_data;
+    krb5_enctype new_master_enctype = DEFAULT_KDC_ENCTYPE;
+    char *new_mkey_password;
+    krb5_db_entry master_entry;
+    krb5_timestamp now;
     krb5_mkey_aux_node  *mkey_aux_data_head, **mkey_aux_data,
-                       *cur_mkey_aux_data, *next_mkey_aux_data;
+                        *cur_mkey_aux_data, *next_mkey_aux_data;
 
     /*
      * The command table entry for this command causes open_db_and_mkey() to be
@@ -62,44 +63,45 @@ kdb5_add_mkey(int argc, char *argv[])
      */
 
     while ((optchar = getopt(argc, argv, "k:s")) != -1) {
-       switch(optchar) {
-       case 'k':
-           if (krb5_string_to_enctype(optarg, &new_master_enctype)) {
-               com_err(progname, EINVAL, ": %s is an invalid enctype", optarg);
-               exit_status++;
-               return;
-           }
-           break;
-       case 's':
-           do_stash++;
-           break;
-       case '?':
-       default:
-           usage();
-           return;
-       }
-    }
-    
+        switch(optchar) {
+        case 'k':
+            if (krb5_string_to_enctype(optarg, &new_master_enctype)) {
+                com_err(progname, EINVAL, ": %s is an invalid enctype", optarg);
+                exit_status++;
+                return;
+            }
+            break;
+        case 's':
+            do_stash++;
+            break;
+        case '?':
+        default:
+            usage();
+            return;
+        }
+    }
+
     /* assemble & parse the master key name */
     if ((retval = krb5_db_setup_mkey_name(util_context,
-                                         global_params.mkey_name,
-                                         global_params.realm,  
-                                         &mkey_fullname, &master_princ))) {
-       com_err(progname, retval, "while setting up master key name");
-       exit_status++;
-       return;
+                                          global_params.mkey_name,
+                                          global_params.realm,  
+                                          &mkey_fullname, &master_princ))) {
+        com_err(progname, retval, "while setting up master key name");
+        exit_status++;
+        return;
     }
 
-    retval = krb5_db_get_principal(util_context, master_princ, &master_entry, &nentries,
-                                  &more);
+    retval = krb5_db_get_principal(util_context, master_princ, &master_entry,
+                                   &nentries,
+                                   &more);
     if (retval != 0) {
-       com_err(progname, retval, "while setting up master key name");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while setting up master key name");
+        exit_status++;
+        return;
     }
 
     printf("Creating new master key for master key principal '%s'\n",
-          mkey_fullname);
+        mkey_fullname);
 
     printf("You will be prompted for a new database Master Password.\n");
     printf("It is important that you NOT FORGET this password.\n");
@@ -108,17 +110,17 @@ kdb5_add_mkey(int argc, char *argv[])
     pw_size = 1024;
     pw_str = malloc(pw_size);
     if (pw_str == NULL) {
-       com_err(progname, ENOMEM, "while creating new master key");
-       exit_status++;
-       return;
+        com_err(progname, ENOMEM, "while creating new master key");
+        exit_status++;
+        return;
     }
-    
+
     retval = krb5_read_password(util_context, KRB5_KDC_MKEY_1, KRB5_KDC_MKEY_2,
-                               pw_str, &pw_size);
+        pw_str, &pw_size);
     if (retval) {
-       com_err(progname, retval, "while reading new master key from keyboard");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while reading new master key from keyboard");
+        exit_status++;
+        return;
     }
     new_mkey_password = pw_str;
 
@@ -126,22 +128,22 @@ kdb5_add_mkey(int argc, char *argv[])
     pwd.length = strlen(new_mkey_password);
     retval = krb5_principal2salt(util_context, master_princ, &master_salt);
     if (retval) {
-       com_err(progname, retval, "while calculating master key salt");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while calculating master key salt");
+        exit_status++;
+        return;
     }
 
     retval = krb5_c_string_to_key(util_context, new_master_enctype, 
-                                 &pwd, &master_salt, &new_master_keyblock);
+        &pwd, &master_salt, &new_master_keyblock);
     if (retval) {
-       com_err(progname, retval, "while transforming master key from password");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while transforming master key from password");
+        exit_status++;
+        return;
     }
 
     /* First save the old keydata */
     old_kvno = get_key_data_kvno(util_context, master_entry.n_key_data,
-                                master_entry.key_data);
+        master_entry.key_data);
     old_key_data_count = master_entry.n_key_data;
     old_key_data = master_entry.key_data;
 
@@ -151,11 +153,12 @@ kdb5_add_mkey(int argc, char *argv[])
      * krb5_key_data key_data_contents is a pointer to this key.  Using some
      * logic from master_key_convert().
      */
-    master_entry.key_data = (krb5_key_data *) malloc(sizeof(krb5_key_data) * (old_key_data_count + 1));
+    master_entry.key_data = (krb5_key_data *) malloc(sizeof(krb5_key_data) *
+                                                     (old_key_data_count + 1));
     if (master_entry.key_data == NULL) {
-       com_err(progname, ENOMEM, "while adding new master key");
-       exit_status++;
-       return;
+        com_err(progname, ENOMEM, "while adding new master key");
+        exit_status++;
+        return;
     }
     memset((char *) master_entry.key_data, 0, sizeof(krb5_key_data) * (old_key_data_count + 1));
     master_entry.n_key_data = old_key_data_count + 1;
@@ -163,16 +166,17 @@ kdb5_add_mkey(int argc, char *argv[])
     new_mkey_kvno = old_kvno + 1;
     /* deal with wrapping? */
     if (new_mkey_kvno == 0)
-       new_mkey_kvno = 1; /* knvo must not be 0 as this is special value (IGNORE_VNO) */
+        new_mkey_kvno = 1; /* knvo must not be 0 as this is special value (IGNORE_VNO) */
 
     /* Note, mkey does not have salt */
     /* add new mkey encrypted with itself to mkey princ entry */
     if ((retval = krb5_dbekd_encrypt_key_data(util_context, &new_master_keyblock,
-                                             &new_master_keyblock, NULL, 
-                                             (int) new_mkey_kvno, master_entry.key_data))) {
-       com_err(progname, retval, "while creating new master key");
-       exit_status++;
-       return;
+                                              &new_master_keyblock, NULL, 
+                                              (int) new_mkey_kvno,
+                                              master_entry.key_data))) {
+        com_err(progname, retval, "while creating new master key");
+        exit_status++;
+        return;
     }
 
     /*
@@ -186,117 +190,118 @@ kdb5_add_mkey(int argc, char *argv[])
      */
     mkey_aux_data_head = (krb5_mkey_aux_node *) malloc(sizeof(krb5_mkey_aux_node));
     if (mkey_aux_data_head == NULL) {
-       com_err(progname, ENOMEM, "while creating mkey_aux_data");
-       exit_status++;
-       return;
+        com_err(progname, ENOMEM, "while creating mkey_aux_data");
+        exit_status++;
+        return;
     }
     memset(mkey_aux_data_head, 0, sizeof(krb5_mkey_aux_node));
     mkey_aux_data = &mkey_aux_data_head;
 
     for (i = 0; i < old_key_data_count; i++) {
-       key_data = &old_key_data[i];
-
-       retval = krb5_dbekd_decrypt_key_data(util_context, &master_keyblock,
-                                            key_data, &plainkey, NULL);
-       if (retval) {
-           com_err(progname, retval, "while decrypting master keys");
-           exit_status++;
-           return;
-       }
-
-       /*
-        * Create a list of krb5_mkey_aux_node nodes.  One node contains the new
-        * mkey encrypted by an old mkey and the old mkey's kvno (one node per
-        * old mkey).
-        */
-
-       if (*mkey_aux_data == NULL) {
-           /* *mkey_aux_data points to next field of previous node */
-           *mkey_aux_data = (krb5_mkey_aux_node *) malloc(sizeof(krb5_mkey_aux_node));
-           if (mkey_aux_data == NULL) {
-               com_err(progname, ENOMEM, "while creating mkey_aux_data");
-               exit_status++;
-               return;
-           }
-           memset(*mkey_aux_data, 0, sizeof(krb5_mkey_aux_node));
-       }
-
-       /* encrypt the new mkey with the older mkey */
-       retval = krb5_dbekd_encrypt_key_data(util_context, &plainkey,
-                                            &new_master_keyblock,
-                                            NULL, /* no keysalt */
-                                            (int) key_data->key_data_kvno,
-                                            &tmp_key_data);
-       if (retval) {
-           com_err(progname, retval, "while encrypting master keys");
-           exit_status++;
-           return;
-       }
-
-       (*mkey_aux_data)->latest_mkey = tmp_key_data;
-       (*mkey_aux_data)->mkey_kvno = key_data->key_data_kvno;
-
-       mkey_aux_data = &((*mkey_aux_data)->next);
-
-       /* Store old key in master_entry keydata, + 1 to skip the first key_data entry */
-       retval = krb5_dbekd_encrypt_key_data(util_context, &new_master_keyblock,
-                                            &plainkey, NULL, /* no keysalt */
-                                            (int) key_data->key_data_kvno,
-                                            &master_entry.key_data[i+1]);
-       if (retval) {
-           com_err(progname, retval, "while encrypting master keys");
-           exit_status++;
-           return;
-       }
-
-       /* free plain text key and old key data entry */
-       krb5_free_keyblock_contents(util_context, &plainkey);
-       for (j = 0; j < key_data->key_data_ver; j++) {
-           if (key_data->key_data_length[j]) {
-               /* the key_data contents are encrypted so no clearing first */
-               free(key_data->key_data_contents[j]);
-           }
-       }
+        key_data = &old_key_data[i];
+
+        retval = krb5_dbekd_decrypt_key_data(util_context, &master_keyblock,
+                                             key_data, &plainkey, NULL);
+        if (retval) {
+            com_err(progname, retval, "while decrypting master keys");
+            exit_status++;
+            return;
+        }
+
+        /*
+         * Create a list of krb5_mkey_aux_node nodes.  One node contains the new
+         * mkey encrypted by an old mkey and the old mkey's kvno (one node per
+         * old mkey).
+         */
+
+        if (*mkey_aux_data == NULL) {
+            /* *mkey_aux_data points to next field of previous node */
+            *mkey_aux_data = (krb5_mkey_aux_node *) malloc(sizeof(krb5_mkey_aux_node));
+            if (mkey_aux_data == NULL) {
+                com_err(progname, ENOMEM, "while creating mkey_aux_data");
+                exit_status++;
+                return;
+            }
+            memset(*mkey_aux_data, 0, sizeof(krb5_mkey_aux_node));
+        }
+
+        /* encrypt the new mkey with the older mkey */
+        retval = krb5_dbekd_encrypt_key_data(util_context, &plainkey,
+            &new_master_keyblock,
+            NULL, /* no keysalt */
+            (int) key_data->key_data_kvno,
+            &tmp_key_data);
+        if (retval) {
+            com_err(progname, retval, "while encrypting master keys");
+            exit_status++;
+            return;
+        }
+
+        (*mkey_aux_data)->latest_mkey = tmp_key_data;
+        (*mkey_aux_data)->mkey_kvno = key_data->key_data_kvno;
+
+        mkey_aux_data = &((*mkey_aux_data)->next);
+
+        /* Store old key in master_entry keydata, + 1 to skip the first key_data entry */
+        retval = krb5_dbekd_encrypt_key_data(util_context, &new_master_keyblock,
+                                             &plainkey,
+                                             NULL, /* no keysalt */
+                                             (int) key_data->key_data_kvno,
+                                             &master_entry.key_data[i+1]);
+        if (retval) {
+            com_err(progname, retval, "while encrypting master keys");
+            exit_status++;
+            return;
+        }
+
+        /* free plain text key and old key data entry */
+        krb5_free_keyblock_contents(util_context, &plainkey);
+        for (j = 0; j < key_data->key_data_ver; j++) {
+            if (key_data->key_data_length[j]) {
+                /* the key_data contents are encrypted so no clearing first */
+                free(key_data->key_data_contents[j]);
+            }
+        }
     }
 
     if ((retval = krb5_dbe_update_mkey_aux(util_context, &master_entry,
-                                          mkey_aux_data_head))) {
-       com_err(progname, retval, "while updating mkey aux data");
-       exit_status++;
-       return;
+                                           mkey_aux_data_head))) {
+        com_err(progname, retval, "while updating mkey aux data");
+        exit_status++;
+        return;
     }
 
     if ((retval = krb5_timeofday(util_context, &now))) {
-       com_err(progname, retval, "while getting current time");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while getting current time");
+        exit_status++;
+        return;
     }
 
     if ((retval = krb5_dbe_update_mod_princ_data(util_context, &master_entry,
-                                                now, master_princ))) {
-       com_err(progname, retval, "while updating the master key principal modification time");
-       exit_status++;
-       return;
+                now, master_princ))) {
+        com_err(progname, retval, "while updating the master key principal modification time");
+        exit_status++;
+        return;
     }
 
     if ((retval = krb5_db_put_principal(util_context, &master_entry, &nentries))) {
-       (void) krb5_db_fini(util_context);
-       com_err(progname, retval, "while adding master key entry to the database");
-       exit_status++;
-       return;
+        (void) krb5_db_fini(util_context);
+        com_err(progname, retval, "while adding master key entry to the database");
+        exit_status++;
+        return;
     }
 
     if (do_stash) {
-       retval = krb5_db_store_master_key(util_context,
-                                         global_params.stash_file,
-                                         master_princ,
-                                         new_mkey_kvno,
-                                         &new_master_keyblock,
-                                         mkey_password);
-       if (retval) {
-           com_err(progname, errno, "while storing key");
-           printf("Warning: couldn't stash master key.\n");
-       }
+        retval = krb5_db_store_master_key(util_context,
+            global_params.stash_file,
+            master_princ,
+            new_mkey_kvno,
+            &new_master_keyblock,
+            mkey_password);
+        if (retval) {
+            com_err(progname, errno, "while storing key");
+            printf("Warning: couldn't stash master key.\n");
+        }
     }
     /* clean up */
     (void) krb5_db_fini(util_context);
@@ -305,17 +310,17 @@ kdb5_add_mkey(int argc, char *argv[])
     memset((char *)new_master_keyblock.contents, 0, new_master_keyblock.length);
     free(new_master_keyblock.contents);
     if (pw_str) {
-       memset(pw_str, 0, pw_size);
-       free(pw_str);
+        memset(pw_str, 0, pw_size);
+        free(pw_str);
     }
     free(master_salt.data);
     free(mkey_fullname);
     for (cur_mkey_aux_data = mkey_aux_data_head; cur_mkey_aux_data != NULL;
-        cur_mkey_aux_data = next_mkey_aux_data) {
+        cur_mkey_aux_data = next_mkey_aux_data) {
 
-       next_mkey_aux_data = cur_mkey_aux_data->next;
-       krb5_free_key_data_contents(util_context, &(cur_mkey_aux_data->latest_mkey));
-       free(cur_mkey_aux_data);
+        next_mkey_aux_data = cur_mkey_aux_data->next;
+        krb5_free_key_data_contents(util_context, &(cur_mkey_aux_data->latest_mkey));
+        free(cur_mkey_aux_data);
     }
     return;
 }
@@ -323,37 +328,38 @@ kdb5_add_mkey(int argc, char *argv[])
 void
 kdb5_use_mkey(int argc, char *argv[])
 {
-    krb5_error_code    retval;
-    char               *mkey_fullname;
-    krb5_kvno          use_kvno;
-    krb5_timestamp     now, start_time;
-    krb5_actkvno_node  *actkvno_list, *new_actkvno_list_head, *new_actkvno, *prev_actkvno, *cur_actkvno;
-    krb5_db_entry      master_entry;
-    int                        nentries = 0;
-    krb5_boolean       more = 0;
+    krb5_error_code retval;
+    char  *mkey_fullname;
+    krb5_kvno  use_kvno;
+    krb5_timestamp now, start_time;
+    krb5_actkvno_node *actkvno_list, *new_actkvno_list_head, *new_actkvno,
+                        *prev_actkvno, *cur_actkvno;
+    krb5_db_entry master_entry;
+    int   nentries = 0;
+    krb5_boolean more = 0;
 
     if (argc < 1 || argc > 2) {
-       /* usage calls exit */
-       usage();
+        /* usage calls exit */
+        usage();
     }
 
     use_kvno = (int) strtol(argv[0], (char **)NULL, 10);
     if (use_kvno == 0) {
-       com_err(progname, EINVAL, ": 0 is an invalid KVNO value.");
-       exit_status++;
-       return;
+        com_err(progname, EINVAL, ": 0 is an invalid KVNO value.");
+        exit_status++;
+        return;
     }
 
     if ((retval = krb5_timeofday(util_context, &now))) {
-       com_err(progname, retval, "while getting current time.");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while getting current time.");
+        exit_status++;
+        return;
     }
 
     if (argc == 2) {
-       start_time = (krb5_timestamp) get_date(argv[0]);
+        start_time = (krb5_timestamp) get_date(argv[0]);
     } else {
-       start_time = now;
+        start_time = now;
     }
 
     /*
@@ -369,29 +375,29 @@ kdb5_use_mkey(int argc, char *argv[])
 
     /* assemble & parse the master key name */
     if ((retval = krb5_db_setup_mkey_name(util_context,
-                                         global_params.mkey_name,
-                                         global_params.realm,  
-                                         &mkey_fullname, &master_princ))) {
-       com_err(progname, retval, "while setting up master key name");
-       exit_status++;
-       return;
+                                          global_params.mkey_name,
+                                          global_params.realm,  
+                                          &mkey_fullname, &master_princ))) {
+        com_err(progname, retval, "while setting up master key name");
+        exit_status++;
+        return;
     }
 
     retval = krb5_db_get_principal(util_context, master_princ, &master_entry, &nentries,
-                                  &more);
+        &more);
     if (retval != 0) {
-       com_err(progname, retval, "while setting up master key name");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while setting up master key name");
+        exit_status++;
+        return;
     }
 
     /* XXX WAF: verify that the provided kvno is valid */
 
     retval = krb5_dbe_lookup_actkvno(util_context, &master_entry, &actkvno_list);
     if (retval != 0) {
-       com_err(progname, retval, "while setting up master key name");
-       exit_status++;
-       return;
+        com_err(progname, retval, "while setting up master key name");
+        exit_status++;
+        return;
     }
 
     /*
@@ -401,82 +407,88 @@ kdb5_use_mkey(int argc, char *argv[])
     /* alloc enough space to hold new and existing key_data */
     new_actkvno = (krb5_actkvno_node *) malloc(sizeof(krb5_actkvno_node));
     if (new_actkvno == NULL) {
-       com_err(progname, ENOMEM, "while adding new master key");
-       exit_status++;
-       return;
+        com_err(progname, ENOMEM, "while adding new master key");
+        exit_status++;
+        return;
     }
 
     new_actkvno->act_kvno = use_kvno;
     new_actkvno->act_time = start_time;
 
     if (actkvno_list == NULL || new_actkvno->act_time < actkvno_list->act_time) {
-       /* insert new actkvno at head of list and link rest following */
-       new_actkvno->next = actkvno_list;
-       new_actkvno_list_head = new_actkvno;
+        /* insert new actkvno at head of list and link rest following */
+        new_actkvno->next = actkvno_list;
+        new_actkvno_list_head = new_actkvno;
     } else {
-       for (new_actkvno_list_head = prev_actkvno = cur_actkvno = actkvno_list; cur_actkvno != NULL;
-            prev_actkvno = cur_actkvno, cur_actkvno = cur_actkvno->next) {
-
-           if (cur_actkvno->act_time <= now) {
-               if (new_actkvno->act_time < cur_actkvno->act_time) {
-                   /*
-                    * This is a problem as the new actkvno would be skipped and
-                    * not added to the entries for the mkey princ.
-                    */
-                   com_err(progname, EINVAL,
-                           "Activation time %s is less than a existing currently active kvno %d (activation time %s)",
-                           strdate(new_actkvno->act_time), cur_actkvno->act_kvno, strdate(cur_actkvno->act_time));
-                   exit_status++;
-                   return;
-               }
-               /*
-                * New list head should point to the most current valid node in
-                * order to trim out of date entries.
-                */
-               new_actkvno_list_head = cur_actkvno;
-           }
-
-           if (new_actkvno->act_time < cur_actkvno->act_time) {
-               if (new_actkvno_list_head == cur_actkvno) {
-                   /*
-                    * XXX WAF: trying to minimize race condition issue here,
-                    * maybe there is a better way to do this?
-                    */
-                   com_err(progname, EINVAL,
-                           "Activation time %s is less than an existing currently active kvno %d (activation time %s)",
-                           strdate(new_actkvno->act_time), cur_actkvno->act_kvno, strdate(cur_actkvno->act_time));
-                   exit_status++;
-                   return;
-               }
-               prev_actkvno->next = new_actkvno;
-               new_actkvno->next = cur_actkvno;
-               break;
-           } else if (cur_actkvno->next == NULL) {
-               /* end of line, just add new node to end of list */
-               cur_actkvno->next = new_actkvno;
-               break;
-           }
-       } /* end for (new_actkvno_list_head = prev_actkvno = cur_actkvno = actkvno_list */
-    }
-
-    if ((retval = krb5_dbe_update_actkvno(util_context, &master_entry, new_actkvno_list_head))) {
-       com_err(progname, retval, "while updating actkvno data for master principal entry.");
-       exit_status++;
-       return;
+        for (new_actkvno_list_head = prev_actkvno = cur_actkvno = actkvno_list;
+             cur_actkvno != NULL;
+             prev_actkvno = cur_actkvno, cur_actkvno = cur_actkvno->next) {
+
+            if (cur_actkvno->act_time <= now) {
+                if (new_actkvno->act_time < cur_actkvno->act_time) {
+                    /*
+                     * This is a problem as the new actkvno would be skipped and
+                     * not added to the entries for the mkey princ.
+                     */
+                    com_err(progname, EINVAL,
+                        "Activation time %s is less than a existing currently "
+                        "active kvno %d (activation time %s)",
+                        strdate(new_actkvno->act_time), cur_actkvno->act_kvno,
+                                strdate(cur_actkvno->act_time));
+                    exit_status++;
+                    return;
+                }
+                /*
+                 * New list head should point to the most current valid node in
+                 * order to trim out of date entries.
+                 */
+                new_actkvno_list_head = cur_actkvno;
+            }
+
+            if (new_actkvno->act_time < cur_actkvno->act_time) {
+                if (new_actkvno_list_head == cur_actkvno) {
+                    /*
+                     * XXX WAF: trying to minimize race condition issue here,
+                     * maybe there is a better way to do this?
+                     */
+                    com_err(progname, EINVAL,
+                        "Activation time %s is less than an existing currently "
+                        "active kvno %d (activation time %s)",
+                        strdate(new_actkvno->act_time), cur_actkvno->act_kvno,
+                                strdate(cur_actkvno->act_time));
+                    exit_status++;
+                    return;
+                }
+                prev_actkvno->next = new_actkvno;
+                new_actkvno->next = cur_actkvno;
+                break;
+            } else if (cur_actkvno->next == NULL) {
+                /* end of line, just add new node to end of list */
+                cur_actkvno->next = new_actkvno;
+                break;
+            }
+        } /* end for (new_actkvno_list_head = prev_actkvno = ... */
+    }
+
+    if ((retval = krb5_dbe_update_actkvno(util_context, &master_entry,
+                                          new_actkvno_list_head))) {
+        com_err(progname, retval, "while updating actkvno data for master principal entry.");
+        exit_status++;
+        return;
     }
 
     if ((retval = krb5_dbe_update_mod_princ_data(util_context, &master_entry,
-                                                now, master_princ))) {
-       com_err(progname, retval, "while updating the master key principal modification time");
-       exit_status++;
-       return;
+                now, master_princ))) {
+        com_err(progname, retval, "while updating the master key principal modification time");
+        exit_status++;
+        return;
     }
 
     if ((retval = krb5_db_put_principal(util_context, &master_entry, &nentries))) {
-       (void) krb5_db_fini(util_context);
-       com_err(progname, retval, "while adding master key entry to the database");
-       exit_status++;
-       return;
+        (void) krb5_db_fini(util_context);
+        com_err(progname, retval, "while adding master key entry to the database");
+        exit_status++;
+        return;
     }
 
     /* clean up */
@@ -484,9 +496,119 @@ kdb5_use_mkey(int argc, char *argv[])
     free(mkey_fullname);
     for (cur_actkvno = actkvno_list; cur_actkvno != NULL;) {
 
-       prev_actkvno = cur_actkvno;
-       cur_actkvno = cur_actkvno->next;
-       free(prev_actkvno);
+        prev_actkvno = cur_actkvno;
+        cur_actkvno = cur_actkvno->next;
+        free(prev_actkvno);
+    }
+    return;
+}
+
+void
+kdb5_list_mkeys(int argc, char *argv[])
+{
+    krb5_error_code retval;
+    char  *mkey_fullname, *output_str = NULL, enctype[BUFSIZ];
+    krb5_kvno  act_kvno;
+    krb5_timestamp act_time;
+    krb5_actkvno_node *actkvno_list = NULL, *cur_actkvno, *prev_actkvno;
+    krb5_db_entry master_entry;
+    int   nentries = 0;
+    krb5_boolean more = 0;
+    krb5_keylist_node  *cur_kb_node;
+    krb5_keyblock *act_mkey;
+
+    /* assemble & parse the master key name */
+    if ((retval = krb5_db_setup_mkey_name(util_context,
+                global_params.mkey_name,
+                global_params.realm,  
+                &mkey_fullname, &master_princ))) {
+        com_err(progname, retval, "while setting up master key name");
+        exit_status++;
+        return;
+    }
+
+    retval = krb5_db_get_principal(util_context, master_princ, &master_entry, &nentries,
+        &more);
+    if (retval != 0) {
+        com_err(progname, retval, "while getting master key principal %s", mkey_fullname);
+        exit_status++;
+        return;
+    }
+
+    retval = krb5_dbe_lookup_actkvno(util_context, &master_entry, &actkvno_list);
+    if (retval != 0) {
+        com_err(progname, retval, "while looking up active kvno list");
+        exit_status++;
+        return;
+    }
+    /* XXX WAF: debug code, remove before commit */
+    if (master_keylist == NULL) {
+        com_err(progname, retval, "master_keylist == NULL this is a problem");
+        exit_status++;
+        return;
+    }
+
+    if (actkvno_list == NULL) {
+        act_kvno = master_entry.key_data[0].key_data_kvno;
+    } else {
+        retval = krb5_dbe_find_act_mkey(util_context, master_keylist,
+                                        actkvno_list, &act_kvno, &act_mkey);
+        if (retval != 0) {
+            com_err(progname, retval, "while setting up master key name");
+            exit_status++;
+            return;
+        }
+    }
+
+    printf("Master keys for Principal: %s\n", mkey_fullname);
+
+    for (cur_kb_node = master_keylist; cur_kb_node != NULL;
+         cur_kb_node = cur_kb_node->next) {
+
+        if (krb5_enctype_to_string(cur_kb_node->keyblock.enctype,
+                                   enctype, sizeof(enctype))) {
+            com_err(progname, retval, "while getting enctype description");
+            exit_status++;
+            return;
+        }
+
+        if (actkvno_list != NULL) {
+            for (cur_actkvno = actkvno_list; cur_actkvno != NULL;
+                 cur_actkvno = cur_actkvno->next) {
+                if (cur_actkvno->act_kvno == cur_kb_node->kvno) {
+                    act_time = cur_actkvno->act_time;
+                    break;
+                }
+            }
+        } else {
+            /*
+             * mkey princ doesn't have an active knvo list so assume the current
+             * key is active now
+             */
+            if ((retval = krb5_timeofday(util_context, &act_time))) {
+                com_err(progname, retval, "while getting current time");
+                exit_status++;
+                return;
+            }
+        }
+
+        if (cur_kb_node->kvno == act_kvno) {
+            asprintf(&output_str, "KNVO: %d, Enctype: %s, Active on: %s *\n",
+                     cur_kb_node->kvno, enctype, strdate(act_time));
+        } else {
+            asprintf(&output_str, "KNVO: %d, Enctype: %s, Active on: %s\n",
+                     cur_kb_node->kvno, enctype, strdate(act_time));
+        }
+    }
+
+    /* clean up */
+    (void) krb5_db_fini(util_context);
+    free(mkey_fullname);
+    free(output_str);
+    for (cur_actkvno = actkvno_list; cur_actkvno != NULL;) {
+        prev_actkvno = cur_actkvno;
+        cur_actkvno = cur_actkvno->next;
+        free(prev_actkvno);
     }
     return;
 }
index 13733102941ed0c0665b5bfbef626e8abcefd636..ee6513a3bf6a484c4f127dc33636644411ff3a0e 100644 (file)
@@ -96,7 +96,7 @@ void usage()
 }
 
 extern krb5_keyblock master_keyblock;
-extern krb5_keyblock_node *master_keylist;
+extern krb5_keylist_node *master_keylist;
 extern krb5_principal master_princ;
 krb5_db_entry master_entry;
 int    valid_master_key = 0;
@@ -124,6 +124,7 @@ struct _cmd_table {
      {"ark", add_random_key, 1},
      {"add_mkey", kdb5_add_mkey, 1}, /* 1 is opendb */
      {"use_mkey", kdb5_use_mkey, 1}, /* 1 is opendb */
+     {"list_mkeys", kdb5_list_mkeys, 1}, /* 1 is opendb */
      {NULL, NULL, 0},
 };
 
index cd0ae25b31f52291963f1e59f2849d68e48255ae..cc69c90c8211d98a2fd269f22c52c5943ec83ad8 100644 (file)
@@ -82,6 +82,7 @@ extern void kdb5_destroy (int argc, char **argv);
 extern void kdb5_stash (int argc, char **argv);
 extern void kdb5_add_mkey (int argc, char **argv);
 extern void kdb5_use_mkey (int argc, char **argv);
+extern void kdb5_list_mkeys (int argc, char **argv);
 
 extern void update_ok_file (char *file_name);
 
index c36cb6ef2d71ef6ec63228e843e3962c0f18aa4f..81e74758fb459a417833d5e293eea3f0e94ced88 100644 (file)
@@ -98,7 +98,7 @@ void *global_server_handle;
 #define OVSEC_KADM_CHANGEPW_SERVICE    "ovsec_adm/changepw"
 
 extern krb5_keyblock master_keyblock;
-extern krb5_keyblock_node  *master_keylist;
+extern krb5_keylist_node  *master_keylist;
 
 char *build_princ_name(char *name, char *realm);
 void log_badauth(OM_uint32 major, OM_uint32 minor,
index 5727fbee3600a13d7d6d9cd4d08342898b3952a2..d79e1aa1795acbcea7a59d2df513dc752a06e0f7 100644 (file)
@@ -41,7 +41,7 @@ typedef struct __kdc_realm_data {
     krb5_context       realm_context;  /* Context to be used for realm     */
     krb5_keytab                realm_keytab;   /* keytab to be used for this realm */
     char *             realm_profile;  /* Profile file for this realm      */
-    krb5_keyblock_node * mkey_list;    /* list of mkeys in use for this realm */
+    krb5_keylist_node * mkey_list;     /* list of mkeys in use for this realm */
     /*
      * Database per-realm data.
      */
index 63c098bdad04515ec0f39a4977afe689d71d6486..70403ce144b7223fbff9eac2e71f8f860f352148 100644 (file)
@@ -16,7 +16,7 @@ static char *rcsid = "$Header$";
 
 krb5_principal     master_princ;
 krb5_keyblock      master_keyblock; /* local mkey */
-krb5_keyblock_node  *master_keylist = NULL;
+krb5_keylist_node  *master_keylist = NULL;
 krb5_actkvno_node   *active_mkey_list = NULL;
 krb5_db_entry      master_db;
 
index 2ab499fe07c2ec668d9272295fea8cfd665ef001..f21b6f549a3bd2beb1a24a1a4a19ee67cfc849b5 100644 (file)
@@ -11,6 +11,7 @@ static char *rcsid = "$Header$";
 #include       <sys/types.h>
 #include       <sys/time.h>
 #include       <errno.h>
+#include       <k5-int.h>
 #include       <kadm5/admin.h>
 #include       <kdb.h>
 #include       <stdio.h>
@@ -26,8 +27,7 @@ static char *rcsid = "$Header$";
 
 extern krb5_principal      master_princ;
 extern krb5_principal      hist_princ;
-/* extern      krb5_keyblock       master_keyblock; */
-extern  krb5_keyblock_node  *master_keylist;
+extern  krb5_keylist_node  *master_keylist;
 extern  krb5_actkvno_node   *active_mkey_list;
 extern krb5_keyblock       hist_key;
 extern krb5_db_entry       master_db;
@@ -201,6 +201,7 @@ kadm5_create_principal_3(void *server_handle,
     unsigned int               ret;
     kadm5_server_handle_t handle = server_handle;
     krb5_keyblock               *act_mkey;
+    krb5_kvno                   act_kvno;
 
     CHECK_HANDLE(server_handle);
 
@@ -344,7 +345,7 @@ kadm5_create_principal_3(void *server_handle,
     /* initialize the keys */
 
     ret = krb5_dbe_find_act_mkey(handle->context, master_keylist,
-                                active_mkey_list, &act_mkey);
+                                active_mkey_list, &act_kvno, &act_mkey);
     if (ret)
        return (ret);
 
@@ -360,9 +361,8 @@ kadm5_create_principal_3(void *server_handle,
        return(ret);
     }
 
-    /* XXX WAF: this needs to be changed to use real mkvno */
     /* Record the master key VNO used to encrypt this entry's keys */
-    ret = krb5_dbe_update_mkvno(handle->context, &kdb, 1);
+    ret = krb5_dbe_update_mkvno(handle->context, &kdb, act_kvno);
     if (ret)
     {
        krb5_db_free_principal(handle->context, &kdb, 1);
@@ -1362,7 +1362,7 @@ kadm5_chpass_principal_3(void *server_handle,
         goto done;
 
     ret = krb5_dbe_find_act_mkey(handle->context, master_keylist,
-                                active_mkey_list, &act_mkey);
+                                active_mkey_list, NULL, &act_mkey);
     if (ret)
        goto done;
 
@@ -1541,7 +1541,7 @@ kadm5_randkey_principal_3(void *server_handle,
        return(ret);
 
     ret = krb5_dbe_find_act_mkey(handle->context, master_keylist,
-                                active_mkey_list, &act_mkey);
+                                active_mkey_list, NULL, &act_mkey);
     if (ret)
        goto done;
 
@@ -1707,7 +1707,7 @@ kadm5_setv4key_principal(void *server_handle,
     keysalt.data.data = NULL;
 
     ret = krb5_dbe_find_act_mkey(handle->context, master_keylist,
-                                active_mkey_list, &act_mkey);
+                                active_mkey_list, NULL, &act_mkey);
     if (ret)
        goto done;
 
@@ -1926,7 +1926,7 @@ kadm5_setkey_principal_3(void *server_handle,
        memset (&tmp_key_data, 0, sizeof(tmp_key_data));
 
        ret = krb5_dbe_find_act_mkey(handle->context, master_keylist,
-                                    active_mkey_list, &act_mkey);
+                                    active_mkey_list, NULL, &act_mkey);
        if (ret)
            goto done;
 
index f5e9e5c4dfa1f91a6c396f27fb8725e58aff7897..c9bf7cd7db67eeb76f4d9957f38f189336eadf81 100644 (file)
@@ -1441,22 +1441,22 @@ krb5_db_set_mkey(krb5_context context, krb5_keyblock * key)
 
 krb5_error_code
 krb5_db_set_mkey_list(krb5_context kcontext,
-                      krb5_keyblock_node * keylist)
+                      krb5_keylist_node * keylist)
 {
     krb5_error_code status = 0;
     kdb5_dal_handle *dal_handle;
 
     if (kcontext->dal_handle == NULL) {
-       status = kdb_setup_lib_handle(kcontext);
-       if (status) {
-           goto clean_n_exit;
-       }
+        status = kdb_setup_lib_handle(kcontext);
+        if (status) {
+            goto clean_n_exit;
+        }
     }
 
     dal_handle = kcontext->dal_handle;
     status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
     if (status) {
-       goto clean_n_exit;
+        goto clean_n_exit;
     }
 
     status = dal_handle->lib_handle->vftabl.set_master_key_list(kcontext, keylist);
@@ -1464,7 +1464,7 @@ krb5_db_set_mkey_list(krb5_context kcontext,
 
     kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
 
-  clean_n_exit:
+clean_n_exit:
     return status;
 }
 
@@ -1498,22 +1498,22 @@ krb5_db_get_mkey(krb5_context kcontext, krb5_keyblock ** key)
 }
 
 krb5_error_code
-krb5_db_get_mkey_list(krb5_context kcontext, krb5_keyblock_node ** keylist)
+krb5_db_get_mkey_list(krb5_context kcontext, krb5_keylist_node ** keylist)
 {
     krb5_error_code status = 0;
     kdb5_dal_handle *dal_handle;
 
     if (kcontext->dal_handle == NULL) {
-       status = kdb_setup_lib_handle(kcontext);
-       if (status) {
-           goto clean_n_exit;
-       }
+        status = kdb_setup_lib_handle(kcontext);
+        if (status) {
+            goto clean_n_exit;
+        }
     }
 
     dal_handle = kcontext->dal_handle;
     status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
     if (status) {
-       goto clean_n_exit;
+        goto clean_n_exit;
     }
 
     /* Let's use temp key and copy it later to avoid memory problems
@@ -1522,7 +1522,7 @@ krb5_db_get_mkey_list(krb5_context kcontext, krb5_keyblock_node ** keylist)
     get_errmsg(kcontext, status);
     kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
 
-  clean_n_exit:
+clean_n_exit:
     return status;
 }
 
@@ -1531,35 +1531,35 @@ krb5_db_fetch_mkey_list(krb5_context     context,
                    krb5_principal        mname,
                    const krb5_keyblock * mkey,
                    krb5_kvno             mkvno,
-                  krb5_keyblock_node  **mkey_list)
+                   krb5_keylist_node  **mkey_list)
 {
-       kdb5_dal_handle *dal_handle;
-       krb5_error_code status = 0;
+    kdb5_dal_handle *dal_handle;
+    krb5_error_code status = 0;
 
-       if (context->dal_handle == NULL) {
-           status = kdb_setup_lib_handle(context);
-           if (status) {
-               goto clean_n_exit;
-           }
-       }
+    if (context->dal_handle == NULL) {
+        status = kdb_setup_lib_handle(context);
+        if (status) {
+            goto clean_n_exit;
+        }
+    }
 
-       dal_handle = context->dal_handle;
-       status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
-       if (status) {
-           goto clean_n_exit;
-       }
+    dal_handle = context->dal_handle;
+    status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
+    if (status) {
+        goto clean_n_exit;
+    }
 
-       status = dal_handle->lib_handle->vftabl.fetch_master_key_list(context,
-                                                                      mname,
-                                                                      mkey,
-                                                                      mkvno,
-                                                                      mkey_list);
-       get_errmsg(context, status);
-       kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
+    status = dal_handle->lib_handle->vftabl.fetch_master_key_list(context,
+        mname,
+        mkey,
+        mkvno,
+        mkey_list);
+    get_errmsg(context, status);
+    kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
 
-       if (status) {
-           goto clean_n_exit;
-       }
+    if (status) {
+        goto clean_n_exit;
+    }
 
 clean_n_exit:
     return status;
@@ -1567,15 +1567,15 @@ clean_n_exit:
 
 krb5_error_code
 krb5_db_free_mkey_list(krb5_context    context,
-                      krb5_keyblock_node  *mkey_list)
+                       krb5_keylist_node  *mkey_list)
 {
-    krb5_keyblock_node *cur, *prev;
+    krb5_keylist_node *cur, *prev;
 
     for (cur = mkey_list; cur != NULL;) {
-       prev = cur;
-       cur = cur->next;
-       krb5_free_keyblock_contents(context, &prev->keyblock);
-       krb5_xfree(prev);
+        prev = cur;
+        cur = cur->next;
+        krb5_free_keyblock_contents(context, &prev->keyblock);
+        krb5_xfree(prev);
     }
 
     return 0;
@@ -1889,8 +1889,8 @@ clean_n_exit:
 
 krb5_error_code
 krb5_dbe_fetch_act_mkey_list(krb5_context        context,
-                            krb5_principal      mprinc,
-                            krb5_actkvno_node  **act_mkey_list)
+                             krb5_principal      mprinc,
+                             krb5_actkvno_node  **act_mkey_list)
 {
     krb5_error_code retval = 0;
     krb5_db_entry master_entry;
@@ -1898,24 +1898,45 @@ krb5_dbe_fetch_act_mkey_list(krb5_context        context,
     krb5_boolean more;
 
     if (act_mkey_list == NULL)
-       return (EINVAL);
+        return (EINVAL);
 
     nprinc = 1;
     if ((retval = krb5_db_get_principal(context, mprinc,
-                                       &master_entry, &nprinc, &more)))
-       return (retval);
-       
+                &master_entry, &nprinc, &more)))
+        return (retval);
+
     if (nprinc != 1) {
-       if (nprinc)
-           krb5_db_free_principal(context, &master_entry, nprinc);
-       return(KRB5_KDB_NOMASTERKEY);
+        if (nprinc)
+            krb5_db_free_principal(context, &master_entry, nprinc);
+        return(KRB5_KDB_NOMASTERKEY);
     } else if (more) {
-       krb5_db_free_principal(context, &master_entry, nprinc);
-       return (KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE);
+        krb5_db_free_principal(context, &master_entry, nprinc);
+        return (KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE);
     }
 
     retval = krb5_dbe_lookup_actkvno(context, &master_entry, act_mkey_list);
 
+    if (*act_mkey_list == NULL) {
+        krb5_actkvno_node   *tmp_actkvno;
+        krb5_timestamp       now;
+        /*
+         * for mkey princ entries without KRB5_TL_ACTKVNO data provide a default
+         */
+
+        if ((retval = krb5_timeofday(context, &now)))
+            return (retval);
+
+        tmp_actkvno = (krb5_actkvno_node *) malloc(sizeof(krb5_actkvno_node));
+        if (tmp_actkvno == NULL)
+            return (ENOMEM);
+
+        tmp_actkvno->act_time = now;
+        tmp_actkvno->act_kvno = master_entry.key_data[0].key_data_kvno;
+        tmp_actkvno->next = NULL;
+
+        *act_mkey_list = tmp_actkvno;
+    }
+
     krb5_db_free_principal(context, &master_entry, nprinc);
     return retval;
 }
@@ -1927,13 +1948,14 @@ krb5_dbe_fetch_act_mkey_list(krb5_context        context,
 
 krb5_error_code
 krb5_dbe_find_act_mkey(krb5_context         context,
-                       krb5_keyblock_node  *mkey_list,
+                       krb5_keylist_node  *mkey_list,
                        krb5_actkvno_node   *act_mkey_list,
+                       krb5_kvno           *act_kvno,
                        krb5_keyblock      **act_mkey)
 {
-    krb5_kvno act_kvno;
+    krb5_kvno tmp_act_kvno;
     krb5_error_code retval;
-    krb5_keyblock_node *cur_keyblock = mkey_list;
+    krb5_keylist_node *cur_keyblock = mkey_list;
     krb5_actkvno_node   *prev_actkvno, *cur_actkvno;
     krb5_timestamp     now;
     krb5_boolean       found = FALSE;
@@ -1954,11 +1976,11 @@ krb5_dbe_find_act_mkey(krb5_context         context,
          prev_actkvno = cur_actkvno, cur_actkvno = cur_actkvno->next) {
 
         if (cur_actkvno->act_time == now) {
-            act_kvno = cur_actkvno->act_kvno;
+            tmp_act_kvno = cur_actkvno->act_kvno;
             found = TRUE;
             break;
         } else if (cur_actkvno->act_time > now && prev_actkvno->act_time <= now) {
-            act_kvno = prev_actkvno->act_kvno;
+            tmp_act_kvno = prev_actkvno->act_kvno;
             found = TRUE;
             break;
         }
@@ -1970,18 +1992,20 @@ krb5_dbe_find_act_mkey(krb5_context         context,
          * the latest entry.
          */
         if (prev_actkvno->act_time <= now) {
-            act_kvno = prev_actkvno->act_kvno;
+            tmp_act_kvno = prev_actkvno->act_kvno;
         } else {
             /* XXX this shouldn't happen */
             return (KRB5_KDB_NOACTMASTERKEY);
         }
     }
 
-    while (cur_keyblock && cur_keyblock->kvno != act_kvno)
+    while (cur_keyblock && cur_keyblock->kvno != tmp_act_kvno)
         cur_keyblock = cur_keyblock->next;
 
     if (cur_keyblock) {
         *act_mkey = &cur_keyblock->keyblock;
+        if (act_kvno != NULL)
+            *act_kvno = tmp_act_kvno;
         return (0);
     } else {
         return (KRB5_KDB_NO_MATCHING_KEY);
@@ -1993,27 +2017,27 @@ krb5_dbe_find_act_mkey(krb5_context         context,
  * free the output key.
  */
 krb5_error_code
-krb5_dbe_find_mkey(krb5_context              context,
-                   krb5_keyblock_node *mkey_list,
+krb5_dbe_find_mkey(krb5_context       context,
+                   krb5_keylist_node *mkey_list,
                    krb5_db_entry      *entry,
                    krb5_keyblock      **mkey)
 {
     krb5_kvno mkvno;
     krb5_error_code retval;
-    krb5_keyblock_node *cur_keyblock = mkey_list;
+    krb5_keylist_node *cur_keyblock = mkey_list;
 
     retval = krb5_dbe_lookup_mkvno(context, entry, &mkvno);
     if (retval)
-       return (retval);
+        return (retval);
 
     while (cur_keyblock && cur_keyblock->kvno != mkvno)
-       cur_keyblock = cur_keyblock->next;
+        cur_keyblock = cur_keyblock->next;
 
     if (cur_keyblock) {
-       *mkey = &cur_keyblock->keyblock;
-       return (0);
+        *mkey = &cur_keyblock->keyblock;
+        return (0);
     } else {
-       return (KRB5_KDB_NO_MATCHING_KEY);
+        return (KRB5_KDB_NO_MATCHING_KEY);
     }
 }
 
@@ -2307,15 +2331,14 @@ krb5_dbe_lookup_mkvno(krb5_context      context,
 
 krb5_error_code
 krb5_dbe_update_mkvno(krb5_context    context,
-                     krb5_db_entry * entry,
-                     krb5_kvno       mkvno)
+                      krb5_db_entry * entry,
+                      krb5_kvno       mkvno)
 {
     krb5_tl_data tl_data;
-    krb5_octet buf[2];         /* this is the encoded size of an int16 */
+    krb5_octet buf[2]; /* this is the encoded size of an int16 */
 
     tl_data.tl_data_type = KRB5_TL_MKVNO;
     tl_data.tl_data_length = sizeof(buf);
-    /* use standard encoding */
     krb5_kdb_encode_int16((krb5_ui_2) mkvno, buf);
     tl_data.tl_data_contents = buf;
 
@@ -2323,80 +2346,81 @@ krb5_dbe_update_mkvno(krb5_context    context,
 }
 
 krb5_error_code
-krb5_dbe_lookup_mkey_aux(krb5_context          context,
-                     krb5_db_entry             * entry,
-                     krb5_mkey_aux_node        ** mkey_aux_data_list)
+krb5_dbe_lookup_mkey_aux(krb5_context          context,
+                         krb5_db_entry       * entry,
+                         krb5_mkey_aux_node ** mkey_aux_data_list)
 {
     krb5_tl_data tl_data;
     krb5_int16 version;
     krb5_mkey_aux_node *head_data = NULL, *new_data = NULL,
-                      *prev_data = NULL;
+                       *prev_data = NULL;
     krb5_octet *curloc; /* current location pointer */
     krb5_error_code code;
 
     tl_data.tl_data_type = KRB5_TL_MKEY_AUX;
     if ((code = krb5_dbe_lookup_tl_data(context, entry, &tl_data)))
-       return (code);
+        return (code);
 
     if (tl_data.tl_data_contents == NULL) {
-       *mkey_aux_data_list = NULL;
-       return (0);
+        *mkey_aux_data_list = NULL;
+        return (0);
     } else {
-       /* get version to determine how to parse the data */
-       krb5_kdb_decode_int16(tl_data.tl_data_contents, version);
-       if (version == KRB5_TL_MKEY_AUX_VER_1) {
-
-           /* curloc points to first tuple entry in the tl_data_contents */
-           curloc = tl_data.tl_data_contents + sizeof(version);
-
-           while (curloc != (tl_data.tl_data_contents + tl_data.tl_data_length)) {
-               assert(curloc < tl_data.tl_data_contents + tl_data.tl_data_length);
-
-               new_data = (krb5_mkey_aux_node *) malloc(sizeof(krb5_mkey_aux_node));
-               if (new_data == NULL) {
-                   krb5_free_mkey_aux_list(context, head_data);
-                   return (ENOMEM);
-               }
-               krb5_kdb_decode_int16(curloc, new_data->mkey_kvno);
-               curloc += sizeof(krb5_ui_2);
-               krb5_kdb_decode_int16(curloc, new_data->latest_mkey.key_data_kvno);
-               curloc += sizeof(krb5_ui_2);
-               krb5_kdb_decode_int16(curloc, new_data->latest_mkey.key_data_type[0]);
-               curloc += sizeof(krb5_ui_2);
-               krb5_kdb_decode_int16(curloc, new_data->latest_mkey.key_data_length[0]);
-               curloc += sizeof(krb5_ui_2);
-
-               new_data->latest_mkey.key_data_contents[0] = (krb5_octet *)
-                   malloc(new_data->latest_mkey.key_data_length[0]);
-
-               if (new_data->latest_mkey.key_data_contents[0] == NULL) {
-                   krb5_free_mkey_aux_list(context, head_data);
-                   return (ENOMEM);
-               }
-               memcpy(new_data->latest_mkey.key_data_contents[0], curloc, new_data->latest_mkey.key_data_length[0]);
-
-               new_data->next = NULL;
-               if (prev_data != NULL)
-                   prev_data->next = new_data;
-               else
-                   head_data = new_data;
-               prev_data = new_data;
-           }
-       } else {
-           krb5_set_error_message (context, KRB5_KDB_BAD_VERSION,
-                   "Illegal version number for KRB5_TL_MKEY_AUX %d\n",
-                   version);
-           return (KRB5_KDB_BAD_VERSION);
-       }
+        /* get version to determine how to parse the data */
+        krb5_kdb_decode_int16(tl_data.tl_data_contents, version);
+        if (version == KRB5_TL_MKEY_AUX_VER_1) {
+
+            /* curloc points to first tuple entry in the tl_data_contents */
+            curloc = tl_data.tl_data_contents + sizeof(version);
+
+            while (curloc != (tl_data.tl_data_contents + tl_data.tl_data_length)) {
+                assert(curloc < tl_data.tl_data_contents + tl_data.tl_data_length);
+
+                new_data = (krb5_mkey_aux_node *) malloc(sizeof(krb5_mkey_aux_node));
+                if (new_data == NULL) {
+                    krb5_free_mkey_aux_list(context, head_data);
+                    return (ENOMEM);
+                }
+                krb5_kdb_decode_int16(curloc, new_data->mkey_kvno);
+                curloc += sizeof(krb5_ui_2);
+                krb5_kdb_decode_int16(curloc, new_data->latest_mkey.key_data_kvno);
+                curloc += sizeof(krb5_ui_2);
+                krb5_kdb_decode_int16(curloc, new_data->latest_mkey.key_data_type[0]);
+                curloc += sizeof(krb5_ui_2);
+                krb5_kdb_decode_int16(curloc, new_data->latest_mkey.key_data_length[0]);
+                curloc += sizeof(krb5_ui_2);
+
+                new_data->latest_mkey.key_data_contents[0] = (krb5_octet *)
+                    malloc(new_data->latest_mkey.key_data_length[0]);
+
+                if (new_data->latest_mkey.key_data_contents[0] == NULL) {
+                    krb5_free_mkey_aux_list(context, head_data);
+                    return (ENOMEM);
+                }
+                memcpy(new_data->latest_mkey.key_data_contents[0], curloc,
+                       new_data->latest_mkey.key_data_length[0]);
+
+                new_data->next = NULL;
+                if (prev_data != NULL)
+                    prev_data->next = new_data;
+                else
+                    head_data = new_data;
+                prev_data = new_data;
+            }
+        } else {
+            krb5_set_error_message (context, KRB5_KDB_BAD_VERSION,
+                "Illegal version number for KRB5_TL_MKEY_AUX %d\n",
+                version);
+            return (KRB5_KDB_BAD_VERSION);
+        }
     }
     *mkey_aux_data_list = head_data;
     return (0);
 }
 
 krb5_error_code
-krb5_dbe_update_mkey_aux(krb5_context          context,
-                     krb5_db_entry             * entry,
-                     krb5_mkey_aux_node        * mkey_aux_data_list)
+krb5_dbe_update_mkey_aux(krb5_context         context,
+                         krb5_db_entry      * entry,
+                         krb5_mkey_aux_node * mkey_aux_data_list)
 {
     krb5_tl_data tl_data;
     krb5_int16 version;
@@ -2408,38 +2432,48 @@ krb5_dbe_update_mkey_aux(krb5_context           context,
      * determine out how much space to allocate
      */
     tl_data.tl_data_length = sizeof(version); /* version */
-    for (aux_data_entry = mkey_aux_data_list; aux_data_entry != NULL; aux_data_entry = aux_data_entry->next) {
-       tl_data.tl_data_length += sizeof(krb5_ui_2); /* mkey_kvno */
-       tl_data.tl_data_length += sizeof(krb5_ui_2); /* latest_mkey kvno */
-       tl_data.tl_data_length += sizeof(krb5_ui_2); /* latest_mkey enctype */
-       tl_data.tl_data_length += sizeof(krb5_ui_2); /* latest_mkey length */
-       tl_data.tl_data_length += aux_data_entry->latest_mkey.key_data_length[0]; /* mkey data */
+    for (aux_data_entry = mkey_aux_data_list; aux_data_entry != NULL;
+         aux_data_entry = aux_data_entry->next) {
+        tl_data.tl_data_length += sizeof(krb5_ui_2); /* mkey_kvno */
+        tl_data.tl_data_length += sizeof(krb5_ui_2); /* latest_mkey kvno */
+        tl_data.tl_data_length += sizeof(krb5_ui_2); /* latest_mkey enctype */
+        tl_data.tl_data_length += sizeof(krb5_ui_2); /* latest_mkey length */
+        tl_data.tl_data_length +=
+            aux_data_entry->latest_mkey.key_data_length[0]; /* mkey data */
     }
 
     tl_data.tl_data_contents = (krb5_octet *) malloc(tl_data.tl_data_length);
     if (tl_data.tl_data_contents == NULL) {
-       return (ENOMEM);
+        return (ENOMEM);
     }
 
     nextloc = tl_data.tl_data_contents;
     /* version */
-    krb5_kdb_encode_int16((krb5_ui_2)KRB5_TL_MKEY_AUX_VER_1, (unsigned char *)nextloc);
+    krb5_kdb_encode_int16((krb5_ui_2)KRB5_TL_MKEY_AUX_VER_1,
+                          (unsigned char *)nextloc);
     nextloc += sizeof(krb5_ui_2);
-    for (aux_data_entry = mkey_aux_data_list; aux_data_entry != NULL; aux_data_entry = aux_data_entry->next) {
-       krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->mkey_kvno, (unsigned char *)nextloc);
-       nextloc += sizeof(krb5_ui_2);
-       krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->latest_mkey.key_data_kvno, (unsigned char *)nextloc);
-       nextloc += sizeof(krb5_ui_2);
-       krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->latest_mkey.key_data_type[0], (unsigned char *)nextloc);
-       nextloc += sizeof(krb5_ui_2);
-       krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->latest_mkey.key_data_length[0], (unsigned char *)nextloc);
-       nextloc += sizeof(krb5_ui_2);
-
-       if (aux_data_entry->latest_mkey.key_data_length[0] > 0) {
-           memcpy(nextloc, aux_data_entry->latest_mkey.key_data_contents[0],
-               aux_data_entry->latest_mkey.key_data_length[0]);
-           nextloc += aux_data_entry->latest_mkey.key_data_length[0];
-       }
+
+    for (aux_data_entry = mkey_aux_data_list; aux_data_entry != NULL;
+         aux_data_entry = aux_data_entry->next) {
+
+        krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->mkey_kvno,
+                              (unsigned char *)nextloc);
+        nextloc += sizeof(krb5_ui_2);
+        krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->latest_mkey.key_data_kvno,
+                              (unsigned char *)nextloc);
+        nextloc += sizeof(krb5_ui_2);
+        krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->latest_mkey.key_data_type[0],
+                              (unsigned char *)nextloc);
+        nextloc += sizeof(krb5_ui_2);
+        krb5_kdb_encode_int16((krb5_ui_2)aux_data_entry->latest_mkey.key_data_length[0],
+                              (unsigned char *)nextloc);
+        nextloc += sizeof(krb5_ui_2);
+
+        if (aux_data_entry->latest_mkey.key_data_length[0] > 0) {
+            memcpy(nextloc, aux_data_entry->latest_mkey.key_data_contents[0],
+                aux_data_entry->latest_mkey.key_data_length[0]);
+            nextloc += aux_data_entry->latest_mkey.key_data_length[0];
+        }
     }
 
     return (krb5_dbe_update_tl_data(context, entry, &tl_data));
@@ -2456,8 +2490,8 @@ krb5_dbe_update_mkey_aux(krb5_context             context,
 
 krb5_error_code
 krb5_dbe_lookup_actkvno(krb5_context context,
-                     krb5_db_entry *entry,
-                     krb5_actkvno_node **actkvno_list)
+                        krb5_db_entry *entry,
+                        krb5_actkvno_node **actkvno_list)
 {
     krb5_tl_data tl_data;
     krb5_error_code code;
@@ -2469,56 +2503,59 @@ krb5_dbe_lookup_actkvno(krb5_context context,
     tl_data.tl_data_type = KRB5_TL_ACTKVNO;
 
     if ((code = krb5_dbe_lookup_tl_data(context, entry, &tl_data)))
-       return (code);
+        return (code);
 
     if (tl_data.tl_data_contents == NULL) {
-       *actkvno_list = NULL;
-       return (0);
+        *actkvno_list = NULL;
+        return (0);
     } else {
-       /* get version to determine how to parse the data */
-       krb5_kdb_decode_int16(tl_data.tl_data_contents, version);
-       if (version == KRB5_TL_ACTKVNO_VER_1) {
-           /*
-            * Find number of tuple entries, remembering to account for version
-            * field.
-            */
-           num_actkvno = (tl_data.tl_data_length - sizeof(version)) / ACTKVNO_TUPLE_SIZE;
-           prev_data = NULL;
-           /* next_tuple points to first tuple entry in the tl_data_contents */
-           next_tuple = tl_data.tl_data_contents + sizeof(version);
-           for (i = 0; i < num_actkvno; i++) {
-               new_data = (krb5_actkvno_node *) malloc(sizeof(krb5_actkvno_node));
-               if (new_data == NULL) {
-                   krb5_free_actkvno_list(context, head_data);
-                   return (ENOMEM);
-               }
-               krb5_kdb_decode_int16(act_kvno(next_tuple), new_data->act_kvno);
-               krb5_kdb_decode_int32(act_time(next_tuple), new_data->act_time);
-               /* XXX WAF: may be able to deal with list pointers in a better
-                * way, see add_mkey() */
-               new_data->next = NULL;
-               if (prev_data != NULL)
-                   prev_data->next = new_data;
-               else
-                   head_data = new_data;
-               prev_data = new_data;
-               next_tuple += ACTKVNO_TUPLE_SIZE;
-           }
-       } else {
-           krb5_set_error_message (context, KRB5_KDB_BAD_VERSION,
-                   "Illegal version number for KRB5_TL_ACTKVNO %d\n",
-                   version);
-           return (KRB5_KDB_BAD_VERSION);
-       }
+        /* get version to determine how to parse the data */
+        krb5_kdb_decode_int16(tl_data.tl_data_contents, version);
+        if (version == KRB5_TL_ACTKVNO_VER_1) {
+            /*
+             * Find number of tuple entries, remembering to account for version
+             * field.
+             */
+            num_actkvno = (tl_data.tl_data_length - sizeof(version)) / ACTKVNO_TUPLE_SIZE;
+            prev_data = NULL;
+            /* next_tuple points to first tuple entry in the tl_data_contents */
+            next_tuple = tl_data.tl_data_contents + sizeof(version);
+            for (i = 0; i < num_actkvno; i++) {
+                new_data = (krb5_actkvno_node *) malloc(sizeof(krb5_actkvno_node));
+                if (new_data == NULL) {
+                    krb5_free_actkvno_list(context, head_data);
+                    return (ENOMEM);
+                }
+                krb5_kdb_decode_int16(act_kvno(next_tuple), new_data->act_kvno);
+                krb5_kdb_decode_int32(act_time(next_tuple), new_data->act_time);
+                /* XXX WAF: may be able to deal with list pointers in a better
+                 * way, see add_mkey() */
+                new_data->next = NULL;
+                if (prev_data != NULL)
+                    prev_data->next = new_data;
+                else
+                    head_data = new_data;
+                prev_data = new_data;
+                next_tuple += ACTKVNO_TUPLE_SIZE;
+            }
+        } else {
+            krb5_set_error_message (context, KRB5_KDB_BAD_VERSION,
+                "Illegal version number for KRB5_TL_ACTKVNO %d\n",
+                version);
+            return (KRB5_KDB_BAD_VERSION);
+        }
     }
     *actkvno_list = head_data;
     return (0);
 }
 
+/*
+ * Add KRB5_TL_ACTKVNO TL data entries to krb5_db_entry *entry
+ */
 krb5_error_code
 krb5_dbe_update_actkvno(krb5_context context,
-                       krb5_db_entry *entry,
-                       const krb5_actkvno_node *actkvno_list)
+                        krb5_db_entry *entry,
+                        const krb5_actkvno_node *actkvno_list)
 {
     krb5_error_code retval = 0;
     krb5_int16 version;
@@ -2526,36 +2563,34 @@ krb5_dbe_update_actkvno(krb5_context context,
     krb5_octet *nextloc;
     const krb5_actkvno_node *cur_actkvno;
 
-    /* XXX WAF: should kvno be verified that it exists for the princ entry? */
-    /* No, this should be handed by functions higher in the stack verifying the user data */
-
     if (actkvno_list == NULL) {
-       return (EINVAL);
+        return (EINVAL);
     }
 
     /* allocate initial KRB5_TL_ACTKVNO tl_data entry */
     new_tl_data.tl_data_length = sizeof(version);
     new_tl_data.tl_data_contents = (krb5_octet *) malloc(new_tl_data.tl_data_length);
-    if (new_tl_data.tl_data_contents == NULL) {
-       return (ENOMEM);
-    }
+    if (new_tl_data.tl_data_contents == NULL)
+        return (ENOMEM);
+
+    /* add the current version # for the data format used for KRB5_TL_ACTKVNO */
     krb5_kdb_encode_int16((krb5_ui_2)KRB5_TL_ACTKVNO_VER_1, (unsigned char *)new_tl_data.tl_data_contents);
 
     for (cur_actkvno = actkvno_list; cur_actkvno != NULL; cur_actkvno = cur_actkvno->next) {
-       new_tl_data.tl_data_length += ACTKVNO_TUPLE_SIZE;
-       new_tl_data.tl_data_contents = (krb5_octet *) realloc(new_tl_data.tl_data_contents, new_tl_data.tl_data_length);
-       if (new_tl_data.tl_data_contents == NULL) {
-           return (ENOMEM);
-       }
+        new_tl_data.tl_data_length += ACTKVNO_TUPLE_SIZE;
+        new_tl_data.tl_data_contents = (krb5_octet *) realloc(new_tl_data.tl_data_contents,
+                                                              new_tl_data.tl_data_length);
+        if (new_tl_data.tl_data_contents == NULL)
+            return (ENOMEM);
 
-       /*
-        * using realloc so tl_data_contents is required to correctly calculate
-        * next location to store new tuple.
-        */
-       nextloc = new_tl_data.tl_data_contents + new_tl_data.tl_data_length - ACTKVNO_TUPLE_SIZE;
-       krb5_kdb_encode_int16((krb5_ui_2)cur_actkvno->act_kvno, (unsigned char *)nextloc);
-       nextloc += sizeof(krb5_ui_2);
-       krb5_kdb_encode_int32((krb5_ui_4)cur_actkvno->act_time, (unsigned char *)nextloc);
+        /*
+         * Using realloc so tl_data_contents is required to correctly calculate
+         * next location to store new tuple.
+         */
+        nextloc = new_tl_data.tl_data_contents + new_tl_data.tl_data_length - ACTKVNO_TUPLE_SIZE;
+        krb5_kdb_encode_int16((krb5_ui_2)cur_actkvno->act_kvno, (unsigned char *)nextloc);
+        nextloc += sizeof(krb5_ui_2);
+        krb5_kdb_encode_int32((krb5_ui_4)cur_actkvno->act_time, (unsigned char *)nextloc);
     }
 
     new_tl_data.tl_data_type = KRB5_TL_ACTKVNO;
index 161f6ea1afefe0b437d11c2a99f56770e5393f7a..32f13dddcb81e0a0c5feb4cc78aef443a3b02143 100644 (file)
@@ -487,14 +487,14 @@ krb5_def_fetch_mkey_list(krb5_context        context,
                        krb5_principal        mprinc,
                        const krb5_keyblock  *mkey,
                        krb5_kvno             mkvno,
-                       krb5_keyblock_node  **mkeys_list)
+                       krb5_keylist_node  **mkeys_list)
 {
     krb5_error_code retval;
     krb5_db_entry master_entry;
     int nprinc;
     krb5_boolean more, found_key = FALSE;
     krb5_keyblock tmp_mkey, tmp_clearkey;
-    krb5_keyblock_node *mkey_list_head, **mkey_list_node;
+    krb5_keylist_node *mkey_list_head, **mkey_list_node;
     krb5_key_data *key_data;
     krb5_mkey_aux_node *mkey_aux_data_list, *aux_data_entry;
     int i;
@@ -572,24 +572,24 @@ krb5_def_fetch_mkey_list(krb5_context        context,
      * create a mkey list for the mkeys field in kdc_realm_t. 
      */
 
-    mkey_list_head = (krb5_keyblock_node *) malloc(sizeof(krb5_keyblock_node));
+    mkey_list_head = (krb5_keylist_node *) malloc(sizeof(krb5_keylist_node));
     if (mkey_list_head == NULL) {
        retval = ENOMEM;
        goto clean_n_exit;
     }
 
-    memset(mkey_list_head, 0, sizeof(krb5_keyblock_node));
+    memset(mkey_list_head, 0, sizeof(krb5_keylist_node));
     mkey_list_node = &mkey_list_head;
 
     for (i=0; i < master_entry.n_key_data; i++) {
        if (*mkey_list_node == NULL) {
            /* *mkey_list_node points to next field of previous node */
-           *mkey_list_node = (krb5_keyblock_node *) malloc(sizeof(krb5_keyblock_node));
+           *mkey_list_node = (krb5_keylist_node *) malloc(sizeof(krb5_keylist_node));
            if (*mkey_list_node == NULL) {
                retval = ENOMEM;
                goto clean_n_exit;
            }
-           memset(*mkey_list_node, 0, sizeof(krb5_keyblock_node));
+           memset(*mkey_list_node, 0, sizeof(krb5_keylist_node));
        }
        key_data = &master_entry.key_data[i];
        retval = krb5_dbekd_decrypt_key_data(context, mkey,
@@ -617,7 +617,7 @@ clean_n_exit:
 
     krb5_db_free_principal(context, &master_entry, nprinc);
     if (retval != 0) {
-       krb5_keyblock_node *cur_node, *next_node;
+       krb5_keylist_node *cur_node, *next_node;
 
        for (cur_node = mkey_list_head; cur_node != NULL; cur_node = next_node) {
            next_node = cur_node->next;
@@ -645,14 +645,14 @@ krb5_error_code kdb_def_get_mkey ( krb5_context kcontext,
 }
 
 krb5_error_code kdb_def_set_mkey_list ( krb5_context kcontext,
-                                       krb5_keyblock_node *keylist )
+                                       krb5_keylist_node *keylist )
 {
     /* printf("default set master key\n"); */
     return 0;
 }
 
 krb5_error_code kdb_def_get_mkey_list ( krb5_context kcontext,
-                                       krb5_keyblock_node **keylist )
+                                       krb5_keylist_node **keylist )
 {
     /* printf("default get master key\n"); */
     return 0;
index 413a2e82715a73df8ab7c90195ec52b159078b2a..7b241a13323271efbe92aaa4ca31048d6c9190a3 100644 (file)
@@ -123,7 +123,7 @@ krb5_ktkdb_get_entry(in_context, id, principal, kvno, enctype, entry)
     krb5_keytab_entry  * entry;
 {
     krb5_context         context;
-    krb5_keyblock_node  * master_keylist;
+    krb5_keylist_node  * master_keylist;
     krb5_keyblock       * master_key;
     krb5_error_code      kerror = 0;
     krb5_key_data      * key_data;
index b83797dcb3334bd4608feeba234118b52fa6175a..bf28a1c49f5e8d20899717ce5f2c8bf8b71761a1 100644 (file)
@@ -6,7 +6,6 @@ krb5_db_free
 krb5_db_create
 krb5_db_delete_principal
 krb5_db_destroy
-krb5_db_fetch_latest_mkey
 krb5_db_fetch_mkey
 krb5_db_fetch_mkey_list
 krb5_db_free_mkey_list
@@ -14,6 +13,7 @@ krb5_db_fini
 krb5_db_free_principal
 krb5_db_get_age
 krb5_db_get_mkey
+krb5_db_get_mkey_list
 krb5_db_get_context
 krb5_db_get_principal
 krb5_db_get_principal_ext
@@ -23,6 +23,7 @@ krb5_db_lock
 krb5_db_put_principal
 krb5_db_set_context
 krb5_db_set_mkey
+krb5_db_set_mkey_list
 krb5_db_setup_mkey_name
 krb5_db_unlock
 krb5_db_store_master_key
@@ -32,6 +33,7 @@ krb5_dbe_ark
 krb5_dbe_cpw
 krb5_dbe_create_key_data
 krb5_dbe_crk
+krb5_dbe_find_act_mkey
 krb5_dbe_fetch_act_mkey_list
 krb5_dbe_find_enctype
 krb5_dbe_find_mkey
index ad560c071bf883dcb543e29aa9d56ee4738618a3..30c198d1cfe8f45c0a3e2a770dcd7aac2f4bb17d 100644 (file)
@@ -221,6 +221,7 @@ krb5_free_etype_info
 krb5_free_host_realm
 krb5_free_kdc_rep
 krb5_free_kdc_req
+krb5_free_key_data_contents
 krb5_free_keyblock
 krb5_free_keyblock_contents
 krb5_free_keytab_entry_contents
index 0457fd58d0e4f51dd5ea674bf93ba718656bef2f..95b51f783ef8a545f7cbd5d3edecfb0580f88ac6 100644 (file)
@@ -194,12 +194,12 @@ WRAP_K (krb5_db2_db_get_mkey,
        ( krb5_context context, krb5_keyblock **key),
        (context, key));
 
-WRAP_K (krb5_db2_set_master_key_list,
-       ( krb5_context kcontext, krb5_keyblock_node *keylist),
+WRAP_K (krb5_db2_db_set_mkey_list,
+       ( krb5_context kcontext, krb5_keylist_node *keylist),
        (kcontext, keylist));
 
 WRAP_K (krb5_db2_db_get_mkey_list,
-       ( krb5_context context, krb5_keyblock_node **keylist),
+       ( krb5_context context, krb5_keylist_node **keylist),
        (context, keylist));
 
 WRAP_K (krb5_db2_promote_db,
@@ -261,7 +261,7 @@ kdb_vftabl kdb_function_table = {
   /* db_free */                                wrap_krb5_db2_free,
   /* set_master_key */                        wrap_krb5_db2_set_master_key_ext,
   /* get_master_key */                        wrap_krb5_db2_db_get_mkey,
-  /* set_master_key_list */                   wrap_krb5_db2_set_master_key_list,
+  /* set_master_key_list */                   wrap_krb5_db2_db_set_mkey_list,
   /* get_master_key_list */                   wrap_krb5_db2_db_get_mkey_list,
   /* blah blah blah */ 0,0,0,0,0,0,0,
   /* promote_db */                            wrap_krb5_db2_promote_db,
index 1627315bbf4197f9bef2318c6c6cc2963770a8fb..80fd8f2c4f2cb7fa3c14b61679e946f291f6688e 100644 (file)
@@ -432,7 +432,7 @@ krb5_db2_db_get_mkey(krb5_context context, krb5_keyblock **key)
 }
 
 krb5_error_code
-krb5_db2_db_set_mkey_list(krb5_context context, krb5_keyblock_node *key_list)
+krb5_db2_db_set_mkey_list(krb5_context context, krb5_keylist_node *key_list)
 {
     krb5_db2_context *db_ctx;
     kdb5_dal_handle *dal_handle;
@@ -447,7 +447,7 @@ krb5_db2_db_set_mkey_list(krb5_context context, krb5_keyblock_node *key_list)
 }
 
 krb5_error_code
-krb5_db2_db_get_mkey_list(krb5_context context, krb5_keyblock_node **key_list)
+krb5_db2_db_get_mkey_list(krb5_context context, krb5_keylist_node **key_list)
 {
     krb5_db2_context *db_ctx;
     kdb5_dal_handle *dal_handle;
index 39e2e08f965eb7af965bbb6903d35e9e97957a7d..07a764f4a8ab7abd71c2dabb7be507a37bdd3a3f 100644 (file)
@@ -43,7 +43,7 @@ typedef struct _krb5_db2_context {
     int                 db_lock_mode;   /* Last lock mode, e.g. greatest*/
     krb5_boolean        db_nb_locks;    /* [Non]Blocking lock modes     */
     krb5_keyblock      *db_master_key; /* Master key of database */
-    krb5_keyblock_node *db_master_key_list;  /* Master key list of database */
+    krb5_keylist_node *db_master_key_list;  /* Master key list of database */
     osa_adb_policy_t    policy_db;
     krb5_boolean tempdb;
 } krb5_db2_context;
@@ -124,11 +124,11 @@ krb5_db2_db_get_mkey( krb5_context context,
                      krb5_keyblock **key);
 krb5_error_code
 krb5_db2_db_set_mkey_list( krb5_context context,
-                     krb5_keyblock_node *keylist);
+                     krb5_keylist_node *keylist);
 
 krb5_error_code
 krb5_db2_db_get_mkey_list( krb5_context context,
-                     krb5_keyblock_node **keylist);
+                     krb5_keylist_node **keylist);
 
 krb5_error_code
 krb5_db2_db_put_principal( krb5_context context,