add encap functions that doesn't take the token type

also make all encap function take the oid mech that they should use


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12636 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2003-08-25 19:56:51 +00:00
parent a8f75867a1
commit 0fed18d468
2 changed files with 138 additions and 36 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan * Copyright (c) 1997 - 2003 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -36,23 +36,45 @@
RCSID("$Id$"); RCSID("$Id$");
void void
gssapi_krb5_encap_length (size_t data_len, _gssapi_encap_length (size_t data_len,
size_t *len, size_t *len,
size_t *total_len) size_t *total_len,
const gss_OID mech)
{ {
size_t len_len; size_t len_len;
*len = 1 + 1 + GSS_KRB5_MECHANISM->length + 2 + data_len; *len = 1 + 1 + mech->length + data_len;
len_len = length_len(*len); len_len = length_len(*len);
*total_len = 1 + len_len + *len; *total_len = 1 + len_len + *len;
} }
void
gssapi_krb5_encap_length (size_t data_len,
size_t *len,
size_t *total_len,
const gss_OID mech)
{
return _gssapi_encap_length(data_len + 2, len, total_len, mech);
}
u_char * u_char *
gssapi_krb5_make_header (u_char *p, gssapi_krb5_make_header (u_char *p,
size_t len, size_t len,
u_char *type) const u_char *type,
const gss_OID mech)
{
p = _gssapi_make_mech_header(p, len, mech);
memcpy (p, type, 2);
p += 2;
return p;
}
u_char *
_gssapi_make_mech_header(u_char *p,
size_t len,
const gss_OID mech)
{ {
int e; int e;
size_t len_len, foo; size_t len_len, foo;
@@ -64,11 +86,9 @@ gssapi_krb5_make_header (u_char *p,
abort (); abort ();
p += len_len; p += len_len;
*p++ = 0x06; *p++ = 0x06;
*p++ = GSS_KRB5_MECHANISM->length; *p++ = mech->length;
memcpy (p, GSS_KRB5_MECHANISM->elements, GSS_KRB5_MECHANISM->length); memcpy (p, mech->elements, mech->length);
p += GSS_KRB5_MECHANISM->length; p += mech->length;
memcpy (p, type, 2);
p += 2;
return p; return p;
} }
@@ -77,17 +97,17 @@ gssapi_krb5_make_header (u_char *p,
*/ */
OM_uint32 OM_uint32
gssapi_krb5_encapsulate( _gssapi_encapsulate(
OM_uint32 *minor_status, OM_uint32 *minor_status,
const krb5_data *in_data, const krb5_data *in_data,
gss_buffer_t output_token, gss_buffer_t output_token,
u_char *type const gss_OID mech
) )
{ {
size_t len, outer_len; size_t len, outer_len;
u_char *p; u_char *p;
gssapi_krb5_encap_length (in_data->length, &len, &outer_len); _gssapi_encap_length (in_data->length, &len, &outer_len, mech);
output_token->length = outer_len; output_token->length = outer_len;
output_token->value = malloc (outer_len); output_token->value = malloc (outer_len);
@@ -96,7 +116,38 @@ gssapi_krb5_encapsulate(
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
p = gssapi_krb5_make_header (output_token->value, len, type); p = _gssapi_make_mech_header (output_token->value, len, mech);
memcpy (p, in_data->data, in_data->length);
return GSS_S_COMPLETE;
}
/*
* Give it a krb5_data and it will encapsulate with extra GSS-API krb5
* wrappings.
*/
OM_uint32
gssapi_krb5_encapsulate(
OM_uint32 *minor_status,
const krb5_data *in_data,
gss_buffer_t output_token,
const u_char *type,
const gss_OID mech
)
{
size_t len, outer_len;
u_char *p;
gssapi_krb5_encap_length (in_data->length, &len, &outer_len, mech);
output_token->length = outer_len;
output_token->value = malloc (outer_len);
if (output_token->value == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
p = gssapi_krb5_make_header (output_token->value, len, type, mech);
memcpy (p, in_data->data, in_data->length); memcpy (p, in_data->data, in_data->length);
return GSS_S_COMPLETE; return GSS_S_COMPLETE;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan * Copyright (c) 1997 - 2003 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -36,23 +36,45 @@
RCSID("$Id$"); RCSID("$Id$");
void void
gssapi_krb5_encap_length (size_t data_len, _gssapi_encap_length (size_t data_len,
size_t *len, size_t *len,
size_t *total_len) size_t *total_len,
const gss_OID mech)
{ {
size_t len_len; size_t len_len;
*len = 1 + 1 + GSS_KRB5_MECHANISM->length + 2 + data_len; *len = 1 + 1 + mech->length + data_len;
len_len = length_len(*len); len_len = length_len(*len);
*total_len = 1 + len_len + *len; *total_len = 1 + len_len + *len;
} }
void
gssapi_krb5_encap_length (size_t data_len,
size_t *len,
size_t *total_len,
const gss_OID mech)
{
return _gssapi_encap_length(data_len + 2, len, total_len, mech);
}
u_char * u_char *
gssapi_krb5_make_header (u_char *p, gssapi_krb5_make_header (u_char *p,
size_t len, size_t len,
u_char *type) const u_char *type,
const gss_OID mech)
{
p = _gssapi_make_mech_header(p, len, mech);
memcpy (p, type, 2);
p += 2;
return p;
}
u_char *
_gssapi_make_mech_header(u_char *p,
size_t len,
const gss_OID mech)
{ {
int e; int e;
size_t len_len, foo; size_t len_len, foo;
@@ -64,11 +86,9 @@ gssapi_krb5_make_header (u_char *p,
abort (); abort ();
p += len_len; p += len_len;
*p++ = 0x06; *p++ = 0x06;
*p++ = GSS_KRB5_MECHANISM->length; *p++ = mech->length;
memcpy (p, GSS_KRB5_MECHANISM->elements, GSS_KRB5_MECHANISM->length); memcpy (p, mech->elements, mech->length);
p += GSS_KRB5_MECHANISM->length; p += mech->length;
memcpy (p, type, 2);
p += 2;
return p; return p;
} }
@@ -77,17 +97,17 @@ gssapi_krb5_make_header (u_char *p,
*/ */
OM_uint32 OM_uint32
gssapi_krb5_encapsulate( _gssapi_encapsulate(
OM_uint32 *minor_status, OM_uint32 *minor_status,
const krb5_data *in_data, const krb5_data *in_data,
gss_buffer_t output_token, gss_buffer_t output_token,
u_char *type const gss_OID mech
) )
{ {
size_t len, outer_len; size_t len, outer_len;
u_char *p; u_char *p;
gssapi_krb5_encap_length (in_data->length, &len, &outer_len); _gssapi_encap_length (in_data->length, &len, &outer_len, mech);
output_token->length = outer_len; output_token->length = outer_len;
output_token->value = malloc (outer_len); output_token->value = malloc (outer_len);
@@ -96,7 +116,38 @@ gssapi_krb5_encapsulate(
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
p = gssapi_krb5_make_header (output_token->value, len, type); p = _gssapi_make_mech_header (output_token->value, len, mech);
memcpy (p, in_data->data, in_data->length);
return GSS_S_COMPLETE;
}
/*
* Give it a krb5_data and it will encapsulate with extra GSS-API krb5
* wrappings.
*/
OM_uint32
gssapi_krb5_encapsulate(
OM_uint32 *minor_status,
const krb5_data *in_data,
gss_buffer_t output_token,
const u_char *type,
const gss_OID mech
)
{
size_t len, outer_len;
u_char *p;
gssapi_krb5_encap_length (in_data->length, &len, &outer_len, mech);
output_token->length = outer_len;
output_token->value = malloc (outer_len);
if (output_token->value == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
p = gssapi_krb5_make_header (output_token->value, len, type, mech);
memcpy (p, in_data->data, in_data->length); memcpy (p, in_data->data, in_data->length);
return GSS_S_COMPLETE; return GSS_S_COMPLETE;
} }