X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=mech_eap%2Futil.h;h=0aa2479119a06d2d77944e1f6f6d53fc3407c400;hb=26311844916784cc0781b1a304b590dff5742fcb;hp=350bb047486c725bc931117a3c8681f40f908799;hpb=71e3acb5cc159fee2a578fd4b12f84598340328b;p=mech_eap.git diff --git a/mech_eap/util.h b/mech_eap/util.h index 350bb04..0aa2479 100644 --- a/mech_eap/util.h +++ b/mech_eap/util.h @@ -73,7 +73,9 @@ #include #ifdef WIN32 -#define inline __inline +# ifndef __cplusplus +# define inline __inline +# endif #define snprintf _snprintf #endif @@ -270,6 +272,12 @@ gssEapSetCredPassword(OM_uint32 *minor, const gss_buffer_t password); OM_uint32 +gssEapSetCredClientCertificate(OM_uint32 *minor, + gss_cred_id_t cred, + const gss_buffer_t clientCert, + const gss_buffer_t privateKey); + +OM_uint32 gssEapSetCredService(OM_uint32 *minor, gss_cred_id_t cred, const gss_name_t target); @@ -379,6 +387,16 @@ gssEapDeriveRfc3961Key(OM_uint32 *minor, #define KRB_DATA_INIT(d) krb5_data_zero((d)) +#define KRB_CHECKSUM_TYPE(c) ((c)->cksumtype) +#define KRB_CHECKSUM_LENGTH(c) ((c)->checksum.length) +#define KRB_CHECKSUM_DATA(c) ((c)->checksum.data) + +#define KRB_CHECKSUM_INIT(cksum, type, d) do { \ + (cksum)->cksumtype = (type); \ + (cksum)->checksum.length = (d)->length; \ + (cksum)->checksum.data = (d)->value; \ + } while (0) + #else #define KRB_TIME_FOREVER KRB5_INT32_MAX @@ -405,6 +423,16 @@ gssEapDeriveRfc3961Key(OM_uint32 *minor, (d)->data = NULL; \ } while (0) +#define KRB_CHECKSUM_TYPE(c) ((c)->checksum_type) +#define KRB_CHECKSUM_LENGTH(c) ((c)->length) +#define KRB_CHECKSUM_DATA(c) ((c)->contents) + +#define KRB_CHECKSUM_INIT(cksum, type, d) do { \ + (cksum)->checksum_type = (type); \ + (cksum)->length = (d)->length; \ + (cksum)->contents = (d)->value; \ + } while (0) + #endif /* HAVE_HEIMDAL_VERSION */ #define KRB_KEY_INIT(key) do { \ @@ -593,10 +621,13 @@ gssEapDisplayName(OM_uint32 *minor, gss_buffer_t output_name_buffer, gss_OID *output_name_type); +#define COMPARE_NAME_FLAG_IGNORE_EMPTY_REALMS 0x1 + OM_uint32 gssEapCompareName(OM_uint32 *minor, gss_name_t name1, gss_name_t name2, + OM_uint32 flags, int *name_equal); /* util_oid.c */ @@ -776,20 +807,20 @@ verifyTokenHeader(OM_uint32 *minor, enum gss_eap_token_type *ret_tok_type); /* Helper macros */ +#ifndef GSSEAP_MALLOC #if _WIN32 #include -#define GSSEAP_MALLOC gssalloc_malloc -#define GSSEAP_CALLOC gssalloc_calloc -#define GSSEAP_FREE gssalloc_free -#define GSSEAP_REALLOC gssalloc_realloc -#endif - -#ifndef GSSEAP_MALLOC +#define GSSEAP_MALLOC gssalloc_malloc +#define GSSEAP_CALLOC gssalloc_calloc +#define GSSEAP_FREE gssalloc_free +#define GSSEAP_REALLOC gssalloc_realloc +#else #define GSSEAP_CALLOC calloc #define GSSEAP_MALLOC malloc #define GSSEAP_FREE free #define GSSEAP_REALLOC realloc -#endif +#endif /* _WIN32 */ +#endif /* !GSSEAP_MALLOC */ #ifndef GSSAPI_CALLCONV #define GSSAPI_CALLCONV KRB5_CALLCONV @@ -981,13 +1012,58 @@ static inline void krbPrincComponentToGssBuffer(krb5_principal krbPrinc, int index, gss_buffer_t buffer) { + if (KRB_PRINC_LENGTH(krbPrinc) < index) { + buffer->value = NULL; + buffer->length = 0; + } else { #ifdef HAVE_HEIMDAL_VERSION - buffer->value = (void *)KRB_PRINC_NAME(krbPrinc)[index]; - buffer->length = strlen((char *)buffer->value); + buffer->value = (void *)KRB_PRINC_NAME(krbPrinc)[index]; + buffer->length = strlen((char *)buffer->value); #else - buffer->value = (void *)krb5_princ_component(NULL, krbPrinc, index)->data; - buffer->length = krb5_princ_component(NULL, krbPrinc, index)->length; + buffer->value = (void *)krb5_princ_component(NULL, krbPrinc, index)->data; + buffer->length = krb5_princ_component(NULL, krbPrinc, index)->length; #endif /* HAVE_HEIMDAL_VERSION */ + } +} + +static inline krb5_error_code +krbPrincUnparseServiceSpecifics(krb5_context krbContext, krb5_principal krbPrinc, + gss_buffer_t nameBuf) +{ + krb5_error_code result = 0; + if (KRB_PRINC_LENGTH(krbPrinc) > 2) { + /* Acceptor-Service-Specific */ + krb5_principal_data ssiPrinc = *krbPrinc; + char *ssi; + + KRB_PRINC_LENGTH(&ssiPrinc) -= 2; + KRB_PRINC_NAME(&ssiPrinc) += 2; + + result = krb5_unparse_name_flags(krbContext, &ssiPrinc, + KRB5_PRINCIPAL_UNPARSE_NO_REALM, &ssi); + if (result != 0) + return result; + + nameBuf->value = ssi; + nameBuf->length = strlen(ssi); + } else { + nameBuf->value = NULL; + nameBuf->length = 0; + } + + return result; +} + +static inline void +krbFreeUnparsedName(krb5_context krbContext, gss_buffer_t nameBuf) +{ +#ifdef HAVE_HEIMDAL_VERSION + krb5_xfree((char *) nameBuf->value); +#else + krb5_free_unparsed_name(krbContext, (char *)(nameBuf->value)); +#endif + nameBuf->value = NULL; + nameBuf->length = 0; } static inline void