1/* 2 * Copyright (c) 2008-2010 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Portions Copyright (c) 2008-2010 Apple Inc. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <Heimdal/krb5_err.h> 37#include <errno.h> 38#include <inttypes.h> 39 40#include <asl.h> 41#include <syslog.h> 42#include <stdlib.h> 43 44/* 45 * errors copied here since pulling in <GSS/gssapi.h> also pulls in 46 * rewrite macros that make other functions below no have the right 47 * name 48 */ 49#define GSS_C_ROUTINE_ERROR_OFFSET 16 50 51#define GSS_S_FAILURE (((uint32_t) 13ul) << GSS_C_ROUTINE_ERROR_OFFSET) 52#define GSS_S_NO_CONTEXT (((uint32_t) 8ul) << GSS_C_ROUTINE_ERROR_OFFSET) 53#define GSS_S_UNAVAILABLE (((uint32_t) 16ul) << GSS_C_ROUTINE_ERROR_OFFSET) 54#define KRB5_CC_READONLY (-1765328138L) 55 56void 57mshim_log_function_missing(const char *func) 58{ 59 aslmsg m = asl_new(ASL_TYPE_MSG); 60 asl_set(m, "com.apple.message.domain", "com.apple.kerberos.mshim.missing-function" ); 61 asl_set(m, "com.apple.message.signature", func); 62 asl_set(m, "com.apple.message.signature2", getprogname()); 63 asl_log(NULL, m, ASL_LEVEL_NOTICE, 64 "function %s not implemented, but used by %s", func, getprogname()); 65 asl_free(m); 66 67 syslog(LOG_ERR, "MITKerberosShim: function %s not implemented", func); 68} 69 70#define dummy(func, ret) int func() { mshim_log_function_missing(__func__); return (ret); } 71 72#define quietdummy(func, ret) int func() { return (ret); } 73 74 75dummy(add_error_table, 0); 76dummy(cc_close, 0); 77dummy(cc_create, 0); 78dummy(cc_destroy, 0); 79dummy(cc_free_NC_info, 0); 80dummy(cc_free_creds, 0); 81dummy(cc_free_name, 0); 82dummy(cc_free_principal, 0); 83dummy(cc_get_NC_info, 0); 84dummy(cc_get_change_time, 0); 85dummy(cc_get_cred_version, 0); 86dummy(cc_get_name, 0); 87dummy(cc_get_principal, 0); 88dummy(cc_open, 0); 89dummy(cc_remove_cred, 0); 90dummy(cc_seq_fetch_NCs_begin, 0); 91dummy(cc_seq_fetch_NCs_end, 0); 92dummy(cc_seq_fetch_NCs_next, 0); 93dummy(cc_seq_fetch_creds_begin, 0); 94dummy(cc_seq_fetch_creds_end, 0); 95dummy(cc_seq_fetch_creds_next, 0); 96dummy(cc_set_principal, 0); 97dummy(cc_shutdown, 0); 98dummy(cc_store, 0); 99dummy(encode_krb5_as_req, 0); 100dummy(gss_krb5_ui, 0); 101dummy(gss_str_to_oid, GSS_S_FAILURE); 102dummy(krb5_get_krbhst, KRB5_REALM_UNKNOWN); 103dummy(krb5_free_krbhst, 0); 104dummy(gss_krb5_get_tkt_flags, GSS_S_NO_CONTEXT); 105dummy(gss_sign, GSS_S_UNAVAILABLE); 106dummy(gss_inquire_mechs_for_name, GSS_S_FAILURE); 107dummy(gss_verify, GSS_S_UNAVAILABLE); 108dummy(kim_ccache_compare, 0); 109dummy(kim_ccache_copy, 0); 110dummy(kim_ccache_create_from_client_identity, 0); 111dummy(kim_ccache_create_from_default, 0); 112dummy(kim_ccache_create_from_display_name, 0); 113dummy(kim_ccache_create_from_keytab, 0); 114dummy(kim_ccache_create_from_krb5_ccache, 0); 115dummy(kim_ccache_create_from_type_and_name, 0); 116dummy(kim_ccache_create_new, 0); 117dummy(kim_ccache_create_new_if_needed, 0); 118dummy(kim_ccache_create_new_if_needed_with_password, 0); 119dummy(kim_ccache_create_new_with_password, 0); 120dummy(kim_ccache_destroy, 0); 121dummy(kim_ccache_free, 0); 122dummy(kim_ccache_get_client_identity, 0); 123dummy(kim_ccache_get_display_name, 0); 124dummy(kim_ccache_get_expiration_time, 0); 125dummy(kim_ccache_get_krb5_ccache, 0); 126dummy(kim_ccache_get_name, 0); 127dummy(kim_ccache_get_options, 0); 128dummy(kim_ccache_get_renewal_expiration_time, 0); 129dummy(kim_ccache_get_start_time, 0); 130dummy(kim_ccache_get_state, 0); 131dummy(kim_ccache_get_type, 0); 132dummy(kim_ccache_get_valid_credential, 0); 133dummy(kim_ccache_iterator_create, 0); 134dummy(kim_ccache_iterator_free, 0); 135dummy(kim_ccache_iterator_next, 0); 136dummy(kim_ccache_renew, 0); 137dummy(kim_ccache_set_default, 0); 138dummy(kim_ccache_validate, 0); 139dummy(kim_ccache_verify, 0); 140dummy(kim_credential_copy, 0); 141dummy(kim_credential_create_from_keytab, 0); 142dummy(kim_credential_create_from_krb5_creds, 0); 143dummy(kim_credential_create_new, 0); 144dummy(kim_credential_create_new_with_password, 0); 145dummy(kim_credential_free, 0); 146dummy(kim_credential_get_client_identity, 0); 147dummy(kim_credential_get_expiration_time, 0); 148dummy(kim_credential_get_krb5_creds, 0); 149dummy(kim_credential_get_options, 0); 150dummy(kim_credential_get_renewal_expiration_time, 0); 151dummy(kim_credential_get_service_identity, 0); 152dummy(kim_credential_get_start_time, 0); 153dummy(kim_credential_get_state, 0); 154dummy(kim_credential_is_tgt, 0); 155dummy(kim_credential_iterator_create, 0); 156dummy(kim_credential_iterator_free, 0); 157dummy(kim_credential_iterator_next, 0); 158dummy(kim_credential_renew, 0); 159dummy(kim_credential_store, 0); 160dummy(kim_credential_validate, 0); 161dummy(kim_credential_verify, 0); 162dummy(kim_identity_change_password, 0); 163dummy(kim_identity_compare, 0); 164dummy(kim_identity_copy, 0); 165dummy(kim_identity_create_from_components, 0); 166dummy(kim_identity_create_from_krb5_principal, 0); 167dummy(kim_identity_create_from_string, 0); 168dummy(kim_identity_free, 0); 169dummy(kim_identity_get_component_at_index, 0); 170dummy(kim_identity_get_components_string, 0); 171dummy(kim_identity_get_display_string, 0); 172dummy(kim_identity_get_krb5_principal, 0); 173dummy(kim_identity_get_number_of_components, 0); 174dummy(kim_identity_get_realm, 0); 175dummy(kim_identity_get_string, 0); 176dummy(kim_library_set_allow_automatic_prompting, 0); 177dummy(kim_library_set_allow_home_directory_access, 0); 178dummy(kim_library_set_application_name, 0); 179dummy(kim_options_copy, 0); 180dummy(kim_options_create, 0); 181dummy(kim_options_create_from_stream, 0); 182dummy(kim_options_free, 0); 183dummy(kim_options_get_addressless, 0); 184dummy(kim_options_get_forwardable, 0); 185dummy(kim_options_get_lifetime, 0); 186dummy(kim_options_get_proxiable, 0); 187dummy(kim_options_get_renewable, 0); 188dummy(kim_options_get_renewal_lifetime, 0); 189dummy(kim_options_get_service_name, 0); 190dummy(kim_options_get_start_time, 0); 191dummy(kim_options_set_addressless, 0); 192dummy(kim_options_set_forwardable, 0); 193dummy(kim_options_set_lifetime, 0); 194dummy(kim_options_set_proxiable, 0); 195dummy(kim_options_set_renewable, 0); 196dummy(kim_options_set_renewal_lifetime, 0); 197dummy(kim_options_set_service_name, 0); 198dummy(kim_options_set_start_time, 0); 199dummy(kim_options_write_to_stream, 0); 200dummy(kim_preferences_add_favorite_identity, 0); 201dummy(kim_preferences_copy, 0); 202dummy(kim_preferences_create, 0); 203dummy(kim_preferences_free, 0); 204dummy(kim_preferences_get_client_identity, 0); 205dummy(kim_preferences_get_favorite_identity_at_index, 0); 206dummy(kim_preferences_get_maximum_lifetime, 0); 207dummy(kim_preferences_get_maximum_renewal_lifetime, 0); 208dummy(kim_preferences_get_minimum_lifetime, 0); 209dummy(kim_preferences_get_minimum_renewal_lifetime, 0); 210dummy(kim_preferences_get_number_of_favorite_identities, 0); 211dummy(kim_preferences_get_options, 0); 212dummy(kim_preferences_get_remember_client_identity, 0); 213dummy(kim_preferences_get_remember_options, 0); 214dummy(kim_preferences_remove_all_favorite_identities, 0); 215dummy(kim_preferences_remove_favorite_identity, 0); 216dummy(kim_preferences_set_client_identity, 0); 217dummy(kim_preferences_set_maximum_lifetime, 0); 218dummy(kim_preferences_set_maximum_renewal_lifetime, 0); 219dummy(kim_preferences_set_minimum_lifetime, 0); 220dummy(kim_preferences_set_minimum_renewal_lifetime, 0); 221dummy(kim_preferences_set_options, 0); 222dummy(kim_preferences_set_remember_client_identity, 0); 223dummy(kim_preferences_set_remember_options, 0); 224dummy(kim_preferences_synchronize, 0); 225dummy(kim_selection_hints_copy, 0); 226dummy(kim_selection_hints_create, 0); 227dummy(kim_selection_hints_create_from_stream, 0); 228dummy(kim_selection_hints_forget_identity, 0); 229dummy(kim_selection_hints_free, 0); 230dummy(kim_selection_hints_get_allow_user_interaction, 0); 231dummy(kim_selection_hints_get_explanation, 0); 232dummy(kim_selection_hints_get_hint, 0); 233dummy(kim_selection_hints_get_identity, 0); 234dummy(kim_selection_hints_get_options, 0); 235dummy(kim_selection_hints_get_remember_identity, 0); 236dummy(kim_selection_hints_remember_identity, 0); 237dummy(kim_selection_hints_set_allow_user_interaction, 0); 238dummy(kim_selection_hints_set_explanation, 0); 239dummy(kim_selection_hints_set_hint, 0); 240dummy(kim_selection_hints_set_options, 0); 241dummy(kim_selection_hints_set_remember_identity, 0); 242dummy(kim_string_compare, 0); 243dummy(kim_string_copy, 0); 244dummy(kim_string_create_for_last_error, 0); 245dummy(kim_string_free, 0); 246dummy(krb524_convert_creds_kdc, ENOMEM); 247dummy(krb5_425_conv_principal, ENOMEM); 248dummy(krb5_524_conv_principal, ENOMEM); 249dummy(krb5_524_convert_creds, ENOMEM); 250dummy(krb5_address_compare, 0); 251dummy(krb5_address_order, 0); 252dummy(krb5_address_search, 0); 253dummy(krb5_aname_to_localname, 0); 254dummy(krb5_auth_con_get_checksum_func, 0); 255dummy(krb5_auth_con_getrecvsubkey, ENOMEM); 256dummy(krb5_auth_con_getsendsubkey, ENOMEM); 257dummy(krb5_auth_con_initivector, 0); 258dummy(krb5_auth_con_set_checksum_func, 0); 259dummy(krb5_auth_con_setrecvsubkey, 0); 260dummy(krb5_auth_con_setsendsubkey, 0); 261dummy(krb5_auth_con_setuseruserkey, 0); 262dummy(krb5_build_principal_alloc_va, ENOMEM); 263dummy(krb5_build_principal_va, ENOMEM); 264dummy(krb5_c_block_size, 0); 265dummy(krb5_c_checksum_length, 0); 266dummy(krb5_c_enctype_compare, 0); 267dummy(krb5_c_free_state, 0); 268dummy(krb5_c_init_state, 0); 269dummy(krb5_c_is_coll_proof_cksum, 0); 270dummy(krb5_c_is_keyed_cksum, 0); 271dummy(krb5_c_keyed_checksum_types, 0); 272dummy(krb5_c_make_checksum, 0); 273dummy(krb5_c_make_random_key, 0); 274dummy(krb5_c_random_add_entropy, 0); 275dummy(krb5_c_random_make_octets, 0); 276dummy(krb5_c_random_os_entropy, 0); 277dummy(krb5_c_random_seed, 0); 278dummy(krb5_c_string_to_key_with_params, 0); 279dummy(krb5_c_valid_cksumtype, 0); 280dummy(krb5_c_valid_enctype, 0); 281dummy(krb5_c_verify_checksum, 0); 282dummy(krb5_calculate_checksum, 0); 283dummy(krb5_cc_copy_creds, KRB5_CC_NOMEM); 284dummy(krb5_cc_last_change_time, 0); 285dummy(krb5_cc_lock, 0); 286dummy(krb5_cc_move, KRB5_CC_READONLY); 287dummy(krb5_cc_remove_cred, 0); 288dummy(krb5_cc_set_config, 0); 289dummy(krb5_cc_set_flags, 0); 290dummy(krb5_cc_unlock, 0); 291dummy(krb5_cccol_last_change_time, 0); 292dummy(krb5_cccol_lock, 0); 293dummy(krb5_cccol_unlock, 0); 294dummy(krb5_checksum_size, 0); 295dummy(krb5_cksumtype_to_string, 0); 296dummy(krb5_copy_addresses, 0); 297dummy(krb5_copy_authdata, 0); 298dummy(krb5_copy_authenticator, 0); 299dummy(krb5_copy_checksum, 0); 300dummy(krb5_copy_context, 0); 301dummy(krb5_copy_ticket, 0); 302dummy(krb5_decrypt, 0); 303dummy(krb5_deltat_to_string, 0); 304dummy(krb5_eblock_enctype, 0); 305dummy(krb5_encrypt, 0); 306dummy(krb5_encrypt_size, 0); 307dummy(krb5_finish_key, 0); 308dummy(krb5_finish_random_key, 0); 309dummy(krb5_free_authenticator, 0); 310dummy(krb5_free_checksum, 0); 311dummy(krb5_free_checksum_contents, 0); 312dummy(krb5_free_cksumtypes, 0); 313dummy(krb5_free_config_files, 0); 314dummy(krb5_free_tgt_creds, 0); 315dummy(krb5_fwd_tgt_creds, 0); 316dummy(krb5_get_credentials_renew, ENOMEM); 317dummy(krb5_get_credentials_validate, ENOMEM); 318dummy(krb5_get_default_config_files, 0); 319dummy(krb5_get_in_tkt, KRB5_KT_NOTFOUND); 320dummy(krb5_get_in_tkt_with_keytab, KRB5_KT_NOTFOUND); 321dummy(krb5_get_in_tkt_with_skey, KRB5_KT_NOTFOUND); 322dummy(krb5_get_init_creds_opt_set_change_password_prompt,0); 323dummy(krb5_get_init_creds_opt_set_pa,0); 324dummy(krb5_get_permitted_enctypes, 0); 325dummy(krb5_get_profile, 0); 326dummy(krb5_get_prompt_types, 0); 327dummy(krb5_get_time_offsets, 0); 328dummy(krb5_gss_use_kdc_context, 0); 329dummy(krb5_init_keyblock, 0); 330dummy(krb5_init_random_key, 0); 331quietdummy(krb5_ipc_client_clear_target, 0); 332quietdummy(krb5_ipc_client_set_target_uid, 0); 333dummy(krb5_is_config_principal, 0); 334dummy(krb5_is_referral_realm, 0); 335dummy(krb5_is_thread_safe, 0); 336dummy(krb5_mk_1cred, ENOMEM); 337dummy(krb5_mk_error, ENOMEM); 338dummy(krb5_mk_ncred, ENOMEM); 339dummy(krb5_mk_rep, ENOMEM); 340dummy(krb5_pkinit_get_client_cert, ENOMEM); 341dummy(krb5_pkinit_get_client_cert_db, ENOMEM); 342dummy(krb5_pkinit_get_kdc_cert, ENOMEM); 343dummy(krb5_pkinit_get_kdc_cert_db, ENOMEM); 344dummy(krb5_pkinit_have_client_cert, 0); 345dummy(krb5_pkinit_release_cert, 0); 346dummy(krb5_pkinit_release_cert_db, 0); 347dummy(krb5_pkinit_set_client_cert, ENOMEM); 348dummy(krb5_process_key, 0); 349dummy(krb5_random_key, 0); 350dummy(krb5_rd_cred, ENOMEM); 351dummy(krb5_rd_error, ENOMEM); 352dummy(krb5_rd_rep, ENOMEM); 353dummy(krb5_read_password, 0); 354dummy(krb5_salttype_to_string, 0); 355dummy(krb5_server_decrypt_ticket_keytab, 0); 356dummy(krb5_set_principal_realm, 0); 357dummy(krb5_string_to_cksumtype, 0); 358dummy(krb5_string_to_enctype, 0); 359dummy(krb5_string_to_salttype, 0); 360dummy(krb5_timestamp_to_sfstring, 0); 361dummy(krb5_timestamp_to_string, 0); 362dummy(krb5_unparse_name_ext, ENOMEM); 363dummy(krb5_unparse_name_flags, ENOMEM); 364dummy(krb5_unparse_name_flags_ext, ENOMEM); 365dummy(krb5_verify_checksum, 0); 366dummy(krb5int_accessor, KRB5_OBSOLETE_FN); 367dummy(krb5int_freeaddrinfo, 0); 368dummy(krb5int_gai_strerror, 0); 369dummy(krb5int_getaddrinfo, 0); 370dummy(krb5int_gmt_mktime, 0); 371dummy(krb5int_init_context_kdc, ENOMEM); 372dummy(krb5int_pkinit_auth_pack_decode, ENOMEM); 373dummy(krb5int_pkinit_create_cms_msg, ENOMEM); 374dummy(krb5int_pkinit_pa_pk_as_rep_encode, ENOMEM); 375dummy(krb5int_pkinit_pa_pk_as_req_decode, ENOMEM); 376dummy(krb5int_pkinit_parse_cms_msg, ENOMEM); 377dummy(krb5int_pkinit_reply_key_pack_encode, ENOMEM); 378dummy(remove_error_table, 0); 379dummy(__KerberosInternal_krb5int_sendtokdc_debug_handler, 0); 380 381