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