X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=util.h;h=0fceafecdfdc9adeb7b3a27cb81bb859e491e9d4;hb=c782e76527626566bb4d6fddf38f83beea0aa72a;hp=cc56fe3cc441bf551dcd49b6571a7131aa702da3;hpb=8df7533a16abccca7dd2c1a03582e3fe7e9c9aca;p=mech_eap.orig diff --git a/util.h b/util.h index cc56fe3..0fceafe 100644 --- a/util.h +++ b/util.h @@ -57,8 +57,42 @@ #ifndef _UTIL_H_ #define _UTIL_H_ 1 +#include + +#include "util_saml.h" +#include "util_radius.h" + #define KRB_KEYTYPE(key) ((key)->enctype) +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_GSS_CHANNEL_BINDINGS = 0x0603, /* draft-howlett-eap-gss */ +}; + +/* util_buffer.c */ +OM_uint32 +makeStringBuffer(OM_uint32 *minor, + const char *string, + gss_buffer_t buffer); + +OM_uint32 +bufferToString(OM_uint32 *minor, + const gss_buffer_t buffer, + char **pString); + +OM_uint32 +duplicateBuffer(OM_uint32 *minor, + const gss_buffer_t src, + gss_buffer_t dst); + +/* util_cksum.c */ int gssEapSign(krb5_context context, krb5_cksumtype type, @@ -82,10 +116,35 @@ gssEapVerify(krb5_context context, OM_uint32 gssEapAllocContext(OM_uint32 *minor, gss_ctx_id_t *pCtx); OM_uint32 gssEapReleaseContext(OM_uint32 *minor, gss_ctx_id_t *pCtx); +OM_uint32 +gssEapMakeToken(OM_uint32 *minor, + gss_ctx_id_t ctx, + const gss_buffer_t innerToken, + enum gss_eap_token_type tokenType, + gss_buffer_t outputToken); + +OM_uint32 +gssEapVerifyToken(OM_uint32 *minor, + gss_ctx_id_t ctx, + const gss_buffer_t inputToken, + enum gss_eap_token_type tokenType, + gss_buffer_t innerInputToken); + /* util_cred.c */ OM_uint32 gssEapAllocCred(OM_uint32 *minor, gss_cred_id_t *pCred); OM_uint32 gssEapReleaseCred(OM_uint32 *minor, gss_cred_id_t *pCred); +OM_uint32 +gssEapAcquireCred(OM_uint32 *minor, + const gss_name_t desiredName, + const gss_buffer_t password, + OM_uint32 timeReq, + const gss_OID_set desiredMechs, + int cred_usage, + gss_cred_id_t *pCred, + gss_OID_set *pActualMechs, + OM_uint32 *timeRec); + /* util_crypt.c */ int gssEapEncrypt(krb5_context context, int dce_style, size_t ec, @@ -120,8 +179,26 @@ gssEapIsIntegrityOnly(gss_iov_buffer_desc *iov, int iov_count); int gssEapAllocIov(gss_iov_buffer_t iov, size_t size); +OM_uint32 +gssEapDeriveRFC3961Key(OM_uint32 *minor, + gss_buffer_t msk, + krb5_enctype enctype, + krb5_keyblock *pKey); + +/* util_krb.c */ +OM_uint32 +gssEapKerberosInit(OM_uint32 *minor, krb5_context *context); + +#define GSSEAP_KRB_INIT(ctx) do { \ + OM_uint32 tmpMajor; \ + tmpMajor = gssEapKerberosInit(minor, ctx); \ + if (GSS_ERROR(tmpMajor)) { \ + return tmpMajor; \ + } \ + } while (0) + /* util_mech.c */ -void +int gssEapInternalizeOid(const gss_OID oid, gss_OID *const pInternalizedOid); @@ -143,9 +220,49 @@ gssEapOidToEnctype(OM_uint32 *minor, const gss_OID oid, krb5_enctype *enctype); +int +gssEapIsMechanismOid(const gss_OID oid); + +int +gssEapIsConcreteMechanismOid(const gss_OID oid); + +OM_uint32 +gssEapValidateMechs(OM_uint32 *minor, + const gss_OID_set mechs); + /* util_name.c */ +enum gss_eap_attribute_type { + ATTR_TYPE_NONE = 0, + ATTR_TYPE_SAML_AAA_ASSERTION = 1, + ATTR_TYPE_SAML_ATTR = 2, + ATTR_TYPE_RADIUS_AVP = 3 +}; + OM_uint32 gssEapAllocName(OM_uint32 *minor, gss_name_t *pName); OM_uint32 gssEapReleaseName(OM_uint32 *minor, gss_name_t *pName); +OM_uint32 gssEapExportName(OM_uint32 *minor, + const gss_name_t name, + gss_buffer_t exportedName, + int composite); +OM_uint32 gssEapImportName(OM_uint32 *minor, + const gss_buffer_t input_name_buffer, + gss_OID input_name_type, + gss_name_t *output_name); + +enum gss_eap_attribute_type +gssEapAttributePrefixToType(const gss_buffer_t prefix); +gss_buffer_t +gssEapAttributeTypeToPrefix(enum gss_eap_attribute_type type); +OM_uint32 +decomposeAttributeName(OM_uint32 *minor, + const gss_buffer_t attribute, + gss_buffer_t prefix, + gss_buffer_t suffix); +OM_uint32 +composeAttributeName(OM_uint32 *minor, + const gss_buffer_t prefix, + const gss_buffer_t suffix, + gss_buffer_t attribute); /* util_oid.c */ OM_uint32 @@ -162,11 +279,26 @@ decomposeOid(OM_uint32 *minor_status, gss_OID_desc *oid, int *suffix) ; +OM_uint32 +duplicateOid(OM_uint32 *minor_status, + const gss_OID_desc * const oid, + gss_OID *new_oid); + +OM_uint32 +duplicateOidSet(OM_uint32 *minor, + const gss_OID_set src, + gss_OID_set *dst); + static inline int -oidEqual(const gss_OID_desc *o1, const gss_OID_desc *o2) +oidEqual(const gss_OID_desc *o1, const gss_OID_desc *o2) { - return (o1->length == o2->length && - memcmp(o1->elements, o2->elements, o1->length) == 0); + if (o1 == GSS_C_NO_OID) + return (o2 == GSS_C_NO_OID); + else if (o2 == GSS_C_NO_OID) + return (o1 == GSS_C_NO_OID); + else + return (o1->length == o2->length && + memcmp(o1->elements, o2->elements, o1->length) == 0); } /* util_ordering.c */ @@ -200,7 +332,7 @@ makeTokenHeader(const gss_OID_desc *mech, enum gss_eap_token_type tok_type); int -verifyTokenHeader(const gss_OID_desc * mech, +verifyTokenHeader(gss_OID mech, size_t *body_size, unsigned char **buf_in, size_t toksize_in, @@ -218,6 +350,25 @@ verifyTokenHeader(const gss_OID_desc * mech, return GSS_S_FAILURE; \ } while (0) +#include + +#define GSSEAP_MUTEX pthread_mutex_t +#define GSSEAP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER + +#define GSSEAP_MUTEX_INIT(m) pthread_mutex_init((m), NULL) +#define GSSEAP_MUTEX_DESTROY(m) pthread_mutex_destroy((m)) +#define GSSEAP_MUTEX_LOCK(m) pthread_mutex_lock((m)) +#define GSSEAP_MUTEX_UNLOCK(m) pthread_mutex_unlock((m)) + +#define GSSEAP_THREAD_KEY pthread_key_t +#define GSSEAP_KEY_CREATE(k, d) pthread_key_create((k), (d)) +#define GSSEAP_GETSPECIFIC(k) pthread_getspecific((k)) +#define GSSEAP_SETSPECIFIC(k, d) pthread_setspecific((k), (d)) + +#define GSSEAP_THREAD_ONCE pthread_once_t +#define GSSEAP_ONCE(o, i) pthread_once((o), (i)) +#define GSSEAP_ONCE_INITIALIZER PTHREAD_ONCE_INIT + /* Helper functions */ static inline void store_uint16_be(uint16_t val, void *vp)