GSSEAP_KRB_INIT(&krbContext);
krb5_free_principal(krbContext, name->krbPrincipal);
- samlReleaseAttrContext(&tmpMinor, name);
- radiusReleaseAttrContext(&tmpMinor, name);
+ gssEapReleaseAttrContext(&tmpMinor, name);
GSSEAP_MUTEX_DESTROY(&name->mutex);
GSSEAP_FREE(name);
name->flags = load_uint32_be(p);
UPDATE_REMAIN(4);
- if (name->flags & NAME_FLAG_RADIUS_ATTRIBUTES) {
- CHECK_REMAIN(4);
- buf.length = load_uint32_be(p);
- UPDATE_REMAIN(4);
-
- CHECK_REMAIN(buf.length);
- buf.value = p;
- UPDATE_REMAIN(buf.length);
-
- major = radiusImportAttrContext(minor, &buf, name);
- if (GSS_ERROR(major))
- goto cleanup;
- }
-
- if (name->flags & NAME_FLAG_SAML_ATTRIBUTES) {
- CHECK_REMAIN(4);
- buf.length = load_uint32_be(p);
- UPDATE_REMAIN(4);
-
- CHECK_REMAIN(buf.length);
- buf.value = p;
- UPDATE_REMAIN(buf.length);
-
- major = samlImportAttrContext(minor, &buf, name);
- if (GSS_ERROR(major))
- goto cleanup;
- }
+ CHECK_REMAIN(4);
+ buf.length = load_uint32_be(p);
+ UPDATE_REMAIN(4);
+
+ CHECK_REMAIN(buf.length);
+ buf.value = p;
+ UPDATE_REMAIN(buf.length);
+
+ major = gssEapImportAttrContext(minor, &buf, name);
+ if (GSS_ERROR(major))
+ goto cleanup;
}
major = GSS_S_COMPLETE;
char *krbName = NULL;
size_t krbNameLen;
unsigned char *p;
- gss_buffer_desc radius, saml;
-
- radius.length = 0;
- radius.value = NULL;
-
- saml.length = 0;
- saml.value = NULL;
+ gss_buffer_desc attrs = GSS_C_EMPTY_BUFFER;
exportedName->length = 0;
exportedName->value = NULL;
if (composite) {
exportedName->length += 4;
- if (name->flags & NAME_FLAG_RADIUS_ATTRIBUTES) {
- major = radiusExportAttrContext(minor, name, &radius);
- if (GSS_ERROR(major))
- goto cleanup;
- exportedName->length += 4 + radius.length;
- }
- if (name->flags & NAME_FLAG_SAML_ATTRIBUTES) {
- major = samlExportAttrContext(minor, name, &saml);
- if (GSS_ERROR(major))
- goto cleanup;
- exportedName->length += 4 + saml.length;
- }
+ major = gssEapExportAttrContext(minor, name, &attrs);
+ if (GSS_ERROR(major))
+ goto cleanup;
+ exportedName->length += 4 + attrs.length;
}
exportedName->value = GSSEAP_MALLOC(exportedName->length);
store_uint32_be(name->flags, p);
p += 4;
- if (name->flags & NAME_FLAG_RADIUS_ATTRIBUTES) {
- store_uint32_be(radius.length, p);
- memcpy(&p[4], radius.value, radius.length);
- p += 4 + radius.length;
- }
- if (name->flags & NAME_FLAG_SAML_ATTRIBUTES) {
- store_uint32_be(saml.length, p);
- memcpy(&p[4], saml.value, saml.length);
- p += 4 + saml.length;
- }
+ store_uint32_be(attrs.length, p);
+ memcpy(&p[4], attrs.value, attrs.length);
+ p += 4 + attrs.length;
}
*minor = 0;
cleanup:
GSSEAP_MUTEX_UNLOCK(&name->mutex);
- gss_release_buffer(&tmpMinor, &saml);
- gss_release_buffer(&tmpMinor, &radius);
+ gss_release_buffer(&tmpMinor, &attrs);
if (GSS_ERROR(major))
gss_release_buffer(&tmpMinor, exportedName);
krb5_free_unparsed_name(krbContext, krbName);
return major;
}
-static gss_buffer_desc attributePrefixes[] = {
- {
- /* ATTR_TYPE_NONE */
- 0,
- NULL,
- },
- {
- /* ATTR_TYPE_SAML_AAA_ASSERTION */
- sizeof("urn:ietf:params:gss-eap:saml-aaa-assertion"),
- "urn:ietf:params:gss-eap:saml-aaa-assertion"
- },
- {
- /* ATTR_TYPE_SAML_ATTR */
- sizeof("urn:ietf:params:gss-eap:saml-attr"),
- "urn:ietf:params:gss-eap:saml-attr"
- },
- {
- /* ATTR_TYPE_RADIUS_AVP */
- sizeof("urn:ietf:params:gss-eap:radius-avp"),
- "urn:ietf:params:gss-eap:radius-avp",
- }
-};
-
-enum gss_eap_attribute_type
-gssEapAttributePrefixToType(const gss_buffer_t prefix)
-{
- enum gss_eap_attribute_type i;
-
- for (i = ATTR_TYPE_SAML_AAA_ASSERTION;
- i < sizeof(attributePrefixes) / sizeof(attributePrefixes[0]);
- i++)
- {
- if (bufferEqual(&attributePrefixes[i], prefix))
- return i;
- }
-
- return ATTR_TYPE_NONE;
-}
-
-gss_buffer_t
-gssEapAttributeTypeToPrefix(enum gss_eap_attribute_type type)
-{
- if (type <= ATTR_TYPE_NONE ||
- type > ATTR_TYPE_RADIUS_AVP)
- return GSS_C_NO_BUFFER;
-
- return &attributePrefixes[type];
-}
-
-OM_uint32
-decomposeAttributeName(OM_uint32 *minor,
- const gss_buffer_t attribute,
- gss_buffer_t prefix,
- gss_buffer_t suffix)
-{
- char *p = NULL;
- int i;
-
- for (i = 0; i < attribute->length; i++) {
- if (((char *)attribute->value)[i] == ' ') {
- p = (char *)attribute->value + i + 1;
- break;
- }
- }
-
- prefix->value = attribute->value;
- prefix->length = i;
-
- if (p != NULL && *p != '\0') {
- suffix->length = attribute->length - 1 - prefix->length;
- suffix->value = p;
- } else {
- suffix->length = 0;
- suffix->value = NULL;
- }
-
- *minor = 0;
- return GSS_S_COMPLETE;
-}
-
-OM_uint32
-composeAttributeName(OM_uint32 *minor,
- const gss_buffer_t prefix,
- const gss_buffer_t suffix,
- gss_buffer_t attribute)
-{
- size_t len = 0;
- char *p;
-
- attribute->length = 0;
- attribute->value = NULL;
-
- if (prefix == GSS_C_NO_BUFFER || prefix->length == 0)
- return GSS_S_COMPLETE;
-
- len = prefix->length;
- if (suffix != NULL) {
- len += 1 + suffix->length;
- }
-
- p = attribute->value = GSSEAP_MALLOC(len + 1);
- if (attribute->value == NULL) {
- *minor = ENOMEM;
- return GSS_S_FAILURE;
- }
- attribute->length = len;
-
- memcpy(p, prefix->value, prefix->length);
- if (suffix != NULL) {
- p[prefix->length] = ' ';
- memcpy(p + prefix->length + 1, suffix->value, suffix->length);
- }
-
- p[attribute->length] = '\0';
-
- *minor = 0;
- return GSS_S_COMPLETE;
-}