From cc661c160a63f372b1c413e680f7781ce717c2ad Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 20 Aug 2019 01:34:12 +0300 Subject: [PATCH] EAP-TEAP: Add parsing and generation routines for Identity-Type TLV Signed-off-by: Jouni Malinen --- src/eap_common/eap_teap_common.c | 27 +++++++++++++++++++++++++++ src/eap_common/eap_teap_common.h | 8 ++++++++ 2 files changed, 35 insertions(+) diff --git a/src/eap_common/eap_teap_common.c b/src/eap_common/eap_teap_common.c index 3c21d8bb3..ffb9a6234 100644 --- a/src/eap_common/eap_teap_common.c +++ b/src/eap_common/eap_teap_common.c @@ -427,6 +427,17 @@ int eap_teap_parse_tlv(struct eap_teap_tlv_parse *tlv, int tlv_type, u8 *pos, size_t len) { 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: wpa_hexdump(MSG_MSGDUMP, "EAP-TEAP: Result TLV", pos, len); 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) { /* RFC 7170, Section 3.8.3: MUST provide mutual authentication, diff --git a/src/eap_common/eap_teap_common.h b/src/eap_common/eap_teap_common.h index d92e4ca2f..3a2587949 100644 --- a/src/eap_common/eap_teap_common.h +++ b/src/eap_common/eap_teap_common.h @@ -151,6 +151,12 @@ enum teap_tlv_result_status { 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_TYPE_MASK 0x3fff @@ -189,6 +195,7 @@ struct eap_teap_tlv_parse { u8 *basic_auth_resp; size_t basic_auth_resp_len; u32 error_code; + u16 identity_type; }; 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); 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_identity_type(enum teap_identity_types id); enum eap_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);