try harder to handle names better. handle missing acceptor and initator creds better (ie dont propose/accept mech that there are no credentials for) split NegTokenInit and NegTokenResp in acceptor

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@19397 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2006-12-18 12:59:50 +00:00
parent 471a5b53bb
commit 62270350bc
5 changed files with 666 additions and 192 deletions

View File

@@ -282,7 +282,21 @@ OM_uint32 _gss_spnego_compare_name
int * name_equal
)
{
return gss_compare_name(minor_status, name1, name2, name_equal);
spnego_name n1 = (spnego_name)name1;
spnego_name n2 = (spnego_name)name2;
*name_equal = 0;
if (!gss_oid_equal(&n1->type, &n2->type))
return GSS_S_COMPLETE;
if (n1->value.length != n2->value.length)
return GSS_S_COMPLETE;
if (memcmp(n1->value.value, n2->value.value, n2->value.length) != 0)
return GSS_S_COMPLETE;
*name_equal = 1;
return GSS_S_COMPLETE;
}
OM_uint32 _gss_spnego_display_name
@@ -292,19 +306,51 @@ OM_uint32 _gss_spnego_display_name
gss_OID * output_name_type
)
{
return gss_display_name(minor_status, input_name,
spnego_name name = (spnego_name)input_name;
*minor_status = 0;
if (name->mech == GSS_C_NO_NAME)
return GSS_S_FAILURE;
return gss_display_name(minor_status, name->mech,
output_name_buffer, output_name_type);
}
OM_uint32 _gss_spnego_import_name
(OM_uint32 * minor_status,
const gss_buffer_t input_name_buffer,
const gss_OID input_name_type,
const gss_buffer_t name_buffer,
const gss_OID name_type,
gss_name_t * output_name
)
{
return gss_import_name(minor_status, input_name_buffer,
input_name_type, output_name);
spnego_name name;
OM_uint32 maj_stat;
*minor_status = 0;
name = calloc(1, sizeof(*name));
if (name == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
maj_stat = _gss_copy_oid(minor_status, name_type, &name->type);
if (maj_stat) {
free(name);
return GSS_S_FAILURE;
}
maj_stat = _gss_copy_buffer(minor_status, name_buffer, &name->value);
if (maj_stat) {
gss_name_t rname = (gss_name_t)name;
_gss_spnego_release_name(minor_status, &rname);
return GSS_S_FAILURE;
}
name->mech = GSS_C_NO_NAME;
*output_name = (gss_name_t)name;
return GSS_S_COMPLETE;
}
OM_uint32 _gss_spnego_export_name
@@ -313,8 +359,17 @@ OM_uint32 _gss_spnego_export_name
gss_buffer_t exported_name
)
{
return gss_export_name(minor_status, input_name,
exported_name);
spnego_name name;
*minor_status = 0;
if (input_name == GSS_C_NO_NAME)
return GSS_S_BAD_NAME;
name = (spnego_name)input_name;
if (name->mech == GSS_C_NO_NAME)
return GSS_S_BAD_NAME;
return gss_export_name(minor_status, name->mech, exported_name);
}
OM_uint32 _gss_spnego_release_name
@@ -322,7 +377,20 @@ OM_uint32 _gss_spnego_release_name
gss_name_t * input_name
)
{
return gss_release_name(minor_status, input_name);
*minor_status = 0;
if (*input_name != GSS_C_NO_NAME) {
OM_uint32 junk;
spnego_name name = (spnego_name)*input_name;
_gss_free_oid(&junk, &name->type);
gss_release_buffer(&junk, &name->value);
if (name->mech != GSS_C_NO_NAME)
gss_release_name(&junk, &name->mech);
free(name);
*input_name = GSS_C_NO_NAME;
}
return GSS_S_COMPLETE;
}
OM_uint32 _gss_spnego_inquire_context (