Implement channel bindings
[mech_eap.git] / util.h
diff --git a/util.h b/util.h
index 5be9538..86fa6f7 100644 (file)
--- a/util.h
+++ b/util.h
@@ -73,9 +73,26 @@ enum gss_eap_token_type {
     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 */
+    TOK_TYPE_GSS_CB                  = 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,
@@ -95,6 +112,11 @@ gssEapVerify(krb5_context context,
              int iov_count,
              int *valid);
 
+OM_uint32
+gssEapEncodeGssChannelBindings(OM_uint32 *minor,
+                               gss_channel_bindings_t chanBindings,
+                               gss_buffer_t encodedBindings);
+
 /* util_context.c */
 OM_uint32 gssEapAllocContext(OM_uint32 *minor, gss_ctx_id_t *pCtx);
 OM_uint32 gssEapReleaseContext(OM_uint32 *minor, gss_ctx_id_t *pCtx);
@@ -128,6 +150,8 @@ gssEapAcquireCred(OM_uint32 *minor,
                   gss_OID_set *pActualMechs,
                   OM_uint32 *timeRec);
 
+int gssEapCredAvailable(gss_cred_id_t cred, gss_OID mech);
+
 /* util_crypt.c */
 int
 gssEapEncrypt(krb5_context context, int dce_style, size_t ec,
@@ -164,7 +188,8 @@ gssEapAllocIov(gss_iov_buffer_t iov, size_t size);
 
 OM_uint32
 gssEapDeriveRFC3961Key(OM_uint32 *minor,
-                       gss_buffer_t msk,
+                       const unsigned char *key,
+                       size_t keyLength,
                        krb5_enctype enctype,
                        krb5_keyblock *pKey);
 
@@ -206,6 +231,9 @@ gssEapOidToEnctype(OM_uint32 *minor,
 int
 gssEapIsMechanismOid(const gss_OID oid);
 
+int
+gssEapIsConcreteMechanismOid(const gss_OID oid);
+
 OM_uint32
 gssEapValidateMechs(OM_uint32 *minor,
                    const gss_OID_set mechs);
@@ -311,8 +339,9 @@ makeTokenHeader(const gss_OID_desc *mech,
                 unsigned char **buf,
                 enum gss_eap_token_type tok_type);
 
-int
-verifyTokenHeader(const gss_OID_desc * mech,
+OM_uint32
+verifyTokenHeader(OM_uint32 *minor,
+                  gss_OID mech,
                   size_t *body_size,
                   unsigned char **buf_in,
                   size_t toksize_in,
@@ -411,70 +440,17 @@ load_uint64_be(const void *cvp)
     return ((uint64_t)load_uint32_be(p) << 32) | load_uint32_be(p + 4);
 }
 
-static OM_uint32
-makeStringBuffer(OM_uint32 *minor,
-                 const char *string,
-                 gss_buffer_t buffer)
-{
-    size_t len = strlen(string);
-
-    buffer->value = GSSEAP_MALLOC(len + 1);
-    if (buffer->value == NULL) {
-        *minor = ENOMEM;
-        return GSS_S_FAILURE;
-    }
-    memcpy(buffer->value, string, len + 1);
-    buffer->length = len;
-
-    *minor = 0;
-    return GSS_S_COMPLETE;
-}
-
-static OM_uint32
-bufferToString(OM_uint32 *minor,
-               const gss_buffer_t buffer,
-               char **pString)
-{
-    char *s;
-
-    s = GSSEAP_MALLOC(buffer->length + 1);
-    if (s == NULL) {
-        *minor = ENOMEM;
-        return GSS_S_FAILURE;
-    }
-    memcpy(s, buffer->value, buffer->length);
-    s[buffer->length] = '\0';
-
-    *pString = s;
-
-    *minor = 0;
-    return GSS_S_COMPLETE;
-}
-
-static OM_uint32
-duplicateBuffer(OM_uint32 *minor,
-                const gss_buffer_t src,
-                gss_buffer_t dst)
+static inline void
+store_buffer(gss_buffer_t buffer, void *vp, int wide_nums)
 {
-    dst->length = 0;
-    dst->value = NULL;
-
-    if (src == GSS_C_NO_BUFFER)
-        return GSS_S_COMPLETE;
-
-    dst->value = GSSEAP_MALLOC(src->length + 1);
-    if (dst->value == NULL) {
-        *minor = ENOMEM;
-        return GSS_S_FAILURE;
-    }
-
-    dst->length = src->length;
-    memcpy(dst->value, src->value, dst->length);
-
-    ((unsigned char *)dst->value)[dst->length] = '\0';
+    unsigned char *p = (unsigned char *)vp;
 
-    *minor = 0;
-    return GSS_S_COMPLETE;
+    if (wide_nums)
+        store_uint64_be(buffer->length, p);
+    else
+        store_uint32_be(buffer->length, p);
+    if (buffer->value != NULL)
+        memcpy(p + 4, buffer->value, buffer->length);
 }
 
 #endif /* _UTIL_H_ */