1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 /*
  26  *  glue routine gss_unseal
  27  */
  28 
  29 #include <mechglueP.h>
  30 #include "gssapiP_generic.h"
  31 
  32 OM_uint32
  33 gss_unseal(minor_status,
  34                 context_handle,
  35                 input_message_buffer,
  36                 output_message_buffer,
  37                 conf_state,
  38                 qop_state)
  39 
  40 OM_uint32 *             minor_status;
  41 gss_ctx_id_t            context_handle;
  42 gss_buffer_t            input_message_buffer;
  43 gss_buffer_t            output_message_buffer;
  44 int *                   conf_state;
  45 int *                   qop_state;
  46 
  47 {
  48         OM_uint32               status;
  49         gss_union_ctx_id_t      ctx;
  50         gss_mechanism           mech;
  51 
  52         if (minor_status != NULL)
  53                 *minor_status = 0;
  54 
  55         if (output_message_buffer != GSS_C_NO_BUFFER) {
  56                 output_message_buffer->length = 0;
  57                 output_message_buffer->value = NULL;
  58         }
  59 
  60         if (minor_status == NULL)
  61                 return (GSS_S_CALL_INACCESSIBLE_WRITE);
  62 
  63         if (context_handle == GSS_C_NO_CONTEXT)
  64                 return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT);
  65 
  66         if (input_message_buffer == GSS_C_NO_BUFFER ||
  67             GSS_EMPTY_BUFFER(input_message_buffer))
  68                 return (GSS_S_CALL_INACCESSIBLE_READ);
  69 
  70         if (output_message_buffer == GSS_C_NO_BUFFER)
  71                 return (GSS_S_CALL_INACCESSIBLE_WRITE);
  72 
  73         /*
  74          * select the approprate underlying mechanism routine and
  75          * call it.
  76          */
  77 
  78         ctx = (gss_union_ctx_id_t) context_handle;
  79         mech = __gss_get_mechanism(ctx->mech_type);
  80 
  81         if (mech) {
  82                 if (mech->gss_unseal) {
  83                         status = mech->gss_unseal(
  84                                                 mech->context,
  85                                                 minor_status,
  86                                                 ctx->internal_ctx_id,
  87                                                 input_message_buffer,
  88                                                 output_message_buffer,
  89                                                 conf_state,
  90                                                 qop_state);
  91                         if (status != GSS_S_COMPLETE)
  92                                 map_error(minor_status, mech);
  93                 } else
  94                         status = GSS_S_UNAVAILABLE;
  95 
  96                 return (status);
  97         }
  98 
  99         return (GSS_S_BAD_MECH);
 100 }
 101 
 102 OM_uint32
 103 gss_unwrap(minor_status,
 104                 context_handle,
 105                 input_message_buffer,
 106                 output_message_buffer,
 107                 conf_state,
 108                 qop_state)
 109 
 110 OM_uint32 *             minor_status;
 111 const gss_ctx_id_t      context_handle;
 112 const gss_buffer_t      input_message_buffer;
 113 gss_buffer_t            output_message_buffer;
 114 int *                   conf_state;
 115 gss_qop_t *             qop_state;
 116 
 117 {
 118         return (gss_unseal(minor_status, (gss_ctx_id_t)context_handle,
 119                         (gss_buffer_t)input_message_buffer,
 120                         output_message_buffer, conf_state, (int *) qop_state));
 121 }