diff options
Diffstat (limited to 'lib/gssapi/spnego/context_stubs.c')
| -rw-r--r-- | lib/gssapi/spnego/context_stubs.c | 373 | 
1 files changed, 141 insertions, 232 deletions
| diff --git a/lib/gssapi/spnego/context_stubs.c b/lib/gssapi/spnego/context_stubs.c index 3535c7bb3596..60b348ec4676 100644 --- a/lib/gssapi/spnego/context_stubs.c +++ b/lib/gssapi/spnego/context_stubs.c @@ -30,16 +30,14 @@   * SUCH DAMAGE.   */ -#include "spnego/spnego_locl.h" - -RCSID("$Id: context_stubs.c 21035 2007-06-09 15:32:47Z lha $"); +#include "spnego_locl.h"  static OM_uint32  spnego_supported_mechs(OM_uint32 *minor_status, gss_OID_set *mechs)  {      OM_uint32 ret, junk;      gss_OID_set m; -    int i; +    size_t i;      ret = gss_indicate_mechs(minor_status, &m);      if (ret != GSS_S_COMPLETE) @@ -62,12 +60,13 @@ spnego_supported_mechs(OM_uint32 *minor_status, gss_OID_set *mechs)  	    return ret;  	}      } +    gss_release_oid_set(&junk, &m);      return ret;  } -OM_uint32 _gss_spnego_process_context_token +OM_uint32 GSSAPI_CALLCONV _gss_spnego_process_context_token             (OM_uint32 *minor_status,              const gss_ctx_id_t context_handle,              const gss_buffer_t token_buffer @@ -100,7 +99,7 @@ OM_uint32 _gss_spnego_process_context_token  					   GSS_C_NO_BUFFER);  } -OM_uint32 _gss_spnego_delete_sec_context +OM_uint32 GSSAPI_CALLCONV _gss_spnego_delete_sec_context             (OM_uint32 *minor_status,              gss_ctx_id_t *context_handle,              gss_buffer_t output_token @@ -120,7 +119,7 @@ OM_uint32 _gss_spnego_delete_sec_context  						   output_token);  } -OM_uint32 _gss_spnego_context_time +OM_uint32 GSSAPI_CALLCONV _gss_spnego_context_time             (OM_uint32 *minor_status,              const gss_ctx_id_t context_handle,              OM_uint32 *time_rec @@ -144,7 +143,7 @@ OM_uint32 _gss_spnego_context_time  			    time_rec);  } -OM_uint32 _gss_spnego_get_mic +OM_uint32 GSSAPI_CALLCONV _gss_spnego_get_mic             (OM_uint32 *minor_status,              const gss_ctx_id_t context_handle,              gss_qop_t qop_req, @@ -170,7 +169,7 @@ OM_uint32 _gss_spnego_get_mic  		       qop_req, message_buffer, message_token);  } -OM_uint32 _gss_spnego_verify_mic +OM_uint32 GSSAPI_CALLCONV _gss_spnego_verify_mic             (OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,              const gss_buffer_t message_buffer, @@ -199,7 +198,7 @@ OM_uint32 _gss_spnego_verify_mic  			  qop_state);  } -OM_uint32 _gss_spnego_wrap +OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap             (OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,              int conf_req_flag, @@ -232,7 +231,7 @@ OM_uint32 _gss_spnego_wrap  		    output_message_buffer);  } -OM_uint32 _gss_spnego_unwrap +OM_uint32 GSSAPI_CALLCONV _gss_spnego_unwrap             (OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,              const gss_buffer_t input_message_buffer, @@ -263,19 +262,7 @@ OM_uint32 _gss_spnego_unwrap  		      qop_state);  } -OM_uint32 _gss_spnego_display_status -           (OM_uint32 * minor_status, -            OM_uint32 status_value, -            int status_type, -            const gss_OID mech_type, -            OM_uint32 * message_context, -            gss_buffer_t status_string -           ) -{ -    return GSS_S_FAILURE; -} - -OM_uint32 _gss_spnego_compare_name +OM_uint32 GSSAPI_CALLCONV _gss_spnego_compare_name             (OM_uint32 *minor_status,              const gss_name_t name1,              const gss_name_t name2, @@ -299,7 +286,7 @@ OM_uint32 _gss_spnego_compare_name      return GSS_S_COMPLETE;  } -OM_uint32 _gss_spnego_display_name +OM_uint32 GSSAPI_CALLCONV _gss_spnego_display_name             (OM_uint32 * minor_status,              const gss_name_t input_name,              gss_buffer_t output_name_buffer, @@ -317,7 +304,7 @@ OM_uint32 _gss_spnego_display_name  			    output_name_buffer, output_name_type);  } -OM_uint32 _gss_spnego_import_name +OM_uint32 GSSAPI_CALLCONV _gss_spnego_import_name             (OM_uint32 * minor_status,              const gss_buffer_t name_buffer,              const gss_OID name_type, @@ -334,13 +321,13 @@ OM_uint32 _gss_spnego_import_name  	*minor_status = ENOMEM;  	return GSS_S_FAILURE;      } -     +      maj_stat = _gss_copy_oid(minor_status, name_type, &name->type);      if (maj_stat) {  	free(name);  	return GSS_S_FAILURE;      } -     +      maj_stat = _gss_copy_buffer(minor_status, name_buffer, &name->value);      if (maj_stat) {  	gss_name_t rname = (gss_name_t)name; @@ -353,7 +340,7 @@ OM_uint32 _gss_spnego_import_name      return GSS_S_COMPLETE;  } -OM_uint32 _gss_spnego_export_name +OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_name             (OM_uint32  * minor_status,              const gss_name_t input_name,              gss_buffer_t exported_name @@ -372,7 +359,7 @@ OM_uint32 _gss_spnego_export_name      return gss_export_name(minor_status, name->mech, exported_name);  } -OM_uint32 _gss_spnego_release_name +OM_uint32 GSSAPI_CALLCONV _gss_spnego_release_name             (OM_uint32 * minor_status,              gss_name_t * input_name             ) @@ -393,7 +380,7 @@ OM_uint32 _gss_spnego_release_name      return GSS_S_COMPLETE;  } -OM_uint32 _gss_spnego_inquire_context ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context (              OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,              gss_name_t * src_name, @@ -406,31 +393,61 @@ OM_uint32 _gss_spnego_inquire_context (             )  {      gssspnego_ctx ctx; +    OM_uint32 maj_stat, junk; +    gss_name_t src_mn, targ_mn;      *minor_status = 0; -    if (context_handle == GSS_C_NO_CONTEXT) { +    if (context_handle == GSS_C_NO_CONTEXT)  	return GSS_S_NO_CONTEXT; -    }      ctx = (gssspnego_ctx)context_handle; -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { +    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)  	return GSS_S_NO_CONTEXT; -    } -    return gss_inquire_context(minor_status, -			       ctx->negotiated_ctx_id, -			       src_name, -			       targ_name, -			       lifetime_rec, -			       mech_type, -			       ctx_flags, -			       locally_initiated, -			       open_context); +    maj_stat = gss_inquire_context(minor_status, +				   ctx->negotiated_ctx_id, +				   &src_mn, +				   &targ_mn, +				   lifetime_rec, +				   mech_type, +				   ctx_flags, +				   locally_initiated, +				   open_context); +    if (maj_stat != GSS_S_COMPLETE) +	return maj_stat; + +    if (src_name) { +	spnego_name name = calloc(1, sizeof(*name)); +	if (name == NULL) +	    goto enomem; +	name->mech = src_mn; +	*src_name = (gss_name_t)name; +    } else +	gss_release_name(&junk, &src_mn); + +    if (targ_name) { +	spnego_name name = calloc(1, sizeof(*name)); +	if (name == NULL) { +	    gss_release_name(minor_status, src_name); +	    goto enomem; +	} +	name->mech = targ_mn; +	*targ_name = (gss_name_t)name; +    } else +	gss_release_name(&junk, &targ_mn); + +    return GSS_S_COMPLETE; + +enomem: +    gss_release_name(&junk, &targ_mn); +    gss_release_name(&junk, &src_mn); +    *minor_status = ENOMEM; +    return GSS_S_FAILURE;  } -OM_uint32 _gss_spnego_wrap_size_limit ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap_size_limit (              OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,              int conf_req_flag, @@ -461,7 +478,7 @@ OM_uint32 _gss_spnego_wrap_size_limit (  			       max_input_size);  } -OM_uint32 _gss_spnego_export_sec_context ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_sec_context (              OM_uint32 * minor_status,              gss_ctx_id_t * context_handle,              gss_buffer_t interprocess_token @@ -504,7 +521,7 @@ OM_uint32 _gss_spnego_export_sec_context (      return ret;  } -OM_uint32 _gss_spnego_import_sec_context ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_import_sec_context (              OM_uint32 * minor_status,              const gss_buffer_t interprocess_token,              gss_ctx_id_t *context_handle @@ -540,7 +557,7 @@ OM_uint32 _gss_spnego_import_sec_context (      return GSS_S_COMPLETE;  } -OM_uint32 _gss_spnego_inquire_names_for_mech ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_names_for_mech (              OM_uint32 * minor_status,              const gss_OID mechanism,              gss_OID_set * name_types @@ -548,7 +565,7 @@ OM_uint32 _gss_spnego_inquire_names_for_mech (  {      gss_OID_set mechs, names, n;      OM_uint32 ret, junk; -    int i, j; +    size_t i, j;      *name_types = NULL; @@ -580,10 +597,10 @@ out:      gss_release_oid_set(&junk, &mechs); -    return GSS_S_COMPLETE; +    return ret;  } -OM_uint32 _gss_spnego_inquire_mechs_for_name ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_mechs_for_name (              OM_uint32 * minor_status,              const gss_name_t input_name,              gss_OID_set * mech_types @@ -604,7 +621,7 @@ OM_uint32 _gss_spnego_inquire_mechs_for_name (      return ret;  } -OM_uint32 _gss_spnego_canonicalize_name ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_canonicalize_name (              OM_uint32 * minor_status,              const gss_name_t input_name,              const gss_OID mech_type, @@ -615,7 +632,7 @@ OM_uint32 _gss_spnego_canonicalize_name (      return gss_duplicate_name(minor_status, input_name, output_name);  } -OM_uint32 _gss_spnego_duplicate_name ( +OM_uint32 GSSAPI_CALLCONV _gss_spnego_duplicate_name (              OM_uint32 * minor_status,              const gss_name_t src_name,              gss_name_t * dest_name @@ -624,207 +641,71 @@ OM_uint32 _gss_spnego_duplicate_name (      return gss_duplicate_name(minor_status, src_name, dest_name);  } -OM_uint32 _gss_spnego_sign -           (OM_uint32 * minor_status, -            gss_ctx_id_t context_handle, -            int qop_req, -            gss_buffer_t message_buffer, -            gss_buffer_t message_token -           ) +OM_uint32 GSSAPI_CALLCONV +_gss_spnego_wrap_iov(OM_uint32 * minor_status, +		     gss_ctx_id_t  context_handle, +		     int conf_req_flag, +		     gss_qop_t qop_req, +		     int * conf_state, +		     gss_iov_buffer_desc *iov, +		     int iov_count)  { -    gssspnego_ctx ctx; +    gssspnego_ctx ctx = (gssspnego_ctx)context_handle;      *minor_status = 0; -    if (context_handle == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    ctx = (gssspnego_ctx)context_handle; - -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { +    if (ctx == NULL || ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)  	return GSS_S_NO_CONTEXT; -    } -    return gss_sign(minor_status, -		    ctx->negotiated_ctx_id, -		    qop_req, -		    message_buffer, -		    message_token); +    return gss_wrap_iov(minor_status, ctx->negotiated_ctx_id, +			conf_req_flag, qop_req, conf_state, +			iov, iov_count);  } -OM_uint32 _gss_spnego_verify -           (OM_uint32 * minor_status, -            gss_ctx_id_t context_handle, -            gss_buffer_t message_buffer, -            gss_buffer_t token_buffer, -            int * qop_state -           ) +OM_uint32 GSSAPI_CALLCONV +_gss_spnego_unwrap_iov(OM_uint32 *minor_status, +		       gss_ctx_id_t context_handle, +		       int *conf_state, +		       gss_qop_t *qop_state, +		       gss_iov_buffer_desc *iov, +		       int iov_count)  { -    gssspnego_ctx ctx; +    gssspnego_ctx ctx = (gssspnego_ctx)context_handle;      *minor_status = 0; -    if (context_handle == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    ctx = (gssspnego_ctx)context_handle; - -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { +    if (ctx == NULL || ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)  	return GSS_S_NO_CONTEXT; -    } -    return gss_verify(minor_status, -		      ctx->negotiated_ctx_id, -		      message_buffer, -		      token_buffer, -		      qop_state); +    return gss_unwrap_iov(minor_status, +			  ctx->negotiated_ctx_id, +			  conf_state, qop_state, +			  iov, iov_count);  } -OM_uint32 _gss_spnego_seal -           (OM_uint32 * minor_status, -            gss_ctx_id_t context_handle, -            int conf_req_flag, -            int qop_req, -            gss_buffer_t input_message_buffer, -            int * conf_state, -            gss_buffer_t output_message_buffer -           ) +OM_uint32 GSSAPI_CALLCONV +_gss_spnego_wrap_iov_length(OM_uint32 * minor_status, +			    gss_ctx_id_t context_handle, +			    int conf_req_flag, +			    gss_qop_t qop_req, +			    int *conf_state, +			    gss_iov_buffer_desc *iov, +			    int iov_count)  { -    gssspnego_ctx ctx; +    gssspnego_ctx ctx = (gssspnego_ctx)context_handle;      *minor_status = 0; -    if (context_handle == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    ctx = (gssspnego_ctx)context_handle; - -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { +    if (ctx == NULL || ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)  	return GSS_S_NO_CONTEXT; -    } -    return gss_seal(minor_status, -		    ctx->negotiated_ctx_id, -		    conf_req_flag, -		    qop_req, -		    input_message_buffer, -		    conf_state, -		    output_message_buffer); -} - -OM_uint32 _gss_spnego_unseal -           (OM_uint32 * minor_status, -            gss_ctx_id_t context_handle, -            gss_buffer_t input_message_buffer, -            gss_buffer_t output_message_buffer, -            int * conf_state, -            int * qop_state -           ) -{ -    gssspnego_ctx ctx; - -    *minor_status = 0; - -    if (context_handle == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    ctx = (gssspnego_ctx)context_handle; - -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    return gss_unseal(minor_status, -		      ctx->negotiated_ctx_id, -		      input_message_buffer, -		      output_message_buffer, -		      conf_state, -		      qop_state); +    return gss_wrap_iov_length(minor_status, ctx->negotiated_ctx_id, +			       conf_req_flag, qop_req, conf_state, +			       iov, iov_count);  }  #if 0 -OM_uint32 _gss_spnego_unwrap_ex -           (OM_uint32 * minor_status, -            const gss_ctx_id_t context_handle, -	    const gss_buffer_t token_header_buffer, -	    const gss_buffer_t associated_data_buffer, -	    const gss_buffer_t input_message_buffer, -	    gss_buffer_t output_message_buffer, -	    int * conf_state, -	    gss_qop_t * qop_state) -{ -    gssspnego_ctx ctx; - -    *minor_status = 0; - -    if (context_handle == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    ctx = (gssspnego_ctx)context_handle; - -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    return gss_unwrap_ex(minor_status, -			 ctx->negotiated_ctx_id, -			 token_header_buffer, -			 associated_data_buffer, -			 input_message_buffer, -			 output_message_buffer, -			 conf_state, -			 qop_state); -} - -OM_uint32 _gss_spnego_wrap_ex -           (OM_uint32 * minor_status, -            const gss_ctx_id_t context_handle, -            int conf_req_flag, -            gss_qop_t qop_req, -            const gss_buffer_t associated_data_buffer, -            const gss_buffer_t input_message_buffer, -            int * conf_state, -            gss_buffer_t output_token_buffer, -            gss_buffer_t output_message_buffer -	   ) -{ -    gssspnego_ctx ctx; - -    *minor_status = 0; - -    if (context_handle == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    ctx = (gssspnego_ctx)context_handle; - -    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) { -	return GSS_S_NO_CONTEXT; -    } - -    if ((ctx->mech_flags & GSS_C_DCE_STYLE) == 0 && -	associated_data_buffer->length != input_message_buffer->length) { -	*minor_status = EINVAL; -	return GSS_S_BAD_QOP; -    } - -    return gss_wrap_ex(minor_status, -		       ctx->negotiated_ctx_id, -		       conf_req_flag, -		       qop_req, -		       associated_data_buffer, -		       input_message_buffer, -		       conf_state, -		       output_token_buffer, -		       output_message_buffer); -} - -OM_uint32 _gss_spnego_complete_auth_token +OM_uint32 GSSAPI_CALLCONV _gss_spnego_complete_auth_token             (OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,  	    gss_buffer_t input_message_buffer) @@ -849,7 +730,7 @@ OM_uint32 _gss_spnego_complete_auth_token  }  #endif -OM_uint32 _gss_spnego_inquire_sec_context_by_oid +OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_sec_context_by_oid             (OM_uint32 * minor_status,              const gss_ctx_id_t context_handle,              const gss_OID desired_object, @@ -875,7 +756,7 @@ OM_uint32 _gss_spnego_inquire_sec_context_by_oid  					  data_set);  } -OM_uint32 _gss_spnego_set_sec_context_option +OM_uint32 GSSAPI_CALLCONV _gss_spnego_set_sec_context_option             (OM_uint32 * minor_status,              gss_ctx_id_t * context_handle,              const gss_OID desired_object, @@ -889,7 +770,7 @@ OM_uint32 _gss_spnego_set_sec_context_option  	return GSS_S_NO_CONTEXT;      } -    ctx = (gssspnego_ctx)context_handle; +    ctx = (gssspnego_ctx)*context_handle;      if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {  	return GSS_S_NO_CONTEXT; @@ -901,3 +782,31 @@ OM_uint32 _gss_spnego_set_sec_context_option  				      value);  } + +OM_uint32 GSSAPI_CALLCONV +_gss_spnego_pseudo_random(OM_uint32 *minor_status, +			  gss_ctx_id_t context_handle, +			  int prf_key, +			  const gss_buffer_t prf_in, +			  ssize_t desired_output_len, +			  gss_buffer_t prf_out) +{ +    gssspnego_ctx ctx; + +    *minor_status = 0; + +    if (context_handle == GSS_C_NO_CONTEXT) +	return GSS_S_NO_CONTEXT; + +    ctx = (gssspnego_ctx)context_handle; + +    if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) +	return GSS_S_NO_CONTEXT; + +    return gss_pseudo_random(minor_status, +			     ctx->negotiated_ctx_id, +			     prf_key, +			     prf_in, +			     desired_output_len, +			     prf_out); +} | 
