Added method to enumerate EAP types contained in an EAP-Nak

This commit is contained in:
Tobias Brunner
2012-08-31 11:40:28 +02:00
parent cc4eec56f7
commit 576490ab09
2 changed files with 79 additions and 11 deletions
+71 -11
View File
@@ -219,28 +219,87 @@ METHOD(eap_payload_t, get_identifier, u_int8_t,
return 0;
}
/**
* Get the current type at the given offset into this->data.
* @return the new offset or 0 if failed
*/
static size_t extract_type(private_eap_payload_t *this, size_t offset,
eap_type_t *type, u_int32_t *vendor)
{
if (this->data.len > offset)
{
*vendor = 0;
*type = this->data.ptr[offset];
if (*type != EAP_EXPANDED)
{
return offset + 1;
}
if (this->data.len >= offset + 8)
{
*vendor = untoh32(this->data.ptr + offset) & 0x00FFFFFF;
*type = untoh32(this->data.ptr + offset + 4);
return offset + 8;
}
}
return 0;
}
METHOD(eap_payload_t, get_type, eap_type_t,
private_eap_payload_t *this, u_int32_t *vendor)
{
eap_type_t type;
*vendor = 0;
if (this->data.len > 4)
if (extract_type(this, 4, &type, vendor))
{
type = this->data.ptr[4];
if (type != EAP_EXPANDED)
{
return type;
}
if (this->data.len >= 12)
{
*vendor = untoh32(this->data.ptr + 4) & 0x00FFFFFF;
return untoh32(this->data.ptr + 8);
}
return type;
}
return 0;
}
/**
* Type enumerator
*/
typedef struct {
/** public interface */
enumerator_t public;
/** payload */
private_eap_payload_t *payload;
/** current offset in the data */
size_t offset;
} type_enumerator_t;
METHOD(enumerator_t, enumerate_types, bool,
type_enumerator_t *this, eap_type_t *type, u_int32_t *vendor)
{
this->offset = extract_type(this->payload, this->offset, type, vendor);
return this->offset;
}
METHOD(eap_payload_t, get_types, enumerator_t*,
private_eap_payload_t *this)
{
type_enumerator_t *enumerator;
eap_type_t type;
u_int32_t vendor;
size_t offset;
offset = extract_type(this, 4, &type, &vendor);
if (offset && type == EAP_NAK)
{
INIT(enumerator,
.public = {
.enumerate = (void*)_enumerate_types,
.destroy = (void*)free,
},
.payload = this,
.offset = offset,
);
return &enumerator->public;
}
return enumerator_create_empty();
}
METHOD(eap_payload_t, is_expanded, bool,
private_eap_payload_t *this)
{
@@ -278,6 +337,7 @@ eap_payload_t *eap_payload_create()
.get_code = _get_code,
.get_identifier = _get_identifier,
.get_type = _get_type,
.get_types = _get_types,
.is_expanded = _is_expanded,
.destroy = _destroy,
},
@@ -82,6 +82,14 @@ struct eap_payload_t {
*/
eap_type_t (*get_type) (eap_payload_t *this, u_int32_t *vendor);
/**
* Enumerate the EAP method types contained in an EAP-Nak (i.e. get_type()
* returns EAP_NAK).
*
* @return enumerator over (eap_type_t type, u_int32_t vendor)
*/
enumerator_t* (*get_types) (eap_payload_t *this);
/**
* Check if the EAP method type is encoded in the Expanded Type format.
*