EAP-TEAP: Add parsing and generation routines for Identity-Type TLV

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2019-08-20 01:34:12 +03:00
parent d11c41bb75
commit cc661c160a
2 changed files with 35 additions and 0 deletions

View file

@ -427,6 +427,17 @@ int eap_teap_parse_tlv(struct eap_teap_tlv_parse *tlv,
int tlv_type, u8 *pos, size_t len) int tlv_type, u8 *pos, size_t len)
{ {
switch (tlv_type) { switch (tlv_type) {
case TEAP_TLV_IDENTITY_TYPE:
if (len < 2) {
wpa_printf(MSG_INFO,
"EAP-TEAP: Too short Identity-Type TLV");
tlv->result = TEAP_STATUS_FAILURE;
break;
}
tlv->identity_type = WPA_GET_BE16(pos);
wpa_printf(MSG_DEBUG, "EAP-TEAP: Identity-Type: %u",
tlv->identity_type);
break;
case TEAP_TLV_RESULT: case TEAP_TLV_RESULT:
wpa_hexdump(MSG_MSGDUMP, "EAP-TEAP: Result TLV", pos, len); wpa_hexdump(MSG_MSGDUMP, "EAP-TEAP: Result TLV", pos, len);
if (tlv->result) { if (tlv->result) {
@ -679,6 +690,22 @@ struct wpabuf * eap_teap_tlv_error(enum teap_error_codes error)
} }
struct wpabuf * eap_teap_tlv_identity_type(enum teap_identity_types id)
{
struct wpabuf *buf;
buf = wpabuf_alloc(4 + 2);
if (!buf)
return NULL;
wpa_printf(MSG_DEBUG,
"EAP-TEAP: Add Identity-Type TLV(Identity-Type=%d)", id);
wpabuf_put_be16(buf, TEAP_TLV_IDENTITY_TYPE);
wpabuf_put_be16(buf, 2);
wpabuf_put_be16(buf, id);
return buf;
}
int eap_teap_allowed_anon_prov_phase2_method(int vendor, enum eap_type type) int eap_teap_allowed_anon_prov_phase2_method(int vendor, enum eap_type type)
{ {
/* RFC 7170, Section 3.8.3: MUST provide mutual authentication, /* RFC 7170, Section 3.8.3: MUST provide mutual authentication,

View file

@ -151,6 +151,12 @@ enum teap_tlv_result_status {
TEAP_STATUS_FAILURE = 2 TEAP_STATUS_FAILURE = 2
}; };
/* Identity-Type values within Identity-Type TLV */
enum teap_identity_types {
TEAP_IDENTITY_TYPE_USER = 1,
TEAP_IDENTITY_TYPE_MACHINE = 2,
};
#define TEAP_TLV_MANDATORY 0x8000 #define TEAP_TLV_MANDATORY 0x8000
#define TEAP_TLV_TYPE_MASK 0x3fff #define TEAP_TLV_TYPE_MASK 0x3fff
@ -189,6 +195,7 @@ struct eap_teap_tlv_parse {
u8 *basic_auth_resp; u8 *basic_auth_resp;
size_t basic_auth_resp_len; size_t basic_auth_resp_len;
u32 error_code; u32 error_code;
u16 identity_type;
}; };
void eap_teap_put_tlv_hdr(struct wpabuf *buf, u16 type, u16 len); void eap_teap_put_tlv_hdr(struct wpabuf *buf, u16 type, u16 len);
@ -215,6 +222,7 @@ int eap_teap_parse_tlv(struct eap_teap_tlv_parse *tlv,
const char * eap_teap_tlv_type_str(enum teap_tlv_types type); const char * eap_teap_tlv_type_str(enum teap_tlv_types type);
struct wpabuf * eap_teap_tlv_result(int status, int intermediate); struct wpabuf * eap_teap_tlv_result(int status, int intermediate);
struct wpabuf * eap_teap_tlv_error(enum teap_error_codes error); struct wpabuf * eap_teap_tlv_error(enum teap_error_codes error);
struct wpabuf * eap_teap_tlv_identity_type(enum teap_identity_types id);
enum eap_type; enum eap_type;
int eap_teap_allowed_anon_prov_phase2_method(int vendor, enum eap_type type); int eap_teap_allowed_anon_prov_phase2_method(int vendor, enum eap_type type);
int eap_teap_allowed_anon_prov_cipher_suite(u16 cs); int eap_teap_allowed_anon_prov_cipher_suite(u16 cs);