075cec8c716bb5a290006d4f5c1d61129f973ad7
[krb5.git] / src / include / k5-int.h
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  * Copyright (C) 1989,1990,1991,1992,1993,1994,1995,2000,2001,
4  * 2003,2006,2007,2008,2009 by the Massachusetts Institute of Technology,
5  * Cambridge, MA, USA.  All Rights Reserved.
6  *
7  * This software is being provided to you, the LICENSEE, by the
8  * Massachusetts Institute of Technology (M.I.T.) under the following
9  * license.  By obtaining, using and/or copying this software, you agree
10  * that you have read, understood, and will comply with these terms and
11  * conditions:
12  *
13  * Export of this software from the United States of America may
14  * require a specific license from the United States Government.
15  * It is the responsibility of any person or organization contemplating
16  * export to obtain such a license before exporting.
17  *
18  * WITHIN THAT CONSTRAINT, permission to use, copy, modify and distribute
19  * this software and its documentation for any purpose and without fee or
20  * royalty is hereby granted, provided that you agree to comply with the
21  * following copyright notice and statements, including the disclaimer, and
22  * that the same appear on ALL copies of the software and documentation,
23  * including modifications that you make for internal use or for
24  * distribution:
25  *
26  * THIS SOFTWARE IS PROVIDED "AS IS", AND M.I.T. MAKES NO REPRESENTATIONS
27  * OR WARRANTIES, EXPRESS OR IMPLIED.  By way of example, but not
28  * limitation, M.I.T. MAKES NO REPRESENTATIONS OR WARRANTIES OF
29  * MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
30  * THE LICENSED SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
31  * PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
32  *
33  * The name of the Massachusetts Institute of Technology or M.I.T. may NOT
34  * be used in advertising or publicity pertaining to distribution of the
35  * software.  Title to copyright in this software and any associated
36  * documentation shall at all times remain with M.I.T., and USER agrees to
37  * preserve same.
38  *
39  * Furthermore if you modify this software you must label
40  * your software as modified software and not distribute it in such a
41  * fashion that it might be confused with the original M.I.T. software.
42  */
43 /*
44  * Copyright (C) 1998 by the FundsXpress, INC.
45  *
46  * All rights reserved.
47  *
48  * Export of this software from the United States of America may require
49  * a specific license from the United States Government.  It is the
50  * responsibility of any person or organization contemplating export to
51  * obtain such a license before exporting.
52  *
53  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
54  * distribute this software and its documentation for any purpose and
55  * without fee is hereby granted, provided that the above copyright
56  * notice appear in all copies and that both that copyright notice and
57  * this permission notice appear in supporting documentation, and that
58  * the name of FundsXpress. not be used in advertising or publicity pertaining
59  * to distribution of the software without specific, written prior
60  * permission.  FundsXpress makes no representations about the suitability of
61  * this software for any purpose.  It is provided "as is" without express
62  * or implied warranty.
63  *
64  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
65  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
66  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
67  */
68
69 /*
70  * This prototype for k5-int.h (Krb5 internals include file)
71  * includes the user-visible definitions from krb5.h and then
72  * includes other definitions that are not user-visible but are
73  * required for compiling Kerberos internal routines.
74  *
75  * John Gilmore, Cygnus Support, Sat Jan 21 22:45:52 PST 1995
76  */
77
78 #ifndef _KRB5_INT_H
79 #define _KRB5_INT_H
80
81 #ifdef KRB5_GENERAL__
82 #error krb5.h included before k5-int.h
83 #endif /* KRB5_GENERAL__ */
84
85 #include "osconf.h"
86
87 #if defined(__MACH__) && defined(__APPLE__)
88 #       include <TargetConditionals.h>
89 #    if TARGET_RT_MAC_CFM
90 #       error "Use KfM 4.0 SDK headers for CFM compilation."
91 #    endif
92 #endif
93
94 /*
95  * Begin "k5-config.h"
96  */
97 #ifndef KRB5_CONFIG__
98 #define KRB5_CONFIG__
99
100 /*
101  * Machine-type definitions: PC Clone 386 running Microloss Windows
102  */
103
104 #if defined(_MSDOS) || defined(_WIN32)
105 #include "win-mac.h"
106
107 /* Kerberos Windows initialization file */
108 #define KERBEROS_INI    "kerberos.ini"
109 #define INI_FILES       "Files"
110 #define INI_KRB_CCACHE  "krb5cc"        /* Location of the ccache */
111 #define INI_KRB5_CONF   "krb5.ini"      /* Location of krb5.conf file */
112 #define ANSI_STDIO
113 #define DISABLE_TRACING
114 #endif
115
116 #include "autoconf.h"
117
118 #ifndef KRB5_SYSTYPES__
119 #define KRB5_SYSTYPES__
120
121 #ifdef HAVE_SYS_TYPES_H         /* From autoconf.h */
122 #include <sys/types.h>
123 #else /* HAVE_SYS_TYPES_H */
124 typedef unsigned long   u_long;
125 typedef unsigned int    u_int;
126 typedef unsigned short  u_short;
127 typedef unsigned char   u_char;
128 #endif /* HAVE_SYS_TYPES_H */
129 #endif /* KRB5_SYSTYPES__ */
130
131
132 #include "k5-platform.h"
133 #include "k5-trace.h"
134 /* not used in krb5.h (yet) */
135 typedef UINT64_TYPE krb5_ui_8;
136 typedef INT64_TYPE krb5_int64;
137
138
139 #define DEFAULT_PWD_STRING1 "Enter password"
140 #define DEFAULT_PWD_STRING2 "Re-enter password for verification"
141
142 #define KRB5_KDB_MAX_LIFE       (60*60*24) /* one day */
143 #define KRB5_KDB_MAX_RLIFE      (60*60*24*7) /* one week */
144 #define KRB5_KDB_EXPIRATION     2145830400 /* Thu Jan  1 00:00:00 2038 UTC */
145
146 /*
147  * Windows requires a different api interface to each function. Here
148  * just define it as NULL.
149  */
150 #ifndef KRB5_CALLCONV
151 #define KRB5_CALLCONV
152 #define KRB5_CALLCONV_C
153 #endif
154 #ifndef O_BINARY
155 #define O_BINARY 0
156 #endif
157
158 /* #define KRB5_OLD_CRYPTO is done in krb5.h */
159
160 #endif /* KRB5_CONFIG__ */
161
162 /*
163  * End "k5-config.h"
164  */
165
166 /*
167  * After loading the configuration definitions, load the Kerberos definitions.
168  */
169 #include <errno.h>
170 #include "krb5.h"
171 #include <krb5/plugin.h>
172 #include "profile.h"
173
174 #include "port-sockets.h"
175 #include "socket-utils.h"
176
177 /* Get mutex support; currently used only for the replay cache.  */
178 #include "k5-thread.h"
179
180 /* Get error info support.  */
181 #include "k5-err.h"
182
183 /* Get string buffer support. */
184 #include "k5-buf.h"
185
186 /* cofiguration variables */
187 #define KRB5_CONF_ACL_FILE                       "acl_file"
188 #define KRB5_CONF_ADMIN_KEYTAB                   "admin_keytab"
189 #define KRB5_CONF_ADMIN_SERVER                   "admin_server"
190 #define KRB5_CONF_ALLOW_WEAK_CRYPTO              "allow_weak_crypto"
191 #define KRB5_CONF_AP_REQ_CHECKSUM_TYPE           "ap_req_checksum_type"
192 #define KRB5_CONF_AUTH_TO_LOCAL                  "auth_to_local"
193 #define KRB5_CONF_AUTH_TO_LOCAL_NAMES            "auth_to_local_names"
194 #define KRB5_CONF_CANONICALIZE                   "canonicalize"
195 #define KRB5_CONF_CCACHE_TYPE                    "ccache_type"
196 #define KRB5_CONF_CLOCKSKEW                      "clockskew"
197 #define KRB5_CONF_DATABASE_NAME                  "database_name"
198 #define KRB5_CONF_DB_MODULE_DIR                  "db_module_dir"
199 #define KRB5_CONF_DEFAULT                        "default"
200 #define KRB5_CONF_DEFAULT_REALM                  "default_realm"
201 #define KRB5_CONF_DEFAULT_DOMAIN                 "default_domain"
202 #define KRB5_CONF_DEFAULT_TKT_ENCTYPES           "default_tkt_enctypes"
203 #define KRB5_CONF_DEFAULT_TGS_ENCTYPES           "default_tgs_enctypes"
204 #define KRB5_CONF_DEFAULT_KEYTAB_NAME            "default_keytab_name"
205 #define KRB5_CONF_DEFAULT_PRINCIPAL_EXPIRATION   "default_principal_expiration"
206 #define KRB5_CONF_DEFAULT_PRINCIPAL_FLAGS        "default_principal_flags"
207 #define KRB5_CONF_DICT_FILE                   "dict_file"
208 #define KRB5_CONF_DISABLE                     "disable"
209 #define KRB5_CONF_DISABLE_LAST_SUCCESS        "disable_last_success"
210 #define KRB5_CONF_DISABLE_LOCKOUT             "disable_lockout"
211 #define KRB5_CONF_DNS_LOOKUP_KDC              "dns_lookup_kdc"
212 #define KRB5_CONF_DNS_LOOKUP_REALM            "dns_lookup_realm"
213 #define KRB5_CONF_DNS_FALLBACK                "dns_fallback"
214 #define KRB5_CONF_DOMAIN_REALM                "domain_realm"
215 #define KRB5_CONF_ENABLE_ONLY                 "enable_only"
216 #define KRB5_CONF_EXTRA_ADDRESSES             "extra_addresses"
217 #define KRB5_CONF_FORWARDABLE                 "forwardable"
218 #define KRB5_CONF_HOST_BASED_SERVICES         "host_based_services"
219 #define KRB5_CONF_IGNORE_ACCEPTOR_HOSTNAME    "ignore_acceptor_hostname"
220 #define KRB5_CONF_IPROP_ENABLE                "iprop_enable"
221 #define KRB5_CONF_IPROP_MASTER_ULOGSIZE       "iprop_master_ulogsize"
222 #define KRB5_CONF_IPROP_PORT                  "iprop_port"
223 #define KRB5_CONF_IPROP_SLAVE_POLL            "iprop_slave_poll"
224 #define KRB5_CONF_IPROP_LOGFILE               "iprop_logfile"
225 #define KRB5_CONF_K5LOGIN_AUTHORITATIVE       "k5login_authoritative"
226 #define KRB5_CONF_K5LOGIN_DIRECTORY           "k5login_directory"
227 #define KRB5_CONF_KADMIND_PORT                "kadmind_port"
228 #define KRB5_CONF_KRB524_SERVER               "krb524_server"
229 #define KRB5_CONF_KDC                         "kdc"
230 #define KRB5_CONF_KDCDEFAULTS                 "kdcdefaults"
231 #define KRB5_CONF_KDC_PORTS                   "kdc_ports"
232 #define KRB5_CONF_KDC_TCP_PORTS               "kdc_tcp_ports"
233 #define KRB5_CONF_MAX_DGRAM_REPLY_SIZE        "kdc_max_dgram_reply_size"
234 #define KRB5_CONF_KDC_DEFAULT_OPTIONS         "kdc_default_options"
235 #define KRB5_CONF_KDC_TIMESYNC                "kdc_timesync"
236 #define KRB5_CONF_KDC_REQ_CHECKSUM_TYPE       "kdc_req_checksum_type"
237 #define KRB5_CONF_KEY_STASH_FILE              "key_stash_file"
238 #define KRB5_CONF_KPASSWD_PORT                "kpasswd_port"
239 #define KRB5_CONF_KPASSWD_SERVER              "kpasswd_server"
240 #define KRB5_CONF_LDAP_CONNS_PER_SERVER       "ldap_conns_per_server"
241 #define KRB5_CONF_LDAP_KADMIN_DN              "ldap_kadmind_dn"
242 #define KRB5_CONF_LDAP_KDC_DN                 "ldap_kdc_dn"
243 #define KRB5_CONF_LDAP_KERBEROS_CONTAINER_DN  "ldap_kerberos_container_dn"
244 #define KRB5_CONF_LDAP_KPASSWDD_DN            "ldap_kpasswdd_dn"
245 #define KRB5_CONF_LDAP_SERVERS                "ldap_servers"
246 #define KRB5_CONF_LDAP_SERVICE_PASSWORD_FILE  "ldap_service_password_file"
247 #define KRB5_CONF_LIBDEFAULTS                 "libdefaults"
248 #define KRB5_CONF_LOGGING                     "logging"
249 #define KRB5_CONF_MASTER_KEY_NAME             "master_key_name"
250 #define KRB5_CONF_MASTER_KEY_TYPE             "master_key_type"
251 #define KRB5_CONF_MASTER_KDC                  "master_kdc"
252 #define KRB5_CONF_MAX_LIFE                    "max_life"
253 #define KRB5_CONF_MAX_RENEWABLE_LIFE          "max_renewable_life"
254 #define KRB5_CONF_MODULE                      "module"
255 #define KRB5_CONF_NOADDRESSES                 "noaddresses"
256 #define KRB5_CONF_NO_HOST_REFERRAL            "no_host_referral"
257 #define KRB5_CONF_PERMITTED_ENCTYPES          "permitted_enctypes"
258 #define KRB5_CONF_PLUGINS                     "plugins"
259 #define KRB5_CONF_PLUGIN_BASE_DIR             "plugin_base_dir"
260 #define KRB5_CONF_PREFERRED_PREAUTH_TYPES     "preferred_preauth_types"
261 #define KRB5_CONF_PROXIABLE                   "proxiable"
262 #define KRB5_CONF_RDNS                        "rdns"
263 #define KRB5_CONF_REALMS                      "realms"
264 #define KRB5_CONF_REALM_TRY_DOMAINS           "realm_try_domains"
265 #define KRB5_CONF_REJECT_BAD_TRANSIT          "reject_bad_transit"
266 #define KRB5_CONF_RENEW_LIFETIME              "renew_lifetime"
267 #define KRB5_CONF_RESTRICT_ANONYMOUS_TO_TGT   "restrict_anonymous_to_tgt"
268 #define KRB5_CONF_SAFE_CHECKSUM_TYPE          "safe_checksum_type"
269 #define KRB5_CONF_SUPPORTED_ENCTYPES          "supported_enctypes"
270 #define KRB5_CONF_TICKET_LIFETIME             "ticket_lifetime"
271 #define KRB5_CONF_UDP_PREFERENCE_LIMIT        "udp_preference_limit"
272 #define KRB5_CONF_VERIFY_AP_REQ_NOFAIL        "verify_ap_req_nofail"
273 #define KRB5_CONF_V4_INSTANCE_CONVERT         "v4_instance_convert"
274 #define KRB5_CONF_V4_REALM                    "v4_realm"
275 #define KRB5_CONF_ASTERISK                    "*"
276 #define KRB5_CONF_FAST_AVAIL                  "fast_avail"
277
278 /* Error codes used in KRB_ERROR protocol messages.
279    Return values of library routines are based on a different error table
280    (which allows non-ambiguous error codes between subsystems) */
281
282 /* KDC errors */
283 #define KDC_ERR_NONE                    0 /* No error */
284 #define KDC_ERR_NAME_EXP                1 /* Client's entry in DB expired */
285 #define KDC_ERR_SERVICE_EXP             2 /* Server's entry in DB expired */
286 #define KDC_ERR_BAD_PVNO                3 /* Requested pvno not supported */
287 #define KDC_ERR_C_OLD_MAST_KVNO         4 /* C's key encrypted in old master */
288 #define KDC_ERR_S_OLD_MAST_KVNO         5 /* S's key encrypted in old master */
289 #define KDC_ERR_C_PRINCIPAL_UNKNOWN     6 /* Client not found in Kerberos DB */
290 #define KDC_ERR_S_PRINCIPAL_UNKNOWN     7 /* Server not found in Kerberos DB */
291 #define KDC_ERR_PRINCIPAL_NOT_UNIQUE    8 /* Multiple entries in Kerberos DB */
292 #define KDC_ERR_NULL_KEY                9 /* The C or S has a null key */
293 #define KDC_ERR_CANNOT_POSTDATE         10 /* Tkt ineligible for postdating */
294 #define KDC_ERR_NEVER_VALID             11 /* Requested starttime > endtime */
295 #define KDC_ERR_POLICY                  12 /* KDC policy rejects request */
296 #define KDC_ERR_BADOPTION               13 /* KDC can't do requested opt. */
297 #define KDC_ERR_ENCTYPE_NOSUPP          14 /* No support for encryption type */
298 #define KDC_ERR_SUMTYPE_NOSUPP          15 /* No support for checksum type */
299 #define KDC_ERR_PADATA_TYPE_NOSUPP      16 /* No support for padata type */
300 #define KDC_ERR_TRTYPE_NOSUPP           17 /* No support for transited type */
301 #define KDC_ERR_CLIENT_REVOKED          18 /* C's creds have been revoked */
302 #define KDC_ERR_SERVICE_REVOKED         19 /* S's creds have been revoked */
303 #define KDC_ERR_TGT_REVOKED             20 /* TGT has been revoked */
304 #define KDC_ERR_CLIENT_NOTYET           21 /* C not yet valid */
305 #define KDC_ERR_SERVICE_NOTYET          22 /* S not yet valid */
306 #define KDC_ERR_KEY_EXP                 23 /* Password has expired */
307 #define KDC_ERR_PREAUTH_FAILED          24 /* Preauthentication failed */
308 #define KDC_ERR_PREAUTH_REQUIRED        25 /* Additional preauthentication */
309                                            /* required */
310 #define KDC_ERR_SERVER_NOMATCH          26 /* Requested server and */
311                                            /* ticket don't match*/
312 #define KDC_ERR_MUST_USE_USER2USER      27 /* Server principal valid for */
313                                            /*   user2user only */
314 #define KDC_ERR_PATH_NOT_ACCEPTED       28 /* KDC policy rejected transited */
315                                            /*   path */
316 #define KDC_ERR_SVC_UNAVAILABLE         29 /* A service is not
317                                             * available that is
318                                             * required to process the
319                                             * request */
320 /* Application errors */
321 #define KRB_AP_ERR_BAD_INTEGRITY 31     /* Decrypt integrity check failed */
322 #define KRB_AP_ERR_TKT_EXPIRED  32      /* Ticket expired */
323 #define KRB_AP_ERR_TKT_NYV      33      /* Ticket not yet valid */
324 #define KRB_AP_ERR_REPEAT       34      /* Request is a replay */
325 #define KRB_AP_ERR_NOT_US       35      /* The ticket isn't for us */
326 #define KRB_AP_ERR_BADMATCH     36      /* Ticket/authenticator don't match */
327 #define KRB_AP_ERR_SKEW         37      /* Clock skew too great */
328 #define KRB_AP_ERR_BADADDR      38      /* Incorrect net address */
329 #define KRB_AP_ERR_BADVERSION   39      /* Protocol version mismatch */
330 #define KRB_AP_ERR_MSG_TYPE     40      /* Invalid message type */
331 #define KRB_AP_ERR_MODIFIED     41      /* Message stream modified */
332 #define KRB_AP_ERR_BADORDER     42      /* Message out of order */
333 #define KRB_AP_ERR_BADKEYVER    44      /* Key version is not available */
334 #define KRB_AP_ERR_NOKEY        45      /* Service key not available */
335 #define KRB_AP_ERR_MUT_FAIL     46      /* Mutual authentication failed */
336 #define KRB_AP_ERR_BADDIRECTION 47      /* Incorrect message direction */
337 #define KRB_AP_ERR_METHOD       48      /* Alternative authentication */
338                                         /* method required */
339 #define KRB_AP_ERR_BADSEQ       49      /* Incorrect sequence numnber */
340                                         /* in message */
341 #define KRB_AP_ERR_INAPP_CKSUM  50      /* Inappropriate type of */
342                                         /* checksum in message */
343 #define KRB_AP_PATH_NOT_ACCEPTED 51     /* Policy rejects transited path */
344 #define KRB_ERR_RESPONSE_TOO_BIG 52     /* Response too big for UDP, */
345                                         /*   retry with TCP */
346
347 /* other errors */
348 #define KRB_ERR_GENERIC         60      /* Generic error (description */
349                                         /* in e-text) */
350 #define KRB_ERR_FIELD_TOOLONG   61      /* Field is too long for impl. */
351
352 /* PKINIT server-reported errors */
353 #define KDC_ERR_CLIENT_NOT_TRUSTED              62 /* client cert not trusted */
354 #define KDC_ERR_KDC_NOT_TRUSTED                 63
355 #define KDC_ERR_INVALID_SIG                     64 /* client signature verify failed */
356 #define KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED  65 /* invalid Diffie-Hellman parameters */
357 #define KDC_ERR_CERTIFICATE_MISMATCH            66
358 #define KRB_AP_ERR_NO_TGT                       67
359 #define KDC_ERR_WRONG_REALM                     68
360 #define KRB_AP_ERR_USER_TO_USER_REQUIRED        69
361 #define KDC_ERR_CANT_VERIFY_CERTIFICATE         70 /* client cert not verifiable to */
362                                                    /* trusted root cert */
363 #define KDC_ERR_INVALID_CERTIFICATE             71 /* client cert had invalid signature */
364 #define KDC_ERR_REVOKED_CERTIFICATE             72 /* client cert was revoked */
365 #define KDC_ERR_REVOCATION_STATUS_UNKNOWN       73 /* client cert revoked, reason unknown */
366 #define KDC_ERR_REVOCATION_STATUS_UNAVAILABLE   74
367 #define KDC_ERR_CLIENT_NAME_MISMATCH            75 /* mismatch between client cert and */
368                                                    /* principal name */
369 #define KDC_ERR_INCONSISTENT_KEY_PURPOSE        77 /* bad extended key use */
370 #define KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED     78 /* bad digest algorithm in client cert */
371 #define KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED    79 /* missing paChecksum in PA-PK-AS-REQ */
372 #define KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED 80 /* bad digest algorithm in SignedData */
373 #define KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED 81
374 #define KRB_AP_ERR_IAKERB_KDC_NOT_FOUND         85 /* The IAKERB proxy could
375                                                       not find a KDC */
376 #define KRB_AP_ERR_IAKERB_KDC_NO_RESPONSE       86 /* The KDC did not respond
377                                                       to the IAKERB proxy */
378
379 /*
380  * This structure is returned in the e-data field of the KRB-ERROR
381  * message when the error calling for an alternative form of
382  * authentication is returned, KRB_AP_METHOD.
383  */
384 typedef struct _krb5_alt_method {
385     krb5_magic      magic;
386     krb5_int32      method;
387     unsigned int    length;
388     krb5_octet      *data;
389 } krb5_alt_method;
390
391 /*
392  * A null-terminated array of this structure is returned by the KDC as
393  * the data part of the ETYPE_INFO preauth type.  It informs the
394  * client which encryption types are supported.
395  * The  same data structure is used by both etype-info and etype-info2
396  * but s2kparams must be null when encoding etype-info.
397  */
398 typedef struct _krb5_etype_info_entry {
399     krb5_magic      magic;
400     krb5_enctype    etype;
401     unsigned int    length;
402     krb5_octet      *salt;
403     krb5_data s2kparams;
404 } krb5_etype_info_entry;
405
406 /*
407  *  This is essentially -1 without sign extension which can screw up
408  *  comparisons on 64 bit machines. If the length is this value, then
409  *  the salt data is not present. This is to distinguish between not
410  *  being set and being of 0 length.
411  */
412 #define KRB5_ETYPE_NO_SALT VALID_UINT_BITS
413
414 typedef krb5_etype_info_entry ** krb5_etype_info;
415
416 /* RFC 4537 */
417 typedef struct _krb5_etype_list {
418     int             length;
419     krb5_enctype    *etypes;
420 } krb5_etype_list;
421
422 /*
423  * a sam_challenge is returned for alternate preauth
424  */
425 /*
426   SAMFlags ::= BIT STRING {
427   use-sad-as-key[0],
428   send-encrypted-sad[1],
429   must-pk-encrypt-sad[2]
430   }
431 */
432 /*
433   PA-SAM-CHALLENGE ::= SEQUENCE {
434   sam-type[0]                 INTEGER,
435   sam-flags[1]                SAMFlags,
436   sam-type-name[2]            GeneralString OPTIONAL,
437   sam-track-id[3]             GeneralString OPTIONAL,
438   sam-challenge-label[4]      GeneralString OPTIONAL,
439   sam-challenge[5]            GeneralString OPTIONAL,
440   sam-response-prompt[6]      GeneralString OPTIONAL,
441   sam-pk-for-sad[7]           EncryptionKey OPTIONAL,
442   sam-nonce[8]                INTEGER OPTIONAL,
443   sam-cksum[9]                Checksum OPTIONAL
444   }
445 */
446 /* sam_type values -- informational only */
447 #define PA_SAM_TYPE_ENIGMA     1   /*  Enigma Logic */
448 #define PA_SAM_TYPE_DIGI_PATH  2   /*  Digital Pathways */
449 #define PA_SAM_TYPE_SKEY_K0    3   /*  S/key where  KDC has key 0 */
450 #define PA_SAM_TYPE_SKEY       4   /*  Traditional S/Key */
451 #define PA_SAM_TYPE_SECURID    5   /*  Security Dynamics */
452 #define PA_SAM_TYPE_CRYPTOCARD 6   /*  CRYPTOCard */
453 #if 1 /* XXX need to figure out who has which numbers assigned */
454 #define PA_SAM_TYPE_ACTIVCARD_DEC  6   /*  ActivCard decimal mode */
455 #define PA_SAM_TYPE_ACTIVCARD_HEX  7   /*  ActivCard hex mode */
456 #define PA_SAM_TYPE_DIGI_PATH_HEX  8   /*  Digital Pathways hex mode */
457 #endif
458 #define PA_SAM_TYPE_EXP_BASE    128 /* experimental */
459 #define PA_SAM_TYPE_GRAIL               (PA_SAM_TYPE_EXP_BASE+0) /* testing */
460 #define PA_SAM_TYPE_SECURID_PREDICT     (PA_SAM_TYPE_EXP_BASE+1) /* special */
461
462 typedef struct _krb5_predicted_sam_response {
463     krb5_magic      magic;
464     krb5_keyblock   sam_key;
465     krb5_flags      sam_flags; /* Makes key munging easier */
466     krb5_timestamp  stime;  /* time on server, for replay detection */
467     krb5_int32      susec;
468     krb5_principal  client;
469     krb5_data       msd;    /* mechanism specific data */
470 } krb5_predicted_sam_response;
471
472 typedef struct _krb5_sam_challenge {
473     krb5_magic      magic;
474     krb5_int32      sam_type; /* information */
475     krb5_flags      sam_flags; /* KRB5_SAM_* values */
476     krb5_data       sam_type_name;
477     krb5_data       sam_track_id;
478     krb5_data       sam_challenge_label;
479     krb5_data       sam_challenge;
480     krb5_data       sam_response_prompt;
481     krb5_data       sam_pk_for_sad;
482     krb5_int32      sam_nonce;
483     krb5_checksum   sam_cksum;
484 } krb5_sam_challenge;
485
486 typedef struct _krb5_sam_key {  /* reserved for future use */
487     krb5_magic      magic;
488     krb5_keyblock   sam_key;
489 } krb5_sam_key;
490
491 typedef struct _krb5_enc_sam_response_enc {
492     krb5_magic      magic;
493     krb5_int32      sam_nonce;
494     krb5_timestamp  sam_timestamp;
495     krb5_int32      sam_usec;
496     krb5_data       sam_sad;
497 } krb5_enc_sam_response_enc;
498
499 typedef struct _krb5_sam_response {
500     krb5_magic      magic;
501     krb5_int32      sam_type; /* informational */
502     krb5_flags      sam_flags; /* KRB5_SAM_* values */
503     krb5_data       sam_track_id; /* copied */
504     krb5_enc_data   sam_enc_key; /* krb5_sam_key - future use */
505     krb5_enc_data   sam_enc_nonce_or_ts; /* krb5_enc_sam_response_enc */
506     krb5_int32      sam_nonce;
507     krb5_timestamp  sam_patimestamp;
508 } krb5_sam_response;
509
510 typedef struct _krb5_sam_challenge_2 {
511     krb5_data       sam_challenge_2_body;
512     krb5_checksum   **sam_cksum;            /* Array of checksums */
513 } krb5_sam_challenge_2;
514
515 typedef struct _krb5_sam_challenge_2_body {
516     krb5_magic      magic;
517     krb5_int32      sam_type; /* information */
518     krb5_flags      sam_flags; /* KRB5_SAM_* values */
519     krb5_data       sam_type_name;
520     krb5_data       sam_track_id;
521     krb5_data       sam_challenge_label;
522     krb5_data       sam_challenge;
523     krb5_data       sam_response_prompt;
524     krb5_data       sam_pk_for_sad;
525     krb5_int32      sam_nonce;
526     krb5_enctype    sam_etype;
527 } krb5_sam_challenge_2_body;
528
529 typedef struct _krb5_sam_response_2 {
530     krb5_magic      magic;
531     krb5_int32      sam_type; /* informational */
532     krb5_flags      sam_flags; /* KRB5_SAM_* values */
533     krb5_data       sam_track_id; /* copied */
534     krb5_enc_data   sam_enc_nonce_or_sad; /* krb5_enc_sam_response_enc */
535     krb5_int32      sam_nonce;
536 } krb5_sam_response_2;
537
538 typedef struct _krb5_enc_sam_response_enc_2 {
539     krb5_magic      magic;
540     krb5_int32      sam_nonce;
541     krb5_data       sam_sad;
542 } krb5_enc_sam_response_enc_2;
543
544 /*
545  * Keep the pkinit definitions in a separate file so that the plugin
546  * only has to include k5-int-pkinit.h rather than k5-int.h
547  */
548
549 #include "k5-int-pkinit.h"
550
551 #include <stdlib.h>
552 #include <string.h>
553
554 #ifndef HAVE_STRDUP
555 extern char *strdup (const char *);
556 #endif
557
558 #ifdef HAVE_UNISTD_H
559 #include <unistd.h>
560 #endif
561
562 #ifdef HAVE_SYS_TIME_H
563 #include <sys/time.h>
564 #ifdef TIME_WITH_SYS_TIME
565 #include <time.h>
566 #endif
567 #else
568 #include <time.h>
569 #endif
570
571 #ifdef HAVE_SYS_STAT_H
572 #include <sys/stat.h>                   /* struct stat, stat() */
573 #endif
574
575 #ifdef HAVE_SYS_PARAM_H
576 #include <sys/param.h>                  /* MAXPATHLEN */
577 #endif
578
579 #ifdef HAVE_SYS_FILE_H
580 #include <sys/file.h>                   /* prototypes for file-related
581                                            syscalls; flags for open &
582                                            friends */
583 #endif
584
585 #ifdef HAVE_FCNTL_H
586 #include <fcntl.h>
587 #endif
588
589 #include <stdio.h>
590
591 #include "k5-gmt_mktime.h"
592
593 struct sendto_callback_info;
594
595 /* libos.spec */
596 krb5_error_code krb5_lock_file(krb5_context, int, int);
597 krb5_error_code krb5_unlock_file(krb5_context, int);
598 krb5_error_code krb5_sendto_kdc(krb5_context, const krb5_data *,
599                                 const krb5_data *, krb5_data *, int *, int);
600
601 krb5_error_code krb5_get_krbhst(krb5_context, const krb5_data *, char *** );
602 krb5_error_code krb5_free_krbhst(krb5_context, char * const * );
603 krb5_error_code krb5_create_secure_file(krb5_context, const char * pathname);
604 krb5_error_code krb5_sync_disk_file(krb5_context, FILE *fp);
605
606 krb5_error_code krb5int_init_context_kdc(krb5_context *);
607
608 krb5_error_code krb5_os_init_context(krb5_context context, profile_t profile,
609                                      krb5_flags flags);
610
611 void krb5_os_free_context(krb5_context);
612
613 /* This function is needed by KfM's KerberosPreferences API
614  * because it needs to be able to specify "secure" */
615 krb5_error_code
616 os_get_default_config_files(profile_filespec_t **pfiles, krb5_boolean secure);
617
618 krb5_error_code
619 krb5_os_hostaddr(krb5_context, const char *, krb5_address ***);
620
621 krb5_error_code
622 krb5int_get_domain_realm_mapping(krb5_context , const char *, char ***);
623
624 struct derived_key {
625     krb5_data constant;
626     krb5_key dkey;
627     struct derived_key *next;
628 };
629
630 /* Internal structure of an opaque key identifier */
631 struct krb5_key_st {
632     krb5_keyblock keyblock;
633     int refcount;
634     struct derived_key *derived;
635     /*
636      * Cache of data private to the cipher implementation, which we
637      * don't want to have to recompute for every operation.  This may
638      * include key schedules, iteration counts, etc.
639      *
640      * The cipher implementation is responsible for setting this up
641      * whenever needed, and the enc_provider key_cleanup method must
642      * then be provided to dispose of it.
643      */
644     void *cache;
645 };
646
647 krb5_error_code
648 krb5int_arcfour_gsscrypt(const krb5_keyblock *keyblock, krb5_keyusage usage,
649                          const krb5_data *kd_data, krb5_crypto_iov *data,
650                          size_t num_data);
651
652 /*
653  * Attempt to zero memory in a way that compilers won't optimize out.
654  *
655  * This mechanism should work even for heap storage about to be freed,
656  * or automatic storage right before we return from a function.
657  *
658  * Then, even if we leak uninitialized memory someplace, or UNIX
659  * "core" files get created with world-read access, some of the most
660  * sensitive data in the process memory will already be safely wiped.
661  *
662  * We're not going so far -- yet -- as to try to protect key data that
663  * may have been written into swap space....
664  */
665 #ifdef _WIN32
666 # define zap(ptr, len) SecureZeroMemory(ptr, len)
667 #elif defined(__GNUC__)
668 static inline void zap(void *ptr, size_t len)
669 {
670     memset(ptr, 0, len);
671     /*
672      * Some versions of gcc have gotten clever enough to eliminate a
673      * memset call right before the block in question is released.
674      * This (empty) asm requires it to assume that we're doing
675      * something interesting with the stored (zero) value, so the
676      * memset can't be eliminated.
677      *
678      * An optimizer that looks at assembly or object code may not be
679      * fooled, and may still cause the memset to go away.  Address
680      * that problem if and when we encounter it.
681      *
682      * This also may not be enough if free() does something
683      * interesting like purge memory locations from a write-back cache
684      * that hasn't written back the zero bytes yet.  A memory barrier
685      * instruction would help in that case.
686      */
687     asm volatile ("" : : "g" (ptr), "g" (len));
688 }
689 #else
690 /* Use a function from libkrb5support to defeat inlining. */
691 # define zap(ptr, len) krb5int_zap(ptr, len)
692 #endif
693
694 /* Convenience function: zap and free ptr if it is non-NULL. */
695 static inline void
696 zapfree(void *ptr, size_t len)
697 {
698     if (ptr != NULL) {
699         zap(ptr, len);
700         free(ptr);
701     }
702 }
703
704 /*
705  * Combine two keys (normally used by the hardware preauth mechanism)
706  */
707 krb5_error_code
708 krb5int_c_combine_keys(krb5_context context, krb5_keyblock *key1,
709                        krb5_keyblock *key2, krb5_keyblock *outkey);
710
711 void krb5int_c_free_keyblock(krb5_context, krb5_keyblock *key);
712 void krb5int_c_free_keyblock_contents(krb5_context, krb5_keyblock *);
713 krb5_error_code krb5int_c_init_keyblock(krb5_context, krb5_enctype enctype,
714                                         size_t length, krb5_keyblock **out);
715 krb5_error_code krb5int_c_copy_keyblock(krb5_context context,
716                                         const krb5_keyblock *from,
717                                         krb5_keyblock **to);
718 krb5_error_code krb5int_c_copy_keyblock_contents(krb5_context context,
719                                                  const krb5_keyblock *from,
720                                                  krb5_keyblock *to);
721
722 #ifdef KRB5_OLD_CRYPTO
723 /* old provider api */
724
725 krb5_error_code krb5_crypto_os_localaddr(krb5_address ***);
726
727 krb5_error_code krb5_crypto_us_timeofday(krb5_int32 *, krb5_int32 *);
728
729 #endif /* KRB5_OLD_CRYPTO */
730
731 /* this helper fct is in libkrb5, but it makes sense declared here. */
732
733 krb5_error_code
734 krb5_encrypt_keyhelper(krb5_context context, krb5_key key,
735                        krb5_keyusage keyusage, const krb5_data *plain,
736                        krb5_enc_data *cipher);
737
738 /*
739  * End "los-proto.h"
740  */
741
742 typedef struct _krb5_os_context {
743     krb5_magic              magic;
744     krb5_int32              time_offset;
745     krb5_int32              usec_offset;
746     krb5_int32              os_flags;
747     char *                  default_ccname;
748 } *krb5_os_context;
749
750 /*
751  * Flags for the os_flags field
752  *
753  * KRB5_OS_TOFFSET_VALID means that the time offset fields are valid.
754  * The intention is that this facility to correct the system clocks so
755  * that they reflect the "real" time, for systems where for some
756  * reason we can't set the system clock.  Instead we calculate the
757  * offset between the system time and real time, and store the offset
758  * in the os context so that we can correct the system clock as necessary.
759  *
760  * KRB5_OS_TOFFSET_TIME means that the time offset fields should be
761  * returned as the time by the krb5 time routines.  This should only
762  * be used for testing purposes (obviously!)
763  */
764 #define KRB5_OS_TOFFSET_VALID   1
765 #define KRB5_OS_TOFFSET_TIME    2
766
767 /* lock mode flags */
768 #define KRB5_LOCKMODE_SHARED    0x0001
769 #define KRB5_LOCKMODE_EXCLUSIVE 0x0002
770 #define KRB5_LOCKMODE_DONTBLOCK 0x0004
771 #define KRB5_LOCKMODE_UNLOCK    0x0008
772
773 /*
774  * Define our view of the size of a DES key.
775  */
776 #define KRB5_MIT_DES_KEYSIZE            8
777 #define KRB5_MIT_DES3_KEYSIZE           24
778 #define KRB5_MIT_DES3_KEY_BYTES         21
779
780 /*
781  * Check if des_int.h has been included before us.  If so, then check to see
782  * that our view of the DES key size is the same as des_int.h's.
783  */
784 #ifdef  MIT_DES_KEYSIZE
785 #if     MIT_DES_KEYSIZE != KRB5_MIT_DES_KEYSIZE
786 error(MIT_DES_KEYSIZE does not equal KRB5_MIT_DES_KEYSIZE)
787 #endif  /* MIT_DES_KEYSIZE != KRB5_MIT_DES_KEYSIZE */
788 #endif  /* MIT_DES_KEYSIZE */
789
790 /*
791  * Begin "preauth.h"
792  *
793  * (Originally written by Glen Machin at Sandia Labs.)
794  */
795 /*
796  * Sandia National Laboratories also makes no representations about the
797  * suitability of the modifications, or additions to this software for
798  * any purpose.  It is provided "as is" without express or implied warranty.
799  */
800 #ifndef KRB5_PREAUTH__
801 #define KRB5_PREAUTH__
802
803 #include <krb5/preauth_plugin.h>
804
805 #define CLIENT_ROCK_MAGIC 0x4352434b
806 /* This structure is passed into the client preauth functions and passed
807  * back to the "get_data_proc" function so that it can locate the
808  * requested information.  It is opaque to the plugin code and can be
809  * expanded in the future as new types of requests are defined which
810  * may require other things to be passed through. */
811 struct krb5int_fast_request_state;
812 struct krb5_clpreauth_rock_st {
813     krb5_magic magic;
814     krb5_enctype *etype;
815     struct krb5int_fast_request_state *fast_state;
816 };
817
818 typedef struct _krb5_pa_enc_ts {
819     krb5_timestamp      patimestamp;
820     krb5_int32          pausec;
821 } krb5_pa_enc_ts;
822
823 typedef struct _krb5_pa_for_user {
824     krb5_principal      user;
825     krb5_checksum       cksum;
826     krb5_data           auth_package;
827 } krb5_pa_for_user;
828
829 typedef struct _krb5_s4u_userid {
830     krb5_int32          nonce;
831     krb5_principal      user;
832     krb5_data           subject_cert;
833     krb5_flags          options;
834 } krb5_s4u_userid;
835
836 #define KRB5_S4U_OPTS_CHECK_LOGON_HOURS         0x40000000 /* check logon hour restrictions */
837 #define KRB5_S4U_OPTS_USE_REPLY_KEY_USAGE       0x20000000 /* sign with usage 27 instead of 26 */
838
839 typedef struct _krb5_pa_s4u_x509_user {
840     krb5_s4u_userid     user_id;
841     krb5_checksum       cksum;
842 } krb5_pa_s4u_x509_user;
843
844 enum {
845     KRB5_FAST_ARMOR_AP_REQUEST = 0x1
846 };
847
848 typedef struct _krb5_fast_armor {
849     krb5_int32 armor_type;
850     krb5_data armor_value;
851 } krb5_fast_armor;
852 typedef struct _krb5_fast_armored_req {
853     krb5_magic magic;
854     krb5_fast_armor *armor;
855     krb5_checksum req_checksum;
856     krb5_enc_data enc_part;
857 } krb5_fast_armored_req;
858
859 typedef struct _krb5_fast_req {
860     krb5_magic magic;
861     krb5_flags fast_options;
862     /* padata from req_body is used*/
863     krb5_kdc_req *req_body;
864 } krb5_fast_req;
865
866 /* Bits 0-15 are critical in fast options.*/
867 #define UNSUPPORTED_CRITICAL_FAST_OPTIONS 0x00ff
868 #define KRB5_FAST_OPTION_HIDE_CLIENT_NAMES 0x01
869
870 typedef struct _krb5_fast_finished {
871     krb5_timestamp timestamp;
872     krb5_int32 usec;
873     krb5_principal client;
874     krb5_checksum ticket_checksum;
875 } krb5_fast_finished;
876
877 typedef struct _krb5_fast_response {
878     krb5_magic magic;
879     krb5_pa_data **padata;
880     krb5_keyblock *strengthen_key;
881     krb5_fast_finished *finished;
882     krb5_int32 nonce;
883 } krb5_fast_response;
884
885 typedef struct _krb5_ad_kdcissued {
886     krb5_checksum ad_checksum;
887     krb5_principal i_principal;
888     krb5_authdata **elements;
889 } krb5_ad_kdcissued;
890
891 typedef struct _krb5_ad_signedpath_data {
892     krb5_principal client;
893     krb5_timestamp authtime;
894     krb5_principal *delegated;
895     krb5_pa_data **method_data;
896     krb5_authdata **authorization_data;
897 } krb5_ad_signedpath_data;
898
899 typedef struct _krb5_ad_signedpath {
900     krb5_enctype enctype;
901     krb5_checksum checksum;
902     krb5_principal *delegated;
903     krb5_pa_data **method_data;
904 } krb5_ad_signedpath;
905
906 typedef struct _krb5_iakerb_header {
907     krb5_data target_realm;
908     krb5_data *cookie;
909 } krb5_iakerb_header;
910
911 typedef struct _krb5_iakerb_finished {
912     krb5_checksum checksum;
913 } krb5_iakerb_finished;
914
915 typedef krb5_error_code
916 (*krb5_preauth_obtain_proc)(krb5_context, krb5_pa_data *,
917                             krb5_etype_info, krb5_keyblock *,
918                             krb5_error_code (*)(krb5_context,
919                                                 const krb5_enctype,
920                                                 krb5_data *,
921                                                 krb5_const_pointer,
922                                                 krb5_keyblock **),
923                             krb5_const_pointer, krb5_creds *,
924                             krb5_kdc_req *, krb5_pa_data **);
925
926 typedef krb5_error_code
927 (*krb5_preauth_process_proc)(krb5_context, krb5_pa_data *, krb5_kdc_req *,
928                              krb5_kdc_rep *,
929                              krb5_error_code (*)(krb5_context,
930                                                  const krb5_enctype,
931                                                  krb5_data *,
932                                                  krb5_const_pointer,
933                                                  krb5_keyblock **),
934                              krb5_const_pointer,
935                              krb5_error_code (*)(krb5_context,
936                                                  const krb5_keyblock *,
937                                                  krb5_const_pointer,
938                                                  krb5_kdc_rep * ),
939                              krb5_keyblock **, krb5_creds *, krb5_int32 *,
940                              krb5_int32 *);
941
942 typedef struct _krb5_preauth_ops {
943     krb5_magic magic;
944     int     type;
945     int flags;
946     krb5_preauth_obtain_proc    obtain;
947     krb5_preauth_process_proc   process;
948 } krb5_preauth_ops;
949
950 krb5_pa_data *
951 krb5int_find_pa_data(krb5_context, krb5_pa_data *const *, krb5_preauthtype);
952 /* Does not return a copy; original padata sequence responsible for freeing*/
953
954 void krb5_free_etype_info(krb5_context, krb5_etype_info);
955
956 /*
957  * Preauthentication property flags
958  */
959 #define KRB5_PREAUTH_FLAGS_ENCRYPT      0x00000001
960 #define KRB5_PREAUTH_FLAGS_HARDWARE     0x00000002
961
962 #endif /* KRB5_PREAUTH__ */
963 /*
964  * End "preauth.h"
965  */
966
967 /*
968  * Extending the krb5_get_init_creds_opt structure.  The original
969  * krb5_get_init_creds_opt structure is defined publicly.  The
970  * new extended version is private.  The original interface
971  * assumed a pre-allocated structure which was passed to
972  * krb5_get_init_creds_init().  The new interface assumes that
973  * the caller will call krb5_get_init_creds_alloc() and
974  * krb5_get_init_creds_free().
975  *
976  * Callers MUST NOT call krb5_get_init_creds_init() after allocating an
977  * opts structure using krb5_get_init_creds_alloc().  To do so will
978  * introduce memory leaks.  Unfortunately, there is no way to enforce
979  * this behavior.
980  *
981  * Two private flags are added for backward compatibility.
982  * KRB5_GET_INIT_CREDS_OPT_EXTENDED says that the structure was allocated
983  * with the new krb5_get_init_creds_opt_alloc() function.
984  * KRB5_GET_INIT_CREDS_OPT_SHADOWED is set to indicate that the extended
985  * structure is a shadow copy of an original krb5_get_init_creds_opt
986  * structure.
987  * If KRB5_GET_INIT_CREDS_OPT_SHADOWED is set after a call to
988  * krb5int_gic_opt_to_opte(), the resulting extended structure should be
989  * freed (using krb5_get_init_creds_free).  Otherwise, the original
990  * structure was already extended and there is no need to free it.
991  */
992
993 #define KRB5_GET_INIT_CREDS_OPT_EXTENDED 0x80000000
994 #define KRB5_GET_INIT_CREDS_OPT_SHADOWED 0x40000000
995
996 #define krb5_gic_opt_is_extended(s)                                     \
997     ((s) && ((s)->flags & KRB5_GET_INIT_CREDS_OPT_EXTENDED) ? 1 : 0)
998 #define krb5_gic_opt_is_shadowed(s)                                     \
999     ((s) && ((s)->flags & KRB5_GET_INIT_CREDS_OPT_SHADOWED) ? 1 : 0)
1000
1001
1002 typedef struct _krb5_gic_opt_private {
1003     int num_preauth_data;
1004     krb5_gic_opt_pa_data *preauth_data;
1005     char * fast_ccache_name;
1006     krb5_ccache out_ccache;
1007     krb5_flags fast_flags;
1008     krb5_expire_callback_func expire_cb;
1009     void *expire_data;
1010 } krb5_gic_opt_private;
1011
1012 /*
1013  * On the Mac, ensure that the layout of krb5_gic_opt_ext matches that
1014  * of krb5_get_init_creds_opt.
1015  */
1016 #if TARGET_OS_MAC
1017 #    pragma pack(push,2)
1018 #endif
1019
1020 typedef struct _krb5_gic_opt_ext {
1021     krb5_flags flags;
1022     krb5_deltat tkt_life;
1023     krb5_deltat renew_life;
1024     int forwardable;
1025     int proxiable;
1026     krb5_enctype *etype_list;
1027     int etype_list_length;
1028     krb5_address **address_list;
1029     krb5_preauthtype *preauth_list;
1030     int preauth_list_length;
1031     krb5_data *salt;
1032     /*
1033      * Do not change anything above this point in this structure.
1034      * It is identical to the public krb5_get_init_creds_opt structure.
1035      * New members must be added below.
1036      */
1037     krb5_gic_opt_private *opt_private;
1038 } krb5_gic_opt_ext;
1039
1040 #if TARGET_OS_MAC
1041 #    pragma pack(pop)
1042 #endif
1043
1044 krb5_error_code
1045 krb5int_gic_opt_to_opte(krb5_context context, krb5_get_init_creds_opt *opt,
1046                         krb5_gic_opt_ext **opte, unsigned int force,
1047                         const char *where);
1048
1049 krb5_error_code
1050 krb5int_copy_data_contents(krb5_context, const krb5_data *, krb5_data *);
1051
1052 krb5_error_code
1053 krb5int_copy_data_contents_add0(krb5_context, const krb5_data *, krb5_data *);
1054
1055 krb5_error_code
1056 krb5int_copy_creds_contents(krb5_context, const krb5_creds *, krb5_creds *);
1057
1058 typedef krb5_error_code
1059 (*krb5_gic_get_as_key_fct)(krb5_context, krb5_principal, krb5_enctype,
1060                            krb5_prompter_fct, void *prompter_data,
1061                            krb5_data *salt, krb5_data *s2kparams,
1062                            krb5_keyblock *as_key, void *gak_data);
1063
1064 krb5_error_code KRB5_CALLCONV
1065 krb5int_get_init_creds(krb5_context context, krb5_creds *creds,
1066                        krb5_principal client, krb5_prompter_fct prompter,
1067                        void *prompter_data, krb5_deltat start_time,
1068                        char *in_tkt_service, krb5_get_init_creds_opt *options,
1069                        krb5_gic_get_as_key_fct gak, void *gak_data,
1070                        int *master, krb5_kdc_rep **as_reply);
1071
1072 krb5_error_code
1073 krb5int_populate_gic_opt (krb5_context, krb5_get_init_creds_opt **,
1074                           krb5_flags options, krb5_address *const *addrs,
1075                           krb5_enctype *ktypes,
1076                           krb5_preauthtype *pre_auth_types, krb5_creds *creds);
1077
1078
1079 krb5_error_code KRB5_CALLCONV
1080 krb5_do_preauth(krb5_context context, krb5_kdc_req *request,
1081                 krb5_data *encoded_request_body,
1082                 krb5_data *encoded_previous_request, krb5_pa_data **in_padata,
1083                 krb5_pa_data ***out_padata, krb5_data *salt,
1084                 krb5_data *s2kparams, krb5_enctype *etype,
1085                 krb5_keyblock *as_key, krb5_prompter_fct prompter,
1086                 void *prompter_data, krb5_gic_get_as_key_fct gak_fct,
1087                 void *gak_data, krb5_clpreauth_rock preauth_rock,
1088                 krb5_gic_opt_ext *opte);
1089
1090 krb5_error_code KRB5_CALLCONV
1091 krb5_do_preauth_tryagain(krb5_context context, krb5_kdc_req *request,
1092                          krb5_data *encoded_request_body,
1093                          krb5_data *encoded_previous_request,
1094                          krb5_pa_data **in_padata, krb5_pa_data ***out_padata,
1095                          krb5_error *err_reply,
1096                          krb5_data *salt, krb5_data *s2kparams,
1097                          krb5_enctype *etype, krb5_keyblock *as_key,
1098                          krb5_prompter_fct prompter, void *prompter_data,
1099                          krb5_gic_get_as_key_fct gak_fct, void *gak_data,
1100                          krb5_clpreauth_rock preauth_rock,
1101                          krb5_gic_opt_ext *opte);
1102
1103 void KRB5_CALLCONV krb5_init_preauth_context(krb5_context);
1104 void KRB5_CALLCONV krb5_free_preauth_context(krb5_context);
1105 void KRB5_CALLCONV krb5_clear_preauth_context_use_counts(krb5_context);
1106 void KRB5_CALLCONV krb5_preauth_prepare_request(krb5_context,
1107                                                 krb5_gic_opt_ext *,
1108                                                 krb5_kdc_req *);
1109 void KRB5_CALLCONV krb5_preauth_request_context_init(krb5_context);
1110 void KRB5_CALLCONV krb5_preauth_request_context_fini(krb5_context);
1111
1112 void KRB5_CALLCONV
1113 krb5_free_sam_challenge(krb5_context, krb5_sam_challenge *);
1114
1115 void KRB5_CALLCONV
1116 krb5_free_sam_challenge_2(krb5_context, krb5_sam_challenge_2 *);
1117
1118 void KRB5_CALLCONV
1119 krb5_free_sam_challenge_2_body(krb5_context, krb5_sam_challenge_2_body *);
1120
1121 void KRB5_CALLCONV
1122 krb5_free_sam_response(krb5_context, krb5_sam_response *);
1123
1124 void KRB5_CALLCONV
1125 krb5_free_sam_response_2(krb5_context, krb5_sam_response_2 *);
1126
1127 void KRB5_CALLCONV
1128 krb5_free_predicted_sam_response(krb5_context, krb5_predicted_sam_response *);
1129
1130 void KRB5_CALLCONV
1131 krb5_free_enc_sam_response_enc(krb5_context, krb5_enc_sam_response_enc *);
1132
1133 void KRB5_CALLCONV
1134 krb5_free_enc_sam_response_enc_2(krb5_context, krb5_enc_sam_response_enc_2 *);
1135
1136 void KRB5_CALLCONV
1137 krb5_free_sam_challenge_contents(krb5_context, krb5_sam_challenge *);
1138
1139 void KRB5_CALLCONV
1140 krb5_free_sam_challenge_2_contents(krb5_context, krb5_sam_challenge_2 *);
1141
1142 void KRB5_CALLCONV
1143 krb5_free_sam_challenge_2_body_contents(krb5_context,
1144                                         krb5_sam_challenge_2_body *);
1145
1146 void KRB5_CALLCONV
1147 krb5_free_sam_response_contents(krb5_context, krb5_sam_response *);
1148
1149 void KRB5_CALLCONV
1150 krb5_free_sam_response_2_contents(krb5_context, krb5_sam_response_2 *);
1151
1152 void KRB5_CALLCONV
1153 krb5_free_predicted_sam_response_contents(krb5_context,
1154                                           krb5_predicted_sam_response * );
1155
1156 void KRB5_CALLCONV
1157 krb5_free_enc_sam_response_enc_contents(krb5_context,
1158                                         krb5_enc_sam_response_enc * );
1159
1160 void KRB5_CALLCONV
1161 krb5_free_enc_sam_response_enc_2_contents(krb5_context,
1162                                           krb5_enc_sam_response_enc_2 * );
1163
1164 void KRB5_CALLCONV
1165 krb5_free_pa_enc_ts(krb5_context, krb5_pa_enc_ts *);
1166
1167 void KRB5_CALLCONV
1168 krb5_free_pa_for_user(krb5_context, krb5_pa_for_user *);
1169
1170 void KRB5_CALLCONV
1171 krb5_free_s4u_userid_contents(krb5_context, krb5_s4u_userid *);
1172
1173 void KRB5_CALLCONV
1174 krb5_free_pa_s4u_x509_user(krb5_context, krb5_pa_s4u_x509_user *);
1175
1176 void KRB5_CALLCONV
1177 krb5_free_pa_svr_referral_data(krb5_context, krb5_pa_svr_referral_data *);
1178
1179 void KRB5_CALLCONV
1180 krb5_free_pa_server_referral_data(krb5_context,
1181                                   krb5_pa_server_referral_data * );
1182
1183 void KRB5_CALLCONV
1184 krb5_free_pa_pac_req(krb5_context, krb5_pa_pac_req * );
1185
1186 void KRB5_CALLCONV
1187 krb5_free_etype_list(krb5_context, krb5_etype_list * );
1188
1189 void KRB5_CALLCONV krb5_free_fast_armor(krb5_context, krb5_fast_armor *);
1190 void KRB5_CALLCONV krb5_free_fast_armored_req(krb5_context,
1191                                               krb5_fast_armored_req *);
1192 void KRB5_CALLCONV krb5_free_fast_req(krb5_context, krb5_fast_req *);
1193 void KRB5_CALLCONV krb5_free_fast_finished(krb5_context, krb5_fast_finished *);
1194 void KRB5_CALLCONV krb5_free_fast_response(krb5_context, krb5_fast_response *);
1195 void KRB5_CALLCONV krb5_free_ad_kdcissued(krb5_context, krb5_ad_kdcissued *);
1196 void KRB5_CALLCONV krb5_free_ad_signedpath(krb5_context, krb5_ad_signedpath *);
1197 void KRB5_CALLCONV krb5_free_iakerb_header(krb5_context, krb5_iakerb_header *);
1198 void KRB5_CALLCONV krb5_free_iakerb_finished(krb5_context,
1199                                              krb5_iakerb_finished *);
1200
1201 /* #include "krb5/wordsize.h" -- comes in through base-defs.h. */
1202 #include "com_err.h"
1203 #include "k5-plugin.h"
1204
1205 #include <krb5/authdata_plugin.h>
1206
1207 struct _krb5_authdata_context {
1208     krb5_magic magic;
1209     int n_modules;
1210     struct _krb5_authdata_context_module {
1211         krb5_authdatatype ad_type;
1212         void *plugin_context;
1213         authdata_client_plugin_fini_proc client_fini;
1214         krb5_flags flags;
1215         krb5plugin_authdata_client_ftable_v0 *ftable;
1216         authdata_client_request_init_proc client_req_init;
1217         authdata_client_request_fini_proc client_req_fini;
1218         const char *name;
1219         void *request_context;
1220         void **request_context_pp;
1221     } *modules;
1222     struct plugin_dir_handle plugins;
1223 };
1224
1225 typedef struct _krb5_authdata_context *krb5_authdata_context;
1226
1227 void KRB5_CALLCONV
1228 krb5int_free_data_list(krb5_context context, krb5_data *data);
1229
1230 krb5_error_code KRB5_CALLCONV
1231 krb5_authdata_context_init(krb5_context kcontext,
1232                            krb5_authdata_context *pcontext);
1233
1234 void KRB5_CALLCONV
1235 krb5_authdata_context_free(krb5_context kcontext,
1236                            krb5_authdata_context context);
1237
1238 krb5_error_code KRB5_CALLCONV
1239 krb5_authdata_export_authdata(krb5_context kcontext,
1240                               krb5_authdata_context context, krb5_flags usage,
1241                               krb5_authdata ***pauthdata);
1242
1243 krb5_error_code KRB5_CALLCONV
1244 krb5_authdata_get_attribute_types(krb5_context kcontext,
1245                                   krb5_authdata_context context,
1246                                   krb5_data **attrs);
1247
1248 krb5_error_code KRB5_CALLCONV
1249 krb5_authdata_get_attribute(krb5_context kcontext,
1250                             krb5_authdata_context context,
1251                             const krb5_data *attribute,
1252                             krb5_boolean *authenticated,
1253                             krb5_boolean *complete, krb5_data *value,
1254                             krb5_data *display_value, int *more);
1255
1256 krb5_error_code KRB5_CALLCONV
1257 krb5_authdata_set_attribute(krb5_context kcontext,
1258                             krb5_authdata_context context,
1259                             krb5_boolean complete, const krb5_data *attribute,
1260                             const krb5_data *value);
1261
1262 krb5_error_code KRB5_CALLCONV
1263 krb5_authdata_delete_attribute(krb5_context kcontext,
1264                                krb5_authdata_context context,
1265                                const krb5_data *attribute);
1266
1267 krb5_error_code KRB5_CALLCONV
1268 krb5_authdata_import_attributes(krb5_context kcontext,
1269                                 krb5_authdata_context context,
1270                                 krb5_flags usage, const krb5_data *attributes);
1271
1272 krb5_error_code KRB5_CALLCONV
1273 krb5_authdata_export_attributes(krb5_context kcontext,
1274                                 krb5_authdata_context context,
1275                                 krb5_flags usage, krb5_data **pattributes);
1276
1277 krb5_error_code KRB5_CALLCONV
1278 krb5_authdata_export_internal(krb5_context kcontext,
1279                               krb5_authdata_context context,
1280                               krb5_boolean restrict_authenticated,
1281                               const char *module, void **ptr);
1282
1283 krb5_error_code KRB5_CALLCONV
1284 krb5_authdata_context_copy(krb5_context kcontext, krb5_authdata_context src,
1285                            krb5_authdata_context *dst);
1286
1287 krb5_error_code KRB5_CALLCONV
1288 krb5_authdata_free_internal(krb5_context kcontext,
1289                             krb5_authdata_context context, const char *module,
1290                             void *ptr);
1291
1292 /*** Plugin framework ***/
1293
1294 /*
1295  * This framework can be used to create pluggable interfaces.  Not all existing
1296  * pluggable interface use this framework, but new ones should.  A new
1297  * pluggable interface entails:
1298  *
1299  * - An interface ID definition in the list of #defines below.
1300  *
1301  * - A name in the interface_names array in lib/krb5/krb/plugins.c.
1302  *
1303  * - An installed public header file in include/krb5.  The public header should
1304  *   include <krb5/plugin.h> and should declare a vtable structure for each
1305  *   supported major version of the interface.
1306  *
1307  * - A consumer API implementation, located within the code unit which makes
1308  *   use of the pluggable interface.  The consumer API should consist of:
1309  *
1310  *   . An interface-specific handle type which contains a vtable structure for
1311  *     the module (or a union of several such structures, if there are multiple
1312  *     supported major versions) and, optionally, resource data bound to the
1313  *     handle.
1314  *
1315  *   . An interface-specific loader function which creates a handle or list of
1316  *     handles.  A list of handles would be created if the interface is a
1317  *     one-to-many interface where the consumer wants to consult all available
1318  *     modules; a single handle would be created for an interface where the
1319  *     consumer wants to consult a specific module.  The loader function should
1320  *     use k5_plugin_load or k5_plugin_load_all to produce one or a list of
1321  *     vtable initializer functions, and should use those functions to fill in
1322  *     the vtable structure for the module (if necessary, trying each supported
1323  *     major version starting from the most recent).  The loader function can
1324  *     also bind resource data into the handle based on caller arguments, if
1325  *     appropriate.
1326  *
1327  *   . For each plugin method, a wrapper function which accepts a krb5_context,
1328  *     a plugin handle, and the method arguments.  Wrapper functions should
1329  *     invoke the method function contained in the handle's vtable.
1330  *
1331  * - Possibly, built-in implementations of the interface, also located within
1332  *   the code unit which makes use of the interface.  Built-in implementations
1333  *   must be registered with k5_plugin_register before the first call to
1334  *   k5_plugin_load or k5_plugin_load_all.
1335  *
1336  * A pluggable interface should have one or more currently supported major
1337  * versions, starting at 1.  Each major version should have a current minor
1338  * version, also starting at 1.  If new methods are added to a vtable, the
1339  * minor version should be incremented and the vtable stucture should document
1340  * where each minor vtable version ends.  If method signatures for a vtable are
1341  * changed, the major version should be incremented.
1342  *
1343  * Plugin module implementations (either built-in or dynamically loaded) should
1344  * define a function named <interfacename>_<modulename>_initvt, matching the
1345  * signature of krb5_plugin_initvt_fn as declared in include/krb5/plugin.h.
1346  * The initvt function should check the given maj_ver argument against its own
1347  * supported major versions, cast the vtable pointer to the appropriate
1348  * interface-specific vtable type, and fill in the vtable methods, stopping as
1349  * appropriate for the given min_ver.  Memory for the vtable structure is
1350  * allocated by the caller, not by the module.
1351  *
1352  * Dynamic plugin modules are registered with the framework through the
1353  * [plugins] section of the profile, as described in the admin documentation
1354  * and krb5.conf man page.
1355  */
1356
1357 /*
1358  * A linked list entry mapping a module name to a module initvt function.  The
1359  * entry may also include a dynamic object handle so that it can be released
1360  * when the context is destroyed.
1361  */
1362 struct plugin_mapping {
1363     char *modname;
1364     krb5_plugin_initvt_fn module;
1365     struct plugin_file_handle *dyn_handle;
1366     struct plugin_mapping *next;
1367 };
1368
1369 /* Holds krb5_context information about each pluggable interface. */
1370 struct plugin_interface {
1371     struct plugin_mapping *modules;
1372     krb5_boolean configured;
1373 };
1374
1375 /* A list of plugin interface IDs.  Make sure to increment
1376  * PLUGIN_NUM_INTERFACES when a new interface is added. */
1377 #define PLUGIN_INTERFACE_PWQUAL      0
1378 #define PLUGIN_INTERFACE_KADM5_HOOK  1
1379 #define PLUGIN_INTERFACE_CLPREAUTH   2
1380 #define PLUGIN_INTERFACE_KDCPREAUTH  3
1381 #define PLUGIN_INTERFACE_CCSELECT    4
1382 #define PLUGIN_NUM_INTERFACES        5
1383
1384 /* Retrieve the plugin module of type interface_id and name modname,
1385  * storing the result into module. */
1386 krb5_error_code
1387 k5_plugin_load(krb5_context context, int interface_id, const char *modname,
1388                krb5_plugin_initvt_fn *module);
1389
1390 /* Retrieve all plugin modules of type interface_id, storing the result
1391  * into modules.  Free the result with k5_plugin_free_handles. */
1392 krb5_error_code
1393 k5_plugin_load_all(krb5_context context, int interface_id,
1394                    krb5_plugin_initvt_fn **modules);
1395
1396 /* Release a module list allocated by k5_plugin_load_all. */
1397 void
1398 k5_plugin_free_modules(krb5_context context, krb5_plugin_initvt_fn *modules);
1399
1400 /* Register a plugin module of type interface_id and name modname. */
1401 krb5_error_code
1402 k5_plugin_register(krb5_context context, int interface_id, const char *modname,
1403                    krb5_plugin_initvt_fn module);
1404
1405 /*
1406  * Register a plugin module which is part of the krb5 tree but is built as a
1407  * dynamic plugin.  Look for the module in modsubdir relative to the
1408  * context->base_plugin_dir.
1409  */
1410 krb5_error_code
1411 k5_plugin_register_dyn(krb5_context context, int interface_id,
1412                        const char *modname, const char *modsubdir);
1413
1414 /* Destroy the module state within context; used by krb5_free_context. */
1415 void
1416 k5_plugin_free_context(krb5_context context);
1417
1418 struct _kdb5_dal_handle;        /* private, in kdb5.h */
1419 typedef struct _kdb5_dal_handle kdb5_dal_handle;
1420 struct _kdb_log_context;
1421 typedef struct krb5_preauth_context_st krb5_preauth_context;
1422 struct ccselect_module_handle;
1423 struct _krb5_context {
1424     krb5_magic      magic;
1425     krb5_enctype    *in_tkt_etypes;
1426     krb5_enctype    *tgs_etypes;
1427     struct _krb5_os_context os_context;
1428     char            *default_realm;
1429     profile_t       profile;
1430     kdb5_dal_handle *dal_handle;
1431     int             ser_ctx_count;
1432     void            *ser_ctx;
1433     /* allowable clock skew */
1434     krb5_deltat     clockskew;
1435     krb5_cksumtype  kdc_req_sumtype;
1436     krb5_cksumtype  default_ap_req_sumtype;
1437     krb5_cksumtype  default_safe_sumtype;
1438     krb5_flags      kdc_default_options;
1439     krb5_flags      library_options;
1440     krb5_boolean    profile_secure;
1441     int             fcc_default_format;
1442     krb5_prompt_type *prompt_types;
1443     /* Message size above which we'll try TCP first in send-to-kdc
1444        type code.  Aside from the 2**16 size limit, we put no
1445        absolute limit on the UDP packet size.  */
1446     int             udp_pref_limit;
1447
1448     /* Use the config-file ktypes instead of app-specified?  */
1449     krb5_boolean    use_conf_ktypes;
1450
1451 #ifdef KRB5_DNS_LOOKUP
1452     krb5_boolean    profile_in_memory;
1453 #endif /* KRB5_DNS_LOOKUP */
1454
1455     /* locate_kdc module stuff */
1456     struct plugin_dir_handle libkrb5_plugins;
1457     struct krb5plugin_service_locate_ftable *vtbl;
1458     void (**locate_fptrs)(void);
1459
1460     /* preauth module stuff */
1461     krb5_preauth_context *preauth_context;
1462
1463     /* cache module stuff */
1464     struct ccselect_module_handle **ccselect_handles;
1465
1466     /* error detail info */
1467     struct errinfo err;
1468
1469     /* For Sun iprop code; does this really have to be here?  */
1470     struct _kdb_log_context *kdblog_context;
1471
1472     krb5_boolean allow_weak_crypto;
1473     krb5_boolean ignore_acceptor_hostname;
1474
1475     krb5_trace_callback trace_callback;
1476     void *trace_callback_data;
1477
1478     struct plugin_interface plugins[PLUGIN_NUM_INTERFACES];
1479     char *plugin_base_dir;
1480 };
1481
1482 /* could be used in a table to find an etype and initialize a block */
1483
1484
1485 #define KRB5_LIBOPT_SYNC_KDCTIME        0x0001
1486
1487 /* internal message representations */
1488
1489 typedef struct _krb5_safe {
1490     krb5_magic magic;
1491     krb5_data user_data;                /* user data */
1492     krb5_timestamp timestamp;           /* client time, optional */
1493     krb5_int32 usec;                    /* microsecond portion of time,
1494                                            optional */
1495     krb5_ui_4 seq_number;               /* sequence #, optional */
1496     krb5_address *s_address;    /* sender address */
1497     krb5_address *r_address;    /* recipient address, optional */
1498     krb5_checksum *checksum;    /* data integrity checksum */
1499 } krb5_safe;
1500
1501 typedef struct _krb5_priv {
1502     krb5_magic magic;
1503     krb5_enc_data enc_part;             /* encrypted part */
1504 } krb5_priv;
1505
1506 typedef struct _krb5_priv_enc_part {
1507     krb5_magic magic;
1508     krb5_data user_data;                /* user data */
1509     krb5_timestamp timestamp;           /* client time, optional */
1510     krb5_int32 usec;                    /* microsecond portion of time, opt. */
1511     krb5_ui_4 seq_number;               /* sequence #, optional */
1512     krb5_address *s_address;    /* sender address */
1513     krb5_address *r_address;    /* recipient address, optional */
1514 } krb5_priv_enc_part;
1515
1516 void KRB5_CALLCONV krb5_free_safe(krb5_context, krb5_safe *);
1517 void KRB5_CALLCONV krb5_free_priv(krb5_context, krb5_priv *);
1518 void KRB5_CALLCONV krb5_free_priv_enc_part(krb5_context, krb5_priv_enc_part *);
1519
1520 /*
1521  * Begin "asn1.h"
1522  */
1523 #ifndef KRB5_ASN1__
1524 #define KRB5_ASN1__
1525
1526 /* ASN.1 encoding knowledge; KEEP IN SYNC WITH ASN.1 defs! */
1527 /* here we use some knowledge of ASN.1 encodings */
1528 /*
1529   Ticket is APPLICATION 1.
1530   Authenticator is APPLICATION 2.
1531   AS_REQ is APPLICATION 10.
1532   AS_REP is APPLICATION 11.
1533   TGS_REQ is APPLICATION 12.
1534   TGS_REP is APPLICATION 13.
1535   AP_REQ is APPLICATION 14.
1536   AP_REP is APPLICATION 15.
1537   KRB_SAFE is APPLICATION 20.
1538   KRB_PRIV is APPLICATION 21.
1539   KRB_CRED is APPLICATION 22.
1540   EncASRepPart is APPLICATION 25.
1541   EncTGSRepPart is APPLICATION 26.
1542   EncAPRepPart is APPLICATION 27.
1543   EncKrbPrivPart is APPLICATION 28.
1544   EncKrbCredPart is APPLICATION 29.
1545   KRB_ERROR is APPLICATION 30.
1546 */
1547 /* allow either constructed or primitive encoding, so check for bit 6
1548    set or reset */
1549 #define krb5int_is_app_tag(dat,tag)                     \
1550     ((dat != NULL) && (dat)->length &&                  \
1551      ((((dat)->data[0] & ~0x20) == ((tag) | 0x40))))
1552 #define krb5_is_krb_ticket(dat)               krb5int_is_app_tag(dat, 1)
1553 #define krb5_is_krb_authenticator(dat)        krb5int_is_app_tag(dat, 2)
1554 #define krb5_is_as_req(dat)                   krb5int_is_app_tag(dat, 10)
1555 #define krb5_is_as_rep(dat)                   krb5int_is_app_tag(dat, 11)
1556 #define krb5_is_tgs_req(dat)                  krb5int_is_app_tag(dat, 12)
1557 #define krb5_is_tgs_rep(dat)                  krb5int_is_app_tag(dat, 13)
1558 #define krb5_is_ap_req(dat)                   krb5int_is_app_tag(dat, 14)
1559 #define krb5_is_ap_rep(dat)                   krb5int_is_app_tag(dat, 15)
1560 #define krb5_is_krb_safe(dat)                 krb5int_is_app_tag(dat, 20)
1561 #define krb5_is_krb_priv(dat)                 krb5int_is_app_tag(dat, 21)
1562 #define krb5_is_krb_cred(dat)                 krb5int_is_app_tag(dat, 22)
1563 #define krb5_is_krb_enc_as_rep_part(dat)      krb5int_is_app_tag(dat, 25)
1564 #define krb5_is_krb_enc_tgs_rep_part(dat)     krb5int_is_app_tag(dat, 26)
1565 #define krb5_is_krb_enc_ap_rep_part(dat)      krb5int_is_app_tag(dat, 27)
1566 #define krb5_is_krb_enc_krb_priv_part(dat)    krb5int_is_app_tag(dat, 28)
1567 #define krb5_is_krb_enc_krb_cred_part(dat)    krb5int_is_app_tag(dat, 29)
1568 #define krb5_is_krb_error(dat)                krb5int_is_app_tag(dat, 30)
1569
1570 /*************************************************************************
1571  * Prototypes for krb5_encode.c
1572  *************************************************************************/
1573
1574 /*
1575   krb5_error_code encode_krb5_structure(const krb5_structure *rep,
1576   krb5_data **code);
1577   modifies  *code
1578   effects   Returns the ASN.1 encoding of *rep in **code.
1579   Returns ASN1_MISSING_FIELD if a required field is emtpy in *rep.
1580   Returns ENOMEM if memory runs out.
1581 */
1582
1583 krb5_error_code
1584 encode_krb5_authenticator(const krb5_authenticator *rep, krb5_data **code);
1585
1586 krb5_error_code
1587 encode_krb5_ticket(const krb5_ticket *rep, krb5_data **code);
1588
1589 krb5_error_code
1590 encode_krb5_enc_tkt_part(const krb5_enc_tkt_part *rep, krb5_data **code);
1591
1592 krb5_error_code
1593 encode_krb5_enc_kdc_rep_part(const krb5_enc_kdc_rep_part *rep,
1594                              krb5_data **code);
1595
1596 /* yes, the translation is identical to that used for KDC__REP */
1597 krb5_error_code
1598 encode_krb5_as_rep(const krb5_kdc_rep *rep, krb5_data **code);
1599
1600 /* yes, the translation is identical to that used for KDC__REP */
1601 krb5_error_code
1602 encode_krb5_tgs_rep(const krb5_kdc_rep *rep, krb5_data **code);
1603
1604 krb5_error_code
1605 encode_krb5_ap_req(const krb5_ap_req *rep, krb5_data **code);
1606
1607 krb5_error_code
1608 encode_krb5_ap_rep(const krb5_ap_rep *rep, krb5_data **code);
1609
1610 krb5_error_code
1611 encode_krb5_ap_rep_enc_part(const krb5_ap_rep_enc_part *rep, krb5_data **code);
1612
1613 krb5_error_code
1614 encode_krb5_as_req(const krb5_kdc_req *rep, krb5_data **code);
1615
1616 krb5_error_code
1617 encode_krb5_tgs_req(const krb5_kdc_req *rep, krb5_data **code);
1618
1619 krb5_error_code
1620 encode_krb5_kdc_req_body(const krb5_kdc_req *rep, krb5_data **code);
1621
1622 krb5_error_code
1623 encode_krb5_safe(const krb5_safe *rep, krb5_data **code);
1624
1625 struct krb5_safe_with_body {
1626     krb5_safe *safe;
1627     krb5_data *body;
1628 };
1629 krb5_error_code
1630 encode_krb5_safe_with_body(const struct krb5_safe_with_body *rep,
1631                            krb5_data **code);
1632
1633 krb5_error_code
1634 encode_krb5_priv(const krb5_priv *rep, krb5_data **code);
1635
1636 krb5_error_code
1637 encode_krb5_enc_priv_part(const krb5_priv_enc_part *rep, krb5_data **code);
1638
1639 krb5_error_code
1640 encode_krb5_cred(const krb5_cred *rep, krb5_data **code);
1641 krb5_error_code
1642 encode_krb5_checksum(const krb5_checksum *, krb5_data **);
1643
1644 krb5_error_code
1645 encode_krb5_enc_cred_part(const krb5_cred_enc_part *rep, krb5_data **code);
1646
1647 krb5_error_code
1648 encode_krb5_error(const krb5_error *rep, krb5_data **code);
1649
1650 krb5_error_code
1651 encode_krb5_authdata(krb5_authdata *const *rep, krb5_data **code);
1652
1653 krb5_error_code
1654 encode_krb5_authdata_elt(const krb5_authdata *rep, krb5_data **code);
1655
1656 krb5_error_code
1657 encode_krb5_pwd_sequence(const passwd_phrase_element *rep, krb5_data **code);
1658
1659 krb5_error_code
1660 encode_krb5_pwd_data(const krb5_pwd_data *rep, krb5_data **code);
1661
1662 krb5_error_code
1663 encode_krb5_padata_sequence(krb5_pa_data *const *rep, krb5_data **code);
1664
1665 krb5_error_code
1666 encode_krb5_alt_method(const krb5_alt_method *, krb5_data **code);
1667
1668 krb5_error_code
1669 encode_krb5_etype_info(krb5_etype_info_entry *const *, krb5_data **code);
1670
1671 krb5_error_code
1672 encode_krb5_etype_info2(krb5_etype_info_entry *const *, krb5_data **code);
1673
1674 krb5_error_code
1675 encode_krb5_pa_enc_ts(const krb5_pa_enc_ts *, krb5_data **);
1676
1677 krb5_error_code
1678 encode_krb5_sam_challenge(const krb5_sam_challenge * , krb5_data **);
1679
1680 krb5_error_code
1681 encode_krb5_sam_key(const krb5_sam_key * , krb5_data **);
1682
1683 krb5_error_code
1684 encode_krb5_enc_sam_response_enc(const krb5_enc_sam_response_enc *,
1685                                  krb5_data **);
1686
1687 krb5_error_code
1688 encode_krb5_sam_response(const krb5_sam_response *, krb5_data **);
1689
1690 krb5_error_code
1691 encode_krb5_sam_challenge_2(const krb5_sam_challenge_2 * , krb5_data **);
1692
1693 krb5_error_code
1694 encode_krb5_sam_challenge_2_body(const krb5_sam_challenge_2_body *,
1695                                  krb5_data **);
1696
1697 krb5_error_code
1698 encode_krb5_enc_sam_response_enc_2(const krb5_enc_sam_response_enc_2 *,
1699                                    krb5_data **);
1700
1701 krb5_error_code
1702 encode_krb5_sam_response_2(const krb5_sam_response_2 * , krb5_data **);
1703
1704 krb5_error_code
1705 encode_krb5_predicted_sam_response(const krb5_predicted_sam_response *,
1706                                    krb5_data **);
1707
1708 struct krb5_setpw_req {
1709     krb5_principal target;
1710     krb5_data password;
1711 };
1712 krb5_error_code
1713 encode_krb5_setpw_req(const struct krb5_setpw_req *rep, krb5_data **code);
1714
1715 krb5_error_code
1716 encode_krb5_pa_for_user(const krb5_pa_for_user *, krb5_data **);
1717
1718 krb5_error_code
1719 encode_krb5_s4u_userid(const krb5_s4u_userid *, krb5_data **);
1720
1721 krb5_error_code
1722 encode_krb5_pa_s4u_x509_user(const krb5_pa_s4u_x509_user *, krb5_data **);
1723
1724 krb5_error_code
1725 encode_krb5_pa_svr_referral_data(const krb5_pa_svr_referral_data *,
1726                                  krb5_data **);
1727
1728 krb5_error_code
1729 encode_krb5_pa_server_referral_data(const krb5_pa_server_referral_data *,
1730                                     krb5_data **);
1731
1732 krb5_error_code
1733 encode_krb5_pa_pac_req(const krb5_pa_pac_req *, krb5_data **);
1734
1735 krb5_error_code
1736 encode_krb5_etype_list(const krb5_etype_list * , krb5_data **);
1737
1738 krb5_error_code
1739 encode_krb5_pa_fx_fast_request(const krb5_fast_armored_req *, krb5_data **);
1740
1741 krb5_error_code
1742 encode_krb5_fast_req(const krb5_fast_req *, krb5_data **);
1743
1744 krb5_error_code
1745 encode_krb5_pa_fx_fast_reply(const krb5_enc_data *, krb5_data **);
1746
1747 krb5_error_code
1748 encode_krb5_iakerb_header(const krb5_iakerb_header *, krb5_data **);
1749
1750 krb5_error_code
1751 encode_krb5_iakerb_finished(const krb5_iakerb_finished *, krb5_data **);
1752
1753 krb5_error_code
1754 encode_krb5_fast_response(const krb5_fast_response *, krb5_data **);
1755
1756 krb5_error_code
1757 encode_krb5_ad_kdcissued(const krb5_ad_kdcissued *, krb5_data **);
1758
1759 krb5_error_code
1760 encode_krb5_ad_signedpath(const krb5_ad_signedpath *, krb5_data **);
1761
1762 krb5_error_code
1763 encode_krb5_ad_signedpath_data(const krb5_ad_signedpath_data *, krb5_data **);
1764
1765 /*************************************************************************
1766  * End of prototypes for krb5_encode.c
1767  *************************************************************************/
1768
1769 krb5_error_code
1770 decode_krb5_sam_challenge(const krb5_data *, krb5_sam_challenge **);
1771
1772 krb5_error_code
1773 decode_krb5_enc_sam_key(const krb5_data *, krb5_sam_key **);
1774
1775 krb5_error_code
1776 decode_krb5_enc_sam_response_enc(const krb5_data *,
1777                                  krb5_enc_sam_response_enc **);
1778
1779 krb5_error_code
1780 decode_krb5_sam_response(const krb5_data *, krb5_sam_response **);
1781
1782 krb5_error_code
1783 decode_krb5_predicted_sam_response(const krb5_data *,
1784                                    krb5_predicted_sam_response **);
1785
1786 krb5_error_code
1787 decode_krb5_sam_challenge_2(const krb5_data *, krb5_sam_challenge_2 **);
1788
1789 krb5_error_code
1790 decode_krb5_sam_challenge_2_body(const krb5_data *,
1791                                  krb5_sam_challenge_2_body **);
1792
1793 krb5_error_code
1794 decode_krb5_enc_sam_response_enc_2(const krb5_data *,
1795                                    krb5_enc_sam_response_enc_2 **);
1796
1797 krb5_error_code
1798 decode_krb5_sam_response_2(const krb5_data *, krb5_sam_response_2 **);
1799
1800
1801 /*************************************************************************
1802  * Prototypes for krb5_decode.c
1803  *************************************************************************/
1804 /*
1805   krb5_error_code decode_krb5_structure(const krb5_data *code,
1806   krb5_structure **rep);
1807
1808   requires  Expects **rep to not have been allocated;
1809   a new *rep is allocated regardless of the old value.
1810   effects   Decodes *code into **rep.
1811   Returns ENOMEM if memory is exhausted.
1812   Returns asn1 and krb5 errors.
1813 */
1814
1815 krb5_error_code
1816 decode_krb5_authenticator(const krb5_data *code, krb5_authenticator **rep);
1817
1818 krb5_error_code
1819 decode_krb5_ticket(const krb5_data *code, krb5_ticket **rep);
1820
1821 krb5_error_code
1822 decode_krb5_encryption_key(const krb5_data *output, krb5_keyblock **rep);
1823
1824 krb5_error_code
1825 decode_krb5_enc_tkt_part(const krb5_data *output, krb5_enc_tkt_part **rep);
1826
1827 krb5_error_code
1828 decode_krb5_enc_kdc_rep_part(const krb5_data *output,
1829                              krb5_enc_kdc_rep_part **rep);
1830
1831 krb5_error_code
1832 decode_krb5_as_rep(const krb5_data *output, krb5_kdc_rep **rep);
1833
1834 krb5_error_code
1835 decode_krb5_tgs_rep(const krb5_data *output, krb5_kdc_rep **rep);
1836
1837 krb5_error_code
1838 decode_krb5_ap_req(const krb5_data *output, krb5_ap_req **rep);
1839
1840 krb5_error_code
1841 decode_krb5_ap_rep(const krb5_data *output, krb5_ap_rep **rep);
1842
1843 krb5_error_code
1844 decode_krb5_ap_rep_enc_part(const krb5_data *output,
1845                             krb5_ap_rep_enc_part **rep);
1846
1847 krb5_error_code
1848 decode_krb5_as_req(const krb5_data *output, krb5_kdc_req **rep);
1849
1850 krb5_error_code
1851 decode_krb5_tgs_req(const krb5_data *output, krb5_kdc_req **rep);
1852
1853 krb5_error_code
1854 decode_krb5_kdc_req_body(const krb5_data *output, krb5_kdc_req **rep);
1855
1856 krb5_error_code
1857 decode_krb5_safe(const krb5_data *output, krb5_safe **rep);
1858
1859 krb5_error_code
1860 decode_krb5_safe_with_body(const krb5_data *output, krb5_safe **rep,
1861                            krb5_data *body);
1862
1863 krb5_error_code
1864 decode_krb5_priv(const krb5_data *output, krb5_priv **rep);
1865
1866 krb5_error_code
1867 decode_krb5_enc_priv_part(const krb5_data *output, krb5_priv_enc_part **rep);
1868 krb5_error_code
1869 decode_krb5_checksum(const krb5_data *, krb5_checksum **);
1870
1871 krb5_error_code
1872 decode_krb5_cred(const krb5_data *output, krb5_cred **rep);
1873
1874 krb5_error_code
1875 decode_krb5_enc_cred_part(const krb5_data *output, krb5_cred_enc_part **rep);
1876
1877 krb5_error_code
1878 decode_krb5_error(const krb5_data *output, krb5_error **rep);
1879
1880 krb5_error_code
1881 decode_krb5_authdata(const krb5_data *output, krb5_authdata ***rep);
1882
1883 krb5_error_code
1884 decode_krb5_pwd_sequence(const krb5_data *output, passwd_phrase_element **rep);
1885
1886 krb5_error_code
1887 decode_krb5_pwd_data(const krb5_data *output, krb5_pwd_data **rep);
1888
1889 krb5_error_code
1890 decode_krb5_padata_sequence(const krb5_data *output, krb5_pa_data ***rep);
1891
1892 krb5_error_code
1893 decode_krb5_alt_method(const krb5_data *output, krb5_alt_method **rep);
1894
1895 krb5_error_code
1896 decode_krb5_etype_info(const krb5_data *output, krb5_etype_info_entry ***rep);
1897
1898 krb5_error_code
1899 decode_krb5_etype_info2(const krb5_data *output, krb5_etype_info_entry ***rep);
1900
1901 krb5_error_code
1902 decode_krb5_enc_data(const krb5_data *output, krb5_enc_data **rep);
1903
1904 krb5_error_code
1905 decode_krb5_pa_enc_ts(const krb5_data *output, krb5_pa_enc_ts **rep);
1906
1907 krb5_error_code
1908 decode_krb5_sam_key(const krb5_data *, krb5_sam_key **);
1909
1910 krb5_error_code
1911 decode_krb5_setpw_req(const krb5_data *, krb5_data **, krb5_principal *);
1912
1913 krb5_error_code
1914 decode_krb5_pa_for_user(const krb5_data *, krb5_pa_for_user **);
1915
1916 krb5_error_code
1917 decode_krb5_pa_s4u_x509_user(const krb5_data *, krb5_pa_s4u_x509_user **);
1918
1919 krb5_error_code
1920 decode_krb5_pa_svr_referral_data(const krb5_data *,
1921                                  krb5_pa_svr_referral_data **);
1922
1923 krb5_error_code
1924 decode_krb5_pa_server_referral_data(const krb5_data *,
1925                                     krb5_pa_server_referral_data **);
1926
1927 krb5_error_code
1928 decode_krb5_pa_pac_req(const krb5_data *, krb5_pa_pac_req **);
1929
1930 krb5_error_code
1931 decode_krb5_etype_list(const krb5_data *, krb5_etype_list **);
1932
1933 krb5_error_code
1934 decode_krb5_pa_fx_fast_request(const krb5_data *, krb5_fast_armored_req **);
1935
1936 krb5_error_code
1937 decode_krb5_fast_req(const krb5_data *, krb5_fast_req **);
1938
1939 krb5_error_code
1940 decode_krb5_pa_fx_fast_reply(const krb5_data *, krb5_enc_data **);
1941
1942 krb5_error_code
1943 decode_krb5_fast_response(const krb5_data *, krb5_fast_response **);
1944
1945 krb5_error_code
1946 decode_krb5_ad_kdcissued(const krb5_data *, krb5_ad_kdcissued **);
1947
1948 krb5_error_code
1949 decode_krb5_ad_signedpath(const krb5_data *, krb5_ad_signedpath **);
1950
1951 krb5_error_code
1952 decode_krb5_iakerb_header(const krb5_data *, krb5_iakerb_header **);
1953
1954 krb5_error_code
1955 decode_krb5_iakerb_finished(const krb5_data *, krb5_iakerb_finished **);
1956
1957 struct _krb5_key_data;          /* kdb.h */
1958
1959 struct ldap_seqof_key_data {
1960     krb5_int32 mkvno;           /* Master key version number */
1961     struct _krb5_key_data *key_data;
1962     krb5_int16 n_key_data;
1963 };
1964 typedef struct ldap_seqof_key_data ldap_seqof_key_data;
1965
1966 krb5_error_code
1967 krb5int_ldap_encode_sequence_of_keys(const ldap_seqof_key_data *val,
1968                                      krb5_data **code);
1969
1970 krb5_error_code
1971 krb5int_ldap_decode_sequence_of_keys(krb5_data *in,
1972                                      ldap_seqof_key_data **rep);
1973
1974 /*************************************************************************
1975  * End of prototypes for krb5_decode.c
1976  *************************************************************************/
1977
1978 #endif /* KRB5_ASN1__ */
1979 /*
1980  * End "asn1.h"
1981  */
1982
1983
1984 /*
1985  * Internal krb5 library routines
1986  */
1987 krb5_error_code
1988 krb5_encrypt_tkt_part(krb5_context, const krb5_keyblock *, krb5_ticket *);
1989
1990 krb5_error_code
1991 krb5_encode_kdc_rep(krb5_context, krb5_msgtype, const krb5_enc_kdc_rep_part *,
1992                     int using_subkey, const krb5_keyblock *, krb5_kdc_rep *,
1993                     krb5_data ** );
1994
1995 /*
1996  * [De]Serialization Handle and operations.
1997  */
1998 struct __krb5_serializer {
1999     krb5_magic          odtype;
2000     krb5_error_code     (*sizer) (krb5_context,
2001                                   krb5_pointer,
2002                                   size_t *);
2003     krb5_error_code     (*externalizer) (krb5_context,
2004                                          krb5_pointer,
2005                                          krb5_octet **,
2006                                          size_t *);
2007     krb5_error_code     (*internalizer) (krb5_context,
2008                                          krb5_pointer *,
2009                                          krb5_octet **,
2010                                          size_t *);
2011 };
2012 typedef const struct __krb5_serializer * krb5_ser_handle;
2013 typedef struct __krb5_serializer krb5_ser_entry;
2014
2015 krb5_ser_handle krb5_find_serializer(krb5_context, krb5_magic);
2016 krb5_error_code krb5_register_serializer(krb5_context, const krb5_ser_entry *);
2017
2018 /* Determine the external size of a particular opaque structure */
2019 krb5_error_code KRB5_CALLCONV
2020 krb5_size_opaque(krb5_context, krb5_magic, krb5_pointer, size_t *);
2021
2022 /* Serialize the structure into a buffer */
2023 krb5_error_code KRB5_CALLCONV
2024 krb5_externalize_opaque(krb5_context, krb5_magic, krb5_pointer, krb5_octet **,
2025                         size_t *);
2026
2027 /* Deserialize the structure from a buffer */
2028 krb5_error_code KRB5_CALLCONV
2029 krb5_internalize_opaque(krb5_context, krb5_magic, krb5_pointer *,
2030                         krb5_octet **, size_t *);
2031
2032 /* Serialize data into a buffer */
2033 krb5_error_code
2034 krb5_externalize_data(krb5_context, krb5_pointer, krb5_octet **, size_t *);
2035 /*
2036  * Initialization routines.
2037  */
2038
2039 /* Initialize serialization for krb5_[os_]context */
2040 krb5_error_code KRB5_CALLCONV krb5_ser_context_init(krb5_context);
2041
2042 /* Initialize serialization for krb5_auth_context */
2043 krb5_error_code KRB5_CALLCONV krb5_ser_auth_context_init(krb5_context);
2044
2045 /* Initialize serialization for krb5_keytab */
2046 krb5_error_code KRB5_CALLCONV krb5_ser_keytab_init(krb5_context);
2047
2048 /* Initialize serialization for krb5_ccache */
2049 krb5_error_code KRB5_CALLCONV krb5_ser_ccache_init(krb5_context);
2050
2051 /* Initialize serialization for krb5_rcache */
2052 krb5_error_code KRB5_CALLCONV krb5_ser_rcache_init(krb5_context);
2053
2054 /* [De]serialize 4-byte integer */
2055 krb5_error_code KRB5_CALLCONV
2056 krb5_ser_pack_int32(krb5_int32, krb5_octet **, size_t *);
2057
2058 krb5_error_code KRB5_CALLCONV
2059 krb5_ser_unpack_int32(krb5_int32 *, krb5_octet **, size_t *);
2060
2061 /* [De]serialize 8-byte integer */
2062 krb5_error_code KRB5_CALLCONV
2063 krb5_ser_pack_int64(krb5_int64, krb5_octet **, size_t *);
2064
2065 krb5_error_code KRB5_CALLCONV
2066 krb5_ser_unpack_int64(krb5_int64 *, krb5_octet **, size_t *);
2067
2068 /* [De]serialize byte string */
2069 krb5_error_code KRB5_CALLCONV
2070 krb5_ser_pack_bytes(krb5_octet *, size_t, krb5_octet **, size_t *);
2071
2072 krb5_error_code KRB5_CALLCONV
2073 krb5_ser_unpack_bytes(krb5_octet *, size_t, krb5_octet **, size_t *);
2074
2075 krb5_error_code KRB5_CALLCONV
2076 krb5int_cc_default(krb5_context, krb5_ccache *);
2077
2078 krb5_error_code KRB5_CALLCONV
2079 krb5_cc_retrieve_cred_default(krb5_context, krb5_ccache, krb5_flags,
2080                               krb5_creds *, krb5_creds *);
2081
2082 krb5_boolean KRB5_CALLCONV
2083 krb5_creds_compare(krb5_context in_context, krb5_creds *in_creds,
2084                    krb5_creds *in_compare_creds);
2085
2086 void
2087 krb5int_set_prompt_types(krb5_context, krb5_prompt_type *);
2088
2089 krb5_error_code
2090 krb5int_generate_and_save_subkey(krb5_context, krb5_auth_context,
2091                                  krb5_keyblock * /* Old keyblock, not new!  */,
2092                                  krb5_enctype);
2093
2094 struct srv_dns_entry {
2095     struct srv_dns_entry *next;
2096     int priority;
2097     int weight;
2098     unsigned short port;
2099     char *host;
2100 };
2101
2102 #define MAX_DNS_NAMELEN (15*(MAXHOSTNAMELEN + 1)+1)
2103
2104 #ifdef KRB5_DNS_LOOKUP
2105 krb5_error_code
2106 krb5int_make_srv_query_realm(const krb5_data *realm,
2107                              const char *service,
2108                              const char *protocol,
2109                              struct srv_dns_entry **answers);
2110 void krb5int_free_srv_dns_data(struct srv_dns_entry *);
2111 #endif
2112
2113 /* value to use when requesting a keytab entry and KVNO doesn't matter */
2114 #define IGNORE_VNO 0
2115 /* value to use when requesting a keytab entry and enctype doesn't matter */
2116 #define IGNORE_ENCTYPE 0
2117
2118 /*
2119  * Convenience function for structure magic number
2120  */
2121 #define KRB5_VERIFY_MAGIC(structure,magic_number)                       \
2122     if ((structure)->magic != (magic_number)) return (magic_number);
2123
2124 /* to keep lint happy */
2125 #define krb5_xfree(val) free((char *)(val))
2126
2127 /* To keep happy libraries which are (for now) accessing internal stuff */
2128
2129 /* Make sure to increment by one when changing the struct */
2130 #define KRB5INT_ACCESS_STRUCT_VERSION 17
2131
2132 #ifndef ANAME_SZ
2133 struct ktext;                   /* from krb.h, for krb524 support */
2134 #endif
2135 typedef struct _krb5int_access {
2136     /* crypto stuff */
2137     krb5_error_code (*arcfour_gsscrypt)(const krb5_keyblock *keyblock,
2138                                         krb5_keyusage usage,
2139                                         const krb5_data *kd_data,
2140                                         krb5_crypto_iov *data,
2141                                         size_t num_data);
2142
2143     krb5_error_code (*auth_con_get_subkey_enctype)(krb5_context,
2144                                                    krb5_auth_context,
2145                                                    krb5_enctype *);
2146
2147     krb5_error_code (*clean_hostname)(krb5_context, const char *, char *,
2148                                       size_t);
2149
2150     krb5_error_code (*mandatory_cksumtype)(krb5_context, krb5_enctype,
2151                                            krb5_cksumtype *);
2152     krb5_error_code (KRB5_CALLCONV *ser_pack_int64)(krb5_int64, krb5_octet **,
2153                                                     size_t *);
2154     krb5_error_code (KRB5_CALLCONV *ser_unpack_int64)(krb5_int64 *,
2155                                                       krb5_octet **, size_t *);
2156
2157     /* Used for KDB LDAP back end.  */
2158     krb5_error_code
2159     (*asn1_ldap_encode_sequence_of_keys)(const ldap_seqof_key_data *val,
2160                                          krb5_data **code);
2161
2162     krb5_error_code
2163     (*asn1_ldap_decode_sequence_of_keys)(krb5_data *in,
2164                                          ldap_seqof_key_data **);
2165
2166     /* Used for encrypted challenge fast factor*/
2167     krb5_error_code (*encode_enc_data)(const krb5_enc_data *, krb5_data **);
2168     krb5_error_code (*decode_enc_data)(const krb5_data *, krb5_enc_data **);
2169     void (KRB5_CALLCONV *free_enc_data)(krb5_context, krb5_enc_data *);
2170     krb5_error_code (*encode_enc_ts)(const krb5_pa_enc_ts *, krb5_data **);
2171     krb5_error_code (*decode_enc_ts)(const krb5_data *, krb5_pa_enc_ts **);
2172     void (KRB5_CALLCONV *free_enc_ts)(krb5_context, krb5_pa_enc_ts *);
2173     krb5_error_code
2174     (*encrypt_helper)(krb5_context, const krb5_keyblock *, krb5_keyusage,
2175                       const krb5_data *, krb5_enc_data *);
2176
2177     /*
2178      * pkinit asn.1 encode/decode functions
2179      */
2180     krb5_error_code
2181     (*encode_krb5_auth_pack)(const krb5_auth_pack *rep, krb5_data **code);
2182
2183     krb5_error_code
2184     (*encode_krb5_auth_pack_draft9)(const krb5_auth_pack_draft9 *rep,
2185                                     krb5_data **code);
2186
2187     krb5_error_code
2188     (*encode_krb5_kdc_dh_key_info)(const krb5_kdc_dh_key_info *rep,
2189                                    krb5_data **code);
2190
2191     krb5_error_code
2192     (*encode_krb5_pa_pk_as_rep)(const krb5_pa_pk_as_rep *rep,
2193                                 krb5_data **code);
2194
2195     krb5_error_code
2196     (*encode_krb5_pa_pk_as_rep_draft9)(const krb5_pa_pk_as_rep_draft9 *rep,
2197                                        krb5_data **code);
2198
2199     krb5_error_code
2200     (*encode_krb5_pa_pk_as_req)(const krb5_pa_pk_as_req *rep,
2201                                 krb5_data **code);
2202
2203     krb5_error_code
2204     (*encode_krb5_pa_pk_as_req_draft9)(const krb5_pa_pk_as_req_draft9 *rep,
2205                                        krb5_data **code);
2206
2207     krb5_error_code
2208     (*encode_krb5_reply_key_pack)(const krb5_reply_key_pack *,
2209                                   krb5_data **code);
2210
2211     krb5_error_code
2212     (*encode_krb5_reply_key_pack_draft9)(const krb5_reply_key_pack_draft9 *,
2213                                          krb5_data **code);
2214
2215     krb5_error_code
2216     (*encode_krb5_td_dh_parameters)(const krb5_algorithm_identifier **,
2217                                     krb5_data **code);
2218
2219     krb5_error_code
2220     (*encode_krb5_td_trusted_certifiers)(const
2221                                          krb5_external_principal_identifier **,
2222                                          krb5_data **code);
2223
2224     krb5_error_code
2225     (*encode_krb5_typed_data)(const krb5_typed_data **, krb5_data **code);
2226
2227     krb5_error_code
2228     (*decode_krb5_auth_pack)(const krb5_data *, krb5_auth_pack **);
2229
2230     krb5_error_code
2231     (*decode_krb5_auth_pack_draft9)(const krb5_data *,
2232                                     krb5_auth_pack_draft9 **);
2233
2234     krb5_error_code
2235     (*decode_krb5_pa_pk_as_req)(const krb5_data *, krb5_pa_pk_as_req **);
2236
2237     krb5_error_code
2238     (*decode_krb5_pa_pk_as_req_draft9)(const krb5_data *,
2239                                        krb5_pa_pk_as_req_draft9 **);
2240
2241     krb5_error_code
2242     (*decode_krb5_pa_pk_as_rep)(const krb5_data *, krb5_pa_pk_as_rep **);
2243
2244     krb5_error_code
2245     (*decode_krb5_pa_pk_as_rep_draft9)(const krb5_data *,
2246                                        krb5_pa_pk_as_rep_draft9 **);
2247
2248     krb5_error_code
2249     (*decode_krb5_kdc_dh_key_info)(const krb5_data *, krb5_kdc_dh_key_info **);
2250
2251     krb5_error_code
2252     (*decode_krb5_principal_name)(const krb5_data *, krb5_principal_data **);
2253
2254     krb5_error_code
2255     (*decode_krb5_reply_key_pack)(const krb5_data *, krb5_reply_key_pack **);
2256
2257     krb5_error_code
2258     (*decode_krb5_reply_key_pack_draft9)(const krb5_data *,
2259                                          krb5_reply_key_pack_draft9 **);
2260
2261     krb5_error_code
2262     (*decode_krb5_td_dh_parameters)(const krb5_data *,
2263                                     krb5_algorithm_identifier ***);
2264
2265     krb5_error_code
2266     (*decode_krb5_td_trusted_certifiers)(const krb5_data *,
2267                                          krb5_external_principal_identifier
2268                                          ***);
2269
2270     krb5_error_code
2271     (*decode_krb5_typed_data)(const krb5_data *, krb5_typed_data ***);
2272
2273     krb5_error_code
2274     (*decode_krb5_as_req)(const krb5_data *output, krb5_kdc_req **rep);
2275
2276     krb5_error_code
2277     (*encode_krb5_kdc_req_body)(const krb5_kdc_req *rep, krb5_data **code);
2278
2279     void
2280     (KRB5_CALLCONV *free_kdc_req)(krb5_context, krb5_kdc_req * );
2281     void
2282     (*set_prompt_types)(krb5_context, krb5_prompt_type *);
2283
2284     krb5_error_code
2285     (*encode_krb5_authdata_elt)(const krb5_authdata *rep, krb5_data **code);
2286
2287     /* Exported for testing only!  */
2288     krb5_error_code
2289     (*encode_krb5_sam_response_2)(const krb5_sam_response_2 *rep,
2290                                   krb5_data **code);
2291     krb5_error_code
2292     (*encode_krb5_enc_sam_response_enc_2)(const
2293                                           krb5_enc_sam_response_enc_2 *rep,
2294                                           krb5_data **code);
2295 } krb5int_access;
2296
2297 #define KRB5INT_ACCESS_VERSION                                          \
2298     (((krb5_int32)((sizeof(krb5int_access) & 0xFFFF) |                  \
2299                    (KRB5INT_ACCESS_STRUCT_VERSION << 16))) & 0xFFFFFFFF)
2300
2301 krb5_error_code KRB5_CALLCONV
2302 krb5int_accessor(krb5int_access*, krb5_int32);
2303
2304 /* Ick -- some krb524 and krb4 support placed in the krb5 library,
2305    because AFS (and potentially other applications?) use the krb4
2306    object as an opaque token, which (in some implementations) is not
2307    in fact a krb4 ticket, so we don't want to drag in the krb4 support
2308    just to enable this.  */
2309
2310 #define KRB524_SERVICE "krb524"
2311 #define KRB524_PORT 4444
2312
2313 /* temporary -- this should be under lib/krb5/ccache somewhere */
2314
2315 struct _krb5_ccache {
2316     krb5_magic magic;
2317     const struct _krb5_cc_ops *ops;
2318     krb5_pointer data;
2319 };
2320
2321 /*
2322  * Per-type ccache cursor.
2323  */
2324 struct krb5_cc_ptcursor_s {
2325     const struct _krb5_cc_ops *ops;
2326     krb5_pointer data;
2327 };
2328 typedef struct krb5_cc_ptcursor_s *krb5_cc_ptcursor;
2329
2330 struct _krb5_cc_ops {
2331     krb5_magic magic;
2332     char *prefix;
2333     const char * (KRB5_CALLCONV *get_name)(krb5_context, krb5_ccache);
2334     krb5_error_code (KRB5_CALLCONV *resolve)(krb5_context, krb5_ccache *,
2335                                              const char *);
2336     krb5_error_code (KRB5_CALLCONV *gen_new)(krb5_context, krb5_ccache *);
2337     krb5_error_code (KRB5_CALLCONV *init)(krb5_context, krb5_ccache,
2338                                           krb5_principal);
2339     krb5_error_code (KRB5_CALLCONV *destroy)(krb5_context, krb5_ccache);
2340     krb5_error_code (KRB5_CALLCONV *close)(krb5_context, krb5_ccache);
2341     krb5_error_code (KRB5_CALLCONV *store)(krb5_context, krb5_ccache,
2342                                            krb5_creds *);
2343     krb5_error_code (KRB5_CALLCONV *retrieve)(krb5_context, krb5_ccache,
2344                                               krb5_flags, krb5_creds *,
2345                                               krb5_creds *);
2346     krb5_error_code (KRB5_CALLCONV *get_princ)(krb5_context, krb5_ccache,
2347                                                krb5_principal *);
2348     krb5_error_code (KRB5_CALLCONV *get_first)(krb5_context, krb5_ccache,
2349                                                krb5_cc_cursor *);
2350     krb5_error_code (KRB5_CALLCONV *get_next)(krb5_context, krb5_ccache,
2351                                               krb5_cc_cursor *, krb5_creds *);
2352     krb5_error_code (KRB5_CALLCONV *end_get)(krb5_context, krb5_ccache,
2353                                              krb5_cc_cursor *);
2354     krb5_error_code (KRB5_CALLCONV *remove_cred)(krb5_context, krb5_ccache,
2355                                                  krb5_flags, krb5_creds *);
2356     krb5_error_code (KRB5_CALLCONV *set_flags)(krb5_context, krb5_ccache,
2357                                                krb5_flags);
2358     krb5_error_code (KRB5_CALLCONV *get_flags)(krb5_context, krb5_ccache,
2359                                                krb5_flags *);
2360     krb5_error_code (KRB5_CALLCONV *ptcursor_new)(krb5_context,
2361                                                   krb5_cc_ptcursor *);
2362     krb5_error_code (KRB5_CALLCONV *ptcursor_next)(krb5_context,
2363                                                    krb5_cc_ptcursor,
2364                                                    krb5_ccache *);
2365     krb5_error_code (KRB5_CALLCONV *ptcursor_free)(krb5_context,
2366                                                    krb5_cc_ptcursor *);
2367     krb5_error_code (KRB5_CALLCONV *move)(krb5_context, krb5_ccache,
2368                                           krb5_ccache);
2369     krb5_error_code (KRB5_CALLCONV *lastchange)(krb5_context,
2370                                                 krb5_ccache, krb5_timestamp *);
2371     krb5_error_code (KRB5_CALLCONV *wasdefault)(krb5_context, krb5_ccache,
2372                                                 krb5_timestamp *);
2373     krb5_error_code (KRB5_CALLCONV *lock)(krb5_context, krb5_ccache);
2374     krb5_error_code (KRB5_CALLCONV *unlock)(krb5_context, krb5_ccache);
2375     krb5_error_code (KRB5_CALLCONV *switch_to)(krb5_context, krb5_ccache);
2376 };
2377
2378 extern const krb5_cc_ops *krb5_cc_dfl_ops;
2379
2380 krb5_error_code
2381 krb5int_cc_os_default_name(krb5_context context, char **name);
2382
2383 typedef struct _krb5_donot_replay {
2384     krb5_magic magic;
2385     krb5_ui_4 hash;
2386     char *server;                       /* null-terminated */
2387     char *client;                       /* null-terminated */
2388     char *msghash;                      /* null-terminated */
2389     krb5_int32 cusec;
2390     krb5_timestamp ctime;
2391 } krb5_donot_replay;
2392
2393 krb5_error_code krb5_rc_default(krb5_context, krb5_rcache *);
2394 krb5_error_code krb5_rc_resolve_type(krb5_context, krb5_rcache *,char *);
2395 krb5_error_code krb5_rc_resolve_full(krb5_context, krb5_rcache *,char *);
2396 char *krb5_rc_get_type(krb5_context, krb5_rcache);
2397 char *krb5_rc_default_type(krb5_context);
2398 char *krb5_rc_default_name(krb5_context);
2399 krb5_error_code krb5_auth_to_rep(krb5_context, krb5_tkt_authent *,
2400                                  krb5_donot_replay *);
2401 krb5_error_code krb5_rc_hash_message(krb5_context context,
2402                                      const krb5_data *message, char **out);
2403
2404 krb5_error_code KRB5_CALLCONV
2405 krb5_rc_initialize(krb5_context, krb5_rcache, krb5_deltat);
2406
2407 krb5_error_code KRB5_CALLCONV
2408 krb5_rc_recover_or_initialize(krb5_context, krb5_rcache,krb5_deltat);
2409
2410 krb5_error_code KRB5_CALLCONV
2411 krb5_rc_recover(krb5_context, krb5_rcache);
2412
2413 krb5_error_code KRB5_CALLCONV
2414 krb5_rc_destroy(krb5_context, krb5_rcache);
2415
2416 krb5_error_code KRB5_CALLCONV
2417 krb5_rc_close(krb5_context, krb5_rcache);
2418
2419 krb5_error_code KRB5_CALLCONV
2420 krb5_rc_store(krb5_context, krb5_rcache, krb5_donot_replay *);
2421
2422 krb5_error_code KRB5_CALLCONV
2423 krb5_rc_expunge(krb5_context, krb5_rcache);
2424
2425 krb5_error_code KRB5_CALLCONV
2426 krb5_rc_get_lifespan(krb5_context, krb5_rcache,krb5_deltat *);
2427
2428 char *KRB5_CALLCONV
2429 krb5_rc_get_name(krb5_context, krb5_rcache);
2430
2431 krb5_error_code KRB5_CALLCONV
2432 krb5_rc_resolve(krb5_context, krb5_rcache, char *);
2433
2434 /*
2435  * This structure was exposed and used in macros in krb5 1.2, so do not
2436  * change its ABI.
2437  */
2438 typedef struct _krb5_kt_ops {
2439     krb5_magic magic;
2440     char *prefix;
2441
2442     /* routines always present */
2443     krb5_error_code (KRB5_CALLCONV *resolve)(krb5_context, const char *,
2444                                              krb5_keytab *);
2445     krb5_error_code (KRB5_CALLCONV *get_name)(krb5_context, krb5_keytab,
2446                                               char *, unsigned int);
2447     krb5_error_code (KRB5_CALLCONV *close)(krb5_context, krb5_keytab);
2448     krb5_error_code (KRB5_CALLCONV *get)(krb5_context, krb5_keytab,
2449                                          krb5_const_principal, krb5_kvno,
2450                                          krb5_enctype, krb5_keytab_entry *);
2451     krb5_error_code (KRB5_CALLCONV *start_seq_get)(krb5_context, krb5_keytab,
2452                                                    krb5_kt_cursor *);
2453     krb5_error_code (KRB5_CALLCONV *get_next)(krb5_context, krb5_keytab,
2454                                               krb5_keytab_entry *,
2455                                               krb5_kt_cursor *);
2456     krb5_error_code (KRB5_CALLCONV *end_get)(krb5_context, krb5_keytab,
2457                                              krb5_kt_cursor *);
2458     /* routines to be included on extended version (write routines) */
2459     krb5_error_code (KRB5_CALLCONV *add)(krb5_context, krb5_keytab,
2460                                          krb5_keytab_entry *);
2461     krb5_error_code (KRB5_CALLCONV *remove)(krb5_context, krb5_keytab,
2462                                             krb5_keytab_entry *);
2463
2464     /* Handle for serializer */
2465     const krb5_ser_entry *serializer;
2466 } krb5_kt_ops;
2467
2468 extern const krb5_kt_ops krb5_kt_dfl_ops;
2469
2470 extern krb5_error_code krb5int_translate_gai_error(int);
2471
2472 /* Not sure it's ready for exposure just yet.  */
2473 extern krb5_error_code
2474 krb5int_c_mandatory_cksumtype(krb5_context, krb5_enctype, krb5_cksumtype *);
2475
2476 /*
2477  * Referral definitions, debugging hooks, and subfunctions.
2478  */
2479 #define        KRB5_REFERRAL_MAXHOPS    10
2480 /* #define DEBUG_REFERRALS */
2481
2482 #ifdef DEBUG_REFERRALS
2483 void krb5int_dbgref_dump_principal(char *, krb5_principal);
2484 #endif
2485
2486 /* Common hostname-parsing code. */
2487 krb5_error_code
2488 krb5int_clean_hostname(krb5_context, const char *, char *, size_t);
2489
2490 #if 0
2491 /*
2492  * There are no IANA assignments for these enctypes or cksumtypes yet.  They
2493  * must be defined to local-use negative numbers at build time for Camellia
2494  * support to function at the moment.  If one is defined, they should all be
2495  * defined.  When IANA assignments exist, these definitions should move to the
2496  * appropriate places in krb5.hin and all CAMELLIA conditional code should be
2497  * made unconditional.
2498  *
2499  * The present code is experimental and may not be compatible with the
2500  * standardized version.
2501  */
2502 #define ENCTYPE_CAMELLIA128_CTS_CMAC -XXX /* Camellia CTS mode, 128-bit key */
2503 #define ENCTYPE_CAMELLIA256_CTS_CMAC -YYY /* Camellia CTS mode, 256-bit key */
2504 #define CKSUMTYPE_CMAC_CAMELLIA128 -XXX   /* CMAC, 128-bit Camellia key */
2505 #define CKSUMTYPE_CMAC_CAMELLIA256 -YYY   /* CMAC, 256-bit Camellia key */
2506 #endif
2507
2508 #ifdef ENCTYPE_CAMELLIA128_CTS_CMAC
2509 #define CAMELLIA
2510 #endif
2511
2512 struct _krb5_kt {       /* should move into k5-int.h */
2513     krb5_magic magic;
2514     const struct _krb5_kt_ops *ops;
2515     krb5_pointer data;
2516 };
2517
2518 krb5_error_code krb5_set_default_in_tkt_ktypes(krb5_context,
2519                                                const krb5_enctype *);
2520
2521 krb5_error_code krb5_get_default_in_tkt_ktypes(krb5_context, krb5_enctype **);
2522
2523 krb5_error_code krb5_set_default_tgs_ktypes(krb5_context,
2524                                             const krb5_enctype *);
2525
2526 krb5_error_code KRB5_CALLCONV
2527 krb5_get_tgs_ktypes(krb5_context, krb5_const_principal, krb5_enctype **);
2528
2529 void KRB5_CALLCONV krb5_free_ktypes(krb5_context, krb5_enctype *);
2530
2531 krb5_boolean krb5_is_permitted_enctype(krb5_context, krb5_enctype);
2532
2533 typedef struct
2534 {
2535     krb5_enctype *etype;
2536     krb5_boolean *etype_ok;
2537     krb5_int32 etype_count;
2538 } krb5_etypes_permitted;
2539
2540 krb5_boolean krb5_is_permitted_enctype_ext(krb5_context,
2541                                            krb5_etypes_permitted *);
2542
2543 krb5_boolean KRB5_CALLCONV krb5int_c_weak_enctype(krb5_enctype);
2544
2545 krb5_error_code krb5_kdc_rep_decrypt_proc(krb5_context, const krb5_keyblock *,
2546                                           krb5_const_pointer, krb5_kdc_rep *);
2547 krb5_error_code KRB5_CALLCONV krb5_decrypt_tkt_part(krb5_context,
2548                                                     const krb5_keyblock *,
2549                                                     krb5_ticket * );
2550
2551 krb5_error_code krb5_get_cred_via_tkt(krb5_context, krb5_creds *, krb5_flags,
2552                                       krb5_address *const *, krb5_creds *,
2553                                       krb5_creds **);
2554
2555 krb5_error_code KRB5_CALLCONV krb5_copy_addr(krb5_context,
2556                                              const krb5_address *,
2557                                              krb5_address **);
2558
2559 void krb5_init_ets(krb5_context);
2560 void krb5_free_ets(krb5_context);
2561 krb5_error_code krb5_generate_subkey(krb5_context, const krb5_keyblock *,
2562                                      krb5_keyblock **);
2563 krb5_error_code krb5_generate_subkey_extended(krb5_context,
2564                                               const krb5_keyblock *,
2565                                               krb5_enctype, krb5_keyblock **);
2566 krb5_error_code krb5_generate_seq_number(krb5_context, const krb5_keyblock *,
2567                                          krb5_ui_4 *);
2568
2569 krb5_error_code KRB5_CALLCONV krb5_kt_register(krb5_context,
2570                                                const struct _krb5_kt_ops *);
2571
2572 krb5_error_code k5_kt_get_principal(krb5_context context, krb5_keytab keytab,
2573                                     krb5_principal *princ_out);
2574
2575 krb5_error_code krb5_principal2salt_norealm(krb5_context, krb5_const_principal,
2576                                             krb5_data *);
2577
2578 unsigned int KRB5_CALLCONV krb5_get_notification_message(void);
2579
2580 /* chk_trans.c */
2581 krb5_error_code krb5_check_transited_list(krb5_context, const krb5_data *trans,
2582                                           const krb5_data *realm1,
2583                                           const krb5_data *realm2);
2584
2585 /* free_rtree.c */
2586 void krb5_free_realm_tree(krb5_context, krb5_principal *);
2587
2588 void KRB5_CALLCONV krb5_free_authenticator_contents(krb5_context,
2589                                                     krb5_authenticator *);
2590
2591 void KRB5_CALLCONV krb5_free_address(krb5_context, krb5_address *);
2592
2593 void KRB5_CALLCONV krb5_free_enc_tkt_part(krb5_context, krb5_enc_tkt_part *);
2594
2595 void KRB5_CALLCONV krb5_free_tickets(krb5_context, krb5_ticket **);
2596 void KRB5_CALLCONV krb5_free_kdc_req(krb5_context, krb5_kdc_req *);
2597 void KRB5_CALLCONV krb5_free_kdc_rep(krb5_context, krb5_kdc_rep *);
2598 void KRB5_CALLCONV krb5_free_last_req(krb5_context, krb5_last_req_entry **);
2599 void KRB5_CALLCONV krb5_free_enc_kdc_rep_part(krb5_context,
2600                                               krb5_enc_kdc_rep_part *);
2601 void KRB5_CALLCONV krb5_free_ap_req(krb5_context, krb5_ap_req *);
2602 void KRB5_CALLCONV krb5_free_ap_rep(krb5_context, krb5_ap_rep *);
2603 void KRB5_CALLCONV krb5_free_cred(krb5_context, krb5_cred *);
2604 void KRB5_CALLCONV krb5_free_cred_enc_part(krb5_context, krb5_cred_enc_part *);
2605 void KRB5_CALLCONV krb5_free_pa_data(krb5_context, krb5_pa_data **);
2606 void KRB5_CALLCONV krb5_free_tkt_authent(krb5_context, krb5_tkt_authent *);
2607 void KRB5_CALLCONV krb5_free_pwd_data(krb5_context, krb5_pwd_data *);
2608 void KRB5_CALLCONV krb5_free_pwd_sequences(krb5_context,
2609                                            passwd_phrase_element **);
2610 void KRB5_CALLCONV krb5_free_passwd_phrase_element(krb5_context,
2611                                                    passwd_phrase_element *);
2612 void KRB5_CALLCONV krb5_free_alt_method(krb5_context, krb5_alt_method *);
2613 void KRB5_CALLCONV krb5_free_enc_data(krb5_context, krb5_enc_data *);
2614 krb5_error_code krb5_set_config_files(krb5_context, const char **);
2615
2616 krb5_error_code KRB5_CALLCONV krb5_get_default_config_files(char ***filenames);
2617
2618 void KRB5_CALLCONV krb5_free_config_files(char **filenames);
2619
2620 krb5_error_code krb5int_find_authdata(krb5_context context,
2621                                       krb5_authdata *const *ticket_authdata,
2622                                       krb5_authdata *const *ap_req_authdata,
2623                                       krb5_authdatatype ad_type,
2624                                       krb5_authdata ***results);
2625
2626 krb5_error_code krb5_rd_req_decoded(krb5_context, krb5_auth_context *,
2627                                     const krb5_ap_req *, krb5_const_principal,
2628                                     krb5_keytab, krb5_flags *, krb5_ticket **);
2629
2630 krb5_error_code krb5_rd_req_decoded_anyflag(krb5_context, krb5_auth_context *,
2631                                             const krb5_ap_req *,
2632                                             krb5_const_principal, krb5_keytab,
2633                                             krb5_flags *, krb5_ticket **);
2634
2635 krb5_error_code KRB5_CALLCONV
2636 krb5_cc_register(krb5_context, const krb5_cc_ops *, krb5_boolean );
2637
2638 krb5_error_code krb5_walk_realm_tree(krb5_context, const krb5_data *,
2639                                      const krb5_data *, krb5_principal **,
2640                                      int);
2641
2642 krb5_error_code
2643 krb5_auth_con_set_safe_cksumtype(krb5_context, krb5_auth_context,
2644                                  krb5_cksumtype);
2645
2646 krb5_error_code krb5_auth_con_setivector(krb5_context, krb5_auth_context,
2647                                          krb5_pointer);
2648
2649 krb5_error_code krb5_auth_con_getivector(krb5_context, krb5_auth_context,
2650                                          krb5_pointer *);
2651
2652 krb5_error_code krb5_auth_con_setpermetypes(krb5_context, krb5_auth_context,
2653                                             const krb5_enctype *);
2654
2655 krb5_error_code krb5_auth_con_getpermetypes(krb5_context, krb5_auth_context,
2656                                             krb5_enctype **);
2657
2658 krb5_error_code krb5_auth_con_get_subkey_enctype(krb5_context context,
2659                                                  krb5_auth_context,
2660                                                  krb5_enctype *);
2661
2662 krb5_error_code
2663 krb5_auth_con_get_authdata_context(krb5_context context,
2664                                    krb5_auth_context auth_context,
2665                                    krb5_authdata_context *ad_context);
2666
2667 krb5_error_code
2668 krb5_auth_con_set_authdata_context(krb5_context context,
2669                                    krb5_auth_context auth_context,
2670                                    krb5_authdata_context ad_context);
2671
2672 krb5_error_code KRB5_CALLCONV
2673 krb5int_server_decrypt_ticket_keyblock(krb5_context context,
2674                                        const krb5_keyblock *key,
2675                                        krb5_ticket  *ticket);
2676
2677 krb5_error_code krb5_read_message(krb5_context, krb5_pointer, krb5_data *);
2678 krb5_error_code krb5_write_message(krb5_context, krb5_pointer, krb5_data *);
2679 krb5_error_code krb5int_write_messages(krb5_context, krb5_pointer, krb5_data *,
2680                                        int);
2681 int krb5_net_read(krb5_context, int , char *, int);
2682 int krb5_net_write(krb5_context, int , const char *, int);
2683
2684 krb5_error_code KRB5_CALLCONV krb5_get_realm_domain(krb5_context,
2685                                                     const char *, char ** );
2686
2687 krb5_error_code krb5_gen_portaddr(krb5_context, const krb5_address *,
2688                                   krb5_const_pointer, krb5_address **);
2689
2690 krb5_error_code krb5_gen_replay_name(krb5_context, const krb5_address *,
2691                                      const char *, char **);
2692 krb5_error_code krb5_make_fulladdr(krb5_context, krb5_address *,
2693                                    krb5_address *, krb5_address *);
2694
2695 krb5_error_code krb5_set_debugging_time(krb5_context, krb5_timestamp,
2696                                         krb5_int32);
2697 krb5_error_code krb5_use_natural_time(krb5_context);
2698 krb5_error_code krb5_set_time_offsets(krb5_context, krb5_timestamp,
2699                                       krb5_int32);
2700 krb5_error_code krb5int_check_clockskew(krb5_context, krb5_timestamp);
2701 /*
2702  * The realm iterator functions
2703  */
2704
2705 krb5_error_code KRB5_CALLCONV
2706 krb5_realm_iterator_create(krb5_context context, void **iter_p);
2707
2708 krb5_error_code KRB5_CALLCONV
2709 krb5_realm_iterator(krb5_context context, void **iter_p, char **ret_realm);
2710
2711 void KRB5_CALLCONV
2712 krb5_realm_iterator_free(krb5_context context, void **iter_p);
2713
2714 void KRB5_CALLCONV krb5_free_realm_string(krb5_context context, char *str);
2715
2716 /* Internal principal function used by KIM to avoid code duplication */
2717 krb5_error_code KRB5_CALLCONV
2718 krb5int_build_principal_alloc_va(krb5_context context,
2719                                  krb5_principal *princ,
2720                                  unsigned int rlen,
2721                                  const char *realm,
2722                                  const char *first,
2723                                  va_list ap);
2724
2725 /* Some data comparison and conversion functions.  */
2726 static inline int
2727 data_eq(krb5_data d1, krb5_data d2)
2728 {
2729     return (d1.length == d2.length && !memcmp(d1.data, d2.data, d1.length));
2730 }
2731
2732 static inline int
2733 data_eq_string (krb5_data d, const char *s)
2734 {
2735     return (d.length == strlen(s) && !memcmp(d.data, s, d.length));
2736 }
2737
2738 static inline krb5_data
2739 make_data(void *data, unsigned int len)
2740 {
2741     krb5_data d;
2742
2743     d.magic = KV5M_DATA;
2744     d.data = (char *) data;
2745     d.length = len;
2746     return d;
2747 }
2748
2749 static inline krb5_data
2750 empty_data()
2751 {
2752     return make_data(NULL, 0);
2753 }
2754
2755 static inline krb5_data
2756 string2data(char *str)
2757 {
2758     return make_data(str, strlen(str));
2759 }
2760
2761 static inline krb5_error_code
2762 alloc_data(krb5_data *data, unsigned int len)
2763 {
2764     /* Allocate at least one byte since zero-byte allocs may return NULL. */
2765     char *ptr = (char *) calloc((len > 0) ? len : 1, 1);
2766
2767     if (ptr == NULL)
2768         return ENOMEM;
2769     data->magic = KV5M_DATA;
2770     data->data = ptr;
2771     data->length = len;
2772     return 0;
2773 }
2774
2775 static inline int
2776 authdata_eq(krb5_authdata a1, krb5_authdata a2)
2777 {
2778     return (a1.ad_type == a2.ad_type
2779             && a1.length == a2.length
2780             && !memcmp(a1.contents, a2.contents, a1.length));
2781 }
2782
2783 /* Allocate zeroed memory; set *code to 0 on success or ENOMEM on failure. */
2784 static inline void *
2785 k5alloc(size_t len, krb5_error_code *code)
2786 {
2787     void *ptr;
2788
2789     /* Allocate at least one byte since zero-byte allocs may return NULL. */
2790     ptr = calloc((len > 0) ? len : 1, 1);
2791     *code = (ptr == NULL) ? ENOMEM : 0;
2792     return ptr;
2793 }
2794
2795 krb5_error_code KRB5_CALLCONV
2796 krb5int_pac_sign(krb5_context context,
2797                  krb5_pac pac,
2798                  krb5_timestamp authtime,
2799                  krb5_const_principal principal,
2800                  const krb5_keyblock *server_key,
2801                  const krb5_keyblock *privsvr_key,
2802                  krb5_data *data);
2803
2804 krb5_error_code KRB5_CALLCONV
2805 krb5_get_credentials_for_user(krb5_context context, krb5_flags options,
2806                               krb5_ccache ccache,
2807                               krb5_creds *in_creds,
2808                               krb5_data *cert,
2809                               krb5_creds **out_creds);
2810
2811 krb5_error_code KRB5_CALLCONV
2812 krb5_get_credentials_for_proxy(krb5_context context,
2813                                krb5_flags options,
2814                                krb5_ccache ccache,
2815                                krb5_creds *in_creds,
2816                                krb5_ticket *evidence_tkt,
2817                                krb5_creds **out_creds);
2818
2819 krb5_error_code KRB5_CALLCONV
2820 krb5int_get_authdata_containee_types(krb5_context context,
2821                                      const krb5_authdata *container,
2822                                      unsigned int *nad_types,
2823                                      krb5_authdatatype **ad_types);
2824
2825 krb5_error_code krb5int_parse_enctype_list(krb5_context context,
2826                                            const char *profkey, char *profstr,
2827                                            krb5_enctype *default_list,
2828                                            krb5_enctype **result);
2829
2830 #ifdef DEBUG_ERROR_LOCATIONS
2831 #define krb5_set_error_message(ctx, code, ...)                          \
2832     krb5_set_error_message_fl(ctx, code, __FILE__, __LINE__, __VA_ARGS__)
2833 #endif
2834 void KRB5_CALLCONV_C
2835 krb5_set_error_message_fl(krb5_context ctx, krb5_error_code code,
2836                           const char *file, int line, const char *fmt, ...)
2837 #ifdef __GNUC__
2838     __attribute__((__format__(printf,5,6)))
2839 #endif
2840     ;
2841
2842 #ifndef DISABLE_TRACING
2843 /* Do not use these functions directly; see k5-trace.h. */
2844 void krb5int_init_trace(krb5_context context);
2845 void krb5int_trace(krb5_context context, const char *fmt, ...);
2846 #endif
2847
2848 #endif /* _KRB5_INT_H */