Added method to enumerate EAP types contained in an EAP-Nak
This commit is contained in:
@@ -219,28 +219,87 @@ METHOD(eap_payload_t, get_identifier, u_int8_t,
|
|||||||
return 0;
|
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,
|
METHOD(eap_payload_t, get_type, eap_type_t,
|
||||||
private_eap_payload_t *this, u_int32_t *vendor)
|
private_eap_payload_t *this, u_int32_t *vendor)
|
||||||
{
|
{
|
||||||
eap_type_t type;
|
eap_type_t type;
|
||||||
|
|
||||||
*vendor = 0;
|
*vendor = 0;
|
||||||
if (this->data.len > 4)
|
if (extract_type(this, 4, &type, vendor))
|
||||||
{
|
{
|
||||||
type = this->data.ptr[4];
|
return type;
|
||||||
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 0;
|
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,
|
METHOD(eap_payload_t, is_expanded, bool,
|
||||||
private_eap_payload_t *this)
|
private_eap_payload_t *this)
|
||||||
{
|
{
|
||||||
@@ -278,6 +337,7 @@ eap_payload_t *eap_payload_create()
|
|||||||
.get_code = _get_code,
|
.get_code = _get_code,
|
||||||
.get_identifier = _get_identifier,
|
.get_identifier = _get_identifier,
|
||||||
.get_type = _get_type,
|
.get_type = _get_type,
|
||||||
|
.get_types = _get_types,
|
||||||
.is_expanded = _is_expanded,
|
.is_expanded = _is_expanded,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -82,6 +82,14 @@ struct eap_payload_t {
|
|||||||
*/
|
*/
|
||||||
eap_type_t (*get_type) (eap_payload_t *this, u_int32_t *vendor);
|
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.
|
* Check if the EAP method type is encoded in the Expanded Type format.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user