X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=wrap_size_limit.c;h=aadf1b48851be6adb653055645145536155ceab0;hb=refs%2Fheads%2Fjson-name;hp=3e0654bfc89622e45b276dd4605e2a0311459de1;hpb=31cef49681566dc99790812f31de834dfce02c74;p=mech_eap.orig diff --git a/wrap_size_limit.c b/wrap_size_limit.c index 3e0654b..aadf1b4 100644 --- a/wrap_size_limit.c +++ b/wrap_size_limit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, JANET(UK) + * Copyright (c) 2011, JANET(UK) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,5 +30,68 @@ * SUCH DAMAGE. */ +/* + * Message protection services: determine maximum input size. + */ + #include "gssapiP_eap.h" +OM_uint32 +gss_wrap_size_limit(OM_uint32 *minor, + gss_ctx_id_t ctx, + int conf_req_flag, + gss_qop_t qop_req, + OM_uint32 req_output_size, + OM_uint32 *max_input_size) +{ + gss_iov_buffer_desc iov[4]; + OM_uint32 major, overhead; + + if (ctx == GSS_C_NO_CONTEXT) { + *minor = EINVAL; + return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT; + } + + *minor = 0; + + GSSEAP_MUTEX_LOCK(&ctx->mutex); + + if (!CTX_IS_ESTABLISHED(ctx)) { + major = GSS_S_NO_CONTEXT; + *minor = GSSEAP_CONTEXT_INCOMPLETE; + goto cleanup; + } + + iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER; + iov[0].buffer.value = NULL; + iov[0].buffer.length = 0; + + iov[1].type = GSS_IOV_BUFFER_TYPE_DATA; + iov[1].buffer.length = req_output_size; + iov[1].buffer.value = NULL; + + iov[2].type = GSS_IOV_BUFFER_TYPE_PADDING; + iov[2].buffer.value = NULL; + iov[2].buffer.length = 0; + + iov[3].type = GSS_IOV_BUFFER_TYPE_TRAILER; + iov[3].buffer.value = NULL; + iov[3].buffer.length = 0; + + major = gssEapWrapIovLength(minor, ctx, conf_req_flag, qop_req, + NULL, iov, 4); + if (GSS_ERROR(major)) + goto cleanup; + + overhead = iov[0].buffer.length + iov[3].buffer.length; + + if (iov[2].buffer.length == 0 && overhead < req_output_size) + *max_input_size = req_output_size - overhead; + else + *max_input_size = 0; + +cleanup: + GSSEAP_MUTEX_UNLOCK(&ctx->mutex); + + return major; +}