+ OM_uint32 major, tmpMinor;
+ gss_iov_buffer_desc iov[2];
+ gss_buffer_desc buf;
+
+ iov[0].type = GSS_IOV_BUFFER_TYPE_DATA;
+ iov[0].buffer.length = 0;
+ iov[0].buffer.value = NULL;
+
+ iov[1].type = GSS_IOV_BUFFER_TYPE_HEADER | GSS_IOV_BUFFER_FLAG_ALLOCATE;
+ iov[1].buffer.length = 0;
+ iov[1].buffer.value = NULL;
+
+ if (chanBindings != GSS_C_NO_CHANNEL_BINDINGS)
+ iov[0].buffer = chanBindings->application_data;
+
+ major = gssEapWrapOrGetMIC(minor, ctx, FALSE, FALSE, iov, 2,
+ TOK_TYPE_GSS_CB);
+ if (GSS_ERROR(major))
+ goto cleanup;
+
+ /* Skip past token ID */
+ assert(iov[1].buffer.length > 2);
+ assert(load_uint16_be(iov[1].buffer.value) == TOK_TYPE_GSS_CB);
+
+ buf.length = iov[1].buffer.length - 2;
+ buf.value = (unsigned char *)iov[1].buffer.value + 2;
+
+ major = duplicateBuffer(minor, &buf, outputToken);
+ if (GSS_ERROR(major))
+ goto cleanup;
+
+ major = GSS_S_COMPLETE;
+ ctx->state = EAP_STATE_ESTABLISHED;
+
+cleanup:
+ gssEapReleaseIov(iov, 2);
+
+ return major;