EAP: decode TEAP Outer-TLVs

This commit is contained in:
Alexander Clouter 2022-04-23 15:03:35 +01:00 committed by A Wireshark GitLab Utility
parent 914d8bc756
commit 6843ca2463
1 changed files with 23 additions and 1 deletions

View File

@ -660,6 +660,7 @@ static int hf_eap_tls_flag_s = -1;
static int hf_eap_tls_flag_o = -1;
static int hf_eap_tls_flags_version = -1;
static int hf_eap_tls_len = -1;
static int hf_eap_tls_outer_tlvs_len = -1;
static int hf_eap_tls_fragment = -1;
static int hf_eap_tls_fragments = -1;
static int hf_eap_tls_fragment_overlap = -1;
@ -1913,6 +1914,8 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
gboolean more_fragments;
gboolean has_length;
gboolean is_start;
gboolean outer_tlvs = false;
gint outer_tlvs_length = 0;
int eap_tls_seq = -1;
guint32 eap_reass_cookie = 0;
gboolean needs_reassembly = FALSE;
@ -1932,7 +1935,7 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
switch (eap_type) {
case EAP_TYPE_TEAP:
proto_tree_add_item(eap_tls_flags_tree, hf_eap_tls_flag_o, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item_ret_boolean(eap_tls_flags_tree, hf_eap_tls_flag_o, tvb, offset, 1, ENC_BIG_ENDIAN, &outer_tlvs);
/* FALLTHROUGH */
case EAP_TYPE_TTLS:
case EAP_TYPE_FAST:
@ -1950,6 +1953,13 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
offset += 4;
}
/* Outer TLV Length field, 4 bytes, OPTIONAL. */
if (outer_tlvs) {
proto_tree_add_item_ret_uint(eap_tree, hf_eap_tls_outer_tlvs_len, tvb, offset, 4, ENC_BIG_ENDIAN, &outer_tlvs_length);
size -= 4;
offset += 4;
}
if (is_start)
conversation_state->eap_tls_seq = -1;
@ -2175,6 +2185,12 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
tls_set_appdata_dissector(tls_handle, pinfo, peap_handle);
break;
case EAP_TYPE_TEAP:
if (outer_tlvs) { /* https://www.rfc-editor.org/rfc/rfc7170.html#section-4.1 */
tvbuff_t *teap_tvb = tvb_new_subset_length(tvb, offset + size - outer_tlvs_length, outer_tlvs_length);
call_dissector(teap_handle, teap_tvb, pinfo, eap_tree);
if (size == outer_tlvs_length) goto skip_tls_dissector;
next_tvb = tvb_new_subset_length(next_tvb, 0, size - outer_tlvs_length);
}
tls_set_appdata_dissector(tls_handle, pinfo, teap_handle);
break;
}
@ -2182,6 +2198,7 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
}
}
}
skip_tls_dissector:
break; /* EAP_TYPE_TLS */
/*********************************************************************
@ -2553,6 +2570,11 @@ proto_register_eap(void)
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_eap_tls_outer_tlvs_len, {
"TEAP Outer TLVs Length", "eap.tls.len",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_eap_tls_fragment, {
"EAP-TLS Fragment", "eap.tls.fragment",
FT_FRAMENUM, BASE_NONE, NULL, 0x0,