Fixes for Heimdal (macOS) builds from Stefan.
[mech_eap.git] / mech_eap / verify_mic.c
index 89bb081..a93f5f8 100644 (file)
 
 #include "gssapiP_eap.h"
 
-OM_uint32 KRB5_CALLCONV
-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);
 }