[krbdev.mit.edu #6897] Default principal name in the acceptor cred corresponds to first entry in associated keytab.

Sriram Nambakam via RT rt-comment at krbdev.mit.edu
Wed Apr 6 16:11:30 EDT 2011


If the name in the acceptor credential has not been specified yet
(because the gss-accept-sec-context call was not run yet), a call to
gss_inquire_cred using this credential must return the principal name
from the first entry in the associated keytab.

I have discussed this implementation with Greg Hudson.

Index: src/lib/gssapi/krb5/inq_cred.c
===================================================================
--- src/lib/gssapi/krb5/inq_cred.c	(revision 56276)
+++ src/lib/gssapi/krb5/inq_cred.c	(working copy)
@@ -145,15 +145,30 @@
         lifetime = GSS_C_INDEFINITE;
 
     if (name) {
-        if (cred->name &&
-            (code = kg_duplicate_name(context, cred->name,
-                                      KG_INIT_NAME_INTERN, &ret_name)))
{
-            k5_mutex_unlock(&cred->lock);
-            *minor_status = code;
-            save_error_info(*minor_status, context);
-            ret = GSS_S_FAILURE;
-            goto fail;
+        if (cred->name)
+        {
+           if (code = kg_duplicate_name(context, cred->name,
+                                          KG_INIT_NAME_INTERN,
&ret_name)) {
+                k5_mutex_unlock(&cred->lock);
+                *minor_status = code;
+                save_error_info(*minor_status, context);
+                ret = GSS_S_FAILURE;
+                goto fail;
+           }
         }
+        else if ((cred->usage == GSS_C_ACCEPT ||cred->usage ==
GSS_C_BOTH) &&
+                 cred->keytab != NULL)
+        {
+            if (code = kg_get_principal_name_from_keytab(context,
cred->keytab,
+
KG_INIT_NAME_INTERN,
+                                                    &ret_name)) {
+                 k5_mutex_unlock(&cred->lock);
+                 *minor_status = code;
+                 save_error_info(*minor_status, context);
+                 ret = GSS_S_FAILURE;
+                 goto fail;
+            }
+        }
     }
 
     if (mechanisms) {
Index: src/lib/gssapi/krb5/gssapiP_krb5.h
===================================================================
--- src/lib/gssapi/krb5/gssapiP_krb5.h	(revision 56276)
+++ src/lib/gssapi/krb5/gssapiP_krb5.h	(working copy)
@@ -892,6 +892,12 @@
                                gss_name_t name,
                                gss_buffer_t exp_composite_name);
 
+krb5_error_code
+kg_get_principal_name_from_keytab(krb5_context     context,
+                                  krb5_keytab      kt,
+                                  krb5_flags       flags,
+                                  krb5_gss_name_t* dst);
+
 OM_uint32
 krb5_gss_map_name_to_any(OM_uint32 *minor_status,
                          gss_name_t name,
Index: src/lib/gssapi/krb5/naming_exts.c
===================================================================
--- src/lib/gssapi/krb5/naming_exts.c	(revision 56276)
+++ src/lib/gssapi/krb5/naming_exts.c	(working copy)
@@ -720,3 +720,55 @@
 }
 #endif
 
+krb5_error_code
+kg_get_principal_name_from_keytab(krb5_context     context,
+                                  krb5_keytab      kt,
+                                  krb5_flags       flags,
+                                  krb5_gss_name_t* dst)
+{
+    krb5_error_code    code;
+    krb5_kt_cursor     cursor;
+    krb5_keytab_entry  entry;
+    krb5_keytab_entry* pEntry = NULL;
+    krb5_gss_name_t    name;
+    int                end_seq = 0;
+
+    code = krb5_kt_start_seq_get(context, kt, &cursor);
+    if (code != 0)
+    {
+        goto cleanup;
+    }
+
+    end_seq = 1;
+
+    code = krb5_kt_next_entry(context, kt, &entry, &cursor);
+    if (code != 0)
+    {
+        goto cleanup;
+    }
+
+    pEntry = &entry;
+
+    code = kg_init_name(context, entry.principal, NULL, flags, &name);
+    if (code != 0)
+    {
+        goto cleanup;
+    }
+
+    *dst = name;
+
+cleanup:
+
+    if (pEntry)
+    {
+        (void) krb5_free_keytab_entry_contents(context, pEntry);
+    }
+
+    if (end_seq)
+    {
+        (void) krb5_kt_end_seq_get(context, kt, &cursor);
+    }
+
+    return code;
+}
+





More information about the krb5-bugs mailing list