#ifndef _UTIL_H_
#define _UTIL_H_ 1
+#include <string.h>
+#include <errno.h>
+
#include <krb5.h>
-#include "util_saml.h"
-#include "util_radius.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MIN /* Usually found in <sys/param.h>. */
+#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
+#endif
#define KRB_KEY_TYPE(key) ((key)->enctype)
#define KRB_KEY_DATA(key) ((key)->contents)
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_CB = 0x0603, /* 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
const gss_buffer_t src,
gss_buffer_t dst);
+static inline int
+bufferEqual(const gss_buffer_t b1, const gss_buffer_t b2)
+{
+ return (b1->length == b2->length &&
+ memcmp(b1->value, b2->value, b2->length) == 0);
+}
+
+static inline int
+bufferEqualString(const gss_buffer_t b1, const char *s)
+{
+ gss_buffer_desc b2;
+
+ b2.length = strlen(s);
+ b2.value = (char *)s;
+
+ return bufferEqual(b1, &b2);
+}
+
/* util_cksum.c */
int
gssEapSign(krb5_context context,
int
gssEapVerify(krb5_context context,
krb5_cksumtype type,
- size_t rrc,
+ size_t rrc,
krb5_keyblock *key,
krb5_keyusage sign_usage,
gss_iov_buffer_desc *iov,
gssEapVerifyToken(OM_uint32 *minor,
gss_ctx_id_t ctx,
const gss_buffer_t inputToken,
- enum gss_eap_token_type tokenType,
+ enum gss_eap_token_type *tokenType,
gss_buffer_t innerInputToken);
+OM_uint32
+gssEapContextTime(OM_uint32 *minor,
+ gss_ctx_id_t context_handle,
+ OM_uint32 *time_rec);
+
+OM_uint32
+gssEapDisplayName(OM_uint32 *minor,
+ gss_name_t name,
+ gss_buffer_t output_name_buffer,
+ gss_OID *output_name_type);
+
/* 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);
gssEapAllocIov(gss_iov_buffer_t iov, size_t size);
OM_uint32
-gssEapDeriveRFC3961Key(OM_uint32 *minor,
+gssEapDeriveRfc3961Key(OM_uint32 *minor,
const unsigned char *key,
size_t keyLength,
krb5_enctype enctype,
OM_uint32
gssEapKerberosInit(OM_uint32 *minor, krb5_context *context);
+OM_uint32
+rfc3961ChecksumTypeForKey(OM_uint32 *minor,
+ krb5_keyblock *key,
+ krb5_cksumtype *cksumtype);
+
#define GSSEAP_KRB_INIT(ctx) do { \
OM_uint32 tmpMajor; \
tmpMajor = gssEapKerberosInit(minor, ctx); \
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
-};
+#define EXPORT_NAME_FLAG_OID 0x1
+#define EXPORT_NAME_FLAG_COMPOSITE 0x2
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);
+ gss_buffer_t exportedName);
+OM_uint32 gssEapExportNameInternal(OM_uint32 *minor,
+ const gss_name_t name,
+ gss_buffer_t exportedName,
+ unsigned int flags);
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 gssEapImportNameInternal(OM_uint32 *minor,
+ const gss_buffer_t input_name_buffer,
+ gss_name_t *output_name,
+ unsigned int flags);
OM_uint32
-composeAttributeName(OM_uint32 *minor,
- const gss_buffer_t prefix,
- const gss_buffer_t suffix,
- gss_buffer_t attribute);
+gssEapDuplicateName(OM_uint32 *minor,
+ const gss_name_t input_name,
+ gss_name_t *dest_name);
/* util_oid.c */
OM_uint32
composeOid(OM_uint32 *minor_status,
const char *prefix,
size_t prefix_len,
- int suffix,
+ int suffix,
gss_OID_desc *oid);
OM_uint32
}
/* util_ordering.c */
-int
-sequenceInternalize(void **vqueue, unsigned char **buf, size_t *lenremain);
+OM_uint32
+sequenceInternalize(OM_uint32 *minor,
+ void **vqueue,
+ unsigned char **buf,
+ size_t *lenremain);
-int
-sequenceExternalize(void *vqueue, unsigned char **buf, size_t *lenremain);
+OM_uint32
+sequenceExternalize(OM_uint32 *minor,
+ void *vqueue,
+ unsigned char **buf,
+ size_t *lenremain);
size_t
sequenceSize(void *vqueue);
-void
-sequenceFree(void **vqueue);
+OM_uint32
+sequenceFree(OM_uint32 *minor, void **vqueue);
-int
-sequenceCheck(void **vqueue, uint64_t seqnum);
+OM_uint32
+sequenceCheck(OM_uint32 *minor, void **vqueue, uint64_t seqnum);
-int
-sequenceInit(void **vqueue, uint64_t seqnum,
+OM_uint32
+sequenceInit(OM_uint32 *minor, void **vqueue, uint64_t seqnum,
int do_replay, int do_sequence, int wide_nums);
/* util_token.c */
size_t *body_size,
unsigned char **buf_in,
size_t toksize_in,
- enum gss_eap_token_type tok_type);
+ enum gss_eap_token_type *ret_tok_type);
/* Helper macros */
#define GSSEAP_CALLOC(count, size) (calloc((count), (size)))
return store_buffer(&buf, vp, FALSE);
}
+
+static inline void
+krbDataToGssBuffer(krb5_data *data, gss_buffer_t buffer)
+{
+ buffer->value = (void *)data->data;
+ buffer->length = data->length;
+}
+
+static inline void
+gssBufferToKrbData(gss_buffer_t buffer, krb5_data *data)
+{
+ data->data = (char *)buffer->value;
+ data->length = buffer->length;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "util_attr.h"
+#ifdef GSSEAP_ENABLE_REAUTH
+#include "util_reauth.h"
+#endif
+
#endif /* _UTIL_H_ */