-: 0:Source:g_seal.c -: 0:Graph:/var/tsitkova/Sources/v10/trunk/src/lib/gssapi/mechglue/g_seal.so.gcno -: 0:Data:/var/tsitkova/Sources/v10/trunk/src/lib/gssapi/mechglue/g_seal.so.gcda -: 0:Runs:1069 -: 0:Programs:1 -: 1:/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */ -: 2:/* -: 3: * Copyright 1996 by Sun Microsystems, Inc. -: 4: * -: 5: * Permission to use, copy, modify, distribute, and sell this software -: 6: * and its documentation for any purpose is hereby granted without fee, -: 7: * provided that the above copyright notice appears in all copies and -: 8: * that both that copyright notice and this permission notice appear in -: 9: * supporting documentation, and that the name of Sun Microsystems not be used -: 10: * in advertising or publicity pertaining to distribution of the software -: 11: * without specific, written prior permission. Sun Microsystems makes no -: 12: * representations about the suitability of this software for any -: 13: * purpose. It is provided "as is" without express or implied warranty. -: 14: * -: 15: * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -: 16: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -: 17: * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR -: 18: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF -: 19: * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -: 20: * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -: 21: * PERFORMANCE OF THIS SOFTWARE. -: 22: */ -: 23: -: 24:/* -: 25: * glue routine for gss_wrap -: 26: */ -: 27: -: 28:#include "mglueP.h" -: 29: -: 30:static OM_uint32 120: 31:val_wrap_args(OM_uint32 *minor_status, -: 32: gss_ctx_id_t context_handle, -: 33: int conf_req_flag, -: 34: gss_qop_t qop_req, -: 35: gss_buffer_t input_message_buffer, -: 36: int *conf_state, -: 37: gss_buffer_t output_message_buffer) -: 38:{ -: 39: /* Initialize outputs. */ -: 40: 120: 41: if (minor_status != NULL) 120: 42: *minor_status = 0; -: 43: 120: 44: if (output_message_buffer != GSS_C_NO_BUFFER) { 120: 45: output_message_buffer->length = 0; 120: 46: output_message_buffer->value = NULL; -: 47: } -: 48: -: 49: /* Validate arguments. */ -: 50: 120: 51: if (minor_status == NULL) #####: 52: return (GSS_S_CALL_INACCESSIBLE_WRITE); -: 53: 120: 54: if (context_handle == GSS_C_NO_CONTEXT) #####: 55: return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT); -: 56: 120: 57: if (input_message_buffer == GSS_C_NO_BUFFER) #####: 58: return (GSS_S_CALL_INACCESSIBLE_READ); -: 59: 120: 60: if (output_message_buffer == GSS_C_NO_BUFFER) #####: 61: return (GSS_S_CALL_INACCESSIBLE_WRITE); -: 62: 120: 63: return (GSS_S_COMPLETE); -: 64:} -: 65: -: 66:OM_uint32 KRB5_CALLCONV 120: 67:gss_wrap( OM_uint32 *minor_status, -: 68: gss_ctx_id_t context_handle, -: 69: int conf_req_flag, -: 70: gss_qop_t qop_req, -: 71: gss_buffer_t input_message_buffer, -: 72: int *conf_state, -: 73: gss_buffer_t output_message_buffer) -: 74:{ -: 75: -: 76: /* EXPORT DELETE START */ -: 77: -: 78: OM_uint32 status; -: 79: gss_union_ctx_id_t ctx; -: 80: gss_mechanism mech; -: 81: 120: 82: status = val_wrap_args(minor_status, context_handle, -: 83: conf_req_flag, qop_req, -: 84: input_message_buffer, conf_state, -: 85: output_message_buffer); 120: 86: if (status != GSS_S_COMPLETE) #####: 87: return (status); -: 88: -: 89: /* -: 90: * select the approprate underlying mechanism routine and -: 91: * call it. -: 92: */ -: 93: 120: 94: ctx = (gss_union_ctx_id_t) context_handle; 120: 95: mech = gssint_get_mechanism (ctx->mech_type); -: 96: 120: 97: if (mech) { 120: 98: if (mech->gss_wrap) { 120: 99: status = mech->gss_wrap(minor_status, -: 100: ctx->internal_ctx_id, -: 101: conf_req_flag, -: 102: qop_req, -: 103: input_message_buffer, -: 104: conf_state, -: 105: output_message_buffer); 120: 106: if (status != GSS_S_COMPLETE) #####: 107: map_error(minor_status, mech); #####: 108: } else if (mech->gss_wrap_aead || #####: 109: (mech->gss_wrap_iov && mech->gss_wrap_iov_length)) { #####: 110: status = gssint_wrap_aead(mech, -: 111: minor_status, -: 112: ctx, -: 113: conf_req_flag, -: 114: (gss_qop_t)qop_req, -: 115: GSS_C_NO_BUFFER, -: 116: input_message_buffer, -: 117: conf_state, -: 118: output_message_buffer); -: 119: } else #####: 120: status = GSS_S_UNAVAILABLE; -: 121: 120: 122: return(status); -: 123: } -: 124: /* EXPORT DELETE END */ -: 125: #####: 126: return (GSS_S_BAD_MECH); -: 127:} -: 128: -: 129:OM_uint32 KRB5_CALLCONV #####: 130:gss_seal(OM_uint32 *minor_status, -: 131: gss_ctx_id_t context_handle, -: 132: int conf_req_flag, -: 133: int qop_req, -: 134: gss_buffer_t input_message_buffer, -: 135: int *conf_state, -: 136: gss_buffer_t output_message_buffer) -: 137:{ -: 138: #####: 139: return gss_wrap(minor_status, context_handle, -: 140: conf_req_flag, (gss_qop_t) qop_req, -: 141: input_message_buffer, conf_state, -: 142: output_message_buffer); -: 143:} -: 144: -: 145:/* -: 146: * It is only possible to implement gss_wrap_size_limit() on top -: 147: * of gss_wrap_iov_length() for mechanisms that do not use any -: 148: * padding and have fixed length headers/trailers. -: 149: */ -: 150:static OM_uint32 #####: 151:gssint_wrap_size_limit_iov_shim(gss_mechanism mech, -: 152: OM_uint32 *minor_status, -: 153: gss_ctx_id_t context_handle, -: 154: int conf_req_flag, -: 155: gss_qop_t qop_req, -: 156: OM_uint32 req_output_size, -: 157: OM_uint32 *max_input_size) -: 158:{ -: 159: gss_iov_buffer_desc iov[4]; -: 160: OM_uint32 status; -: 161: OM_uint32 ohlen; -: 162: #####: 163: iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER; #####: 164: iov[0].buffer.value = NULL; #####: 165: iov[0].buffer.length = 0; -: 166: #####: 167: iov[1].type = GSS_IOV_BUFFER_TYPE_DATA; #####: 168: iov[1].buffer.length = req_output_size; #####: 169: iov[1].buffer.value = NULL; -: 170: #####: 171: iov[2].type = GSS_IOV_BUFFER_TYPE_PADDING; #####: 172: iov[2].buffer.value = NULL; #####: 173: iov[2].buffer.length = 0; -: 174: #####: 175: iov[3].type = GSS_IOV_BUFFER_TYPE_TRAILER; #####: 176: iov[3].buffer.value = NULL; #####: 177: iov[3].buffer.length = 0; -: 178: #####: 179: assert(mech->gss_wrap_iov_length); -: 180: #####: 181: status = mech->gss_wrap_iov_length(minor_status, context_handle, -: 182: conf_req_flag, qop_req, -: 183: NULL, iov, -: 184: sizeof(iov)/sizeof(iov[0])); #####: 185: if (status != GSS_S_COMPLETE) { #####: 186: map_error(minor_status, mech); #####: 187: return status; -: 188: } -: 189: #####: 190: ohlen = iov[0].buffer.length + iov[3].buffer.length; -: 191: #####: 192: if (iov[2].buffer.length == 0 && ohlen < req_output_size) #####: 193: *max_input_size = req_output_size - ohlen; -: 194: else #####: 195: *max_input_size = 0; -: 196: #####: 197: return GSS_S_COMPLETE; -: 198:} -: 199: -: 200:/* -: 201: * New for V2 -: 202: */ -: 203:OM_uint32 KRB5_CALLCONV #####: 204:gss_wrap_size_limit(OM_uint32 *minor_status, -: 205: gss_ctx_id_t context_handle, -: 206: int conf_req_flag, -: 207: gss_qop_t qop_req, OM_uint32 req_output_size, OM_uint32 *max_input_size) -: 208:{ -: 209: gss_union_ctx_id_t ctx; -: 210: gss_mechanism mech; -: 211: OM_uint32 major_status; -: 212: #####: 213: if (minor_status == NULL) #####: 214: return (GSS_S_CALL_INACCESSIBLE_WRITE); #####: 215: *minor_status = 0; -: 216: #####: 217: if (context_handle == GSS_C_NO_CONTEXT) #####: 218: return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT); -: 219: #####: 220: if (max_input_size == NULL) #####: 221: return (GSS_S_CALL_INACCESSIBLE_WRITE); -: 222: -: 223: /* -: 224: * select the approprate underlying mechanism routine and -: 225: * call it. -: 226: */ -: 227: #####: 228: ctx = (gss_union_ctx_id_t) context_handle; #####: 229: mech = gssint_get_mechanism (ctx->mech_type); -: 230: #####: 231: if (!mech) #####: 232: return (GSS_S_BAD_MECH); -: 233: #####: 234: if (mech->gss_wrap_size_limit) #####: 235: major_status = mech->gss_wrap_size_limit(minor_status, -: 236: ctx->internal_ctx_id, -: 237: conf_req_flag, qop_req, -: 238: req_output_size, max_input_size); #####: 239: else if (mech->gss_wrap_iov_length) #####: 240: major_status = gssint_wrap_size_limit_iov_shim(mech, minor_status, -: 241: ctx->internal_ctx_id, -: 242: conf_req_flag, qop_req, -: 243: req_output_size, max_input_size); -: 244: else #####: 245: major_status = GSS_S_UNAVAILABLE; #####: 246: if (major_status != GSS_S_COMPLETE) #####: 247: map_error(minor_status, mech); #####: 248: return major_status; -: 249:}