Merge branch 'eap-client-select'

This brings support for EAP-Nak payloads on the client (to select a
specific or supported method), and the server (via the eap-dynamic
plugin which selects a method supported/requested by the client).
This commit is contained in:
Tobias Brunner
2012-08-31 12:25:41 +02:00
20 changed files with 983 additions and 83 deletions
+70 -10
View File
@@ -1,4 +1,5 @@
/*
* Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2006 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -13,8 +14,13 @@
* for more details.
*/
#include <stdlib.h>
#include <errno.h>
#include "eap.h"
#include <debug.h>
ENUM(eap_code_names, EAP_REQUEST, EAP_FAILURE,
"EAP_REQUEST",
"EAP_RESPONSE",
@@ -51,12 +57,12 @@ ENUM_NEXT(eap_type_names, EAP_MSTLV, EAP_MSTLV, EAP_MSCHAPV2,
"EAP_MSTLV");
ENUM_NEXT(eap_type_names, EAP_TNC, EAP_TNC, EAP_MSTLV,
"EAP_TNC");
ENUM_NEXT(eap_type_names, EAP_DYNAMIC, EAP_EXPERIMENTAL, EAP_TNC,
"EAP_DYNAMIC",
"EAP_RADIUS",
ENUM_NEXT(eap_type_names, EAP_EXPANDED, EAP_DYNAMIC, EAP_TNC,
"EAP_EXPANDED",
"EAP_EXPERIMENTAL");
ENUM_END(eap_type_names, EAP_EXPERIMENTAL);
"EAP_EXPERIMENTAL",
"EAP_RADIUS",
"EAP_DYNAMIC");
ENUM_END(eap_type_names, EAP_DYNAMIC);
ENUM_BEGIN(eap_type_short_names, EAP_IDENTITY, EAP_GTC,
"ID",
@@ -80,12 +86,12 @@ ENUM_NEXT(eap_type_short_names, EAP_MSTLV, EAP_MSTLV, EAP_MSCHAPV2,
"MSTLV");
ENUM_NEXT(eap_type_short_names, EAP_TNC, EAP_TNC, EAP_MSTLV,
"TNC");
ENUM_NEXT(eap_type_short_names, EAP_DYNAMIC, EAP_EXPERIMENTAL, EAP_TNC,
"DYN",
"RAD",
ENUM_NEXT(eap_type_short_names, EAP_EXPANDED, EAP_DYNAMIC, EAP_TNC,
"EXP",
"XP");
ENUM_END(eap_type_short_names, EAP_EXPERIMENTAL);
"XP",
"RAD",
"DYN");
ENUM_END(eap_type_short_names, EAP_DYNAMIC);
/*
* See header
@@ -108,6 +114,7 @@ eap_type_t eap_type_from_string(char *name)
{"peap", EAP_PEAP},
{"mschapv2", EAP_MSCHAPV2},
{"tnc", EAP_TNC},
{"dynamic", EAP_DYNAMIC},
{"radius", EAP_RADIUS},
};
@@ -120,3 +127,56 @@ eap_type_t eap_type_from_string(char *name)
}
return 0;
}
/*
* See header
*/
eap_vendor_type_t *eap_vendor_type_from_string(char *str)
{
enumerator_t *enumerator;
eap_vendor_type_t *result = NULL;
eap_type_t type = 0;
u_int32_t vendor = 0;
char *part, *end;
/* parse EAP method string of the form: [eap-]type[-vendor] */
enumerator = enumerator_create_token(str, "-", " ");
while (enumerator->enumerate(enumerator, &part))
{
if (!type)
{
if (streq(part, "eap"))
{ /* skip 'eap' at the beginning */
continue;
}
type = eap_type_from_string(part);
if (!type)
{
type = strtoul(part, &end, 0);
if (*end != '\0' || errno)
{
DBG1(DBG_LIB, "unknown or invalid EAP method: %s", part);
break;
}
}
continue;
}
vendor = strtoul(part, &end, 0);
if (*end != '\0' || errno)
{
DBG1(DBG_LIB, "invalid EAP vendor: %s", part);
type = 0;
}
break;
}
enumerator->destroy(enumerator);
if (type)
{
INIT(result,
.type = type,
.vendor = vendor,
);
}
return result;
}
+31 -4
View File
@@ -1,6 +1,8 @@
/*
* Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2010 Martin Willi
* Copyright (C) 2010 revosec AG
* Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -23,6 +25,7 @@
typedef enum eap_code_t eap_code_t;
typedef enum eap_type_t eap_type_t;
typedef struct eap_vendor_type_t eap_vendor_type_t;
#include <library.h>
@@ -64,12 +67,12 @@ enum eap_type_t {
EAP_MSCHAPV2 = 26,
EAP_MSTLV = 33,
EAP_TNC = 38,
/** select EAP method dynamically based on i.e. EAP-Identity */
EAP_DYNAMIC = 252,
/** not a method, but an implementation providing different methods */
EAP_RADIUS = 253,
EAP_EXPANDED = 254,
EAP_EXPERIMENTAL = 255,
/** not a method, but an implementation providing different methods */
EAP_RADIUS = 256,
/** not a method, select method dynamically based on client selection */
EAP_DYNAMIC = 257,
};
/**
@@ -82,6 +85,22 @@ extern enum_name_t *eap_type_names;
*/
extern enum_name_t *eap_type_short_names;
/**
* Struct that stores EAP type and vendor ID
*/
struct eap_vendor_type_t {
/**
* EAP type
*/
eap_type_t type;
/**
* Vendor Id
*/
u_int32_t vendor;
};
/**
* EAP packet format
*/
@@ -101,4 +120,12 @@ typedef struct __attribute__((packed)) {
*/
eap_type_t eap_type_from_string(char *name);
/**
* Parse a string of the form [eap-]type[-vendor].
*
* @param str EAP method string
* @return parsed type (gets allocated), NULL if unknown or failed
*/
eap_vendor_type_t *eap_vendor_type_from_string(char *str);
#endif /** EAP_H_ @}*/