From 9ef52e1041de88a80b32e30bd6c18f35f5b2c92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Thu, 28 Aug 2003 10:22:03 +0000 Subject: [PATCH] (_gssapi_verify_pad): verify padding of a gss wrapped message and return its length git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12686 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/gssapi/decapsulate.c | 29 +++++++++++++++++++++++++++++ lib/gssapi/krb5/decapsulate.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/lib/gssapi/decapsulate.c b/lib/gssapi/decapsulate.c index 70d83c1de..39d721892 100644 --- a/lib/gssapi/decapsulate.c +++ b/lib/gssapi/decapsulate.c @@ -178,3 +178,32 @@ gssapi_krb5_decapsulate(OM_uint32 *minor_status, out_data->data = p; return GSS_S_COMPLETE; } + +/* + * Verify padding of a gss wrapped message and return its length. + */ + +OM_uint32 +_gssapi_verify_pad(gss_buffer_t wrapped_token, + size_t datalen, + size_t *padlen) +{ + u_char *pad; + size_t padlength; + int i; + + pad = (u_char *)wrapped_token->value + wrapped_token->length - 1; + padlength = *pad; + + if (padlength > datalen) + return GSS_S_BAD_MECH; + + for (i = padlength; i > 0 && *pad == padlength; i--, pad--) + ; + if (i != 0) + return GSS_S_BAD_MIC; + + *padlen = padlength; + + return 0; +} diff --git a/lib/gssapi/krb5/decapsulate.c b/lib/gssapi/krb5/decapsulate.c index 70d83c1de..39d721892 100644 --- a/lib/gssapi/krb5/decapsulate.c +++ b/lib/gssapi/krb5/decapsulate.c @@ -178,3 +178,32 @@ gssapi_krb5_decapsulate(OM_uint32 *minor_status, out_data->data = p; return GSS_S_COMPLETE; } + +/* + * Verify padding of a gss wrapped message and return its length. + */ + +OM_uint32 +_gssapi_verify_pad(gss_buffer_t wrapped_token, + size_t datalen, + size_t *padlen) +{ + u_char *pad; + size_t padlength; + int i; + + pad = (u_char *)wrapped_token->value + wrapped_token->length - 1; + padlength = *pad; + + if (padlength > datalen) + return GSS_S_BAD_MECH; + + for (i = padlength; i > 0 && *pad == padlength; i--, pad--) + ; + if (i != 0) + return GSS_S_BAD_MIC; + + *padlen = padlength; + + return 0; +}