From 25ddeeab96025a23796095e96a8c8bed459163ff Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Mon, 14 Jul 1997 11:41:22 +0000 Subject: [PATCH] New functions `gssapi_krb5_encap_length' and `gssapi_krb5_make_header' git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2276 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/gssapi/encapsulate.c | 64 +++++++++++++++++++++++++++-------- lib/gssapi/krb5/encapsulate.c | 64 +++++++++++++++++++++++++++-------- 2 files changed, 98 insertions(+), 30 deletions(-) diff --git a/lib/gssapi/encapsulate.c b/lib/gssapi/encapsulate.c index 598167466..7b54d3e09 100644 --- a/lib/gssapi/encapsulate.c +++ b/lib/gssapi/encapsulate.c @@ -2,6 +2,43 @@ RCSID("$Id$"); +void +gssapi_krb5_encap_length (size_t data_len, + size_t *len, + size_t *total_len) +{ + size_t len_len; + + *len = 1 + 1 + GSS_KRB5_MECHANISM->length + 2 + data_len; + + len_len = length_len(*len); + + *total_len = 1 + len_len + *len; +} + +u_char * +gssapi_krb5_make_header (u_char *p, + size_t len, + u_char *type) +{ + int e; + size_t len_len, foo; + + *p++ = 0x60; + len_len = length_len(len); + e = der_put_length (p + len_len - 1, len_len, len, &foo); + if(e || foo != len_len) + abort (); + p += len_len; + *p++ = 0x06; + *p++ = GSS_KRB5_MECHANISM->length; + memcpy (p, GSS_KRB5_MECHANISM->elements, GSS_KRB5_MECHANISM->length); + p += GSS_KRB5_MECHANISM->length; + memcpy (p, type, 2); + p += 2; + return p; +} + /* * Give it a krb5_data and it will encapsulate with extra GSS-API wrappings. */ @@ -13,21 +50,18 @@ gssapi_krb5_encapsulate( u_char *type ) { - u_char *p; + size_t len, outer_len; + u_char *p; - output_token->length = in_data->length + GSS_KRB5_MECHANISM->length + 6; - output_token->value = malloc (output_token->length); - if (output_token->value == NULL) - return GSS_S_FAILURE; + gssapi_krb5_encap_length (in_data->length, &len, &outer_len); + + output_token->length = outer_len; + output_token->value = malloc (outer_len); + if (output_token->value == NULL) + return GSS_S_FAILURE; - p = output_token->value; - memcpy (p, "\x60\x07\x06\x05", 4); - p += 4; - memcpy (p, GSS_KRB5_MECHANISM->elements, GSS_KRB5_MECHANISM->length); - p += GSS_KRB5_MECHANISM->length; - memcpy (p, type, 2); - p += 2; - memcpy (p, in_data->data, in_data->length); - krb5_data_free (in_data); - return GSS_S_COMPLETE; + p = gssapi_krb5_make_header (output_token->value, len, type); + memcpy (p, in_data->data, in_data->length); + krb5_data_free (in_data); + return GSS_S_COMPLETE; } diff --git a/lib/gssapi/krb5/encapsulate.c b/lib/gssapi/krb5/encapsulate.c index 598167466..7b54d3e09 100644 --- a/lib/gssapi/krb5/encapsulate.c +++ b/lib/gssapi/krb5/encapsulate.c @@ -2,6 +2,43 @@ RCSID("$Id$"); +void +gssapi_krb5_encap_length (size_t data_len, + size_t *len, + size_t *total_len) +{ + size_t len_len; + + *len = 1 + 1 + GSS_KRB5_MECHANISM->length + 2 + data_len; + + len_len = length_len(*len); + + *total_len = 1 + len_len + *len; +} + +u_char * +gssapi_krb5_make_header (u_char *p, + size_t len, + u_char *type) +{ + int e; + size_t len_len, foo; + + *p++ = 0x60; + len_len = length_len(len); + e = der_put_length (p + len_len - 1, len_len, len, &foo); + if(e || foo != len_len) + abort (); + p += len_len; + *p++ = 0x06; + *p++ = GSS_KRB5_MECHANISM->length; + memcpy (p, GSS_KRB5_MECHANISM->elements, GSS_KRB5_MECHANISM->length); + p += GSS_KRB5_MECHANISM->length; + memcpy (p, type, 2); + p += 2; + return p; +} + /* * Give it a krb5_data and it will encapsulate with extra GSS-API wrappings. */ @@ -13,21 +50,18 @@ gssapi_krb5_encapsulate( u_char *type ) { - u_char *p; + size_t len, outer_len; + u_char *p; - output_token->length = in_data->length + GSS_KRB5_MECHANISM->length + 6; - output_token->value = malloc (output_token->length); - if (output_token->value == NULL) - return GSS_S_FAILURE; + gssapi_krb5_encap_length (in_data->length, &len, &outer_len); + + output_token->length = outer_len; + output_token->value = malloc (outer_len); + if (output_token->value == NULL) + return GSS_S_FAILURE; - p = output_token->value; - memcpy (p, "\x60\x07\x06\x05", 4); - p += 4; - memcpy (p, GSS_KRB5_MECHANISM->elements, GSS_KRB5_MECHANISM->length); - p += GSS_KRB5_MECHANISM->length; - memcpy (p, type, 2); - p += 2; - memcpy (p, in_data->data, in_data->length); - krb5_data_free (in_data); - return GSS_S_COMPLETE; + p = gssapi_krb5_make_header (output_token->value, len, type); + memcpy (p, in_data->data, in_data->length); + krb5_data_free (in_data); + return GSS_S_COMPLETE; }