X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=wrap.c;h=a89bcb615fe65a39f12d99585192fa09ecfa39fb;hb=refs%2Fheads%2Fjson-name;hp=5f81544a9cdbff0f9586da2079d95dad4ab228b2;hpb=2726871e0ab92938b385d2a1e6deef44ecb208b8;p=mech_eap.orig diff --git a/wrap.c b/wrap.c index 5f81544..a89bcb6 100644 --- a/wrap.c +++ b/wrap.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,6 +30,10 @@ * SUCH DAMAGE. */ +/* + * Message protection services: wrap. + */ + #include "gssapiP_eap.h" OM_uint32 @@ -41,6 +45,44 @@ gss_wrap(OM_uint32 *minor, int *conf_state, gss_buffer_t output_message_buffer) { + OM_uint32 major; + + 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; + } + + major = gssEapWrap(minor, ctx, conf_req_flag, qop_req, + input_message_buffer, + conf_state, output_message_buffer); + if (GSS_ERROR(major)) + goto cleanup; + +cleanup: + GSSEAP_MUTEX_UNLOCK(&ctx->mutex); + + return major; +} + +OM_uint32 +gssEapWrap(OM_uint32 *minor, + gss_ctx_id_t ctx, + int conf_req_flag, + gss_qop_t qop_req, + gss_buffer_t input_message_buffer, + int *conf_state, + gss_buffer_t output_message_buffer) +{ OM_uint32 major, tmpMinor; gss_iov_buffer_desc iov[4]; unsigned char *p; @@ -61,7 +103,7 @@ gss_wrap(OM_uint32 *minor, iov[3].buffer.value = NULL; iov[3].buffer.length = 0; - major = gss_wrap_iov_length(minor, ctx, conf_req_flag, qop_req, + major = gssEapWrapIovLength(minor, ctx, conf_req_flag, qop_req, NULL, iov, 4); if (GSS_ERROR(major)) { return major; @@ -85,7 +127,8 @@ gss_wrap(OM_uint32 *minor, p += iov[i].buffer.length; } - major = gss_wrap_iov(minor, ctx, conf_req_flag, qop_req, conf_state, iov, 4); + major = gssEapWrapOrGetMIC(minor, ctx, conf_req_flag, conf_state, + iov, 4, TOK_TYPE_WRAP); if (GSS_ERROR(major)) { gss_release_buffer(&tmpMinor, output_message_buffer); }