##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) \
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
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::
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
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++;
}
}
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);
--- /dev/null
+
+#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);
+}
--- /dev/null
+
+#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);
+}
--- /dev/null
+
+#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);
+
+}
--- /dev/null
+
+#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);
+}
--- /dev/null
+/*
+ * 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);
+}
+
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,
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);
OM_uint32 * minor_status;
gss_OID_set * set;
{
+ size_t index;
+ OM_uint32 status;
+
if (minor_status)
*minor_status = 0;
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);
}
OM_uint32
-gss_verify_misc (minor_status,
+gss_verify_mic (minor_status,
context_handle,
message_buffer,
token_buffer,
--- /dev/null
+/*
+ * 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;
-#ident "%Z%%M% %I% %E% SMI"
+#ident "@(#)mglueP.h 1.2 96/01/18 SMI"
/*
* This header contains the private mechglue definitions.
*
#ifndef _GSS_MECHGLUEP_H
#define _GSS_MECHGLUEP_H
-#include <gssapi/mechglue.h>
+#include "mechglue.h"
#include <sys/types.h>
/*
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;
/********************************************************/
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 */
--- /dev/null
+/*
+ * 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);
+}
+