Added Sun's changes (from Roland), as fixed by Ted, to finally have a
authorTheodore Tso <tytso@mit.edu>
Tue, 23 Jan 1996 08:34:12 +0000 (08:34 +0000)
committerTheodore Tso <tytso@mit.edu>
Tue, 23 Jan 1996 08:34:12 +0000 (08:34 +0000)
fully working mechglue layer.

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

14 files changed:
src/lib/gssapi/mechglue/Makefile.in
src/lib/gssapi/mechglue/configure.in
src/lib/gssapi/mechglue/g_acquire_cred.c
src/lib/gssapi/mechglue/g_exp_sec_context.c [new file with mode: 0644]
src/lib/gssapi/mechglue/g_imp_sec_context.c [new file with mode: 0644]
src/lib/gssapi/mechglue/g_inquire_context.c [new file with mode: 0644]
src/lib/gssapi/mechglue/g_inquire_names.c [new file with mode: 0644]
src/lib/gssapi/mechglue/g_oid_ops.c [new file with mode: 0644]
src/lib/gssapi/mechglue/g_rel_cred.c
src/lib/gssapi/mechglue/g_rel_oid_set.c
src/lib/gssapi/mechglue/g_verify.c
src/lib/gssapi/mechglue/gen_oids.c [new file with mode: 0644]
src/lib/gssapi/mechglue/mglueP.h
src/lib/gssapi/mechglue/oid_ops.c [new file with mode: 0644]

index 90cbd7b58c5930ee05d06c72b1011b0521a9fb19..122202a8f264e096bb091527cac283e92022b423 100644 (file)
@@ -6,41 +6,53 @@ CFLAGS = $(CCOPTS) $(DEFS) -I. -I$(srcdir)
 ##DOS!include $(BUILDTOP)\config\windows.in
 
 LIBDONE=DONE
-LIB_SUBDIRSS=.
-
-SRCS   = g_acquire_cred.c \
-         g_rel_cred.c \
-         g_init_sec_context.c \
-         g_accept_sec_context.c \
-         g_process_context.c \
-         g_delete_sec_context.c \
-         g_context_time.c \
-         g_sign.c \
-         g_verify.c \
-         g_seal.c \
-         g_unseal.c \
-         g_dsp_status.c \
-         g_indicate_mechs.c \
-         g_compare_name.c \
-         g_dsp_name.c \
-         g_imp_name.c \
-         g_rel_name.c \
-         g_rel_buffer.c \
-         g_rel_oid_set.c \
-         g_inquire_cred.c \
-         g_initialize.c \
-         get_mtype.c \
-         get_mechanism.c \
-         internal_name.c \
-         gssd_pname_to_uid.c \
-         add_mechanism.c
-
+LIB_SUBDIRS=.
+DEPLIBS=
+SHLIB_LDFLAGS= $(LDFLAGS) @SHLIB_RPATH_DIRS@
+SHLIB_LIBDIRS= @SHLIB_LIBDIRS@
+
+SRCS   = $(srcdir)/g_acquire_cred.c \
+         $(srcdir)/g_rel_cred.c \
+         $(srcdir)/g_init_sec_context.c \
+         $(srcdir)/g_accept_sec_context.c \
+         $(srcdir)/g_process_context.c \
+         $(srcdir)/g_delete_sec_context.c \
+         $(srcdir)/g_imp_sec_context.c \
+         $(srcdir)/g_exp_sec_context.c \
+         $(srcdir)/g_context_time.c \
+         $(srcdir)/g_sign.c \
+         $(srcdir)/g_verify.c \
+         $(srcdir)/g_seal.c \
+         $(srcdir)/g_unseal.c \
+         $(srcdir)/g_dsp_status.c \
+         $(srcdir)/g_indicate_mechs.c \
+         $(srcdir)/g_compare_name.c \
+         $(srcdir)/g_dsp_name.c \
+         $(srcdir)/g_imp_name.c \
+         $(srcdir)/g_rel_name.c \
+         $(srcdir)/g_rel_buffer.c \
+         $(srcdir)/g_rel_oid_set.c \
+         $(srcdir)/g_oid_ops.c \
+         $(srcdir)/g_inquire_cred.c \
+         $(srcdir)/g_inquire_context.c \
+         $(srcdir)/g_inquire_names.c \
+         $(srcdir)/g_initialize.c \
+         $(srcdir)/get_mtype.c \
+         $(srcdir)/get_mechanism.c \
+         $(srcdir)/internal_name.c \
+         $(srcdir)/gssd_pname_to_uid.c \
+         $(srcdir)/add_mechanism.c \
+         $(srcdir)/gen_oids.c \
+         $(srcdir)/oid_ops.c
+         
 OBJS   = g_acquire_cred.$(OBJEXT) \
          g_rel_cred.$(OBJEXT) \
          g_init_sec_context.$(OBJEXT) \
          g_accept_sec_context.$(OBJEXT) \
          g_process_context.$(OBJEXT) \
          g_delete_sec_context.$(OBJEXT) \
+         g_imp_sec_context.$(OBJEXT) \
+         g_exp_sec_context.$(OBJEXT) \
          g_context_time.$(OBJEXT) \
          g_sign.$(OBJEXT) \
          g_verify.$(OBJEXT) \
@@ -54,13 +66,18 @@ OBJS        = g_acquire_cred.$(OBJEXT) \
          g_rel_name.$(OBJEXT) \
          g_rel_buffer.$(OBJEXT) \
          g_rel_oid_set.$(OBJEXT) \
+         g_oid_ops.$(OBJEXT) \
          g_inquire_cred.$(OBJEXT) \
+         g_inquire_context.$(OBJEXT) \
+         g_inquire_names.$(OBJEXT) \
          g_initialize.$(OBJEXT) \
          get_mtype.$(OBJEXT) \
          get_mechanism.$(OBJEXT) \
          internal_name.$(OBJEXT) \
          gssd_pname_to_uid.$(OBJEXT) \
-         add_mechanism.$(OBJEXT)
+         add_mechanism.$(OBJEXT) \
+         gen_oids.$(OBJEXT) \
+         oid_ops.$(OBJEXT)
 
 EHDRDIR= $(BUILDTOP)$(S)include$(S)gssapi
 EXPORTED_HEADERS = mechglue.h
@@ -84,10 +101,19 @@ shared:
 
 unixmac: 
 
-libgssapi.$(LIBEXT): $(OBJS)
-       $(ARCHIVE) $@ $(OBJS)
+libgssapi.$(STEXT): $(OBJS)
+       $(RM) $@
+       $(ARADD) $@ $(OBJS)
        $(RANLIB) $@
 
+install:: libgssapi.a
+       $(INSTALL_DATA) libgssapi.a $(DESTDIR)$(KRB5_LIBDIR)/libgssapi.a
+       $(RANLIB) $(DESTDIR)$(KRB5_LIBDIR)/libgssapi.a
+
+#libgssapi.$(LIBEXT): $(OBJS)
+#      $(ARCHIVE) $@ $(OBJS)
+#      $(RANLIB) $@
+
 clean:: clean-$(WHAT)
 
 clean-unix::
index 755d6e2a56f4059bcb2e4d8dfb7ec2861408b9fb..e691fe424b9cc31b8ff89ea6d2c767d58bd26117 100644 (file)
@@ -1,13 +1,15 @@
 AC_INIT(configure.in)
 CONFIG_RULES
 AC_PROG_ARCHIVE
+AC_PROG_ARCHIVE_ADD
 AC_PROG_RANLIB
 AC_PROG_INSTALL
 V5_SHARED_LIB_OBJS
 SubdirLibraryRule([${OBJS}])
 CopySrcHeader(mechglue.h,[$(EHDRDIR)])
-dnl AppendRule([install:: libgssapi.[$](LIBEXT)
-dnl    [$](INSTALL_DATA) libgssapi.[$](LIBEXT) [$](DESTDIR)[$](KRB5_LIBDIR)[$](S)libgssapi.[$](LIBEXT)])
-dnl LinkFileDir([$](TOPLIBD)/libgssapi.[$](LIBEXT),libgssapi.[$](LIBEXT),./gssapi/mechglue)
-dnl AppendRule([all:: [$](TOPLIBD)/libgssapi.[$](LIBEXT)])
+AppendRule([install:: libgssapi.[$](LIBEXT)
+       [$](INSTALL_DATA) libgssapi.[$](LIBEXT) [$](DESTDIR)[$](KRB5_LIBDIR)[$](S)libgssapi.[$](LIBEXT)])
+LinkFileDir([$](TOPLIBD)/libgssapi.[$](LIBEXT),libgssapi.[$](LIBEXT),./gssapi/mechglue)
+AppendRule([all:: [$](TOPLIBD)/libgssapi.[$](LIBEXT)])
+V5_MAKE_SHARED_LIB(libgssapi,0.1,.., ./mechglue)
 V5_AC_OUTPUT_MAKEFILE
index 111819be68bd8ca0eb15f5297605231bcf866983..e904c9dda47e48e66b062b5ac564e90a0bc40d03 100644 (file)
@@ -214,15 +214,15 @@ OM_uint32 *               time_rec;
                   desired_mechs->elements[i].elements,
                   desired_mechs->elements[i].length);
            creds->cred_array[j] = creds_returned[i].cred;
-
-           (*actual_mechs)->elements[j].length =
-               desired_mechs->elements[i].length;
-           (*actual_mechs)->elements[j].elements = (void *)
-               malloc(desired_mechs->elements[i].length);
-           memcpy((*actual_mechs)->elements[j].elements,
-                  desired_mechs->elements[i].elements,
-                  desired_mechs->elements[i].length);
-
+           if (actual_mechs) {
+                   (*actual_mechs)->elements[j].length =
+                       desired_mechs->elements[i].length;
+                   (*actual_mechs)->elements[j].elements = (void *)
+                       malloc(desired_mechs->elements[i].length);
+                   memcpy((*actual_mechs)->elements[j].elements,
+                          desired_mechs->elements[i].elements,
+                          desired_mechs->elements[i].length);
+           }
            j++;
        }
     }
@@ -253,12 +253,14 @@ OM_uint32 *               time_rec;
 
        for(i=0; i < creds->count; i++) {
            free(creds->mechs_array[i].elements);
-           free((*actual_mechs)->elements[i].elements);
+           if (actual_mechs) free((*actual_mechs)->elements[i].elements);
        }
        
-       free((*actual_mechs)->elements);
-       free(*actual_mechs);
-       *actual_mechs = GSS_C_NULL_OID_SET;
+       if (actual_mechs) {
+               free((*actual_mechs)->elements);
+               free(*actual_mechs);
+               *actual_mechs = GSS_C_NULL_OID_SET;
+       }
        free(creds->cred_array);
        free(creds->mechs_array);
        free(creds);
diff --git a/src/lib/gssapi/mechglue/g_exp_sec_context.c b/src/lib/gssapi/mechglue/g_exp_sec_context.c
new file mode 100644 (file)
index 0000000..1bb7a67
--- /dev/null
@@ -0,0 +1,55 @@
+
+#ident  "@(#)g_exp_sec_context.c 1.2     96/01/18 SMI"
+
+/*
+ *  glue routine gss_export_sec_context
+ *
+ * Copyright (c) 1995, by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#include "mglueP.h"
+
+OM_uint32
+gss_export_sec_context(minor_status,
+                       context_handle,
+                       interprocess_token)
+
+OM_uint32 *            minor_status;
+gss_ctx_id_t *         context_handle;
+gss_buffer_t           interprocess_token;
+
+{
+    OM_uint32          status;
+    gss_union_ctx_id_t ctx;
+    gss_mechanism      mech;
+    
+    gss_initialize();
+
+    if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT)
+       return GSS_S_NO_CONTEXT;
+
+    /*
+     * select the approprate underlying mechanism routine and
+     * call it.
+     */
+    
+    ctx = (gss_union_ctx_id_t) *context_handle;
+    mech = get_mechanism (ctx->mech_type);
+
+    if (mech) {
+
+       if (mech->gss_export_sec_context)
+           status = mech->gss_export_sec_context(
+                                                   mech->context,
+                                                   minor_status,
+                                                   &ctx->internal_ctx_id,
+                                                   interprocess_token);
+       else
+           status = GSS_S_BAD_BINDINGS;
+
+       return(status);
+    }
+    
+    return(GSS_S_NO_CONTEXT);
+}
diff --git a/src/lib/gssapi/mechglue/g_imp_sec_context.c b/src/lib/gssapi/mechglue/g_imp_sec_context.c
new file mode 100644 (file)
index 0000000..dde516a
--- /dev/null
@@ -0,0 +1,56 @@
+
+#ident  "@(#)g_imp_sec_context.c 1.2     96/01/18 SMI"
+
+/*
+ *  glue routine gss_export_sec_context
+ *
+ * Copyright (c) 1995, by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#include "mglueP.h"
+
+OM_uint32
+gss_import_sec_context(minor_status,
+                       interprocess_token,
+                       context_handle)
+
+OM_uint32 *            minor_status;
+gss_buffer_t           interprocess_token;
+gss_ctx_id_t *         context_handle;
+
+{
+    OM_uint32          status;
+    gss_union_ctx_id_t ctx;
+    gss_mechanism      mech;
+    
+    gss_initialize();
+
+    if (context_handle == NULL || *context_handle==GSS_C_NO_CONTEXT)
+       return GSS_S_NO_CONTEXT;
+
+    /*
+     * select the approprate underlying mechanism routine and
+     * call it.
+     */
+    
+    ctx = (gss_union_ctx_id_t) *context_handle;
+    mech = get_mechanism (ctx->mech_type);
+
+    if (mech) {
+
+       if (mech->gss_import_sec_context)
+          status = mech->gss_import_sec_context(
+                                                   mech->context,
+                                                   minor_status,
+                                                   interprocess_token,
+                                                   &ctx->internal_ctx_id);
+
+       else
+           status = GSS_S_BAD_BINDINGS;
+
+       return(status);
+    }
+    
+    return(GSS_S_NO_CONTEXT);
+}
diff --git a/src/lib/gssapi/mechglue/g_inquire_context.c b/src/lib/gssapi/mechglue/g_inquire_context.c
new file mode 100644 (file)
index 0000000..2d3dfcc
--- /dev/null
@@ -0,0 +1,166 @@
+
+#ident "@(#)g_inquire_context.c 1.2     96/01/18 SMI"
+
+/*
+ *  glue routine for gss_inquire_context
+ *
+ * Copyright (c) 1995, by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#include "mglueP.h"
+
+static OM_uint32
+convert_name_to_union_name(
+       gss_mechanism   mech,
+       OM_uint32 *minor_status,
+       gss_name_t * internal_name);
+
+
+/* Last argument new for V2 */
+OM_uint32 gss_inquire_context(
+           minor_status,
+           context_handle,
+           src_name,
+           targ_name,
+           lifetime_rec,
+           mech_type,
+           ctx_flags,
+           locally_initiated,
+           open)
+
+OM_uint32 *    minor_status;
+gss_ctx_id_t   context_handle;
+gss_name_t *   src_name;
+gss_name_t *   targ_name;
+OM_uint32 *    lifetime_rec;
+gss_OID *      mech_type;
+OM_uint32 *    ctx_flags;
+int *           locally_initiated;
+int *          open;
+
+
+{
+    gss_union_ctx_id_t ctx;
+    gss_mechanism      mech;
+    OM_uint32          status, temp_minor, temp_major;
+    
+    gss_initialize();
+
+    /* if the context_handle is Null, return NO_CONTEXT error */
+    
+    if(context_handle == GSS_C_NO_CONTEXT)
+       return(GSS_S_NO_CONTEXT);
+    
+    /*
+     * select the approprate underlying mechanism routine and
+     * call it.
+     */
+    
+    ctx = (gss_union_ctx_id_t) context_handle;
+    mech = get_mechanism (ctx->mech_type);
+    
+    if (!mech || !mech->gss_inquire_context || !mech->gss_display_name) {
+       return(GSS_S_NO_CONTEXT);
+
+    }
+
+    status = mech->gss_inquire_context(
+                       mech->context,
+                       minor_status,
+                       ctx->internal_ctx_id,
+                       src_name,
+                       targ_name,
+                       lifetime_rec,
+                       mech_type,
+                       ctx_flags,
+                       locally_initiated,
+                       open);
+
+    if (status != GSS_S_COMPLETE) {
+       return status;
+    }
+
+    /* need to convert names */
+
+    if (src_name) {
+           status = convert_name_to_union_name(mech, minor_status, src_name);
+
+           if (status != GSS_S_COMPLETE) {
+               (void) mech->gss_release_name(mech->context,
+                                               &temp_minor, src_name);
+               (void) mech->gss_release_name(mech->context,
+                                               &temp_minor, targ_name);
+               if (mech_type) {
+                               gss_release_oid(&temp_minor, mech_type);
+               }
+               return (GSS_S_FAILURE);
+           }
+
+    }
+
+    if (targ_name) {
+           status = convert_name_to_union_name(mech, minor_status, targ_name);
+
+           if (status != GSS_S_COMPLETE) {
+               (void) mech->gss_release_name(mech->context,
+                                               &temp_minor, targ_name);
+               if (mech_type) {
+                       gss_release_oid(&temp_minor, mech_type);
+               }
+               return (GSS_S_FAILURE);
+           }
+    }
+
+    return(GSS_S_COMPLETE);
+}
+
+static OM_uint32
+convert_name_to_union_name(
+                       mech,
+                       minor_status,
+                       internal_name)
+gss_mechanism  mech;
+OM_uint32 *minor_status;
+gss_name_t * internal_name;
+
+{
+       OM_uint32 status;
+        gss_OID name_type;
+       gss_union_name_t union_name;
+
+       union_name  = (gss_union_name_t) malloc (sizeof(gss_union_name_desc));
+       if (!union_name) 
+               return (GSS_S_FAILURE);
+
+       union_name->external_name = 
+                       (gss_buffer_t) malloc(sizeof(gss_buffer_desc));
+
+       if (!union_name->external_name) {
+               free(union_name);
+               return (GSS_S_FAILURE);
+       }
+       
+       status = mech->gss_display_name(
+                       mech->context,
+                       minor_status,
+                       *internal_name,
+                       union_name->external_name,
+                       &union_name->name_type);
+
+       if (status != GSS_S_COMPLETE) {
+               free(union_name->external_name);
+               free(union_name);
+               return (GSS_S_FAILURE);
+       }
+
+       status = mech->gss_release_name(
+               mech->context,
+               minor_status,
+               internal_name);
+
+       *internal_name =  union_name;
+
+       return (GSS_S_COMPLETE);
+
+}
diff --git a/src/lib/gssapi/mechglue/g_inquire_names.c b/src/lib/gssapi/mechglue/g_inquire_names.c
new file mode 100644 (file)
index 0000000..05548cb
--- /dev/null
@@ -0,0 +1,51 @@
+
+#ident "@(#)g_inquire_names.c 1.1     95/12/19 SMI"
+
+/*
+ *  glue routine for gss_inquire_context
+ *
+ * Copyright (c) 1995, by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#include "mglueP.h"
+
+/* Last argument new for V2 */
+OM_uint32 gss_inquire_names_for_mech(
+           minor_status,
+           mechanism,
+           name_types)
+
+OM_uint32 *    minor_status;
+gss_OID        mechanism;
+gss_OID_set *  name_types;
+
+{
+    OM_uint32          status;
+    gss_mechanism      mech;
+    
+    gss_initialize();
+    
+    /*
+     * select the approprate underlying mechanism routine and
+     * call it.
+     */
+    
+    mech = get_mechanism (mechanism);
+    
+    if (mech) {
+
+       if (mech->gss_inquire_names_for_mech)
+           status = mech->gss_inquire_names_for_mech(
+                               mech->context,
+                               minor_status,
+                               mechanism,
+                               name_types);
+       else
+           status = GSS_S_BAD_BINDINGS;
+
+       return(status);
+    }
+    
+    return(GSS_S_NO_CONTEXT);
+}
diff --git a/src/lib/gssapi/mechglue/g_oid_ops.c b/src/lib/gssapi/mechglue/g_oid_ops.c
new file mode 100644 (file)
index 0000000..91033c4
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * lib/gssapi/mechglue/g_oid_ops.c
+ *
+ * Copyright 1995 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ */
+
+/*
+ * oid_ops.c - GSS-API V2 interfaces to manipulate OIDs
+ */
+
+#include "mglueP.h"
+/* should include to get protos #include "../generic/gssapiP_generic.h" */
+
+extern gss_mechanism *mechs_array;
+
+OM_uint32
+gss_release_oid(minor_status, oid)
+    OM_uint32  *minor_status;
+    gss_OID    *oid;
+{
+    int i;
+    OM_uint32   major_status;
+
+    /* first call the gss_internal_release_oid for each mechanism
+     * until one returns success. gss_internal_release_oid will only return
+     * success when the OID was recognized as an internal mechanism OID.
+     * if no mechanisms recognize the OID, then call the generic version.
+     */
+
+    for(i=0; mechs_array[i]->mech_type.length !=0; i++) {
+        if (mechs_array[i]->gss_internal_release_oid) {
+           major_status = mechs_array[i]->gss_internal_release_oid(
+                                           mechs_array[i]->context,
+                                           minor_status,
+                                           oid);
+           if (major_status == GSS_S_COMPLETE) {
+               return (GSS_S_COMPLETE);
+           }
+       }
+    }
+
+    return generic_gss_release_oid(minor_status, oid);
+}
+
+OM_uint32
+gss_create_empty_oid_set(minor_status, oid_set)
+    OM_uint32  *minor_status;
+    gss_OID_set        *oid_set;
+{
+       return generic_gss_create_empty_oid_set(minor_status, oid_set);
+}
+
+OM_uint32
+gss_add_oid_set_member(minor_status, member_oid, oid_set)
+    OM_uint32  *minor_status;
+    gss_OID    member_oid;
+    gss_OID_set        *oid_set;
+{
+     return generic_gss_add_oid_set_member(minor_status, member_oid, oid_set);
+}
+
+OM_uint32
+gss_test_oid_set_member(minor_status, member, set, present)
+    OM_uint32  *minor_status;
+    gss_OID    member;
+    gss_OID_set        set;
+    int                *present;
+{
+    return generic_gss_test_oid_set_member(minor_status, member, set, present);
+}
+
+OM_uint32
+gss_oid_to_str(minor_status, oid, oid_str)
+    OM_uint32          *minor_status;
+    gss_OID            oid;
+    gss_buffer_t       oid_str;
+{
+    return generic_gss_oid_to_str(minor_status, oid, oid_str);
+}
+
+OM_uint32
+gss_str_to_oid(minor_status, oid_str, oid)
+    OM_uint32          *minor_status;
+    gss_buffer_t       oid_str;
+    gss_OID            *oid;
+{
+    return generic_gss_str_to_oid(minor_status, oid_str, oid);
+}
+
index f5df0dffa034601b3dd984fc4cebf8a0828a7f6c..fc30c2801399c0351a0b7a8e4f1c0e5db5b471e8 100644 (file)
@@ -49,8 +49,9 @@ gss_cred_id_t *               cred_handle;
 
        mech = get_mechanism (&union_cred->mechs_array[j]);
 
+       if (union_cred->mechs_array[j].elements)
+               free(union_cred->mechs_array[j].elements);
        if (mech) {
-
            if (mech->gss_release_cred) {
                temp_status = mech->gss_release_cred
                    (mech->context,
@@ -66,6 +67,7 @@ gss_cred_id_t *               cred_handle;
            status = GSS_S_NO_CRED;
     }
 
+    gss_release_buffer(minor_status, &union_cred->auxinfo.name);
     free(union_cred->cred_array);
     free(union_cred->mechs_array);
     free(union_cred);
index da1d0ed6d64f8232f6bb43906956df079f65faa3..ebb84530ed4eca7c9f4d8673204a1a46fde01e10 100644 (file)
@@ -15,6 +15,9 @@ gss_release_oid_set (minor_status,
 OM_uint32 *            minor_status;
 gss_OID_set *          set;
 {
+   size_t index;
+   OM_uint32   status;
+
     if (minor_status)
        *minor_status = 0;
 
@@ -24,6 +27,8 @@ gss_OID_set *         set;
     if (*set == GSS_C_NULL_OID_SET)
        return(GSS_S_COMPLETE);
 
+    for (index=0; index<(*set)->count; index++)
+      free((*set)->elements[index].elements);
     free((*set)->elements);
     free(*set);
 
index 1a5c149a7811fe1b12aceda5cb2b89c6960cdaa9..0d3b890d45e24ba95000aecabe18271d3bd00eb5 100644 (file)
@@ -58,7 +58,7 @@ int *                 qop_state;
 }
 
 OM_uint32
-gss_verify_misc (minor_status,
+gss_verify_mic (minor_status,
             context_handle,
             message_buffer,
             token_buffer,
diff --git a/src/lib/gssapi/mechglue/gen_oids.c b/src/lib/gssapi/mechglue/gen_oids.c
new file mode 100644 (file)
index 0000000..cd3c1a8
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright 1993 by OpenVision Technologies, Inc.
+ * 
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appears in all copies and
+ * that both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of OpenVision not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. OpenVision makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ * 
+ * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "mglueP.h"
+
+/*
+ * See krb5/gssapi_krb5.c for a description of the algorithm for
+ * encoding an object identifier.
+ */
+
+/*
+ * The OID of user_name is:
+ *     iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ *     generic(1) user_name(1) = 1.2.840.113554.1.2.1.1
+ * machine_uid_name:
+ *     iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ *     generic(1) machine_uid_name(2) = 1.2.840.113554.1.2.1.2
+ * string_uid_name:
+ *     iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ *     generic(1) string_uid_name(3) = 1.2.840.113554.1.2.1.3
+ * service_name:
+ *     iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ *     generic(1) service_name(4) = 1.2.840.113554.1.2.1.4
+ */
+
+static const gss_OID_desc oids[] = {
+   {10, "\052\206\110\206\367\022\001\002\001\001"},
+   {10, "\052\206\110\206\367\022\001\002\001\002"},
+   {10, "\052\206\110\206\367\022\001\002\001\003"},
+   {10, "\052\206\110\206\367\022\001\002\001\004"},
+};
+
+const gss_OID_desc * const gss_nt_user_name = oids+0;
+const gss_OID_desc * const gss_nt_machine_uid_name = oids+1;
+const gss_OID_desc * const gss_nt_string_uid_name = oids+2;
+const gss_OID_desc * const gss_nt_service_name = oids+3;
index a322f65c1af3ee20ed01497df007b87160d691f8..d0abead43786f9f0f987918fe216535048637c31 100644 (file)
@@ -1,4 +1,4 @@
-#ident  "%Z%%M% %I%     %E% SMI"
+#ident  "@(#)mglueP.h 1.2     96/01/18 SMI"
 /*
  * This header contains the private mechglue definitions.
  *
@@ -9,7 +9,7 @@
 #ifndef _GSS_MECHGLUEP_H
 #define _GSS_MECHGLUEP_H
 
-#include <gssapi/mechglue.h>
+#include "mechglue.h"
 #include <sys/types.h>
 
 /*
@@ -252,19 +252,36 @@ typedef struct gss_config {
         OM_uint32 *,           /* acceptor_lifetime */
         gss_cred_usage_t *     /* cred_usage */
         );
-
     OM_uint32      (*gss_inquire_names_for_mech)
        (void *,                /* context */
         OM_uint32 *,           /* minor_status */
         gss_OID,               /* mechanism */
         gss_OID_set *          /* name_types */
         );
+    OM_uint32  (*gss_inquire_context)
+       (void *,                /* context */
+        OM_uint32 *,           /* minor_status */
+        gss_ctx_id_t,          /* context_handle */
+        gss_name_t *,          /* src_name */
+        gss_name_t *,          /* targ_name */
+        OM_uint32 *,           /* lifetime_rec */
+        gss_OID *,             /* mech_type */
+        OM_uint32 *,           /* ctx_flags */
+        int *,                 /* locally_initiated */
+        int *                  /* open */
+       );
+    OM_uint32      (*gss_internal_release_oid)
+       (void *,                /* context */
+        OM_uint32 *,           /* minor_status */
+        gss_OID *              /* OID */
+        );
     int                     (*pname_to_uid)
        (char *,                /* pname */
         gss_OID,               /* name type */
         gss_OID,               /* mech type */
         uid_t *                /* uid */
         );
+
 } *gss_mechanism;
 
 /********************************************************/
@@ -279,4 +296,41 @@ OM_uint32 display_internal_name (OM_uint32 *, gss_OID, gss_name_t,
                                 gss_buffer_t, gss_OID *);
 OM_uint32 release_internal_name (OM_uint32 *, gss_OID, gss_name_t *);
 
+OM_uint32 generic_gss_release_oid
+PROTOTYPE( (OM_uint32 *,       /* minor_status */
+           gss_OID *           /* oid */
+          ));
+
+OM_uint32 generic_gss_create_empty_oid_set
+PROTOTYPE( (OM_uint32 *,       /* minor_status */
+           gss_OID_set *       /* oid_set */
+          ));
+
+OM_uint32 generic_gss_add_oid_set_member
+PROTOTYPE( (OM_uint32 *,       /* minor_status */
+           gss_OID,            /* member_oid */
+           gss_OID_set *       /* oid_set */
+          ));
+
+OM_uint32 generic_gss_test_oid_set_member
+PROTOTYPE( (OM_uint32 *,       /* minor_status */
+           gss_OID,            /* member */
+           gss_OID_set,        /* set */
+           int *               /* present */
+          ));
+
+OM_uint32 generic_gss_oid_to_str
+PROTOTYPE( (OM_uint32 *,       /* minor_status */
+           gss_OID,            /* oid */
+           gss_buffer_t        /* oid_str */
+          ));
+
+OM_uint32 generic_gss_str_to_oid
+PROTOTYPE( (OM_uint32 *,       /* minor_status */
+           gss_buffer_t,       /* oid_str */
+           gss_OID *           /* oid */
+          ));
+
+
+
 #endif /* _GSS_MECHGLUEP_H */
diff --git a/src/lib/gssapi/mechglue/oid_ops.c b/src/lib/gssapi/mechglue/oid_ops.c
new file mode 100644 (file)
index 0000000..2db42af
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ * lib/gssapi/generic/oid_ops.c
+ *
+ * Copyright 1995 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ */
+
+/*
+ * oid_ops.c - GSS-API V2 interfaces to manipulate OIDs
+ */
+
+#include "mglueP.h"
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#ifndef _MACINTOSH
+#include <gssapi/gssapi_generic.h>
+#else
+#include <gssapi_generic.h>
+#endif
+#include <errno.h>
+#include <ctype.h>
+
+OM_uint32
+generic_gss_release_oid(minor_status, oid)
+    OM_uint32  *minor_status;
+    gss_OID    *oid;
+{
+    *minor_status = 0;
+
+    if (*oid == GSS_C_NO_OID)
+       return(GSS_S_COMPLETE);
+
+    /*
+     * The V2 API says the following!
+     *
+     * gss_release_oid[()] will recognize any of the GSSAPI's own OID values,
+     * and will silently ignore attempts to free these OIDs; for other OIDs
+     * it will call the C free() routine for both the OID data and the
+     * descriptor.  This allows applications to freely mix their own heap-
+     * allocated OID values with OIDs returned by GSS-API.
+     */
+    if ((*oid != gss_nt_user_name) &&
+       (*oid != gss_nt_machine_uid_name) &&
+       (*oid != gss_nt_string_uid_name) &&
+       (*oid != gss_nt_service_name)) {
+       free((*oid)->elements);
+       free(*oid);
+    }
+    *oid = GSS_C_NO_OID;
+    return(GSS_S_COMPLETE);
+}
+
+OM_uint32
+generic_gss_create_empty_oid_set(minor_status, oid_set)
+    OM_uint32  *minor_status;
+    gss_OID_set        *oid_set;
+{
+    if ((*oid_set = (gss_OID_set) malloc(sizeof(gss_OID_set_desc)))) {
+       memset(*oid_set, 0, sizeof(gss_OID_set_desc));
+       *minor_status = 0;
+       return(GSS_S_COMPLETE);
+    }
+    else {
+       *minor_status = ENOMEM;
+       return(GSS_S_FAILURE);
+    }
+}
+
+OM_uint32
+generic_gss_add_oid_set_member(minor_status, member_oid, oid_set)
+    OM_uint32  *minor_status;
+    gss_OID    member_oid;
+    gss_OID_set        *oid_set;
+{
+    gss_OID    elist;
+    gss_OID    lastel;
+
+    elist = (*oid_set)->elements;
+    /* Get an enlarged copy of the array */
+    if (((*oid_set)->elements = (gss_OID) malloc(((*oid_set)->count+1) *
+                                                 sizeof(gss_OID_desc)))) {
+       /* Copy in the old junk */
+       if (elist)
+           memcpy((*oid_set)->elements,
+                  elist,
+                  ((*oid_set)->count * sizeof(gss_OID_desc)));
+
+       /* Duplicate the input element */
+       lastel = &(*oid_set)->elements[(*oid_set)->count];
+       if ((lastel->elements =
+            (void *) malloc((size_t) member_oid->length))) {
+           /* Success - copy elements */
+           memcpy(lastel->elements, member_oid->elements,
+                  (size_t) member_oid->length);
+           /* Set length */
+           lastel->length = member_oid->length;
+
+           /* Update count */
+           (*oid_set)->count++;
+           if (elist)
+               free(elist);
+           *minor_status = 0;
+           return(GSS_S_COMPLETE);
+       }
+       else
+           free((*oid_set)->elements);
+    }
+    /* Failure - restore old contents of list */
+    (*oid_set)->elements = elist;
+    *minor_status = ENOMEM;
+    return(GSS_S_FAILURE);
+}
+
+OM_uint32
+generic_gss_test_oid_set_member(minor_status, member, set, present)
+    OM_uint32  *minor_status;
+    gss_OID    member;
+    gss_OID_set        set;
+    int                *present;
+{
+    size_t     i;
+    int                result;
+
+    result = 0;
+    for (i=0; i<set->count; i++) {
+       if ((set->elements[i].length == member->length) &&
+           !memcmp(set->elements[i].elements,
+                   member->elements,
+                   (size_t) member->length)) {
+           result = 1;
+           break;
+       }
+    }
+    *present = result;
+    *minor_status = 0;
+    return(GSS_S_COMPLETE);
+}
+
+/*
+ * OID<->string routines.  These are uuuuugly.
+ */
+OM_uint32
+generic_gss_oid_to_str(minor_status, oid, oid_str)
+    OM_uint32          *minor_status;
+    gss_OID            oid;
+    gss_buffer_t       oid_str;
+{
+    char               numstr[128];
+    unsigned long      number;
+    int                        numshift;
+    size_t             string_length;
+    size_t             i;
+    unsigned char      *cp;
+    char               *bp;
+
+    /* Decoded according to krb5/gssapi_krb5.c */
+
+    /* First determine the size of the string */
+    string_length = 0;
+    number = 0;
+    numshift = 0;
+    cp = (unsigned char *) oid->elements;
+    number = (unsigned long) cp[0];
+    sprintf(numstr, "%ld ", number/40);
+    string_length += strlen(numstr);
+    sprintf(numstr, "%ld ", number%40);
+    string_length += strlen(numstr);
+    for (i=1; i<oid->length; i++) {
+       if ( (size_t) (numshift+7) < (sizeof(unsigned long)*8)) {
+           number = (number << 7) | (cp[i] & 0x7f);
+           numshift += 7;
+       }
+       else {
+           *minor_status = EINVAL;
+           return(GSS_S_FAILURE);
+       }
+       if ((cp[i] & 0x80) == 0) {
+           sprintf(numstr, "%ld ", number);
+           string_length += strlen(numstr);
+           number = 0;
+           numshift = 0;
+       }
+    }
+    /*
+     * If we get here, we've calculated the length of "n n n ... n ".  Add 4
+     * here for "{ " and "}\0".
+     */
+    string_length += 4;
+    if ((bp = (char *) malloc(string_length))) {
+       strcpy(bp, "{ ");
+       number = (unsigned long) cp[0];
+       sprintf(numstr, "%ld ", number/40);
+       strcat(bp, numstr);
+       sprintf(numstr, "%ld ", number%40);
+       strcat(bp, numstr);
+       number = 0;
+       cp = (unsigned char *) oid->elements;
+       for (i=1; i<oid->length; i++) {
+           number = (number << 7) | (cp[i] & 0x7f);
+           if ((cp[i] & 0x80) == 0) {
+               sprintf(numstr, "%ld ", number);
+               strcat(bp, numstr);
+               number = 0;
+           }
+       }
+       strcat(bp, "}");
+       oid_str->length = strlen(bp)+1;
+       oid_str->value = (void *) bp;
+       *minor_status = 0;
+       return(GSS_S_COMPLETE);
+    }
+    *minor_status = ENOMEM;
+    return(GSS_S_FAILURE);
+}
+
+OM_uint32
+generic_gss_str_to_oid(minor_status, oid_str, oid)
+    OM_uint32          *minor_status;
+    gss_buffer_t       oid_str;
+    gss_OID            *oid;
+{
+    char       *cp, *bp, *startp;
+    int                brace;
+    long       numbuf;
+    long       onumbuf;
+    OM_uint32  nbytes;
+    int                index;
+    unsigned char *op;
+
+    brace = 0;
+    bp = (char *) oid_str->value;
+    cp = bp;
+    /* Skip over leading space */
+    while ((bp < &cp[oid_str->length]) && isspace(*bp))
+       bp++;
+    if (*bp == '{') {
+       brace = 1;
+       bp++;
+    }
+    while ((bp < &cp[oid_str->length]) && isspace(*bp))
+       bp++;
+    startp = bp;
+    nbytes = 0;
+
+    /*
+     * The first two numbers are chewed up by the first octet.
+     */
+    if (sscanf(bp, "%ld", &numbuf) != 1) {
+       *minor_status = EINVAL;
+       return(GSS_S_FAILURE);
+    }
+    while ((bp < &cp[oid_str->length]) && isdigit(*bp))
+       bp++;
+    while ((bp < &cp[oid_str->length]) && isspace(*bp))
+       bp++;
+    if (sscanf(bp, "%ld", &numbuf) != 1) {
+       *minor_status = EINVAL;
+       return(GSS_S_FAILURE);
+    }
+    while ((bp < &cp[oid_str->length]) && isdigit(*bp))
+       bp++;
+    while ((bp < &cp[oid_str->length]) && isspace(*bp))
+       bp++;
+    nbytes++;
+    while (isdigit(*bp)) {
+       if (sscanf(bp, "%ld", &numbuf) != 1) {
+           *minor_status = EINVAL;
+           return(GSS_S_FAILURE);
+       }
+       while (numbuf) {
+           nbytes++;
+           numbuf >>= 7;
+       }
+       while ((bp < &cp[oid_str->length]) && isdigit(*bp))
+           bp++;
+       while ((bp < &cp[oid_str->length]) && isspace(*bp))
+           bp++;
+    }
+    if (brace && (*bp != '}')) {
+       *minor_status = EINVAL;
+       return(GSS_S_FAILURE);
+    }
+
+    /*
+     * Phew!  We've come this far, so the syntax is good.
+     */
+    if ((*oid = (gss_OID) malloc(sizeof(gss_OID_desc)))) {
+       if (((*oid)->elements = (void *) malloc((size_t) nbytes))) {
+           (*oid)->length = nbytes;
+           op = (unsigned char *) (*oid)->elements;
+           bp = startp;
+           sscanf(bp, "%ld", &numbuf);
+           while (isdigit(*bp))
+               bp++;
+           while (isspace(*bp))
+               bp++;
+           onumbuf = 40*numbuf;
+           sscanf(bp, "%ld", &numbuf);
+           onumbuf += numbuf;
+           *op = (unsigned char) onumbuf;
+           op++;
+           while (isdigit(*bp))
+               bp++;
+           while (isspace(*bp))
+               bp++;
+           while (isdigit(*bp)) {
+               sscanf(bp, "%ld", &numbuf);
+               nbytes = 0;
+               /* Have to fill in the bytes msb-first */
+               onumbuf = numbuf;
+               while (numbuf) {
+                   nbytes++;
+                   numbuf >>= 7;
+               }
+               numbuf = onumbuf;
+               op += nbytes;
+               index = -1;
+               while (numbuf) {
+                   op[index] = (unsigned char) numbuf & 0x7f;
+                   if (index != -1)
+                       op[index] |= 0x80;
+                   index--;
+                   numbuf >>= 7;
+               }
+               while (isdigit(*bp))
+                   bp++;
+               while (isspace(*bp))
+                   bp++;
+           }
+           *minor_status = 0;
+           return(GSS_S_COMPLETE);
+       }
+       else {
+           free(*oid);
+           *oid = GSS_C_NO_OID;
+       }
+    }
+    *minor_status = ENOMEM;
+    return(GSS_S_FAILURE);
+}
+