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=0a56949daf8b9e27abfddcd43f3dad7f651d2277;hb=HEAD;hpb=32c7cb5841cb87eb434b1a802f0032b2b71c7d17 diff --git a/mech_eap/verify_mic.c b/mech_eap/verify_mic.c index 0a56949..a93f5f8 100644 --- a/mech_eap/verify_mic.c +++ b/mech_eap/verify_mic.c @@ -36,41 +36,58 @@ #include "gssapiP_eap.h" -OM_uint32 -gss_verify_mic(OM_uint32 *minor, - gss_ctx_id_t ctx, - gss_buffer_t message_buffer, - gss_buffer_t message_token, - gss_qop_t *qop_state) +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; - gss_iov_buffer_desc iov[3]; - int conf_state; - if (message_token->length < 16) { - *minor = GSSEAP_TOK_TRUNC; - return GSS_S_BAD_SIG; + if (ctx == GSS_C_NO_CONTEXT) { + *minor = EINVAL; + return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT; } - *minor = 0; + GSSEAP_MUTEX_LOCK(&((gss_ctx_id_t)ctx)->mutex); - iov[0].type = GSS_IOV_BUFFER_TYPE_DATA; - iov[0].buffer = *message_buffer; + major = gssEapUnwrapOrVerifyMIC(minor, (gss_ctx_id_t)ctx, NULL, qop_state, + iov, iov_count, TOK_TYPE_MIC); - iov[1].type = GSS_IOV_BUFFER_TYPE_HEADER; - iov[1].buffer.length = 16; - iov[1].buffer.value = message_token->value; + GSSEAP_MUTEX_UNLOCK(&((gss_ctx_id_t)ctx)->mutex); - 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; + return major; +} - GSSEAP_MUTEX_LOCK(&ctx->mutex); +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) +{ + gss_iov_buffer_desc iov[2]; + + iov[0].type = GSS_IOV_BUFFER_TYPE_DATA; + iov[0].buffer = *message_buffer; - major = gssEapUnwrapOrVerifyMIC(minor, ctx, &conf_state, qop_state, - iov, 3, TOK_TYPE_MIC); + iov[1].type = GSS_IOV_BUFFER_TYPE_MIC_TOKEN; + iov[1].buffer = *message_token; - 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); }