#include "mglueP.h"
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <string.h>
#include <errno.h>
#define g_OID_equal(o1,o2) \
(((o1)->length == (o2)->length) && \
(memcmp((o1)->elements,(o2)->elements,(int) (o1)->length) == 0))
extern gss_mechanism *__gss_mechs_array;
gss_mechanism __gss_get_mechanism (type)
gss_OID type;
{
int i;
if (type == GSS_C_NULL_OID)
return (__gss_mechs_array[0]);
for (i=0; __gss_mechs_array[i]->mech_type.length != 0; i++) {
if ((__gss_mechs_array[i]->mech_type.length == type->length) &&
(memcmp (__gss_mechs_array[i]->mech_type.elements, type->elements,
type->length) == 0)) {
return (__gss_mechs_array[i]);
}
}
return NULL;
}
OM_uint32 __gss_get_mech_type(OID, token)
gss_OID OID;
gss_buffer_t token;
{
unsigned char * buffer_ptr;
int length;
if (token == NULL)
return (GSS_S_DEFECTIVE_TOKEN);
buffer_ptr = (unsigned char *) token->value;
if (*(buffer_ptr++) != 0x60)
return (GSS_S_DEFECTIVE_TOKEN);
length = *buffer_ptr++;
if (length & 0x80) {
if ((length & 0x7f) > 4)
return (GSS_S_DEFECTIVE_TOKEN);
buffer_ptr += length & 0x7f;
}
if (*(buffer_ptr++) != 0x06)
return (GSS_S_DEFECTIVE_TOKEN);
OID->length = (OM_uint32) *(buffer_ptr++);
OID->elements = (void *) buffer_ptr;
return (GSS_S_COMPLETE);
}
#include "mglueP.h"
OM_uint32 __gss_import_internal_name (minor_status, mech_type, union_name,
internal_name)
OM_uint32 *minor_status;
gss_OID mech_type;
gss_union_name_t union_name;
gss_name_t *internal_name;
{
OM_uint32 status;
gss_mechanism mech;
mech = __gss_get_mechanism (mech_type);
if (mech) {
if (mech->gss_import_name)
status = mech->gss_import_name (
mech->context,
minor_status,
union_name->external_name,
union_name->name_type,
internal_name);
else
status = GSS_S_BAD_BINDINGS;
return (status);
}
return (GSS_S_BAD_MECH);
}
OM_uint32 __gss_display_internal_name (minor_status, mech_type, internal_name,
external_name, name_type)
OM_uint32 *minor_status;
gss_OID mech_type;
gss_name_t internal_name;
gss_buffer_t external_name;
gss_OID *name_type;
{
OM_uint32 status;
gss_mechanism mech;
mech = __gss_get_mechanism (mech_type);
if (mech) {
if (mech->gss_display_name)
status = mech->gss_display_name (
mech->context,
minor_status,
internal_name,
external_name,
name_type);
else
status = GSS_S_BAD_BINDINGS;
return (status);
}
return (GSS_S_BAD_MECH);
}
OM_uint32 __gss_release_internal_name (minor_status, mech_type, internal_name)
OM_uint32 *minor_status;
gss_OID mech_type;
gss_name_t *internal_name;
{
OM_uint32 status;
gss_mechanism mech;
mech = __gss_get_mechanism (mech_type);
if (mech) {
if (mech->gss_release_name)
status = mech->gss_release_name (
mech->context,
minor_status,
internal_name);
else
status = GSS_S_BAD_BINDINGS;
return (status);
}
return (GSS_S_BAD_MECH);
}
OM_uint32 __gss_convert_name_to_union_name(minor_status, mech,
internal_name, external_name)
OM_uint32 *minor_status;
gss_mechanism mech;
gss_name_t internal_name;
gss_name_t *external_name;
{
OM_uint32 major_status,tmp;
gss_union_name_t union_name;
union_name = (gss_union_name_t) malloc (sizeof(gss_union_name_desc));
if (!union_name) {
*minor_status = ENOMEM;
goto allocation_failure;
}
union_name->mech_type = 0;
union_name->mech_name = internal_name;
union_name->name_type = 0;
union_name->external_name = 0;
major_status = generic_gss_copy_oid(minor_status, &mech->mech_type,
&union_name->mech_type);
if (major_status != GSS_S_COMPLETE)
goto allocation_failure;
union_name->external_name =
(gss_buffer_t) malloc(sizeof(gss_buffer_desc));
if (!union_name->external_name) {
*minor_status = ENOMEM;
goto allocation_failure;
}
major_status = mech->gss_display_name(mech->context, minor_status,
internal_name,
union_name->external_name,
&union_name->name_type);
if (major_status != GSS_S_COMPLETE)
goto allocation_failure;
*external_name = union_name;
return (GSS_S_COMPLETE);
allocation_failure:
if (union_name) {
if (union_name->external_name) {
if (union_name->external_name->value)
free(union_name->external_name->value);
free(union_name->external_name);
}
if (union_name->name_type)
gss_release_oid(&tmp, &union_name->name_type);
if (union_name->mech_name)
__gss_release_internal_name(minor_status, union_name->mech_type,
&union_name->mech_name);
if (union_name->mech_type)
gss_release_oid(&tmp, &union_name->mech_type);
free(union_name);
}
return (major_status);
}
gss_cred_id_t
__gss_get_mechanism_cred(union_cred, mech_type)
gss_union_cred_t union_cred;
gss_OID mech_type;
{
int i;
if (union_cred == GSS_C_NO_CREDENTIAL)
return GSS_C_NO_CREDENTIAL;
for (i=0; i < union_cred->count; i++) {
if (g_OID_equal(mech_type, &union_cred->mechs_array[i]))
return union_cred->cred_array[i];
}
return GSS_C_NO_CREDENTIAL;
}