X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=util.h;h=49c7c9110f5a3ddf6900399a5e23c212ef60bfc2;hb=7db57acddeddad5f96d16288b3776baf6c10c0b1;hp=2b8e9022971f40849173c60f0b48eef9b0ce23dc;hpb=05f822c330b24b35594b1da982f2b1fbd5f6d067;p=mech_eap.orig diff --git a/util.h b/util.h index 2b8e902..49c7c91 100644 --- a/util.h +++ b/util.h @@ -54,9 +54,14 @@ * */ +/* + * Utility functions. + */ + #ifndef _UTIL_H_ #define _UTIL_H_ 1 +#include #include #include @@ -66,35 +71,10 @@ extern "C" { #endif -#ifndef MIN /* Usually found in . */ +#ifndef MIN #define MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) #endif -#define KRB_KEY_TYPE(key) ((key)->enctype) -#define KRB_KEY_DATA(key) ((key)->contents) -#define KRB_KEY_LENGTH(key) ((key)->length) -#define KRB_KEY_INIT(key) do { \ - KRB_KEY_TYPE(key) = ENCTYPE_NULL; \ - KRB_KEY_DATA(key) = NULL; \ - KRB_KEY_LENGTH(key) = 0; \ - } while (0) - -enum gss_eap_token_type { - TOK_TYPE_NONE = 0x0000, /* no token */ - TOK_TYPE_MIC = 0x0404, /* RFC 4121 MIC token */ - TOK_TYPE_WRAP = 0x0504, /* RFC 4121 wrap token */ - TOK_TYPE_EXPORT_NAME = 0x0401, /* RFC 2743 exported name */ - TOK_TYPE_EXPORT_NAME_COMPOSITE = 0x0402, /* draft-ietf-kitten-gss-naming */ - TOK_TYPE_DELETE_CONTEXT = 0x0405, /* RFC 2743 delete context */ - TOK_TYPE_EAP_RESP = 0x0601, /* draft-howlett-eap-gss */ - TOK_TYPE_EAP_REQ = 0x0602, /* draft-howlett-eap-gss */ - TOK_TYPE_EXT_REQ = 0x0603, /* draft-howlett-eap-gss */ - TOK_TYPE_EXT_RESP = 0x0604, /* to be specified */ - TOK_TYPE_GSS_REAUTH = 0x0605, /* to be specified */ -}; - -#define EAP_EXPORT_CONTEXT_V1 1 - /* util_buffer.c */ OM_uint32 makeStringBuffer(OM_uint32 *minor, @@ -134,7 +114,11 @@ int gssEapSign(krb5_context context, krb5_cksumtype type, size_t rrc, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto crypto, +#else krb5_keyblock *key, +#endif krb5_keyusage sign_usage, gss_iov_buffer_desc *iov, int iov_count); @@ -143,7 +127,11 @@ int gssEapVerify(krb5_context context, krb5_cksumtype type, size_t rrc, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto crypto, +#else krb5_keyblock *key, +#endif krb5_keyusage sign_usage, gss_iov_buffer_desc *iov, int iov_count, @@ -157,6 +145,23 @@ gssEapEncodeGssChannelBindings(OM_uint32 *minor, #endif /* util_context.c */ +#define EAP_EXPORT_CONTEXT_V1 1 + +enum gss_eap_token_type { + TOK_TYPE_NONE = 0x0000, /* no token */ + TOK_TYPE_MIC = 0x0404, /* RFC 4121 MIC token */ + TOK_TYPE_WRAP = 0x0504, /* RFC 4121 wrap token */ + TOK_TYPE_EXPORT_NAME = 0x0401, /* RFC 2743 exported name */ + TOK_TYPE_EXPORT_NAME_COMPOSITE = 0x0402, /* exported composite name */ + TOK_TYPE_DELETE_CONTEXT = 0x0405, /* RFC 2743 delete context */ + TOK_TYPE_EAP_RESP = 0x0601, /* EAP response */ + TOK_TYPE_EAP_REQ = 0x0602, /* EAP request */ + TOK_TYPE_EXT_REQ = 0x0603, /* GSS EAP extensions request */ + TOK_TYPE_EXT_RESP = 0x0604, /* GSS EAP extensions response */ + TOK_TYPE_GSS_REAUTH = 0x0605, /* GSS EAP fast reauthentication token */ + TOK_TYPE_CONTEXT_ERR = 0x0606, /* context error */ +}; + OM_uint32 gssEapAllocContext(OM_uint32 *minor, gss_ctx_id_t *pCtx); OM_uint32 gssEapReleaseContext(OM_uint32 *minor, gss_ctx_id_t *pCtx); @@ -205,15 +210,27 @@ int gssEapCredAvailable(gss_cred_id_t cred, gss_OID mech); /* util_crypt.c */ int gssEapEncrypt(krb5_context context, int dce_style, size_t ec, - size_t rrc, krb5_keyblock *key, int usage, krb5_pointer iv, + size_t rrc, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto crypto, +#else + krb5_keyblock *key, +#endif + int usage, gss_iov_buffer_desc *iov, int iov_count); int gssEapDecrypt(krb5_context context, int dce_style, size_t ec, - size_t rrc, krb5_keyblock *key, int usage, krb5_pointer iv, + size_t rrc, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto crypto, +#else + krb5_keyblock *key, +#endif + int usage, gss_iov_buffer_desc *iov, int iov_count); -krb5_cryptotype +int gssEapMapCryptoFlag(OM_uint32 type); gss_iov_buffer_t @@ -243,23 +260,170 @@ gssEapDeriveRfc3961Key(OM_uint32 *minor, krb5_enctype enctype, krb5_keyblock *pKey); -/* util_krb.c */ +/* util_exts.c */ +#define EXT_FLAG_CRITICAL 0x80000000 /* critical, wire flag */ +#define EXT_FLAG_VERIFIED 0x40000000 /* verified, API flag */ + +#define EXT_TYPE_GSS_CHANNEL_BINDINGS 0x00000000 +#define EXT_TYPE_REAUTH_CREDS 0x00000001 +#define EXT_TYPE_MASK (~(EXT_FLAG_CRITICAL | EXT_FLAG_VERIFIED)) + +struct gss_eap_extension_provider { + OM_uint32 type; + int critical; /* client */ + int required; /* server */ + OM_uint32 (*make)(OM_uint32 *, + gss_cred_id_t, + gss_ctx_id_t, + gss_channel_bindings_t, + gss_buffer_t); + OM_uint32 (*verify)(OM_uint32 *, + gss_cred_id_t, + gss_ctx_id_t, + gss_channel_bindings_t, + const gss_buffer_t); +}; + OM_uint32 -gssEapKerberosInit(OM_uint32 *minor, krb5_context *context); +gssEapMakeExtensions(OM_uint32 *minor, + gss_cred_id_t cred, + gss_ctx_id_t ctx, + gss_channel_bindings_t chanBindings, + gss_buffer_t buffer); OM_uint32 -rfc3961ChecksumTypeForKey(OM_uint32 *minor, - krb5_keyblock *key, - krb5_cksumtype *cksumtype); +gssEapVerifyExtensions(OM_uint32 *minor, + gss_cred_id_t cred, + gss_ctx_id_t ctx, + gss_channel_bindings_t chanBindings, + const gss_buffer_t buffer); + +/* util_krb.c */ +#ifdef HAVE_HEIMDAL_VERSION + +#define KRB_TIME_FOREVER ((time_t)~0L) + +#define KRB_KEY_TYPE(key) ((key)->keytype) +#define KRB_KEY_DATA(key) ((key)->keyvalue.data) +#define KRB_KEY_LENGTH(key) ((key)->keyvalue.length) + +#define KRB_PRINC_LENGTH(princ) ((princ)->name.name_string.len) +#define KRB_PRINC_TYPE(princ) ((princ)->name.name_type) +#define KRB_PRINC_NAME(princ) ((princ)->name.name_string.val) +#define KRB_PRINC_REALM(princ) ((princ)->realm) + +#define KRB_KT_ENT_KEYBLOCK(e) (&(e)->keyblock) +#define KRB_KT_ENT_FREE(c, e) krb5_kt_free_entry((c), (e)) + +#define KRB_CRYPTO_CONTEXT(ctx) (krbCrypto) + +#else + +#define KRB_TIME_FOREVER KRB5_INT32_MAX + +#define KRB_KEY_TYPE(key) ((key)->enctype) +#define KRB_KEY_DATA(key) ((key)->contents) +#define KRB_KEY_LENGTH(key) ((key)->length) + +#define KRB_PRINC_LENGTH(princ) (krb5_princ_size(NULL, (princ))) +#define KRB_PRINC_TYPE(princ) (krb5_princ_type(NULL, (princ))) +#define KRB_PRINC_NAME(princ) (krb5_princ_name(NULL, (princ))) +#define KRB_PRINC_REALM(princ) (krb5_princ_realm(NULL, (princ))) + +#define KRB_KT_ENT_KEYBLOCK(e) (&(e)->key) +#define KRB_KT_ENT_FREE(c, e) krb5_free_keytab_entry_contents((c), (e)) + +#define KRB_CRYPTO_CONTEXT(ctx) (&(ctx)->rfc3961Key) + +#endif /* HAVE_HEIMDAL_VERSION */ + +#define KRB_KEY_INIT(key) do { \ + KRB_KEY_TYPE(key) = ENCTYPE_NULL; \ + KRB_KEY_DATA(key) = NULL; \ + KRB_KEY_LENGTH(key) = 0; \ + } while (0) + +#ifdef HAVE_HEIMDAL_VERSION +#define GSS_IOV_BUFFER_FLAG_ALLOCATE GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE +#define GSS_IOV_BUFFER_FLAG_ALLOCATED GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATED + +#define GSS_S_CRED_UNAVAIL GSS_S_FAILURE +#endif #define GSSEAP_KRB_INIT(ctx) do { \ OM_uint32 tmpMajor; \ + \ tmpMajor = gssEapKerberosInit(minor, ctx); \ if (GSS_ERROR(tmpMajor)) { \ return tmpMajor; \ } \ } while (0) +OM_uint32 +gssEapKerberosInit(OM_uint32 *minor, krb5_context *context); + +OM_uint32 +rfc3961ChecksumTypeForKey(OM_uint32 *minor, + krb5_keyblock *key, + krb5_cksumtype *cksumtype); + +krb5_const_principal +krbAnonymousPrincipal(void); + +krb5_error_code +krbCryptoLength(krb5_context krbContext, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto krbCrypto, +#else + krb5_keyblock *key, +#endif + int type, + size_t *length); + +krb5_error_code +krbPaddingLength(krb5_context krbContext, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto krbCrypto, +#else + krb5_keyblock *key, +#endif + size_t dataLength, + size_t *padLength); + +krb5_error_code +krbBlockSize(krb5_context krbContext, +#ifdef HAVE_HEIMDAL_VERSION + krb5_crypto krbCrypto, +#else + krb5_keyblock *key, +#endif + size_t *blockSize); + +krb5_error_code +krbEnctypeToString(krb5_context krbContext, + krb5_enctype enctype, + const char *prefix, + gss_buffer_t string); + +krb5_error_code +krbMakeAuthDataKdcIssued(krb5_context context, + const krb5_keyblock *key, + krb5_const_principal issuer, +#ifdef HAVE_HEIMDAL_VERSION + const AuthorizationData *authdata, + AuthorizationData *adKdcIssued +#else + krb5_authdata *const *authdata, + krb5_authdata ***adKdcIssued +#endif + ); + +krb5_error_code +krbMakeCred(krb5_context context, + krb5_auth_context authcontext, + krb5_creds *creds, + krb5_data *data); + /* util_lucid.c */ OM_uint32 gssEapExportLucidSecContext(OM_uint32 *minor, @@ -268,11 +432,16 @@ gssEapExportLucidSecContext(OM_uint32 *minor, gss_buffer_set_t *data_set); /* util_mech.c */ +extern gss_OID GSS_EAP_MECHANISM; + int gssEapInternalizeOid(const gss_OID oid, gss_OID *const pInternalizedOid); OM_uint32 +gssEapReleaseOid(OM_uint32 *minor, gss_OID *oid); + +OM_uint32 gssEapDefaultMech(OM_uint32 *minor, gss_OID *oid); @@ -414,10 +583,11 @@ verifyTokenHeader(OM_uint32 *minor, enum gss_eap_token_type *ret_tok_type); /* Helper macros */ -#define GSSEAP_CALLOC(count, size) (calloc((count), (size))) -#define GSSEAP_FREE(ptr) (free((ptr))) -#define GSSEAP_MALLOC(size) (malloc((size))) -#define GSSEAP_REALLOC(ptr, size) (realloc((ptr), (size))) + +#define GSSEAP_CALLOC calloc +#define GSSEAP_MALLOC malloc +#define GSSEAP_FREE free +#define GSSEAP_REALLOC realloc #define GSSEAP_NOT_IMPLEMENTED do { \ assert(0 && "not implemented"); \ @@ -563,6 +733,30 @@ krbDataToGssBuffer(krb5_data *data, gss_buffer_t buffer) } static inline void +krbPrincComponentToGssBuffer(krb5_principal krbPrinc, + int index, gss_buffer_t buffer) +{ +#ifdef HAVE_HEIMDAL_VERSION + 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; +#endif /* HAVE_HEIMDAL_VERSION */ +} + +static inline void +krbPrincRealmToGssBuffer(krb5_principal krbPrinc, gss_buffer_t buffer) +{ +#ifdef HAVE_HEIMDAL_VERSION + buffer->value = (void *)KRB_PRINC_REALM(krbPrinc); + buffer->length = strlen((char *)buffer->value); +#else + krbDataToGssBuffer(KRB_PRINC_REALM(krbPrinc), buffer); +#endif +} + +static inline void gssBufferToKrbData(gss_buffer_t buffer, krb5_data *data) { data->data = (char *)buffer->value;