cleanup
authorLuke Howard <lukeh@padl.com>
Sun, 10 Oct 2010 23:59:41 +0000 (01:59 +0200)
committerLuke Howard <lukeh@padl.com>
Sun, 10 Oct 2010 23:59:41 +0000 (01:59 +0200)
mech_eap/util_exts.c

index 0cdeed0..0ce98c5 100644 (file)
 #include "gssapiP_eap.h"
 
 static OM_uint32
+encodeExtensions(OM_uint32 *minor,
+                 gss_buffer_set_t extensions,
+                 OM_uint32 *types,
+                 gss_buffer_t buffer);
+
+static OM_uint32
+decodeExtensions(OM_uint32 *minor,
+                 const gss_buffer_t buffer,
+                 gss_buffer_set_t *pExtensions,
+                 OM_uint32 **pTypes);
+
+/*
+ * Initiator extensions
+ */
+static OM_uint32
 makeGssChannelBindings(OM_uint32 *minor,
                        gss_cred_id_t cred,
                        gss_ctx_id_t ctx,
@@ -98,6 +113,9 @@ eapGssInitExtensions[] = {
     },
 };
 
+/*
+ * Acceptor extensions
+ */
 static OM_uint32
 makeReauthCreds(OM_uint32 *minor,
                 gss_cred_id_t cred,
@@ -143,144 +161,6 @@ eapGssAcceptExtensions[] = {
     },
 };
 
-static OM_uint32
-encodeExtensions(OM_uint32 *minor,
-                 gss_buffer_set_t extensions,
-                 OM_uint32 *types,
-                 gss_buffer_t buffer)
-{
-    OM_uint32 major, tmpMinor;
-    size_t required = 0, i;
-    unsigned char *p;
-
-    buffer->value = NULL;
-    buffer->length = 0;
-
-    if (extensions != GSS_C_NO_BUFFER_SET) {
-        for (i = 0; i < extensions->count; i++) {
-            required += 8 + extensions->elements[i].length;
-        }
-    }
-
-    /*
-     * We must always return a non-NULL token otherwise the calling state
-     * machine assumes we are finished. Hence care in case malloc(0) does
-     * return NULL.
-     */
-    buffer->value = GSSEAP_MALLOC(required ? required : 1);
-    if (buffer->value == NULL) {
-        *minor = ENOMEM;
-        major = GSS_S_FAILURE;
-        goto cleanup;
-    }
-
-    buffer->length = required;
-    p = (unsigned char *)buffer->value;
-
-    if (extensions != GSS_C_NO_BUFFER_SET) {
-        for (i = 0; i < extensions->count; i++) {
-            gss_buffer_t extension = &extensions->elements[i];
-
-            assert((types[i] & EXT_FLAG_VERIFIED) == 0); /* private flag */
-
-             /*
-              * Extensions are encoded as type-length-value, where the upper
-              * bit of the type indicates criticality.
-              */
-            store_uint32_be(types[i], &p[0]);
-            store_uint32_be(extension->length, &p[4]);
-            memcpy(&p[8], extension->value, extension->length);
-
-            p += 8 + extension->length;
-        }
-    }
-
-    assert(p == (unsigned char *)buffer->value + required);
-    assert(buffer->value != NULL);
-
-cleanup:
-    if (GSS_ERROR(major)) {
-        gss_release_buffer(&tmpMinor, buffer);
-    }
-
-    return major;
-}
-
-static OM_uint32
-decodeExtensions(OM_uint32 *minor,
-                 const gss_buffer_t buffer,
-                 gss_buffer_set_t *pExtensions,
-                 OM_uint32 **pTypes)
-{
-    OM_uint32 major, tmpMinor;
-    gss_buffer_set_t extensions = GSS_C_NO_BUFFER_SET;
-    OM_uint32 *types = NULL;
-    unsigned char *p;
-    size_t remain;
-
-    *pExtensions = GSS_C_NO_BUFFER_SET;
-    *pTypes = NULL;
-
-    major = gss_create_empty_buffer_set(minor, &extensions);
-    if (GSS_ERROR(major))
-        goto cleanup;
-
-    if (buffer->length == 0) {
-        major = GSS_S_COMPLETE;
-        goto cleanup;
-    }
-
-    p = (unsigned char *)buffer->value;
-    remain = buffer->length;
-
-    do {
-        OM_uint32 *ntypes;
-        gss_buffer_desc extension;
-
-        if (remain < 8) {
-            major = GSS_S_DEFECTIVE_TOKEN;
-            goto cleanup;
-        }
-
-        ntypes = GSSEAP_REALLOC(types,
-                                (extensions->count + 1) * sizeof(OM_uint32));
-        if (ntypes == NULL) {
-            *minor = ENOMEM;
-            major = GSS_S_FAILURE;
-            goto cleanup;
-        }
-        types = ntypes;
-
-        types[extensions->count] = load_uint32_be(&p[0]);
-        extension.length = load_uint32_be(&p[4]);
-
-        if (remain < 8 + extension.length) {
-            major = GSS_S_DEFECTIVE_TOKEN;
-            goto cleanup;
-        }
-        extension.value = &p[8];
-
-        major = gss_add_buffer_set_member(minor, &extension, &extensions);
-        if (GSS_ERROR(major))
-            goto cleanup;
-
-        p      += 8 + extension.length;
-        remain -= 8 + extension.length;
-    } while (remain != 0);
-
-cleanup:
-    if (GSS_ERROR(major)) {
-        gss_release_buffer_set(&tmpMinor, &extensions);
-        if (types != NULL)
-            GSSEAP_FREE(types);
-    } else {
-        *pExtensions = extensions;
-        *pTypes = types;
-    }
-
-    return major;
-}
-
 OM_uint32
 gssEapMakeExtensions(OM_uint32 *minor,
                      gss_cred_id_t cred,
@@ -430,3 +310,143 @@ cleanup:
 
     return major;
 }
+
+static OM_uint32
+encodeExtensions(OM_uint32 *minor,
+                 gss_buffer_set_t extensions,
+                 OM_uint32 *types,
+                 gss_buffer_t buffer)
+{
+    OM_uint32 major, tmpMinor;
+    size_t required = 0, i;
+    unsigned char *p;
+
+    buffer->value = NULL;
+    buffer->length = 0;
+
+    if (extensions != GSS_C_NO_BUFFER_SET) {
+        for (i = 0; i < extensions->count; i++) {
+            required += 8 + extensions->elements[i].length;
+        }
+    }
+
+    /*
+     * We must always return a non-NULL token otherwise the calling state
+     * machine assumes we are finished. Hence care in case malloc(0) does
+     * return NULL.
+     */
+    buffer->value = GSSEAP_MALLOC(required ? required : 1);
+    if (buffer->value == NULL) {
+        *minor = ENOMEM;
+        major = GSS_S_FAILURE;
+        goto cleanup;
+    }
+
+    buffer->length = required;
+    p = (unsigned char *)buffer->value;
+
+    if (extensions != GSS_C_NO_BUFFER_SET) {
+        for (i = 0; i < extensions->count; i++) {
+            gss_buffer_t extension = &extensions->elements[i];
+
+            assert((types[i] & EXT_FLAG_VERIFIED) == 0); /* private flag */
+
+             /*
+              * Extensions are encoded as type-length-value, where the upper
+              * bit of the type indicates criticality.
+              */
+            store_uint32_be(types[i], &p[0]);
+            store_uint32_be(extension->length, &p[4]);
+            memcpy(&p[8], extension->value, extension->length);
+
+            p += 8 + extension->length;
+        }
+    }
+
+    assert(p == (unsigned char *)buffer->value + required);
+    assert(buffer->value != NULL);
+
+cleanup:
+    if (GSS_ERROR(major)) {
+        gss_release_buffer(&tmpMinor, buffer);
+    }
+
+    return major;
+}
+
+static OM_uint32
+decodeExtensions(OM_uint32 *minor,
+                 const gss_buffer_t buffer,
+                 gss_buffer_set_t *pExtensions,
+                 OM_uint32 **pTypes)
+{
+    OM_uint32 major, tmpMinor;
+    gss_buffer_set_t extensions = GSS_C_NO_BUFFER_SET;
+    OM_uint32 *types = NULL;
+    unsigned char *p;
+    size_t remain;
+
+    *pExtensions = GSS_C_NO_BUFFER_SET;
+    *pTypes = NULL;
+
+    major = gss_create_empty_buffer_set(minor, &extensions);
+    if (GSS_ERROR(major))
+        goto cleanup;
+
+    if (buffer->length == 0) {
+        major = GSS_S_COMPLETE;
+        goto cleanup;
+    }
+
+    p = (unsigned char *)buffer->value;
+    remain = buffer->length;
+
+    do {
+        OM_uint32 *ntypes;
+        gss_buffer_desc extension;
+
+        if (remain < 8) {
+            major = GSS_S_DEFECTIVE_TOKEN;
+            goto cleanup;
+        }
+
+        ntypes = GSSEAP_REALLOC(types,
+                                (extensions->count + 1) * sizeof(OM_uint32));
+        if (ntypes == NULL) {
+            *minor = ENOMEM;
+            major = GSS_S_FAILURE;
+            goto cleanup;
+        }
+        types = ntypes;
+
+        types[extensions->count] = load_uint32_be(&p[0]);
+        extension.length = load_uint32_be(&p[4]);
+
+        if (remain < 8 + extension.length) {
+            major = GSS_S_DEFECTIVE_TOKEN;
+            goto cleanup;
+        }
+        extension.value = &p[8];
+
+        major = gss_add_buffer_set_member(minor, &extension, &extensions);
+        if (GSS_ERROR(major))
+            goto cleanup;
+
+        p      += 8 + extension.length;
+        remain -= 8 + extension.length;
+    } while (remain != 0);
+
+cleanup:
+    if (GSS_ERROR(major)) {
+        gss_release_buffer_set(&tmpMinor, &extensions);
+        if (types != NULL)
+            GSSEAP_FREE(types);
+    } else {
+        *pExtensions = extensions;
+        *pTypes = types;
+    }
+
+    return major;
+}
+
+