#ifndef _KRB5_INT_H
#define _KRB5_INT_H
#ifdef KRB5_GENERAL__
#error krb5.h included before k5-int.h
#endif
#include "osconf.h"
#if defined(__MACH__) && defined(__APPLE__)
# include <TargetConditionals.h>
# if TARGET_RT_MAC_CFM
# error "Use KfM 4.0 SDK headers for CFM compilation."
# endif
#endif
#ifndef KRB5_CONFIG__
#define KRB5_CONFIG__
#if defined(_MSDOS) || defined(_WIN32)
#include "win-mac.h"
#define KERBEROS_INI "kerberos.ini"
#define INI_FILES "Files"
#define INI_KRB_CCACHE "krb5cc"
#define INI_KRB5_CONF "krb5.ini"
#endif
#include "autoconf.h"
#ifndef KRB5_SYSTYPES__
#define KRB5_SYSTYPES__
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#else
typedef unsigned long u_long;
typedef unsigned int u_int;
typedef unsigned short u_short;
typedef unsigned char u_char;
#endif
#endif
#include "k5-platform.h"
#define KRB5_KDB_MAX_LIFE (60*60*24)
#define KRB5_KDB_MAX_RLIFE (60*60*24*7)
#define KRB5_KDB_EXPIRATION 2145830400
#ifndef KRB5_CALLCONV
#define KRB5_CALLCONV
#define KRB5_CALLCONV_C
#endif
#ifndef O_BINARY
#define O_BINARY 0
#endif
#endif
#include <errno.h>
#include "krb5.h"
#include <krb5/plugin.h>
#include "profile.h"
#include "port-sockets.h"
#include "socket-utils.h"
#include "k5-thread.h"
#include "k5-err.h"
#include "k5-buf.h"
#include "k5-trace.h"
#define KRB5_CONF_ACL_FILE "acl_file"
#define KRB5_CONF_ADMIN_SERVER "admin_server"
#define KRB5_CONF_ALLOW_DES3 "allow_des3"
#define KRB5_CONF_ALLOW_RC4 "allow_rc4"
#define KRB5_CONF_ALLOW_WEAK_CRYPTO "allow_weak_crypto"
#define KRB5_CONF_AUTH_TO_LOCAL "auth_to_local"
#define KRB5_CONF_AUTH_TO_LOCAL_NAMES "auth_to_local_names"
#define KRB5_CONF_CANONICALIZE "canonicalize"
#define KRB5_CONF_CCACHE_TYPE "ccache_type"
#define KRB5_CONF_CLOCKSKEW "clockskew"
#define KRB5_CONF_DATABASE_NAME "database_name"
#define KRB5_CONF_DB_MODULE_DIR "db_module_dir"
#define KRB5_CONF_DEBUG "debug"
#define KRB5_CONF_DEFAULT "default"
#define KRB5_CONF_DEFAULT_CCACHE_NAME "default_ccache_name"
#define KRB5_CONF_DEFAULT_CLIENT_KEYTAB_NAME "default_client_keytab_name"
#define KRB5_CONF_DEFAULT_DOMAIN "default_domain"
#define KRB5_CONF_DEFAULT_KEYTAB_NAME "default_keytab_name"
#define KRB5_CONF_DEFAULT_PRINCIPAL_EXPIRATION "default_principal_expiration"
#define KRB5_CONF_DEFAULT_PRINCIPAL_FLAGS "default_principal_flags"
#define KRB5_CONF_DEFAULT_RCACHE_NAME "default_rcache_name"
#define KRB5_CONF_DEFAULT_REALM "default_realm"
#define KRB5_CONF_DEFAULT_TGS_ENCTYPES "default_tgs_enctypes"
#define KRB5_CONF_DEFAULT_TKT_ENCTYPES "default_tkt_enctypes"
#define KRB5_CONF_DICT_FILE "dict_file"
#define KRB5_CONF_DISABLE "disable"
#define KRB5_CONF_DISABLE_ENCRYPTED_TIMESTAMP "disable_encrypted_timestamp"
#define KRB5_CONF_DISABLE_LAST_SUCCESS "disable_last_success"
#define KRB5_CONF_DISABLE_LOCKOUT "disable_lockout"
#define KRB5_CONF_DISABLE_PAC "disable_pac"
#define KRB5_CONF_DNS_CANONICALIZE_HOSTNAME "dns_canonicalize_hostname"
#define KRB5_CONF_DNS_FALLBACK "dns_fallback"
#define KRB5_CONF_DNS_LOOKUP_KDC "dns_lookup_kdc"
#define KRB5_CONF_DNS_LOOKUP_REALM "dns_lookup_realm"
#define KRB5_CONF_DNS_URI_LOOKUP "dns_uri_lookup"
#define KRB5_CONF_DOMAIN_REALM "domain_realm"
#define KRB5_CONF_ENABLE_ONLY "enable_only"
#define KRB5_CONF_ENCRYPTED_CHALLENGE_INDICATOR "encrypted_challenge_indicator"
#define KRB5_CONF_ENFORCE_OK_AS_DELEGATE "enforce_ok_as_delegate"
#define KRB5_CONF_ERR_FMT "err_fmt"
#define KRB5_CONF_EXTRA_ADDRESSES "extra_addresses"
#define KRB5_CONF_FORWARDABLE "forwardable"
#define KRB5_CONF_HOST_BASED_SERVICES "host_based_services"
#define KRB5_CONF_HTTP_ANCHORS "http_anchors"
#define KRB5_CONF_IGNORE_ACCEPTOR_HOSTNAME "ignore_acceptor_hostname"
#define KRB5_CONF_IPROP_ENABLE "iprop_enable"
#define KRB5_CONF_IPROP_LISTEN "iprop_listen"
#define KRB5_CONF_IPROP_LOGFILE "iprop_logfile"
#define KRB5_CONF_IPROP_MASTER_ULOGSIZE "iprop_master_ulogsize"
#define KRB5_CONF_IPROP_PORT "iprop_port"
#define KRB5_CONF_IPROP_RESYNC_TIMEOUT "iprop_resync_timeout"
#define KRB5_CONF_IPROP_REPLICA_POLL "iprop_replica_poll"
#define KRB5_CONF_IPROP_SLAVE_POLL "iprop_slave_poll"
#define KRB5_CONF_IPROP_ULOGSIZE "iprop_ulogsize"
#define KRB5_CONF_K5LOGIN_AUTHORITATIVE "k5login_authoritative"
#define KRB5_CONF_K5LOGIN_DIRECTORY "k5login_directory"
#define KRB5_CONF_KADMIND_LISTEN "kadmind_listen"
#define KRB5_CONF_KADMIND_PORT "kadmind_port"
#define KRB5_CONF_KCM_MACH_SERVICE "kcm_mach_service"
#define KRB5_CONF_KCM_SOCKET "kcm_socket"
#define KRB5_CONF_KDC "kdc"
#define KRB5_CONF_KDCDEFAULTS "kdcdefaults"
#define KRB5_CONF_KDC_DEFAULT_OPTIONS "kdc_default_options"
#define KRB5_CONF_KDC_LISTEN "kdc_listen"
#define KRB5_CONF_KDC_MAX_DGRAM_REPLY_SIZE "kdc_max_dgram_reply_size"
#define KRB5_CONF_KDC_PORTS "kdc_ports"
#define KRB5_CONF_KDC_TCP_PORTS "kdc_tcp_ports"
#define KRB5_CONF_KDC_TCP_LISTEN "kdc_tcp_listen"
#define KRB5_CONF_KDC_TCP_LISTEN_BACKLOG "kdc_tcp_listen_backlog"
#define KRB5_CONF_KDC_TIMESYNC "kdc_timesync"
#define KRB5_CONF_KDC_UNIXSOCK_LISTEN "kdc_unixsock_listen"
#define KRB5_CONF_KEY_STASH_FILE "key_stash_file"
#define KRB5_CONF_KPASSWD_LISTEN "kpasswd_listen"
#define KRB5_CONF_KPASSWD_PORT "kpasswd_port"
#define KRB5_CONF_KPASSWD_SERVER "kpasswd_server"
#define KRB5_CONF_KRB524_SERVER "krb524_server"
#define KRB5_CONF_LDAP_CONNS_PER_SERVER "ldap_conns_per_server"
#define KRB5_CONF_LDAP_KADMIND_DN "ldap_kadmind_dn"
#define KRB5_CONF_LDAP_KADMIND_SASL_AUTHCID "ldap_kadmind_sasl_authcid"
#define KRB5_CONF_LDAP_KADMIND_SASL_AUTHZID "ldap_kadmind_sasl_authzid"
#define KRB5_CONF_LDAP_KADMIND_SASL_MECH "ldap_kadmind_sasl_mech"
#define KRB5_CONF_LDAP_KADMIND_SASL_REALM "ldap_kadmind_sasl_realm"
#define KRB5_CONF_LDAP_KDC_DN "ldap_kdc_dn"
#define KRB5_CONF_LDAP_KDC_SASL_AUTHCID "ldap_kdc_sasl_authcid"
#define KRB5_CONF_LDAP_KDC_SASL_AUTHZID "ldap_kdc_sasl_authzid"
#define KRB5_CONF_LDAP_KDC_SASL_MECH "ldap_kdc_sasl_mech"
#define KRB5_CONF_LDAP_KDC_SASL_REALM "ldap_kdc_sasl_realm"
#define KRB5_CONF_LDAP_KERBEROS_CONTAINER_DN "ldap_kerberos_container_dn"
#define KRB5_CONF_LDAP_SERVERS "ldap_servers"
#define KRB5_CONF_LDAP_SERVICE_PASSWORD_FILE "ldap_service_password_file"
#define KRB5_CONF_LIBDEFAULTS "libdefaults"
#define KRB5_CONF_LOGGING "logging"
#define KRB5_CONF_MAPSIZE "mapsize"
#define KRB5_CONF_MASTER_KDC "master_kdc"
#define KRB5_CONF_MASTER_KEY_NAME "master_key_name"
#define KRB5_CONF_MASTER_KEY_TYPE "master_key_type"
#define KRB5_CONF_MAX_LIFE "max_life"
#define KRB5_CONF_MAX_READERS "max_readers"
#define KRB5_CONF_MAX_RENEWABLE_LIFE "max_renewable_life"
#define KRB5_CONF_MODULE "module"
#define KRB5_CONF_NOADDRESSES "noaddresses"
#define KRB5_CONF_NOSYNC "nosync"
#define KRB5_CONF_NO_HOST_REFERRAL "no_host_referral"
#define KRB5_CONF_PERMITTED_ENCTYPES "permitted_enctypes"
#define KRB5_CONF_PLUGINS "plugins"
#define KRB5_CONF_PLUGIN_BASE_DIR "plugin_base_dir"
#define KRB5_CONF_PREFERRED_PREAUTH_TYPES "preferred_preauth_types"
#define KRB5_CONF_PRIMARY_KDC "primary_kdc"
#define KRB5_CONF_PROXIABLE "proxiable"
#define KRB5_CONF_QUALIFY_SHORTNAME "qualify_shortname"
#define KRB5_CONF_RDNS "rdns"
#define KRB5_CONF_REALMS "realms"
#define KRB5_CONF_REALM_TRY_DOMAINS "realm_try_domains"
#define KRB5_CONF_REJECT_BAD_TRANSIT "reject_bad_transit"
#define KRB5_CONF_RENEW_LIFETIME "renew_lifetime"
#define KRB5_CONF_RESTRICT_ANONYMOUS_TO_TGT "restrict_anonymous_to_tgt"
#define KRB5_CONF_SITENAME "sitename"
#define KRB5_CONF_SUPPORTED_ENCTYPES "supported_enctypes"
#define KRB5_CONF_SPAKE_PREAUTH_INDICATOR "spake_preauth_indicator"
#define KRB5_CONF_SPAKE_PREAUTH_KDC_CHALLENGE "spake_preauth_kdc_challenge"
#define KRB5_CONF_SPAKE_PREAUTH_GROUPS "spake_preauth_groups"
#define KRB5_CONF_REQUEST_TIMEOUT "request_timeout"
#define KRB5_CONF_TICKET_LIFETIME "ticket_lifetime"
#define KRB5_CONF_UDP_PREFERENCE_LIMIT "udp_preference_limit"
#define KRB5_CONF_UNLOCKITER "unlockiter"
#define KRB5_CONF_V4_INSTANCE_CONVERT "v4_instance_convert"
#define KRB5_CONF_V4_REALM "v4_realm"
#define KRB5_CONF_VERIFY_AP_REQ_NOFAIL "verify_ap_req_nofail"
#define KRB5_CONF_CLIENT_AWARE_GSS_BINDINGS "client_aware_channel_bindings"
#define KRB5_CC_CONF_FAST_AVAIL "fast_avail"
#define KRB5_CC_CONF_PA_CONFIG_DATA "pa_config_data"
#define KRB5_CC_CONF_PA_TYPE "pa_type"
#define KRB5_CC_CONF_PROXY_IMPERSONATOR "proxy_impersonator"
#define KRB5_CC_CONF_REFRESH_TIME "refresh_time"
#define KRB5_CC_CONF_START_REALM "start_realm"
#define KDC_ERR_NONE 0
#define KDC_ERR_NAME_EXP 1
#define KDC_ERR_SERVICE_EXP 2
#define KDC_ERR_BAD_PVNO 3
#define KDC_ERR_C_OLD_MAST_KVNO 4
#define KDC_ERR_S_OLD_MAST_KVNO 5
#define KDC_ERR_C_PRINCIPAL_UNKNOWN 6
#define KDC_ERR_S_PRINCIPAL_UNKNOWN 7
#define KDC_ERR_PRINCIPAL_NOT_UNIQUE 8
#define KDC_ERR_NULL_KEY 9
#define KDC_ERR_CANNOT_POSTDATE 10
#define KDC_ERR_NEVER_VALID 11
#define KDC_ERR_POLICY 12
#define KDC_ERR_BADOPTION 13
#define KDC_ERR_ENCTYPE_NOSUPP 14
#define KDC_ERR_SUMTYPE_NOSUPP 15
#define KDC_ERR_PADATA_TYPE_NOSUPP 16
#define KDC_ERR_TRTYPE_NOSUPP 17
#define KDC_ERR_CLIENT_REVOKED 18
#define KDC_ERR_SERVICE_REVOKED 19
#define KDC_ERR_TGT_REVOKED 20
#define KDC_ERR_CLIENT_NOTYET 21
#define KDC_ERR_SERVICE_NOTYET 22
#define KDC_ERR_KEY_EXP 23
#define KDC_ERR_PREAUTH_FAILED 24
#define KDC_ERR_PREAUTH_REQUIRED 25
#define KDC_ERR_SERVER_NOMATCH 26
#define KDC_ERR_MUST_USE_USER2USER 27
#define KDC_ERR_PATH_NOT_ACCEPTED 28
#define KDC_ERR_SVC_UNAVAILABLE 29
#define KRB_AP_ERR_BAD_INTEGRITY 31
#define KRB_AP_ERR_TKT_EXPIRED 32
#define KRB_AP_ERR_TKT_NYV 33
#define KRB_AP_ERR_REPEAT 34
#define KRB_AP_ERR_NOT_US 35
#define KRB_AP_ERR_BADMATCH 36
#define KRB_AP_ERR_SKEW 37
#define KRB_AP_ERR_BADADDR 38
#define KRB_AP_ERR_BADVERSION 39
#define KRB_AP_ERR_MSG_TYPE 40
#define KRB_AP_ERR_MODIFIED 41
#define KRB_AP_ERR_BADORDER 42
#define KRB_AP_ERR_BADKEYVER 44
#define KRB_AP_ERR_NOKEY 45
#define KRB_AP_ERR_MUT_FAIL 46
#define KRB_AP_ERR_BADDIRECTION 47
#define KRB_AP_ERR_METHOD 48
#define KRB_AP_ERR_BADSEQ 49
#define KRB_AP_ERR_INAPP_CKSUM 50
#define KRB_AP_PATH_NOT_ACCEPTED 51
#define KRB_ERR_RESPONSE_TOO_BIG 52
#define KRB_ERR_GENERIC 60
#define KRB_ERR_FIELD_TOOLONG 61
#define KDC_ERR_CLIENT_NOT_TRUSTED 62
#define KDC_ERR_KDC_NOT_TRUSTED 63
#define KDC_ERR_INVALID_SIG 64
#define KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED 65
#define KDC_ERR_CERTIFICATE_MISMATCH 66
#define KRB_AP_ERR_NO_TGT 67
#define KDC_ERR_WRONG_REALM 68
#define KRB_AP_ERR_USER_TO_USER_REQUIRED 69
#define KDC_ERR_CANT_VERIFY_CERTIFICATE 70
#define KDC_ERR_INVALID_CERTIFICATE 71
#define KDC_ERR_REVOKED_CERTIFICATE 72
#define KDC_ERR_REVOCATION_STATUS_UNKNOWN 73
#define KDC_ERR_REVOCATION_STATUS_UNAVAILABLE 74
#define KDC_ERR_CLIENT_NAME_MISMATCH 75
#define KDC_ERR_INCONSISTENT_KEY_PURPOSE 77
#define KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED 78
#define KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED 79
#define KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED 80
#define KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED 81
#define KRB_AP_ERR_IAKERB_KDC_NOT_FOUND 85
#define KRB_AP_ERR_IAKERB_KDC_NO_RESPONSE 86
#define KDC_ERR_PREAUTH_EXPIRED 90
#define KDC_ERR_MORE_PREAUTH_DATA_REQUIRED 91
#define KRB_ERR_MAX 127
typedef struct _krb5_etype_info_entry {
krb5_magic magic;
krb5_enctype etype;
unsigned int length;
krb5_octet *salt;
krb5_data s2kparams;
} krb5_etype_info_entry;
#define KRB5_ETYPE_NO_SALT VALID_UINT_BITS
typedef krb5_etype_info_entry ** krb5_etype_info;
typedef struct _krb5_etype_list {
int length;
krb5_enctype *etypes;
} krb5_etype_list;
#define PA_SAM_TYPE_ENIGMA 1
#define PA_SAM_TYPE_DIGI_PATH 2
#define PA_SAM_TYPE_SKEY_K0 3
#define PA_SAM_TYPE_SKEY 4
#define PA_SAM_TYPE_SECURID 5
#define PA_SAM_TYPE_CRYPTOCARD 6
#if 1
#define PA_SAM_TYPE_ACTIVCARD_DEC 6
#define PA_SAM_TYPE_ACTIVCARD_HEX 7
#define PA_SAM_TYPE_DIGI_PATH_HEX 8
#endif
#define PA_SAM_TYPE_EXP_BASE 128
#define PA_SAM_TYPE_GRAIL (PA_SAM_TYPE_EXP_BASE+0)
#define PA_SAM_TYPE_SECURID_PREDICT (PA_SAM_TYPE_EXP_BASE+1)
typedef struct _krb5_sam_challenge_2 {
krb5_data sam_challenge_2_body;
krb5_checksum **sam_cksum;
} krb5_sam_challenge_2;
typedef struct _krb5_sam_challenge_2_body {
krb5_magic magic;
krb5_int32 sam_type;
krb5_flags sam_flags;
krb5_data sam_type_name;
krb5_data sam_track_id;
krb5_data sam_challenge_label;
krb5_data sam_challenge;
krb5_data sam_response_prompt;
krb5_data sam_pk_for_sad;
krb5_int32 sam_nonce;
krb5_enctype sam_etype;
} krb5_sam_challenge_2_body;
typedef struct _krb5_sam_response_2 {
krb5_magic magic;
krb5_int32 sam_type;
krb5_flags sam_flags;
krb5_data sam_track_id;
krb5_enc_data sam_enc_nonce_or_sad;
krb5_int32 sam_nonce;
} krb5_sam_response_2;
typedef struct _krb5_enc_sam_response_enc_2 {
krb5_magic magic;
krb5_int32 sam_nonce;
krb5_data sam_sad;
} krb5_enc_sam_response_enc_2;
#include "k5-int-pkinit.h"
#define KRB5_OTP_FLAG_NEXTOTP 0x40000000
#define KRB5_OTP_FLAG_COMBINE 0x20000000
#define KRB5_OTP_FLAG_COLLECT_PIN 0x10000000
#define KRB5_OTP_FLAG_NO_COLLECT_PIN 0x08000000
#define KRB5_OTP_FLAG_ENCRYPT_NONCE 0x04000000
#define KRB5_OTP_FLAG_SEPARATE_PIN 0x02000000
#define KRB5_OTP_FLAG_CHECK_DIGIT 0x01000000
#define KRB5_OTP_FORMAT_DECIMAL 0x00000000
#define KRB5_OTP_FORMAT_HEXADECIMAL 0x00000001
#define KRB5_OTP_FORMAT_ALPHANUMERIC 0x00000002
#define KRB5_OTP_FORMAT_BINARY 0x00000003
#define KRB5_OTP_FORMAT_BASE64 0x00000004
typedef struct _krb5_otp_tokeninfo {
krb5_flags flags;
krb5_data vendor;
krb5_data challenge;
krb5_int32 length;
krb5_int32 format;
krb5_data token_id;
krb5_data alg_id;
krb5_algorithm_identifier **supported_hash_alg;
krb5_int32 iteration_count;
} krb5_otp_tokeninfo;
typedef struct _krb5_pa_otp_challenge {
krb5_data nonce;
krb5_data service;
krb5_otp_tokeninfo **tokeninfo;
krb5_data salt;
krb5_data s2kparams;
} krb5_pa_otp_challenge;
typedef struct _krb5_pa_otp_req {
krb5_int32 flags;
krb5_data nonce;
krb5_enc_data enc_data;
krb5_algorithm_identifier *hash_alg;
krb5_int32 iteration_count;
krb5_data otp_value;
krb5_data pin;
krb5_data challenge;
krb5_timestamp time;
krb5_data counter;
krb5_int32 format;
krb5_data token_id;
krb5_data alg_id;
krb5_data vendor;
} krb5_pa_otp_req;
typedef struct _krb5_kkdcp_message {
krb5_data kerb_message;
krb5_data target_domain;
krb5_int32 dclocator_hint;
} krb5_kkdcp_message;
typedef struct _krb5_secure_cookie {
time_t time;
krb5_pa_data **data;
} krb5_secure_cookie;
typedef struct _krb5_pa_pac_options {
krb5_flags options;
} krb5_pa_pac_options;
#define KRB5_PA_PAC_OPTIONS_RBCD 0x10000000
#include <stdlib.h>
#include <string.h>
#ifndef HAVE_STRDUP
extern char *strdup (const char *);
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <time.h>
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_FILE_H
#include <sys/file.h>
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#include <stdio.h>
#include "k5-gmt_mktime.h"
krb5_error_code krb5_lock_file(krb5_context, int, int);
krb5_error_code krb5_unlock_file(krb5_context, int);
krb5_error_code krb5_sendto_kdc(krb5_context, const krb5_data *,
const krb5_data *, krb5_data *, int *, int);
krb5_error_code krb5int_init_context_kdc(krb5_context *);
struct derived_key {
krb5_data constant;
krb5_key dkey;
struct derived_key *next;
};
struct krb5_key_st {
krb5_keyblock keyblock;
int refcount;
struct derived_key *derived;
void *cache;
};
krb5_error_code
krb5int_arcfour_gsscrypt(const krb5_keyblock *keyblock, krb5_keyusage usage,
const krb5_data *kd_data, krb5_crypto_iov *data,
size_t num_data);
#define K5_SHA256_HASHLEN (256 / 8)
krb5_error_code
k5_sha256(const krb5_data *in, size_t n, uint8_t out[K5_SHA256_HASHLEN]);
static inline void
zapfree(void *ptr, size_t len)
{
if (ptr != NULL) {
zap(ptr, len);
free(ptr);
}
}
static inline void
zapfreestr(void *str)
{
if (str != NULL) {
zap(str, strlen((char *)str));
free(str);
}
}
static inline void
zapfreedata(krb5_data *data)
{
if (data != NULL) {
zapfree(data->data, data->length);
free(data);
}
}
void krb5int_c_free_keyblock(krb5_context, krb5_keyblock *key);
void krb5int_c_free_keyblock_contents(krb5_context, krb5_keyblock *);
krb5_error_code krb5int_c_init_keyblock(krb5_context, krb5_enctype enctype,
size_t length, krb5_keyblock **out);
krb5_error_code krb5int_c_copy_keyblock(krb5_context context,
const krb5_keyblock *from,
krb5_keyblock **to);
krb5_error_code krb5int_c_copy_keyblock_contents(krb5_context context,
const krb5_keyblock *from,
krb5_keyblock *to);
krb5_error_code k5_us_timeofday(krb5_timestamp *, krb5_int32 *);
krb5_error_code krb5_crypto_us_timeofday(krb5_timestamp *, krb5_int32 *);
typedef struct _krb5_os_context {
krb5_magic magic;
krb5_int32 time_offset;
krb5_int32 usec_offset;
krb5_int32 os_flags;
char * default_ccname;
} *krb5_os_context;
#define KRB5_OS_TOFFSET_VALID 1
#define KRB5_OS_TOFFSET_TIME 2
#define KRB5_LOCKMODE_SHARED 0x0001
#define KRB5_LOCKMODE_EXCLUSIVE 0x0002
#define KRB5_LOCKMODE_DONTBLOCK 0x0004
#define KRB5_LOCKMODE_UNLOCK 0x0008
#ifndef KRB5_PREAUTH__
#define KRB5_PREAUTH__
typedef struct _krb5_pa_enc_ts {
krb5_timestamp patimestamp;
krb5_int32 pausec;
} krb5_pa_enc_ts;
typedef struct _krb5_pa_for_user {
krb5_principal user;
krb5_checksum cksum;
krb5_data auth_package;
} krb5_pa_for_user;
typedef struct _krb5_s4u_userid {
krb5_int32 nonce;
krb5_principal user;
krb5_data subject_cert;
krb5_flags options;
} krb5_s4u_userid;
#define KRB5_S4U_OPTS_CHECK_LOGON_HOURS 0x40000000
#define KRB5_S4U_OPTS_USE_REPLY_KEY_USAGE 0x20000000
typedef struct _krb5_pa_s4u_x509_user {
krb5_s4u_userid user_id;
krb5_checksum cksum;
} krb5_pa_s4u_x509_user;
enum {
KRB5_FAST_ARMOR_AP_REQUEST = 0x1
};
typedef struct _krb5_fast_armor {
krb5_int32 armor_type;
krb5_data armor_value;
} krb5_fast_armor;
typedef struct _krb5_fast_armored_req {
krb5_magic magic;
krb5_fast_armor *armor;
krb5_checksum req_checksum;
krb5_enc_data enc_part;
} krb5_fast_armored_req;
typedef struct _krb5_fast_req {
krb5_magic magic;
krb5_flags fast_options;
krb5_kdc_req *req_body;
} krb5_fast_req;
#define UNSUPPORTED_CRITICAL_FAST_OPTIONS 0xbfff0000
#define KRB5_FAST_OPTION_HIDE_CLIENT_NAMES 0x40000000
typedef struct _krb5_fast_finished {
krb5_timestamp timestamp;
krb5_int32 usec;
krb5_principal client;
krb5_checksum ticket_checksum;
} krb5_fast_finished;
typedef struct _krb5_fast_response {
krb5_magic magic;
krb5_pa_data **padata;
krb5_keyblock *strengthen_key;
krb5_fast_finished *finished;
krb5_int32 nonce;
} krb5_fast_response;
typedef struct _krb5_ad_kdcissued {
krb5_checksum ad_checksum;
krb5_principal i_principal;
krb5_authdata **elements;
} krb5_ad_kdcissued;
typedef struct _krb5_iakerb_header {
krb5_data target_realm;
krb5_data *cookie;
} krb5_iakerb_header;
typedef struct _krb5_iakerb_finished {
krb5_checksum checksum;
} krb5_iakerb_finished;
typedef struct _krb5_verifier_mac {
krb5_principal princ;
krb5_kvno kvno;
krb5_enctype enctype;
krb5_checksum checksum;
} krb5_verifier_mac;
typedef struct _krb5_cammac {
krb5_authdata **elements;
krb5_verifier_mac *kdc_verifier;
krb5_verifier_mac *svc_verifier;
krb5_verifier_mac **other_verifiers;
} krb5_cammac;
void krb5_free_etype_info(krb5_context, krb5_etype_info);
krb5_pa_data *
krb5int_find_pa_data(krb5_context, krb5_pa_data *const *, krb5_preauthtype);
krb5_error_code
k5_alloc_pa_data(krb5_preauthtype pa_type, size_t len, krb5_pa_data **out);
void
k5_free_pa_data_element(krb5_pa_data *pa);
krb5_error_code
k5_add_pa_data_element(krb5_pa_data ***list, krb5_pa_data **pa);
krb5_error_code
k5_add_pa_data_from_data(krb5_pa_data ***list, krb5_preauthtype pa_type,
krb5_data *data);
krb5_error_code
k5_add_empty_pa_data(krb5_pa_data ***list, krb5_preauthtype pa_type);
#endif
krb5_error_code
krb5int_copy_data_contents(krb5_context, const krb5_data *, krb5_data *);
krb5_error_code
krb5int_copy_data_contents_add0(krb5_context, const krb5_data *, krb5_data *);
void KRB5_CALLCONV
krb5_free_sam_challenge_2(krb5_context, krb5_sam_challenge_2 *);
void KRB5_CALLCONV
krb5_free_sam_challenge_2_body(krb5_context, krb5_sam_challenge_2_body *);
void KRB5_CALLCONV
krb5_free_sam_response_2(krb5_context, krb5_sam_response_2 *);
void KRB5_CALLCONV
krb5_free_enc_sam_response_enc_2(krb5_context, krb5_enc_sam_response_enc_2 *);
void KRB5_CALLCONV
krb5_free_sam_challenge_2_contents(krb5_context, krb5_sam_challenge_2 *);
void KRB5_CALLCONV
krb5_free_sam_challenge_2_body_contents(krb5_context,
krb5_sam_challenge_2_body *);
void KRB5_CALLCONV
krb5_free_sam_response_2_contents(krb5_context, krb5_sam_response_2 *);
void KRB5_CALLCONV
krb5_free_enc_sam_response_enc_2_contents(krb5_context,
krb5_enc_sam_response_enc_2 * );
void KRB5_CALLCONV
krb5_free_pa_enc_ts(krb5_context, krb5_pa_enc_ts *);
void KRB5_CALLCONV
krb5_free_pa_for_user(krb5_context, krb5_pa_for_user *);
void KRB5_CALLCONV
krb5_free_s4u_userid_contents(krb5_context, krb5_s4u_userid *);
void KRB5_CALLCONV
krb5_free_pa_s4u_x509_user(krb5_context, krb5_pa_s4u_x509_user *);
void KRB5_CALLCONV
krb5_free_pa_pac_req(krb5_context, krb5_pa_pac_req * );
void KRB5_CALLCONV krb5_free_fast_armor(krb5_context, krb5_fast_armor *);
void KRB5_CALLCONV krb5_free_fast_armored_req(krb5_context,
krb5_fast_armored_req *);
void KRB5_CALLCONV krb5_free_fast_req(krb5_context, krb5_fast_req *);
void KRB5_CALLCONV krb5_free_fast_finished(krb5_context, krb5_fast_finished *);
void KRB5_CALLCONV krb5_free_fast_response(krb5_context, krb5_fast_response *);
void KRB5_CALLCONV krb5_free_ad_kdcissued(krb5_context, krb5_ad_kdcissued *);
void KRB5_CALLCONV krb5_free_iakerb_header(krb5_context, krb5_iakerb_header *);
void KRB5_CALLCONV krb5_free_iakerb_finished(krb5_context,
krb5_iakerb_finished *);
void k5_free_algorithm_identifier(krb5_context context,
krb5_algorithm_identifier *val);
void k5_free_otp_tokeninfo(krb5_context context, krb5_otp_tokeninfo *val);
void k5_free_pa_otp_challenge(krb5_context context,
krb5_pa_otp_challenge *val);
void k5_free_pa_otp_req(krb5_context context, krb5_pa_otp_req *val);
void k5_free_kkdcp_message(krb5_context context, krb5_kkdcp_message *val);
void k5_free_cammac(krb5_context context, krb5_cammac *val);
void k5_free_secure_cookie(krb5_context context, krb5_secure_cookie *val);
krb5_error_code
k5_unwrap_cammac_svc(krb5_context context, const krb5_authdata *ad,
const krb5_keyblock *key, krb5_authdata ***adata_out);
krb5_error_code
k5_authind_decode(const krb5_authdata *ad, krb5_data ***indicators);
#include "com_err.h"
#include "k5-plugin.h"
#include <krb5/authdata_plugin.h>
struct _krb5_authdata_context {
krb5_magic magic;
int n_modules;
struct _krb5_authdata_context_module {
krb5_authdatatype ad_type;
void *plugin_context;
authdata_client_plugin_fini_proc client_fini;
krb5_flags flags;
krb5plugin_authdata_client_ftable_v0 *ftable;
authdata_client_request_init_proc client_req_init;
authdata_client_request_fini_proc client_req_fini;
const char *name;
void *request_context;
void **request_context_pp;
} *modules;
struct plugin_dir_handle plugins;
};
typedef struct _krb5_authdata_context *krb5_authdata_context;
void
k5_free_data_ptr_list(krb5_data **list);
void
k5_zapfree_pa_data(krb5_pa_data **val);
void KRB5_CALLCONV
krb5int_free_data_list(krb5_context context, krb5_data *data);
krb5_error_code KRB5_CALLCONV
krb5_authdata_context_init(krb5_context kcontext,
krb5_authdata_context *pcontext);
void KRB5_CALLCONV
krb5_authdata_context_free(krb5_context kcontext,
krb5_authdata_context context);
krb5_error_code KRB5_CALLCONV
krb5_authdata_export_authdata(krb5_context kcontext,
krb5_authdata_context context, krb5_flags usage,
krb5_authdata ***pauthdata);
krb5_error_code KRB5_CALLCONV
krb5_authdata_get_attribute_types(krb5_context kcontext,
krb5_authdata_context context,
krb5_data **attrs);
krb5_error_code KRB5_CALLCONV
krb5_authdata_get_attribute(krb5_context kcontext,
krb5_authdata_context context,
const krb5_data *attribute,
krb5_boolean *authenticated,
krb5_boolean *complete, krb5_data *value,
krb5_data *display_value, int *more);
krb5_error_code KRB5_CALLCONV
krb5_authdata_set_attribute(krb5_context kcontext,
krb5_authdata_context context,
krb5_boolean complete, const krb5_data *attribute,
const krb5_data *value);
krb5_error_code KRB5_CALLCONV
krb5_authdata_delete_attribute(krb5_context kcontext,
krb5_authdata_context context,
const krb5_data *attribute);
krb5_error_code KRB5_CALLCONV
krb5_authdata_import_attributes(krb5_context kcontext,
krb5_authdata_context context,
krb5_flags usage, const krb5_data *attributes);
krb5_error_code KRB5_CALLCONV
krb5_authdata_export_attributes(krb5_context kcontext,
krb5_authdata_context context,
krb5_flags usage, krb5_data **pattributes);
krb5_error_code KRB5_CALLCONV
krb5_authdata_export_internal(krb5_context kcontext,
krb5_authdata_context context,
krb5_boolean restrict_authenticated,
const char *module, void **ptr);
krb5_error_code KRB5_CALLCONV
krb5_authdata_context_copy(krb5_context kcontext, krb5_authdata_context src,
krb5_authdata_context *dst);
krb5_error_code KRB5_CALLCONV
krb5_authdata_free_internal(krb5_context kcontext,
krb5_authdata_context context, const char *module,
void *ptr);
struct plugin_mapping;
struct plugin_interface {
struct plugin_mapping **modules;
krb5_boolean configured;
};
#define PLUGIN_INTERFACE_PWQUAL 0
#define PLUGIN_INTERFACE_KADM5_HOOK 1
#define PLUGIN_INTERFACE_CLPREAUTH 2
#define PLUGIN_INTERFACE_KDCPREAUTH 3
#define PLUGIN_INTERFACE_CCSELECT 4
#define PLUGIN_INTERFACE_LOCALAUTH 5
#define PLUGIN_INTERFACE_HOSTREALM 6
#define PLUGIN_INTERFACE_AUDIT 7
#define PLUGIN_INTERFACE_TLS 8
#define PLUGIN_INTERFACE_KDCAUTHDATA 9
#define PLUGIN_INTERFACE_CERTAUTH 10
#define PLUGIN_INTERFACE_KADM5_AUTH 11
#define PLUGIN_INTERFACE_KDCPOLICY 12
#define PLUGIN_NUM_INTERFACES 13
krb5_error_code
k5_plugin_load(krb5_context context, int interface_id, const char *modname,
krb5_plugin_initvt_fn *module);
krb5_error_code
k5_plugin_load_all(krb5_context context, int interface_id,
krb5_plugin_initvt_fn **modules);
void
k5_plugin_free_modules(krb5_context context, krb5_plugin_initvt_fn *modules);
krb5_error_code
k5_plugin_register(krb5_context context, int interface_id, const char *modname,
krb5_plugin_initvt_fn module);
krb5_error_code
k5_plugin_register_dyn(krb5_context context, int interface_id,
const char *modname, const char *modsubdir);
void
k5_plugin_free_context(krb5_context context);
enum dns_canonhost {
CANONHOST_FALSE = 0,
CANONHOST_TRUE = 1,
CANONHOST_FALLBACK = 2
};
struct _kdb5_dal_handle;
typedef struct _kdb5_dal_handle kdb5_dal_handle;
struct _kdb_log_context;
typedef struct krb5_preauth_context_st *krb5_preauth_context;
struct ccselect_module_handle;
struct localauth_module_handle;
struct hostrealm_module_handle;
struct k5_tls_vtable_st;
struct _krb5_context {
krb5_magic magic;
krb5_enctype *tgs_etypes;
struct _krb5_os_context os_context;
char *default_realm;
profile_t profile;
kdb5_dal_handle *dal_handle;
krb5_deltat clockskew;
krb5_deltat req_timeout;
krb5_flags kdc_default_options;
krb5_flags library_options;
krb5_boolean profile_secure;
int fcc_default_format;
krb5_prompt_type *prompt_types;
int udp_pref_limit;
krb5_boolean use_conf_ktypes;
struct plugin_dir_handle libkrb5_plugins;
krb5_preauth_context preauth_context;
struct ccselect_module_handle **ccselect_handles;
struct localauth_module_handle **localauth_handles;
struct hostrealm_module_handle **hostrealm_handles;
struct k5_tls_vtable_st *tls;
struct errinfo err;
char *err_fmt;
struct _kdb_log_context *kdblog_context;
krb5_boolean allow_weak_crypto;
krb5_boolean allow_des3;
krb5_boolean allow_rc4;
krb5_boolean ignore_acceptor_hostname;
krb5_boolean enforce_ok_as_delegate;
enum dns_canonhost dns_canonicalize_hostname;
krb5_trace_callback trace_callback;
void *trace_callback_data;
krb5_pre_send_fn kdc_send_hook;
void *kdc_send_hook_data;
krb5_post_recv_fn kdc_recv_hook;
void *kdc_recv_hook_data;
struct plugin_interface plugins[PLUGIN_NUM_INTERFACES];
char *plugin_base_dir;
};
#define KRB5_LIBOPT_SYNC_KDCTIME 0x0001
typedef struct _krb5_safe {
krb5_magic magic;
krb5_data user_data;
krb5_timestamp timestamp;
krb5_int32 usec;
krb5_ui_4 seq_number;
krb5_address *s_address;
krb5_address *r_address;
krb5_checksum *checksum;
} krb5_safe;
typedef struct _krb5_priv {
krb5_magic magic;
krb5_enc_data enc_part;
} krb5_priv;
typedef struct _krb5_priv_enc_part {
krb5_magic magic;
krb5_data user_data;
krb5_timestamp timestamp;
krb5_int32 usec;
krb5_ui_4 seq_number;
krb5_address *s_address;
krb5_address *r_address;
} krb5_priv_enc_part;
void KRB5_CALLCONV krb5_free_safe(krb5_context, krb5_safe *);
void KRB5_CALLCONV krb5_free_priv(krb5_context, krb5_priv *);
void KRB5_CALLCONV krb5_free_priv_enc_part(krb5_context, krb5_priv_enc_part *);
#ifndef KRB5_ASN1__
#define KRB5_ASN1__
#define krb5int_is_app_tag(dat,tag) \
((dat != NULL) && (dat)->length && \
((((dat)->data[0] & ~0x20) == ((tag) | 0x40))))
#define krb5_is_krb_ticket(dat) krb5int_is_app_tag(dat, 1)
#define krb5_is_krb_authenticator(dat) krb5int_is_app_tag(dat, 2)
#define krb5_is_as_req(dat) krb5int_is_app_tag(dat, 10)
#define krb5_is_as_rep(dat) krb5int_is_app_tag(dat, 11)
#define krb5_is_tgs_req(dat) krb5int_is_app_tag(dat, 12)
#define krb5_is_tgs_rep(dat) krb5int_is_app_tag(dat, 13)
#define krb5_is_ap_req(dat) krb5int_is_app_tag(dat, 14)
#define krb5_is_ap_rep(dat) krb5int_is_app_tag(dat, 15)
#define krb5_is_krb_safe(dat) krb5int_is_app_tag(dat, 20)
#define krb5_is_krb_priv(dat) krb5int_is_app_tag(dat, 21)
#define krb5_is_krb_cred(dat) krb5int_is_app_tag(dat, 22)
#define krb5_is_krb_enc_as_rep_part(dat) krb5int_is_app_tag(dat, 25)
#define krb5_is_krb_enc_tgs_rep_part(dat) krb5int_is_app_tag(dat, 26)
#define krb5_is_krb_enc_ap_rep_part(dat) krb5int_is_app_tag(dat, 27)
#define krb5_is_krb_enc_krb_priv_part(dat) krb5int_is_app_tag(dat, 28)
#define krb5_is_krb_enc_krb_cred_part(dat) krb5int_is_app_tag(dat, 29)
#define krb5_is_krb_error(dat) krb5int_is_app_tag(dat, 30)
krb5_error_code
encode_krb5_authenticator(const krb5_authenticator *rep, krb5_data **code);
krb5_error_code
encode_krb5_ticket(const krb5_ticket *rep, krb5_data **code);
krb5_error_code
encode_krb5_enc_tkt_part(const krb5_enc_tkt_part *rep, krb5_data **code);
krb5_error_code
encode_krb5_enc_kdc_rep_part(const krb5_enc_kdc_rep_part *rep,
krb5_data **code);
krb5_error_code
encode_krb5_as_rep(const krb5_kdc_rep *rep, krb5_data **code);
krb5_error_code
encode_krb5_tgs_rep(const krb5_kdc_rep *rep, krb5_data **code);
krb5_error_code
encode_krb5_ap_req(const krb5_ap_req *rep, krb5_data **code);
krb5_error_code
encode_krb5_ap_rep(const krb5_ap_rep *rep, krb5_data **code);
krb5_error_code
encode_krb5_ap_rep_enc_part(const krb5_ap_rep_enc_part *rep, krb5_data **code);
krb5_error_code
encode_krb5_as_req(const krb5_kdc_req *rep, krb5_data **code);
krb5_error_code
encode_krb5_tgs_req(const krb5_kdc_req *rep, krb5_data **code);
krb5_error_code
encode_krb5_kdc_req_body(const krb5_kdc_req *rep, krb5_data **code);
krb5_error_code
encode_krb5_safe(const krb5_safe *rep, krb5_data **code);
struct krb5_safe_with_body {
krb5_safe *safe;
krb5_data *body;
};
krb5_error_code
encode_krb5_safe_with_body(const struct krb5_safe_with_body *rep,
krb5_data **code);
krb5_error_code
encode_krb5_priv(const krb5_priv *rep, krb5_data **code);
krb5_error_code
encode_krb5_enc_priv_part(const krb5_priv_enc_part *rep, krb5_data **code);
krb5_error_code
encode_krb5_cred(const krb5_cred *rep, krb5_data **code);
krb5_error_code
encode_krb5_checksum(const krb5_checksum *, krb5_data **);
krb5_error_code
encode_krb5_enc_cred_part(const krb5_cred_enc_part *rep, krb5_data **code);
krb5_error_code
encode_krb5_error(const krb5_error *rep, krb5_data **code);
krb5_error_code
encode_krb5_authdata(krb5_authdata *const *rep, krb5_data **code);
krb5_error_code
encode_krb5_padata_sequence(krb5_pa_data *const *rep, krb5_data **code);
krb5_error_code
encode_krb5_typed_data(krb5_pa_data *const *rep, krb5_data **code);
krb5_error_code
encode_krb5_etype_info(krb5_etype_info_entry *const *, krb5_data **code);
krb5_error_code
encode_krb5_etype_info2(krb5_etype_info_entry *const *, krb5_data **code);
krb5_error_code
encode_krb5_pa_enc_ts(const krb5_pa_enc_ts *, krb5_data **);
krb5_error_code
encode_krb5_sam_challenge_2(const krb5_sam_challenge_2 * , krb5_data **);
krb5_error_code
encode_krb5_sam_challenge_2_body(const krb5_sam_challenge_2_body *,
krb5_data **);
krb5_error_code
encode_krb5_enc_sam_response_enc_2(const krb5_enc_sam_response_enc_2 *,
krb5_data **);
krb5_error_code
encode_krb5_sam_response_2(const krb5_sam_response_2 * , krb5_data **);
struct krb5_setpw_req {
krb5_principal target;
krb5_data password;
};
krb5_error_code
encode_krb5_setpw_req(const struct krb5_setpw_req *rep, krb5_data **code);
krb5_error_code
encode_krb5_pa_for_user(const krb5_pa_for_user *, krb5_data **);
krb5_error_code
encode_krb5_s4u_userid(const krb5_s4u_userid *, krb5_data **);
krb5_error_code
encode_krb5_pa_s4u_x509_user(const krb5_pa_s4u_x509_user *, krb5_data **);
krb5_error_code
encode_krb5_pa_pac_req(const krb5_pa_pac_req *, krb5_data **);
krb5_error_code
encode_krb5_etype_list(const krb5_etype_list * , krb5_data **);
krb5_error_code
encode_krb5_pa_fx_fast_request(const krb5_fast_armored_req *, krb5_data **);
krb5_error_code
encode_krb5_fast_req(const krb5_fast_req *, krb5_data **);
krb5_error_code
encode_krb5_pa_fx_fast_reply(const krb5_enc_data *, krb5_data **);
krb5_error_code
encode_krb5_iakerb_header(const krb5_iakerb_header *, krb5_data **);
krb5_error_code
encode_krb5_iakerb_finished(const krb5_iakerb_finished *, krb5_data **);
krb5_error_code
encode_krb5_fast_response(const krb5_fast_response *, krb5_data **);
krb5_error_code
encode_krb5_ad_kdcissued(const krb5_ad_kdcissued *, krb5_data **);
krb5_error_code
encode_krb5_otp_tokeninfo(const krb5_otp_tokeninfo *, krb5_data **);
krb5_error_code
encode_krb5_pa_otp_challenge(const krb5_pa_otp_challenge *, krb5_data **);
krb5_error_code
encode_krb5_pa_otp_req(const krb5_pa_otp_req *, krb5_data **);
krb5_error_code
encode_krb5_pa_otp_enc_req(const krb5_data *, krb5_data **);
krb5_error_code
encode_krb5_kkdcp_message(const krb5_kkdcp_message *, krb5_data **);
krb5_error_code
encode_krb5_cammac(const krb5_cammac *, krb5_data **);
krb5_error_code
encode_utf8_strings(krb5_data *const *ut8fstrings, krb5_data **);
krb5_error_code
encode_krb5_secure_cookie(const krb5_secure_cookie *, krb5_data **);
krb5_error_code
encode_krb5_pa_pac_options(const krb5_pa_pac_options *, krb5_data **);
krb5_error_code
decode_krb5_sam_challenge_2(const krb5_data *, krb5_sam_challenge_2 **);
krb5_error_code
decode_krb5_sam_challenge_2_body(const krb5_data *,
krb5_sam_challenge_2_body **);
krb5_error_code
decode_krb5_enc_sam_response_enc_2(const krb5_data *,
krb5_enc_sam_response_enc_2 **);
krb5_error_code
decode_krb5_sam_response_2(const krb5_data *, krb5_sam_response_2 **);
krb5_error_code
decode_krb5_authenticator(const krb5_data *code, krb5_authenticator **rep);
krb5_error_code
decode_krb5_ticket(const krb5_data *code, krb5_ticket **rep);
krb5_error_code
decode_krb5_encryption_key(const krb5_data *output, krb5_keyblock **rep);
krb5_error_code
decode_krb5_enc_tkt_part(const krb5_data *output, krb5_enc_tkt_part **rep);
krb5_error_code
decode_krb5_enc_kdc_rep_part(const krb5_data *output,
krb5_enc_kdc_rep_part **rep);
krb5_error_code
decode_krb5_as_rep(const krb5_data *output, krb5_kdc_rep **rep);
krb5_error_code
decode_krb5_tgs_rep(const krb5_data *output, krb5_kdc_rep **rep);
krb5_error_code
decode_krb5_ap_req(const krb5_data *output, krb5_ap_req **rep);
krb5_error_code
decode_krb5_ap_rep(const krb5_data *output, krb5_ap_rep **rep);
krb5_error_code
decode_krb5_ap_rep_enc_part(const krb5_data *output,
krb5_ap_rep_enc_part **rep);
krb5_error_code
decode_krb5_as_req(const krb5_data *output, krb5_kdc_req **rep);
krb5_error_code
decode_krb5_tgs_req(const krb5_data *output, krb5_kdc_req **rep);
krb5_error_code
decode_krb5_kdc_req_body(const krb5_data *output, krb5_kdc_req **rep);
krb5_error_code
decode_krb5_safe(const krb5_data *output, krb5_safe **rep);
krb5_error_code
decode_krb5_safe_with_body(const krb5_data *output, krb5_safe **rep,
krb5_data **body);
krb5_error_code
decode_krb5_priv(const krb5_data *output, krb5_priv **rep);
krb5_error_code
decode_krb5_enc_priv_part(const krb5_data *output, krb5_priv_enc_part **rep);
krb5_error_code
decode_krb5_checksum(const krb5_data *, krb5_checksum **);
krb5_error_code
decode_krb5_cred(const krb5_data *output, krb5_cred **rep);
krb5_error_code
decode_krb5_enc_cred_part(const krb5_data *output, krb5_cred_enc_part **rep);
krb5_error_code
decode_krb5_error(const krb5_data *output, krb5_error **rep);
krb5_error_code
decode_krb5_authdata(const krb5_data *output, krb5_authdata ***rep);
krb5_error_code
decode_krb5_padata_sequence(const krb5_data *output, krb5_pa_data ***rep);
krb5_error_code
decode_krb5_typed_data(const krb5_data *, krb5_pa_data ***);
krb5_error_code
decode_krb5_etype_info(const krb5_data *output, krb5_etype_info_entry ***rep);
krb5_error_code
decode_krb5_etype_info2(const krb5_data *output, krb5_etype_info_entry ***rep);
krb5_error_code
decode_krb5_enc_data(const krb5_data *output, krb5_enc_data **rep);
krb5_error_code
decode_krb5_pa_enc_ts(const krb5_data *output, krb5_pa_enc_ts **rep);
krb5_error_code
decode_krb5_setpw_req(const krb5_data *, krb5_data **, krb5_principal *);
krb5_error_code
decode_krb5_pa_for_user(const krb5_data *, krb5_pa_for_user **);
krb5_error_code
decode_krb5_pa_s4u_x509_user(const krb5_data *, krb5_pa_s4u_x509_user **);
krb5_error_code
decode_krb5_pa_pac_req(const krb5_data *, krb5_pa_pac_req **);
krb5_error_code
decode_krb5_etype_list(const krb5_data *, krb5_etype_list **);
krb5_error_code
decode_krb5_pa_fx_fast_request(const krb5_data *, krb5_fast_armored_req **);
krb5_error_code
decode_krb5_fast_req(const krb5_data *, krb5_fast_req **);
krb5_error_code
decode_krb5_pa_fx_fast_reply(const krb5_data *, krb5_enc_data **);
krb5_error_code
decode_krb5_fast_response(const krb5_data *, krb5_fast_response **);
krb5_error_code
decode_krb5_ad_kdcissued(const krb5_data *, krb5_ad_kdcissued **);
krb5_error_code
decode_krb5_iakerb_header(const krb5_data *, krb5_iakerb_header **);
krb5_error_code
decode_krb5_iakerb_finished(const krb5_data *, krb5_iakerb_finished **);
krb5_error_code
decode_krb5_otp_tokeninfo(const krb5_data *, krb5_otp_tokeninfo **);
krb5_error_code
decode_krb5_pa_otp_challenge(const krb5_data *, krb5_pa_otp_challenge **);
krb5_error_code
decode_krb5_pa_otp_req(const krb5_data *, krb5_pa_otp_req **);
krb5_error_code
decode_krb5_pa_otp_enc_req(const krb5_data *, krb5_data **);
krb5_error_code
decode_krb5_kkdcp_message(const krb5_data *, krb5_kkdcp_message **);
krb5_error_code
decode_krb5_cammac(const krb5_data *, krb5_cammac **);
krb5_error_code
decode_utf8_strings(const krb5_data *, krb5_data ***);
krb5_error_code
decode_krb5_secure_cookie(const krb5_data *, krb5_secure_cookie **);
krb5_error_code
decode_krb5_pa_pac_options(const krb5_data *, krb5_pa_pac_options **);
struct _krb5_key_data;
struct ldap_seqof_key_data {
krb5_int32 mkvno;
krb5_ui_2 kvno;
struct _krb5_key_data *key_data;
krb5_int16 n_key_data;
};
typedef struct ldap_seqof_key_data ldap_seqof_key_data;
krb5_error_code
krb5int_ldap_encode_sequence_of_keys(const ldap_seqof_key_data *val,
krb5_data **code);
krb5_error_code
krb5int_ldap_decode_sequence_of_keys(const krb5_data *in,
ldap_seqof_key_data **rep);
#endif
krb5_error_code
krb5_encrypt_tkt_part(krb5_context, const krb5_keyblock *, krb5_ticket *);
krb5_error_code
krb5_encode_kdc_rep(krb5_context, krb5_msgtype, const krb5_enc_kdc_rep_part *,
int using_subkey, const krb5_keyblock *, krb5_kdc_rep *,
krb5_data ** );
krb5_boolean
k5_is_string_numeric(const char *s);
krb5_error_code
k5_parse_host_string(const char *address, int default_port, char **host_out,
int *port_out);
krb5_error_code
k5_size_authdata_context(krb5_context kcontext, krb5_authdata_context context,
size_t *sizep);
krb5_error_code
k5_externalize_authdata_context(krb5_context kcontext,
krb5_authdata_context context,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_authdata_context(krb5_context kcontext,
krb5_authdata_context *ptr,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_auth_context(krb5_auth_context auth_context, size_t *sizep);
krb5_error_code
k5_externalize_auth_context(krb5_auth_context auth_context,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_auth_context(krb5_auth_context *argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_authdata(krb5_authdata *authdata, size_t *sizep);
krb5_error_code
k5_externalize_authdata(krb5_authdata *authdata,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_authdata(krb5_authdata **authdata,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_address(krb5_address *address, size_t *sizep);
krb5_error_code
k5_externalize_address(krb5_address *address,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_address(krb5_address **argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_authenticator(krb5_authenticator *authenticator, size_t *sizep);
krb5_error_code
k5_externalize_authenticator(krb5_authenticator *authenticator,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_authenticator(krb5_authenticator **argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_checksum(krb5_checksum *checksum, size_t *sizep);
krb5_error_code
k5_externalize_checksum(krb5_checksum *checksum,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_checksum(krb5_checksum **argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_context(krb5_context context, size_t *sizep);
krb5_error_code
k5_externalize_context(krb5_context context,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_context(krb5_context *argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_keyblock(krb5_keyblock *keyblock, size_t *sizep);
krb5_error_code
k5_externalize_keyblock(krb5_keyblock *keyblock,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_keyblock(krb5_keyblock **argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_size_principal(krb5_principal principal, size_t *sizep);
krb5_error_code
k5_externalize_principal(krb5_principal principal,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code
k5_internalize_principal(krb5_principal *argp,
krb5_octet **buffer, size_t *lenremain);
krb5_error_code KRB5_CALLCONV
krb5_ser_pack_int32(krb5_int32, krb5_octet **, size_t *);
krb5_error_code KRB5_CALLCONV
krb5_ser_unpack_int32(krb5_int32 *, krb5_octet **, size_t *);
krb5_error_code KRB5_CALLCONV
krb5_ser_pack_int64(int64_t, krb5_octet **, size_t *);
krb5_error_code KRB5_CALLCONV
krb5_ser_unpack_int64(int64_t *, krb5_octet **, size_t *);
krb5_error_code KRB5_CALLCONV
krb5_ser_pack_bytes(krb5_octet *, size_t, krb5_octet **, size_t *);
krb5_error_code KRB5_CALLCONV
krb5_ser_unpack_bytes(krb5_octet *, size_t, krb5_octet **, size_t *);
krb5_error_code KRB5_CALLCONV
krb5int_cc_default(krb5_context, krb5_ccache *);
krb5_error_code
k5_cc_store_primary_cred(krb5_context, krb5_ccache, krb5_creds *);
krb5_error_code
krb5int_random_string(krb5_context, char *string, unsigned int length);
#define IGNORE_VNO 0
#define IGNORE_ENCTYPE 0
#define KRB5INT_ACCESS_STRUCT_VERSION 23
typedef struct _krb5int_access {
krb5_error_code (*auth_con_get_subkey_enctype)(krb5_context,
krb5_auth_context,
krb5_enctype *);
krb5_error_code (*mandatory_cksumtype)(krb5_context, krb5_enctype,
krb5_cksumtype *);
krb5_error_code (KRB5_CALLCONV *ser_pack_int64)(int64_t, krb5_octet **,
size_t *);
krb5_error_code (KRB5_CALLCONV *ser_unpack_int64)(int64_t *, krb5_octet **,
size_t *);
krb5_error_code
(*asn1_ldap_encode_sequence_of_keys)(const ldap_seqof_key_data *val,
krb5_data **code);
krb5_error_code
(*asn1_ldap_decode_sequence_of_keys)(const krb5_data *in,
ldap_seqof_key_data **);
krb5_error_code
(*encode_krb5_auth_pack)(const krb5_auth_pack *rep, krb5_data **code);
krb5_error_code
(*encode_krb5_kdc_dh_key_info)(const krb5_kdc_dh_key_info *rep,
krb5_data **code);
krb5_error_code
(*encode_krb5_pa_pk_as_rep)(const krb5_pa_pk_as_rep *rep,
krb5_data **code);
krb5_error_code
(*encode_krb5_pa_pk_as_req)(const krb5_pa_pk_as_req *rep,
krb5_data **code);
krb5_error_code
(*encode_krb5_reply_key_pack)(const krb5_reply_key_pack *,
krb5_data **code);
krb5_error_code
(*encode_krb5_td_dh_parameters)(krb5_algorithm_identifier *const *,
krb5_data **code);
krb5_error_code
(*encode_krb5_td_trusted_certifiers)(krb5_external_principal_identifier *
const *, krb5_data **code);
krb5_error_code
(*decode_krb5_auth_pack)(const krb5_data *, krb5_auth_pack **);
krb5_error_code
(*decode_krb5_pa_pk_as_req)(const krb5_data *, krb5_pa_pk_as_req **);
krb5_error_code
(*decode_krb5_pa_pk_as_rep)(const krb5_data *, krb5_pa_pk_as_rep **);
krb5_error_code
(*decode_krb5_kdc_dh_key_info)(const krb5_data *, krb5_kdc_dh_key_info **);
krb5_error_code
(*decode_krb5_principal_name)(const krb5_data *, krb5_principal_data **);
krb5_error_code
(*decode_krb5_reply_key_pack)(const krb5_data *, krb5_reply_key_pack **);
krb5_error_code
(*decode_krb5_td_dh_parameters)(const krb5_data *,
krb5_algorithm_identifier ***);
krb5_error_code
(*decode_krb5_td_trusted_certifiers)(const krb5_data *,
krb5_external_principal_identifier
***);
krb5_error_code
(*encode_krb5_kdc_req_body)(const krb5_kdc_req *rep, krb5_data **code);
void
(KRB5_CALLCONV *free_kdc_req)(krb5_context, krb5_kdc_req * );
void
(*set_prompt_types)(krb5_context, krb5_prompt_type *);
} krb5int_access;
#define KRB5INT_ACCESS_VERSION \
(((krb5_int32)((sizeof(krb5int_access) & 0xFFFF) | \
(KRB5INT_ACCESS_STRUCT_VERSION << 16))) & 0xFFFFFFFF)
krb5_error_code KRB5_CALLCONV
krb5int_accessor(krb5int_access*, krb5_int32);
krb5_error_code KRB5_CALLCONV
krb5int_cc_user_set_default_name(krb5_context context, const char *name);
krb5_error_code k5_rc_default(krb5_context context, krb5_rcache *rc_out);
krb5_error_code k5_rc_resolve(krb5_context context, const char *name,
krb5_rcache *rc_out);
void k5_rc_close(krb5_context context, krb5_rcache rc);
krb5_error_code k5_rc_store(krb5_context context, krb5_rcache rc,
const krb5_enc_data *authenticator);
const char *k5_rc_get_name(krb5_context context, krb5_rcache rc);
krb5_error_code
k5_rc_tag_from_ciphertext(krb5_context context, const krb5_enc_data *enc,
krb5_data *tag_out);
typedef struct _krb5_kt_ops {
krb5_magic magic;
char *prefix;
krb5_error_code (KRB5_CALLCONV *resolve)(krb5_context, const char *,
krb5_keytab *);
krb5_error_code (KRB5_CALLCONV *get_name)(krb5_context, krb5_keytab,
char *, unsigned int);
krb5_error_code (KRB5_CALLCONV *close)(krb5_context, krb5_keytab);
krb5_error_code (KRB5_CALLCONV *get)(krb5_context, krb5_keytab,
krb5_const_principal, krb5_kvno,
krb5_enctype, krb5_keytab_entry *);
krb5_error_code (KRB5_CALLCONV *start_seq_get)(krb5_context, krb5_keytab,
krb5_kt_cursor *);
krb5_error_code (KRB5_CALLCONV *get_next)(krb5_context, krb5_keytab,
krb5_keytab_entry *,
krb5_kt_cursor *);
krb5_error_code (KRB5_CALLCONV *end_get)(krb5_context, krb5_keytab,
krb5_kt_cursor *);
krb5_error_code (KRB5_CALLCONV *add)(krb5_context, krb5_keytab,
krb5_keytab_entry *);
krb5_error_code (KRB5_CALLCONV *remove)(krb5_context, krb5_keytab,
krb5_keytab_entry *);
} krb5_kt_ops;
extern krb5_error_code
krb5int_c_mandatory_cksumtype(krb5_context, krb5_enctype, krb5_cksumtype *);
#define KRB5_REFERRAL_MAXHOPS 10
struct _krb5_kt {
krb5_magic magic;
const struct _krb5_kt_ops *ops;
krb5_pointer data;
};
krb5_error_code krb5_get_default_in_tkt_ktypes(krb5_context, krb5_enctype **);
krb5_error_code KRB5_CALLCONV
krb5_get_tgs_ktypes(krb5_context, krb5_const_principal, krb5_enctype **);
krb5_boolean krb5_is_permitted_enctype(krb5_context, krb5_enctype);
krb5_boolean KRB5_CALLCONV krb5int_c_weak_enctype(krb5_enctype);
krb5_boolean KRB5_CALLCONV krb5int_c_deprecated_enctype(krb5_enctype);
krb5_error_code k5_enctype_to_ssf(krb5_enctype enctype, unsigned int *ssf_out);
krb5_error_code krb5_kdc_rep_decrypt_proc(krb5_context, const krb5_keyblock *,
krb5_const_pointer, krb5_kdc_rep *);
krb5_error_code KRB5_CALLCONV krb5_decrypt_tkt_part(krb5_context,
const krb5_keyblock *,
krb5_ticket * );
krb5_error_code krb5_get_cred_via_tkt(krb5_context, krb5_creds *, krb5_flags,
krb5_address *const *, krb5_creds *,
krb5_creds **);
krb5_error_code KRB5_CALLCONV krb5_copy_addr(krb5_context,
const krb5_address *,
krb5_address **);
void krb5_init_ets(krb5_context);
void krb5_free_ets(krb5_context);
krb5_error_code krb5_generate_subkey(krb5_context, const krb5_keyblock *,
krb5_keyblock **);
krb5_error_code krb5_generate_subkey_extended(krb5_context,
const krb5_keyblock *,
krb5_enctype, krb5_keyblock **);
krb5_error_code krb5_generate_seq_number(krb5_context, const krb5_keyblock *,
krb5_ui_4 *);
krb5_error_code KRB5_CALLCONV krb5_kt_register(krb5_context,
const struct _krb5_kt_ops *);
krb5_error_code k5_kt_get_principal(krb5_context context, krb5_keytab keytab,
krb5_principal *princ_out);
krb5_error_code k5_kt_have_match(krb5_context context, krb5_keytab keytab,
krb5_principal mprinc);
krb5_error_code krb5_principal2salt_norealm(krb5_context, krb5_const_principal,
krb5_data *);
unsigned int KRB5_CALLCONV krb5_get_notification_message(void);
krb5_error_code krb5_check_transited_list(krb5_context, const krb5_data *trans,
const krb5_data *realm1,
const krb5_data *realm2);
void krb5_free_realm_tree(krb5_context, krb5_principal *);
void KRB5_CALLCONV krb5_free_authenticator_contents(krb5_context,
krb5_authenticator *);
void KRB5_CALLCONV krb5_free_address(krb5_context, krb5_address *);
void KRB5_CALLCONV krb5_free_enc_tkt_part(krb5_context, krb5_enc_tkt_part *);
void KRB5_CALLCONV krb5_free_tickets(krb5_context, krb5_ticket **);
void KRB5_CALLCONV krb5_free_kdc_req(krb5_context, krb5_kdc_req *);
void KRB5_CALLCONV krb5_free_kdc_rep(krb5_context, krb5_kdc_rep *);
void KRB5_CALLCONV krb5_free_last_req(krb5_context, krb5_last_req_entry **);
void KRB5_CALLCONV krb5_free_enc_kdc_rep_part(krb5_context,
krb5_enc_kdc_rep_part *);
void KRB5_CALLCONV krb5_free_ap_req(krb5_context, krb5_ap_req *);
void KRB5_CALLCONV krb5_free_ap_rep(krb5_context, krb5_ap_rep *);
void KRB5_CALLCONV krb5_free_cred(krb5_context, krb5_cred *);
void KRB5_CALLCONV krb5_free_cred_enc_part(krb5_context, krb5_cred_enc_part *);
void KRB5_CALLCONV krb5_free_pa_data(krb5_context, krb5_pa_data **);
void KRB5_CALLCONV krb5_free_tkt_authent(krb5_context, krb5_tkt_authent *);
void KRB5_CALLCONV krb5_free_enc_data(krb5_context, krb5_enc_data *);
krb5_error_code krb5_set_config_files(krb5_context, const char **);
krb5_error_code krb5_rd_req_decoded(krb5_context, krb5_auth_context *,
const krb5_ap_req *, krb5_const_principal,
krb5_keytab, krb5_flags *, krb5_ticket **);
krb5_error_code krb5_rd_req_decoded_anyflag(krb5_context, krb5_auth_context *,
const krb5_ap_req *,
krb5_const_principal, krb5_keytab,
krb5_flags *, krb5_ticket **);
krb5_error_code KRB5_CALLCONV
krb5_cc_register(krb5_context, const krb5_cc_ops *, krb5_boolean );
krb5_error_code krb5_walk_realm_tree(krb5_context, const krb5_data *,
const krb5_data *, krb5_principal **,
int);
krb5_error_code
krb5_auth_con_set_safe_cksumtype(krb5_context, krb5_auth_context,
krb5_cksumtype);
krb5_error_code krb5_auth_con_setivector(krb5_context, krb5_auth_context,
krb5_pointer);
krb5_error_code krb5_auth_con_getivector(krb5_context, krb5_auth_context,
krb5_pointer *);
krb5_error_code krb5_auth_con_setpermetypes(krb5_context, krb5_auth_context,
const krb5_enctype *);
krb5_error_code krb5_auth_con_getpermetypes(krb5_context, krb5_auth_context,
krb5_enctype **);
krb5_error_code krb5_auth_con_get_subkey_enctype(krb5_context context,
krb5_auth_context,
krb5_enctype *);
krb5_error_code
krb5_auth_con_get_authdata_context(krb5_context context,
krb5_auth_context auth_context,
krb5_authdata_context *ad_context);
krb5_error_code
krb5_auth_con_set_authdata_context(krb5_context context,
krb5_auth_context auth_context,
krb5_authdata_context ad_context);
krb5_error_code krb5_read_message(krb5_context, krb5_pointer, krb5_data *);
krb5_error_code krb5_write_message(krb5_context, krb5_pointer, krb5_data *);
int krb5_net_read(krb5_context, int , char *, int);
int krb5_net_write(krb5_context, int , const char *, int);
krb5_error_code KRB5_CALLCONV krb5_get_realm_domain(krb5_context,
const char *, char ** );
krb5_error_code krb5_gen_portaddr(krb5_context, const krb5_address *,
krb5_const_pointer, krb5_address **);
krb5_error_code krb5_gen_replay_name(krb5_context, const krb5_address *,
const char *, char **);
krb5_error_code krb5_make_fulladdr(krb5_context, krb5_address *,
krb5_address *, krb5_address *);
krb5_error_code krb5_set_debugging_time(krb5_context, krb5_timestamp,
krb5_int32);
krb5_error_code krb5_use_natural_time(krb5_context);
krb5_error_code krb5_set_time_offsets(krb5_context, krb5_timestamp,
krb5_int32);
static inline int
data_eq(krb5_data d1, krb5_data d2)
{
return (d1.length == d2.length && (d1.length == 0 ||
!memcmp(d1.data, d2.data, d1.length)));
}
static inline int
data_eq_string (krb5_data d, const char *s)
{
return (d.length == strlen(s) && (d.length == 0 ||
!memcmp(d.data, s, d.length)));
}
static inline krb5_data
make_data(void *data, unsigned int len)
{
krb5_data d;
d.magic = KV5M_DATA;
d.data = (char *) data;
d.length = len;
return d;
}
static inline krb5_data
empty_data(void)
{
return make_data(NULL, 0);
}
static inline krb5_data
string2data(char *str)
{
return make_data(str, strlen(str));
}
static inline krb5_error_code
alloc_data(krb5_data *data, unsigned int len)
{
char *ptr = (char *) calloc((len > 0) ? len : 1, 1);
if (ptr == NULL)
return ENOMEM;
data->magic = KV5M_DATA;
data->data = ptr;
data->length = len;
return 0;
}
static inline int
authdata_eq(krb5_authdata a1, krb5_authdata a2)
{
return (a1.ad_type == a2.ad_type && a1.length == a2.length &&
(a1.length == 0 || !memcmp(a1.contents, a2.contents, a1.length)));
}
static inline void *
k5calloc(size_t nmemb, size_t size, krb5_error_code *code)
{
void *ptr;
ptr = calloc(nmemb ? nmemb : 1, size ? size : 1);
*code = (ptr == NULL) ? ENOMEM : 0;
return ptr;
}
static inline void *
k5alloc(size_t size, krb5_error_code *code)
{
return k5calloc(1, size, code);
}
static inline void *
k5memdup(const void *in, size_t len, krb5_error_code *code)
{
void *ptr = k5alloc(len, code);
if (ptr != NULL && len > 0)
memcpy(ptr, in, len);
return ptr;
}
static inline void *
k5memdup0(const void *in, size_t len, krb5_error_code *code)
{
void *ptr = k5alloc(len + 1, code);
if (ptr != NULL && len > 0)
memcpy(ptr, in, len);
return ptr;
}
static inline time_t
ts2tt(krb5_timestamp timestamp)
{
return (time_t)(uint32_t)timestamp;
}
static inline krb5_deltat
ts_delta(krb5_timestamp a, krb5_timestamp b)
{
return (krb5_deltat)((uint32_t)a - (uint32_t)b);
}
static inline uint32_t
ts_interval(krb5_timestamp start, krb5_timestamp end)
{
if ((uint32_t)start > (uint32_t)end)
return 0;
return (uint32_t)end - (uint32_t)start;
}
static inline krb5_timestamp
ts_incr(krb5_timestamp ts, krb5_deltat delta)
{
return (krb5_timestamp)((uint32_t)ts + (uint32_t)delta);
}
static inline krb5_boolean
ts_after(krb5_timestamp a, krb5_timestamp b)
{
return (uint32_t)a > (uint32_t)b;
}
static inline krb5_boolean
ts_within(krb5_timestamp a, krb5_timestamp b, krb5_deltat d)
{
return !ts_after(a, ts_incr(b, d)) && !ts_after(b, ts_incr(a, d));
}
krb5_error_code KRB5_CALLCONV
krb5_get_credentials_for_user(krb5_context context, krb5_flags options,
krb5_ccache ccache,
krb5_creds *in_creds,
krb5_data *cert,
krb5_creds **out_creds);
krb5_error_code KRB5_CALLCONV
krb5_get_credentials_for_proxy(krb5_context context,
krb5_flags options,
krb5_ccache ccache,
krb5_creds *in_creds,
krb5_ticket *evidence_tkt,
krb5_creds **out_creds);
krb5_error_code KRB5_CALLCONV
krb5int_get_authdata_containee_types(krb5_context context,
const krb5_authdata *container,
unsigned int *nad_types,
krb5_authdatatype **ad_types);
krb5_error_code krb5int_parse_enctype_list(krb5_context context,
const char *profkey, char *profstr,
krb5_enctype *default_list,
krb5_enctype **result);
krb5_boolean k5_etypes_contains(const krb5_enctype *list, krb5_enctype etype);
void k5_change_error_message_code(krb5_context ctx, krb5_error_code oldcode,
krb5_error_code newcode);
#define k5_setmsg krb5_set_error_message
#define k5_prependmsg krb5_prepend_error_message
#define k5_wrapmsg krb5_wrap_error_message
krb5_boolean
k5_sname_compare(krb5_context context, krb5_const_principal sname,
krb5_const_principal princ);
krb5_error_code
k5_hmac_md5(const krb5_data *key, const krb5_crypto_iov *data, size_t num_data,
krb5_data *output);
extern const krb5_address k5_addr_directional_init;
extern const krb5_address k5_addr_directional_accept;
krb5_error_code
k5_sockaddr_to_address(const struct sockaddr *sa, krb5_boolean local_use,
krb5_address *out);
void
k5_print_addr(const struct sockaddr *sa, char *buf, size_t len);
void
k5_print_addr_port(const struct sockaddr *sa, char *buf, size_t len);
#endif