X-Git-Url: http://www.project-moonshot.org/gitweb/?p=mech_eap.git;a=blobdiff_plain;f=mech_eap%2Fverify_mic.c;h=a93f5f831d9866df37071c2e11a0dcfa57c33b7e;hp=d72c57ed4dea3e0af1bd4f1fda60eafb8362ecea;hb=HEAD;hpb=527a687917e60958777a01ca7a458888bee341b8 diff --git a/mech_eap/verify_mic.c b/mech_eap/verify_mic.c index d72c57e..a93f5f8 100644 --- a/mech_eap/verify_mic.c +++ b/mech_eap/verify_mic.c @@ -36,41 +36,58 @@ #include "gssapiP_eap.h" +static OM_uint32 +gssEapVerifyMIC(OM_uint32 *minor, + gss_ctx_id_t ctx, + gss_qop_t *qop_state, + gss_iov_buffer_desc *iov, + int iov_count) +{ + OM_uint32 major; + + if (ctx == GSS_C_NO_CONTEXT) { + *minor = EINVAL; + return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT; + } + + GSSEAP_MUTEX_LOCK(&((gss_ctx_id_t)ctx)->mutex); + + major = gssEapUnwrapOrVerifyMIC(minor, (gss_ctx_id_t)ctx, NULL, qop_state, + iov, iov_count, TOK_TYPE_MIC); + + GSSEAP_MUTEX_UNLOCK(&((gss_ctx_id_t)ctx)->mutex); + + return major; +} + OM_uint32 GSSAPI_CALLCONV gss_verify_mic(OM_uint32 *minor, +#ifdef HAVE_HEIMDAL_VERSION + gss_const_ctx_id_t ctx, +#else gss_ctx_id_t ctx, +#endif gss_buffer_t message_buffer, gss_buffer_t message_token, gss_qop_t *qop_state) { - OM_uint32 major; - gss_iov_buffer_desc iov[3]; - int conf_state; - - if (message_token->length < 16) { - *minor = GSSEAP_TOK_TRUNC; - return GSS_S_BAD_SIG; - } - - *minor = 0; + gss_iov_buffer_desc iov[2]; iov[0].type = GSS_IOV_BUFFER_TYPE_DATA; iov[0].buffer = *message_buffer; - iov[1].type = GSS_IOV_BUFFER_TYPE_HEADER; - iov[1].buffer.length = 16; - iov[1].buffer.value = message_token->value; - - iov[2].type = GSS_IOV_BUFFER_TYPE_TRAILER; - iov[2].buffer.length = message_token->length - 16; - iov[2].buffer.value = (unsigned char *)message_token->value + 16; - - GSSEAP_MUTEX_LOCK(&ctx->mutex); + iov[1].type = GSS_IOV_BUFFER_TYPE_MIC_TOKEN; + iov[1].buffer = *message_token; - major = gssEapUnwrapOrVerifyMIC(minor, ctx, &conf_state, qop_state, - iov, 3, TOK_TYPE_MIC); - - GSSEAP_MUTEX_UNLOCK(&ctx->mutex); + return gssEapVerifyMIC(minor, (gss_ctx_id_t)ctx, qop_state, iov, 2); +} - return major; +OM_uint32 GSSAPI_CALLCONV +gss_verify_mic_iov(OM_uint32 *minor, + gss_ctx_id_t ctx, + gss_qop_t *qop_state, + gss_iov_buffer_desc *iov, + int iov_count) +{ + return gssEapVerifyMIC(minor, ctx, qop_state, iov, iov_count); }