#include "gssapiP_eap.h"
+gss_eap_radius_attr_provider::gss_eap_radius_attr_provider(void)
+{
+ m_authenticated = false;
+}
+
+gss_eap_radius_attr_provider::~gss_eap_radius_attr_provider(void)
+{
+}
+
bool
-gss_eap_radius_attr_provider::initFromExistingContext(const gss_eap_attr_ctx *source,
+gss_eap_radius_attr_provider::initFromExistingContext(const gss_eap_attr_ctx *manager,
const gss_eap_attr_provider *ctx)
{
- if (!gss_eap_attr_provider::initFromExistingContext(source, ctx))
+ if (!gss_eap_attr_provider::initFromExistingContext(manager, ctx))
return false;
return true;
}
bool
-gss_eap_radius_attr_provider::initFromGssContext(const gss_eap_attr_ctx *source,
+gss_eap_radius_attr_provider::initFromGssContext(const gss_eap_attr_ctx *manager,
const gss_cred_id_t gssCred,
const gss_ctx_id_t gssCtx)
{
- if (!gss_eap_attr_provider::initFromGssContext(source, gssCred, gssCtx))
+ if (!gss_eap_attr_provider::initFromGssContext(manager, gssCred, gssCtx))
return false;
return true;
}
-gss_eap_radius_attr_provider::~gss_eap_radius_attr_provider(void)
-{
-}
-
bool
gss_eap_radius_attr_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addAttribute, void *data) const
{
void
gss_eap_radius_attr_provider::exportToBuffer(gss_buffer_t buffer) const
{
+ buffer->length = 0;
+ buffer->value = NULL;
}
bool
if (!gss_eap_attr_provider::initFromBuffer(ctx, buffer))
return false;
- return false;
+ return true;
}
bool
gss_eap_radius_attr_provider::init(void)
{
+ gss_eap_attr_ctx::registerProvider(ATTR_TYPE_RADIUS,
+ "urn:ietf:params:gss-eap:radius-avp",
+ gss_eap_radius_attr_provider::createAttrContext);
return true;
}
void
gss_eap_radius_attr_provider::finalize(void)
{
+ gss_eap_attr_ctx::unregisterProvider(ATTR_TYPE_RADIUS);
}
gss_eap_attr_provider *
{
return new gss_eap_radius_attr_provider;
}
+
+OM_uint32
+addAvpFromBuffer(OM_uint32 *minor,
+ rc_handle *rh,
+ VALUE_PAIR **vp,
+ int type,
+ gss_buffer_t buffer)
+{
+ if (rc_avpair_add(rh, vp, type, buffer->value, buffer->length, 0) == NULL) {
+ return GSS_S_FAILURE;
+ }
+
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32
+getBufferFromAvps(OM_uint32 *minor,
+ VALUE_PAIR *vps,
+ int type,
+ gss_buffer_t buffer,
+ int concat)
+{
+ VALUE_PAIR *vp;
+ unsigned char *p;
+
+ buffer->length = 0;
+ buffer->value = NULL;
+
+ vp = rc_avpair_get(vps, type, 0);
+ if (vp == NULL)
+ return GSS_S_UNAVAILABLE;
+
+ do {
+ buffer->length += vp->lvalue;
+ } while (concat && (vp = rc_avpair_get(vp->next, type, 0)) != NULL);
+
+ buffer->value = GSSEAP_MALLOC(buffer->length);
+ if (buffer->value == NULL) {
+ *minor = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+
+ p = (unsigned char *)buffer->value;
+
+ for (vp = rc_avpair_get(vps, type, 0);
+ concat && vp != NULL;
+ vp = rc_avpair_get(vp->next, type, 0)) {
+ memcpy(p, vp->strvalue, vp->lvalue);
+ p += vp->lvalue;
+ }
+
+ *minor = 0;
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32
+gssEapRadiusAttrProviderInit(OM_uint32 *minor)
+{
+ return gss_eap_radius_attr_provider::init()
+ ? GSS_S_COMPLETE : GSS_S_FAILURE;
+}
+
+OM_uint32
+gssEapRadiusAttrProviderFinalize(OM_uint32 *minor)
+{
+ gss_eap_radius_attr_provider::finalize();
+ return GSS_S_COMPLETE;
+}