1153838Sdfr/*- 2153838Sdfr * Copyright (c) 2005 Doug Rabson 3153838Sdfr * All rights reserved. 4153838Sdfr * 5153838Sdfr * Redistribution and use in source and binary forms, with or without 6153838Sdfr * modification, are permitted provided that the following conditions 7153838Sdfr * are met: 8153838Sdfr * 1. Redistributions of source code must retain the above copyright 9153838Sdfr * notice, this list of conditions and the following disclaimer. 10153838Sdfr * 2. Redistributions in binary form must reproduce the above copyright 11153838Sdfr * notice, this list of conditions and the following disclaimer in the 12153838Sdfr * documentation and/or other materials provided with the distribution. 13153838Sdfr * 14153838Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15153838Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16153838Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17153838Sdfr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18153838Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19153838Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20153838Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21153838Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22153838Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23153838Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24153838Sdfr * SUCH DAMAGE. 25153838Sdfr * 26153838Sdfr * $FreeBSD$ 27153838Sdfr */ 28153838Sdfr 29178828Sdfr#include <unistd.h> 30153838Sdfr#include <sys/queue.h> 31153838Sdfr 32153838Sdfrtypedef OM_uint32 _gss_acquire_cred_t 33153838Sdfr (OM_uint32 *, /* minor_status */ 34153838Sdfr const gss_name_t, /* desired_name */ 35153838Sdfr OM_uint32, /* time_req */ 36153838Sdfr const gss_OID_set, /* desired_mechs */ 37153838Sdfr gss_cred_usage_t, /* cred_usage */ 38153838Sdfr gss_cred_id_t *, /* output_cred_handle */ 39153838Sdfr gss_OID_set *, /* actual_mechs */ 40153838Sdfr OM_uint32 * /* time_rec */ 41153838Sdfr ); 42153838Sdfr 43153838Sdfrtypedef OM_uint32 _gss_release_cred_t 44153838Sdfr (OM_uint32 *, /* minor_status */ 45153838Sdfr gss_cred_id_t * /* cred_handle */ 46153838Sdfr ); 47153838Sdfr 48153838Sdfrtypedef OM_uint32 _gss_init_sec_context_t 49153838Sdfr (OM_uint32 *, /* minor_status */ 50153838Sdfr const gss_cred_id_t, /* initiator_cred_handle */ 51153838Sdfr gss_ctx_id_t *, /* context_handle */ 52153838Sdfr const gss_name_t, /* target_name */ 53153838Sdfr const gss_OID, /* mech_type */ 54153838Sdfr OM_uint32, /* req_flags */ 55153838Sdfr OM_uint32, /* time_req */ 56153838Sdfr const gss_channel_bindings_t, 57153838Sdfr /* input_chan_bindings */ 58153838Sdfr const gss_buffer_t, /* input_token */ 59153838Sdfr gss_OID *, /* actual_mech_type */ 60153838Sdfr gss_buffer_t, /* output_token */ 61153838Sdfr OM_uint32 *, /* ret_flags */ 62153838Sdfr OM_uint32 * /* time_rec */ 63153838Sdfr ); 64153838Sdfr 65153838Sdfrtypedef OM_uint32 _gss_accept_sec_context_t 66153838Sdfr (OM_uint32 *, /* minor_status */ 67153838Sdfr gss_ctx_id_t *, /* context_handle */ 68153838Sdfr const gss_cred_id_t, /* acceptor_cred_handle */ 69153838Sdfr const gss_buffer_t, /* input_token_buffer */ 70153838Sdfr const gss_channel_bindings_t, 71153838Sdfr /* input_chan_bindings */ 72153838Sdfr gss_name_t *, /* src_name */ 73153838Sdfr gss_OID *, /* mech_type */ 74153838Sdfr gss_buffer_t, /* output_token */ 75153838Sdfr OM_uint32 *, /* ret_flags */ 76153838Sdfr OM_uint32 *, /* time_rec */ 77153838Sdfr gss_cred_id_t * /* delegated_cred_handle */ 78153838Sdfr ); 79153838Sdfr 80153838Sdfrtypedef OM_uint32 _gss_process_context_token_t 81153838Sdfr (OM_uint32 *, /* minor_status */ 82153838Sdfr const gss_ctx_id_t, /* context_handle */ 83153838Sdfr const gss_buffer_t /* token_buffer */ 84153838Sdfr ); 85153838Sdfr 86153838Sdfrtypedef OM_uint32 _gss_delete_sec_context_t 87153838Sdfr (OM_uint32 *, /* minor_status */ 88153838Sdfr gss_ctx_id_t *, /* context_handle */ 89153838Sdfr gss_buffer_t /* output_token */ 90153838Sdfr ); 91153838Sdfr 92153838Sdfrtypedef OM_uint32 _gss_context_time_t 93153838Sdfr (OM_uint32 *, /* minor_status */ 94153838Sdfr const gss_ctx_id_t, /* context_handle */ 95153838Sdfr OM_uint32 * /* time_rec */ 96153838Sdfr ); 97153838Sdfr 98153838Sdfrtypedef OM_uint32 _gss_get_mic_t 99153838Sdfr (OM_uint32 *, /* minor_status */ 100153838Sdfr const gss_ctx_id_t, /* context_handle */ 101153838Sdfr gss_qop_t, /* qop_req */ 102153838Sdfr const gss_buffer_t, /* message_buffer */ 103153838Sdfr gss_buffer_t /* message_token */ 104153838Sdfr ); 105153838Sdfr 106153838Sdfrtypedef OM_uint32 _gss_verify_mic_t 107153838Sdfr (OM_uint32 *, /* minor_status */ 108153838Sdfr const gss_ctx_id_t, /* context_handle */ 109153838Sdfr const gss_buffer_t, /* message_buffer */ 110153838Sdfr const gss_buffer_t, /* token_buffer */ 111153838Sdfr gss_qop_t * /* qop_state */ 112153838Sdfr ); 113153838Sdfr 114153838Sdfrtypedef OM_uint32 _gss_wrap_t 115153838Sdfr (OM_uint32 *, /* minor_status */ 116153838Sdfr const gss_ctx_id_t, /* context_handle */ 117153838Sdfr int, /* conf_req_flag */ 118153838Sdfr gss_qop_t, /* qop_req */ 119153838Sdfr const gss_buffer_t, /* input_message_buffer */ 120153838Sdfr int *, /* conf_state */ 121153838Sdfr gss_buffer_t /* output_message_buffer */ 122153838Sdfr ); 123153838Sdfr 124153838Sdfrtypedef OM_uint32 _gss_unwrap_t 125153838Sdfr (OM_uint32 *, /* minor_status */ 126153838Sdfr const gss_ctx_id_t, /* context_handle */ 127153838Sdfr const gss_buffer_t, /* input_message_buffer */ 128153838Sdfr gss_buffer_t, /* output_message_buffer */ 129153838Sdfr int *, /* conf_state */ 130153838Sdfr gss_qop_t * /* qop_state */ 131153838Sdfr ); 132153838Sdfr 133153838Sdfrtypedef OM_uint32 _gss_display_status_t 134153838Sdfr (OM_uint32 *, /* minor_status */ 135153838Sdfr OM_uint32, /* status_value */ 136153838Sdfr int, /* status_type */ 137153838Sdfr const gss_OID, /* mech_type */ 138153838Sdfr OM_uint32 *, /* message_context */ 139153838Sdfr gss_buffer_t /* status_string */ 140153838Sdfr ); 141153838Sdfr 142153838Sdfrtypedef OM_uint32 _gss_indicate_mechs_t 143153838Sdfr (OM_uint32 *, /* minor_status */ 144153838Sdfr gss_OID_set * /* mech_set */ 145153838Sdfr ); 146153838Sdfr 147153838Sdfrtypedef OM_uint32 _gss_compare_name_t 148153838Sdfr (OM_uint32 *, /* minor_status */ 149153838Sdfr const gss_name_t, /* name1 */ 150153838Sdfr const gss_name_t, /* name2 */ 151153838Sdfr int * /* name_equal */ 152153838Sdfr ); 153153838Sdfr 154153838Sdfrtypedef OM_uint32 _gss_display_name_t 155153838Sdfr (OM_uint32 *, /* minor_status */ 156153838Sdfr const gss_name_t, /* input_name */ 157153838Sdfr gss_buffer_t, /* output_name_buffer */ 158153838Sdfr gss_OID * /* output_name_type */ 159153838Sdfr ); 160153838Sdfr 161153838Sdfrtypedef OM_uint32 _gss_import_name_t 162153838Sdfr (OM_uint32 *, /* minor_status */ 163153838Sdfr const gss_buffer_t, /* input_name_buffer */ 164153838Sdfr const gss_OID, /* input_name_type */ 165153838Sdfr gss_name_t * /* output_name */ 166153838Sdfr ); 167153838Sdfr 168153838Sdfrtypedef OM_uint32 _gss_export_name_t 169153838Sdfr (OM_uint32 *, /* minor_status */ 170153838Sdfr const gss_name_t, /* input_name */ 171153838Sdfr gss_buffer_t /* exported_name */ 172153838Sdfr ); 173153838Sdfr 174153838Sdfrtypedef OM_uint32 _gss_release_name_t 175153838Sdfr (OM_uint32 *, /* minor_status */ 176153838Sdfr gss_name_t * /* input_name */ 177153838Sdfr ); 178153838Sdfr 179153838Sdfrtypedef OM_uint32 _gss_inquire_cred_t 180153838Sdfr (OM_uint32 *, /* minor_status */ 181153838Sdfr const gss_cred_id_t, /* cred_handle */ 182153838Sdfr gss_name_t *, /* name */ 183153838Sdfr OM_uint32 *, /* lifetime */ 184153838Sdfr gss_cred_usage_t *, /* cred_usage */ 185153838Sdfr gss_OID_set * /* mechanisms */ 186153838Sdfr ); 187153838Sdfr 188153838Sdfrtypedef OM_uint32 _gss_inquire_context_t 189153838Sdfr (OM_uint32 *, /* minor_status */ 190153838Sdfr const gss_ctx_id_t, /* context_handle */ 191153838Sdfr gss_name_t *, /* src_name */ 192153838Sdfr gss_name_t *, /* targ_name */ 193153838Sdfr OM_uint32 *, /* lifetime_rec */ 194153838Sdfr gss_OID *, /* mech_type */ 195153838Sdfr OM_uint32 *, /* ctx_flags */ 196153838Sdfr int *, /* locally_initiated */ 197153838Sdfr int * /* open */ 198153838Sdfr ); 199153838Sdfr 200153838Sdfrtypedef OM_uint32 _gss_wrap_size_limit_t 201153838Sdfr (OM_uint32 *, /* minor_status */ 202153838Sdfr const gss_ctx_id_t, /* context_handle */ 203153838Sdfr int, /* conf_req_flag */ 204153838Sdfr gss_qop_t, /* qop_req */ 205153838Sdfr OM_uint32, /* req_output_size */ 206153838Sdfr OM_uint32 * /* max_input_size */ 207153838Sdfr ); 208153838Sdfr 209153838Sdfrtypedef OM_uint32 _gss_add_cred_t ( 210153838Sdfr OM_uint32 *, /* minor_status */ 211153838Sdfr const gss_cred_id_t, /* input_cred_handle */ 212153838Sdfr const gss_name_t, /* desired_name */ 213153838Sdfr const gss_OID, /* desired_mech */ 214153838Sdfr gss_cred_usage_t, /* cred_usage */ 215153838Sdfr OM_uint32, /* initiator_time_req */ 216153838Sdfr OM_uint32, /* acceptor_time_req */ 217153838Sdfr gss_cred_id_t *, /* output_cred_handle */ 218153838Sdfr gss_OID_set *, /* actual_mechs */ 219153838Sdfr OM_uint32 *, /* initiator_time_rec */ 220153838Sdfr OM_uint32 * /* acceptor_time_rec */ 221153838Sdfr ); 222153838Sdfr 223153838Sdfrtypedef OM_uint32 _gss_inquire_cred_by_mech_t ( 224153838Sdfr OM_uint32 *, /* minor_status */ 225153838Sdfr const gss_cred_id_t, /* cred_handle */ 226153838Sdfr const gss_OID, /* mech_type */ 227153838Sdfr gss_name_t *, /* name */ 228153838Sdfr OM_uint32 *, /* initiator_lifetime */ 229153838Sdfr OM_uint32 *, /* acceptor_lifetime */ 230153838Sdfr gss_cred_usage_t * /* cred_usage */ 231153838Sdfr ); 232153838Sdfr 233153838Sdfrtypedef OM_uint32 _gss_export_sec_context_t ( 234153838Sdfr OM_uint32 *, /* minor_status */ 235153838Sdfr gss_ctx_id_t *, /* context_handle */ 236153838Sdfr gss_buffer_t /* interprocess_token */ 237153838Sdfr ); 238153838Sdfr 239153838Sdfrtypedef OM_uint32 _gss_import_sec_context_t ( 240153838Sdfr OM_uint32 *, /* minor_status */ 241153838Sdfr const gss_buffer_t, /* interprocess_token */ 242153838Sdfr gss_ctx_id_t * /* context_handle */ 243153838Sdfr ); 244153838Sdfr 245153838Sdfrtypedef OM_uint32 _gss_inquire_names_for_mech_t ( 246153838Sdfr OM_uint32 *, /* minor_status */ 247153838Sdfr const gss_OID, /* mechanism */ 248153838Sdfr gss_OID_set * /* name_types */ 249153838Sdfr ); 250153838Sdfr 251153838Sdfrtypedef OM_uint32 _gss_inquire_mechs_for_name_t ( 252153838Sdfr OM_uint32 *, /* minor_status */ 253153838Sdfr const gss_name_t, /* input_name */ 254153838Sdfr gss_OID_set * /* mech_types */ 255153838Sdfr ); 256153838Sdfr 257153838Sdfrtypedef OM_uint32 _gss_canonicalize_name_t ( 258153838Sdfr OM_uint32 *, /* minor_status */ 259153838Sdfr const gss_name_t, /* input_name */ 260153838Sdfr const gss_OID, /* mech_type */ 261153838Sdfr gss_name_t * /* output_name */ 262153838Sdfr ); 263153838Sdfr 264153838Sdfrtypedef OM_uint32 _gss_duplicate_name_t ( 265153838Sdfr OM_uint32 *, /* minor_status */ 266153838Sdfr const gss_name_t, /* src_name */ 267153838Sdfr gss_name_t * /* dest_name */ 268153838Sdfr ); 269153838Sdfr 270178828Sdfrtypedef OM_uint32 _gss_inquire_sec_context_by_oid 271178828Sdfr (OM_uint32 *, /* minor_status */ 272178828Sdfr const gss_ctx_id_t, /* context_handle */ 273178828Sdfr const gss_OID, /* desired_object */ 274178828Sdfr gss_buffer_set_t * /* result */ 275153838Sdfr ); 276153838Sdfr 277178828Sdfrtypedef OM_uint32 _gss_inquire_cred_by_oid 278178828Sdfr (OM_uint32 *, /* bminor_status */ 279178828Sdfr const gss_cred_id_t, /* cred_handle, */ 280178828Sdfr const gss_OID, /* desired_object */ 281178828Sdfr gss_buffer_set_t * /* data_set */ 282153838Sdfr ); 283153838Sdfr 284178828Sdfrtypedef OM_uint32 _gss_set_sec_context_option 285178828Sdfr (OM_uint32 *, /* minor status */ 286178828Sdfr gss_ctx_id_t *, /* context */ 287178828Sdfr const gss_OID, /* option to set */ 288178828Sdfr const gss_buffer_t /* option value */ 289153838Sdfr ); 290153838Sdfr 291178828Sdfrtypedef OM_uint32 _gss_set_cred_option 292178828Sdfr (OM_uint32 *, /* minor status */ 293178828Sdfr gss_cred_id_t *, /* cred */ 294178828Sdfr const gss_OID, /* option to set */ 295178828Sdfr const gss_buffer_t /* option value */ 296178828Sdfr ); 297178828Sdfr 298178828Sdfrtypedef OM_uint32 _gss_pseudo_random 299178828Sdfr (OM_uint32 *, /* minor status */ 300178828Sdfr gss_ctx_id_t, /* context */ 301178828Sdfr int, /* PRF key */ 302178828Sdfr const gss_buffer_t, /* PRF input */ 303178828Sdfr ssize_t, /* desired output length */ 304178828Sdfr gss_buffer_t /* PRF output */ 305178828Sdfr ); 306178828Sdfr 307181344Sdfrtypedef OM_uint32 _gss_pname_to_uid 308181344Sdfr (OM_uint32 *, /* minor status */ 309181344Sdfr gss_name_t pname, /* principal name */ 310181344Sdfr gss_OID mech, /* mechanism to query */ 311181344Sdfr uid_t *uidp /* pointer to UID for result */ 312181344Sdfr ); 313181344Sdfr 314153838Sdfrstruct _gss_mech_switch { 315153838Sdfr SLIST_ENTRY(_gss_mech_switch) gm_link; 316178828Sdfr const char *gm_name_prefix; 317153838Sdfr gss_OID_desc gm_mech_oid; 318153838Sdfr void *gm_so; 319153838Sdfr _gss_acquire_cred_t *gm_acquire_cred; 320153838Sdfr _gss_release_cred_t *gm_release_cred; 321153838Sdfr _gss_init_sec_context_t *gm_init_sec_context; 322153838Sdfr _gss_accept_sec_context_t *gm_accept_sec_context; 323153838Sdfr _gss_process_context_token_t *gm_process_context_token; 324153838Sdfr _gss_delete_sec_context_t *gm_delete_sec_context; 325153838Sdfr _gss_context_time_t *gm_context_time; 326153838Sdfr _gss_get_mic_t *gm_get_mic; 327153838Sdfr _gss_verify_mic_t *gm_verify_mic; 328153838Sdfr _gss_wrap_t *gm_wrap; 329153838Sdfr _gss_unwrap_t *gm_unwrap; 330153838Sdfr _gss_display_status_t *gm_display_status; 331153838Sdfr _gss_indicate_mechs_t *gm_indicate_mechs; 332153838Sdfr _gss_compare_name_t *gm_compare_name; 333153838Sdfr _gss_display_name_t *gm_display_name; 334153838Sdfr _gss_import_name_t *gm_import_name; 335153838Sdfr _gss_export_name_t *gm_export_name; 336153838Sdfr _gss_release_name_t *gm_release_name; 337153838Sdfr _gss_inquire_cred_t *gm_inquire_cred; 338153838Sdfr _gss_inquire_context_t *gm_inquire_context; 339153838Sdfr _gss_wrap_size_limit_t *gm_wrap_size_limit; 340153838Sdfr _gss_add_cred_t *gm_add_cred; 341153838Sdfr _gss_inquire_cred_by_mech_t *gm_inquire_cred_by_mech; 342153838Sdfr _gss_export_sec_context_t *gm_export_sec_context; 343153838Sdfr _gss_import_sec_context_t *gm_import_sec_context; 344153838Sdfr _gss_inquire_names_for_mech_t *gm_inquire_names_for_mech; 345153838Sdfr _gss_inquire_mechs_for_name_t *gm_inquire_mechs_for_name; 346153838Sdfr _gss_canonicalize_name_t *gm_canonicalize_name; 347153838Sdfr _gss_duplicate_name_t *gm_duplicate_name; 348178828Sdfr _gss_inquire_sec_context_by_oid *gm_inquire_sec_context_by_oid; 349178828Sdfr _gss_inquire_cred_by_oid *gm_inquire_cred_by_oid; 350178828Sdfr _gss_set_sec_context_option *gm_set_sec_context_option; 351178828Sdfr _gss_set_cred_option *gm_set_cred_option; 352178828Sdfr _gss_pseudo_random *gm_pseudo_random; 353181344Sdfr _gss_pname_to_uid *gm_pname_to_uid; 354153838Sdfr}; 355153838SdfrSLIST_HEAD(_gss_mech_switch_list, _gss_mech_switch); 356153838Sdfrextern struct _gss_mech_switch_list _gss_mechs; 357153838Sdfrextern gss_OID_set _gss_mech_oids; 358153838Sdfr 359153838Sdfrextern void _gss_load_mech(void); 360153838Sdfrextern struct _gss_mech_switch *_gss_find_mech_switch(gss_OID); 361178828Sdfrextern void _gss_mg_error(struct _gss_mech_switch *m, OM_uint32 maj, 362178828Sdfr OM_uint32 min); 363233294Sstasextern void _gss_mg_collect_error(gss_OID mech, OM_uint32 maj, OM_uint32 min); 364