some work on fast reauth
[mech_eap.git] / util.h
diff --git a/util.h b/util.h
index 1dafd6b..c23c997 100644 (file)
--- a/util.h
+++ b/util.h
 #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)
@@ -81,6 +89,8 @@ enum gss_eap_token_type {
     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_KRB_CRED                = 0x0604,  /* to be specified */
+    TOK_TYPE_GSS_REAUTH              = 0x0605,  /* to be specified */
 };
 
 #define EAP_EXPORT_CONTEXT_V1           1
@@ -101,6 +111,24 @@ duplicateBuffer(OM_uint32 *minor,
                 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,
@@ -114,17 +142,19 @@ 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,
              int iov_count,
              int *valid);
 
+#if 0
 OM_uint32
 gssEapEncodeGssChannelBindings(OM_uint32 *minor,
                                gss_channel_bindings_t chanBindings,
                                gss_buffer_t encodedBindings);
+#endif
 
 /* util_context.c */
 OM_uint32 gssEapAllocContext(OM_uint32 *minor, gss_ctx_id_t *pCtx);
@@ -144,6 +174,17 @@ gssEapVerifyToken(OM_uint32 *minor,
                   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);
@@ -196,7 +237,7 @@ int
 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,
@@ -206,6 +247,11 @@ gssEapDeriveRFC3961Key(OM_uint32 *minor,
 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); \
@@ -248,45 +294,37 @@ 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
-};
+#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 gssEapImportNameInternal(OM_uint32 *minor,
+                                   const gss_buffer_t input_name_buffer,
+                                   gss_name_t *output_name,
+                                   unsigned int flags);
 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);
+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
@@ -319,23 +357,29 @@ oidEqual(const gss_OID_desc *o1, const gss_OID_desc *o2)
 }
 
 /* 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 */
@@ -497,4 +541,25 @@ store_oid(gss_OID oid, void *vp)
 
     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"
+
 #endif /* _UTIL_H_ */