Ethereal-dev: [Ethereal-dev] Ethereal patch for IEEE 802.11i/RSN IE / packet-ieee80211.c
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Jouni Malinen <jkmaline@xxxxxxxxx>
Date: Mon, 22 Mar 2004 21:59:27 -0800
The attached patch adds support for dissecting IEEE 802.11i RSN IE. In addition, new status and result codes for IEEE 802.11i are included in the patch. Updates for EAPOL-Key processing (it differs a bit from WPA) and pre-authentication have not yet been implemented (but are on my to do list). -- Jouni Malinen PGP id EFC895FA
? JKM-rsn-beacon.capture ? ieee80211_rsn_ie_and_codes.patch ? rsn_ie_and_codes.patch Index: packet-ieee80211.c =================================================================== RCS file: /cvsroot/ethereal/packet-ieee80211.c,v retrieving revision 1.106 diff -u -p -r1.106 packet-ieee80211.c --- packet-ieee80211.c 25 Feb 2004 09:31:06 -0000 1.106 +++ packet-ieee80211.c 23 Mar 2004 05:57:03 -0000 @@ -38,6 +38,9 @@ * 09/12/2003 - Added dissection of country information tag * * Ritchie<at>tipsybottle.com + * + * 03/22/2004 - Added dissection of RSN IE + * Jouni Malinen <jkmaline@xxxxxxxxx> */ #ifdef HAVE_CONFIG_H @@ -232,10 +235,12 @@ static char *wep_keystr[] = {NULL, NULL, #define TAG_CHALLENGE_TEXT 0x10 #define TAG_ERP_INFO 0x2A #define TAG_ERP_INFO_OLD 0x2F /* IEEE Std 802.11g/D4.0 */ +#define TAG_RSN_IE 0x30 #define TAG_EXT_SUPP_RATES 0x32 #define TAG_VENDOR_SPECIFIC_IE 0xDD #define WPA_OUI "\x00\x50\xF2" +#define RSN_OUI "\x00\x0F\xAC" /* ************************************************************************* */ /* Frame types, and their names */ @@ -387,6 +392,13 @@ static int hf_wep_iv = -1; static int hf_wep_key = -1; static int hf_wep_icv = -1; + +static int rsn_cap = -1; +static int rsn_cap_preauth = -1; +static int rsn_cap_no_pairwise = -1; +static int rsn_cap_ptksa_replay_counter = -1; +static int rsn_cap_gtksa_replay_counter = -1; + /* ************************************************************************* */ /* Protocol trees */ /* ************************************************************************* */ @@ -402,6 +414,8 @@ static gint ett_fixed_parameters = -1; static gint ett_tagged_parameters = -1; static gint ett_wep_parameters = -1; +static gint ett_rsn_cap_tree = -1; + static const fragment_items frag_items = { &ett_fragment, &ett_fragments, @@ -786,6 +800,121 @@ dissect_vendor_specific_ie(proto_tree * tvb, offset, tag_len, "Not interpreted"); } +static void +dissect_rsn_ie(proto_tree * tree, tvbuff_t * tvb, int offset, + guint32 tag_len, const guint8 *tag_val) +{ + guint32 tag_val_off = 0; + guint16 rsn_capab; + char out_buff[SHORT_STR]; + int i, count; + proto_item *cap_item; + proto_tree *cap_tree; + + if (tag_val_off + 2 > tag_len) { + proto_tree_add_string(tree, tag_interpretation, tvb, offset, tag_len, + "Not interpreted"); + return; + } + + snprintf(out_buff, SHORT_STR, "RSN IE, version %u", + pletohs(&tag_val[tag_val_off])); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 2, out_buff); + + offset += 2; + tag_val_off += 2; + + if (tag_val_off + 4 > tag_len) + goto done; + + /* multicast cipher suite */ + if (!memcmp(&tag_val[tag_val_off], RSN_OUI, 3)) { + snprintf(out_buff, SHORT_STR, "Multicast cipher suite: %s", + wpa_cipher_idx2str(tag_val[tag_val_off + 3])); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 4, out_buff); + offset += 4; + tag_val_off += 4; + } + + if (tag_val_off + 2 > tag_len) + goto done; + + /* unicast cipher suites */ + count = pletohs(tag_val + tag_val_off); + snprintf(out_buff, SHORT_STR, "# of unicast cipher suites: %u", count); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 2, out_buff); + offset += 2; + tag_val_off += 2; + i = 1; + while (tag_val_off + 4 <= tag_len && i <= count) { + if (memcmp(&tag_val[tag_val_off], RSN_OUI, 3) != 0) + goto done; + snprintf(out_buff, SHORT_STR, "Unicast cipher suite %u: %s", + i, wpa_cipher_idx2str(tag_val[tag_val_off + 3])); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 4, out_buff); + offset += 4; + tag_val_off += 4; + i++; + } + + if (i <= count || tag_val_off + 2 > tag_len) + goto done; + + /* authenticated key management suites */ + count = pletohs(tag_val + tag_val_off); + snprintf(out_buff, SHORT_STR, "# of auth key management suites: %u", count); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 2, out_buff); + offset += 2; + tag_val_off += 2; + i = 1; + while (tag_val_off + 4 <= tag_len && i <= count) { + if (memcmp(&tag_val[tag_val_off], RSN_OUI, 3) != 0) + goto done; + snprintf(out_buff, SHORT_STR, "auth key management suite %u: %s", + i, wpa_keymgmt_idx2str(tag_val[tag_val_off + 3])); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 4, out_buff); + offset += 4; + tag_val_off += 4; + i++; + } + + if (i <= count || tag_val_off + 2 > tag_len) + goto done; + + rsn_capab = pletohs(&tag_val[tag_val_off]); + snprintf(out_buff, SHORT_STR, "RSN Capabilities 0x%04x", rsn_capab); + cap_item = proto_tree_add_uint_format(tree, rsn_cap, tvb, + offset, 2, rsn_capab, + "RSN Capabilities: 0x%04X", rsn_capab); + cap_tree = proto_item_add_subtree(cap_item, ett_rsn_cap_tree); + proto_tree_add_boolean(cap_tree, rsn_cap_preauth, tvb, offset, 2, + rsn_capab); + proto_tree_add_boolean(cap_tree, rsn_cap_no_pairwise, tvb, offset, 2, + rsn_capab); + proto_tree_add_uint(cap_tree, rsn_cap_ptksa_replay_counter, tvb, offset, 2, + rsn_capab); + proto_tree_add_uint(cap_tree, rsn_cap_gtksa_replay_counter, tvb, offset, 2, + rsn_capab); + offset += 2; + tag_val_off += 2; + + if (tag_val_off + 2 > tag_len) + goto done; + + count = pletohs(tag_val + tag_val_off); + snprintf(out_buff, SHORT_STR, "# of PMKIDs: %u", count); + proto_tree_add_string(tree, tag_interpretation, tvb, offset, 2, out_buff); + offset += 2; + tag_val_off += 2; + + /* TODO: PMKID List (16 * n octets) */ + + done: + if (tag_val_off < tag_len) + proto_tree_add_string(tree, tag_interpretation, tvb, offset, + tag_len - tag_val_off, "Not interpreted"); +} + /* ************************************************************************* */ /* Dissect and add tagged (optional) fields to proto tree */ /* ************************************************************************* */ @@ -803,6 +932,7 @@ static const value_string tag_num_vals[] { TAG_CHALLENGE_TEXT, "Challenge text" }, { TAG_ERP_INFO, "ERP Information" }, { TAG_ERP_INFO_OLD, "ERP Information" }, + { TAG_RSN_IE, "RSN Information" }, { TAG_EXT_SUPP_RATES, "Extended Supported Rates" }, { TAG_VENDOR_SPECIFIC_IE, "Vendor Specific" }, { 0, NULL } @@ -1009,6 +1139,10 @@ add_tagged_field (proto_tree * tree, tvb tag_data_ptr); break; + case TAG_RSN_IE: + dissect_rsn_ie(tree, tvb, offset + 2, tag_len, tag_data_ptr); + break; + default: proto_tree_add_string (tree, tag_interpretation, tvb, offset + 2, @@ -2210,6 +2344,19 @@ proto_register_ieee80211 (void) {0x08, "Disassociated because sending STA is leaving (has left) BSS"}, {0x09, "Station requesting (re)association is not authenticated with " "responding station"}, + {0x0D, "Invalid Information Element"}, + {0x0E, "Michael MIC failure"}, + {0x0F, "4-Way Handshake timeout"}, + {0x10, "Group key update timeout"}, + {0x11, "Information element in 4-Way Handshake different from " + "(Re)Association Request/Probe Response/Beacon"}, + {0x12, "Group Cipher is not valid"}, + {0x13, "Pairwise Cipher is not valid"}, + {0x14, "AKMP is not valid"}, + {0x15, "Unsupported RSN IE version"}, + {0x16, "Invalid RSN IE Capabilities"}, + {0x17, "IEEE 802.1X Authentication failed"}, + {0x18, "Cipher suite is rejected per security policy"}, {0x00, NULL} }; @@ -2245,6 +2392,13 @@ proto_register_ieee80211 (void) "short slot operation"}, {0x1A, "Association denied due to requesting station not supporting " "DSSS-OFDM operation"}, + {0x28, "Invalid Information Element"}, + {0x29, "Group Cipher is not valid"}, + {0x2A, "Pairwise Cipher is not valid"}, + {0x2B, "AKMP is not valid"}, + {0x2C, "Unsupported RSN IE version"}, + {0x2D, "Invalid RSN IE Capabilities"}, + {0x2E, "Cipher suite is rejected per security policy"}, {0x00, NULL} }; @@ -2414,6 +2568,26 @@ proto_register_ieee80211 (void) "WEP ICV", HFILL }}, }; + static const true_false_string rsn_preauth_flags = { + "Transmitter supports pre-authentication", + "Transmitter does not support pre-authentication" + }; + + static const true_false_string rsn_no_pairwise_flags = { + "Transmitter cannot support WEP default key 0 simultaneously with " + "Pairwise key", + "Transmitter can support WEP default key 0 simultaneously with " + "Pairwise key" + }; + + static const value_string rsn_cap_replay_counter[] = { + {0x00, "1 replay counter per PTKSA/GTKSA/STAKeySA"}, + {0x01, "2 replay counters per PTKSA/GTKSA/STAKeySA"}, + {0x02, "4 replay counters per PTKSA/GTKSA/STAKeySA"}, + {0x03, "16 replay counters per PTKSA/GTKSA/STAKeySA"}, + {0, NULL} + }; + static hf_register_info ff[] = { {&ff_timestamp, {"Timestamp", "wlan_mgt.fixed.timestamp", FT_STRING, BASE_NONE, @@ -2520,8 +2694,33 @@ proto_register_ieee80211 (void) {&tag_interpretation, {"Tag interpretation", "wlan_mgt.tag.interpretation", - FT_STRING, BASE_NONE, NULL, 0, "Interpretation of tag", HFILL }} + FT_STRING, BASE_NONE, NULL, 0, "Interpretation of tag", HFILL }}, + {&rsn_cap, + {"RSN Capabilities", "wlan_mgt.rsn.capabilities", FT_UINT16, BASE_HEX, + NULL, 0, "RSN Capability information", HFILL }}, + + {&rsn_cap_preauth, + {"RSN Pre-Auth capabilities", "wlan_mgt.rsn.capabilities.preauth", + FT_BOOLEAN, 16, TFS (&rsn_preauth_flags), 0x0001, + "RSN Pre-Auth capabilities", HFILL }}, + + {&rsn_cap_no_pairwise, + {"RSN No Pairwise capabilities", "wlan_mgt.rsn.capabilities.no_pairwise", + FT_BOOLEAN, 16, TFS (&rsn_no_pairwise_flags), 0x0002, + "RSN No Pairwise capabilities", HFILL }}, + + {&rsn_cap_ptksa_replay_counter, + {"RSN PTKSA Replay Counter capabilities", + "wlan_mgt.rsn.capabilities.ptksa_replay_counter", + FT_UINT16, BASE_HEX, VALS (&rsn_cap_replay_counter), 0x000C, + "RSN PTKSA Replay Counter capabilities", HFILL }}, + + {&rsn_cap_gtksa_replay_counter, + {"RSN GTKSA Replay Counter capabilities", + "wlan_mgt.rsn.capabilities.gtksa_replay_counter", + FT_UINT16, BASE_HEX, VALS (&rsn_cap_replay_counter), 0x0030, + "RSN GTKSA Replay Counter capabilities", HFILL }}, }; static gint *tree_array[] = { @@ -2535,6 +2734,7 @@ proto_register_ieee80211 (void) &ett_tagged_parameters, &ett_wep_parameters, &ett_cap_tree, + &ett_rsn_cap_tree, }; module_t *wlan_module;
- Follow-Ups:
- Prev by Date: Re: [Ethereal-dev] Re-indenting the configure script (please test)
- Next by Date: Re: [Ethereal-dev] Re-indenting the configure script (please test)
- Previous by thread: Re: [Ethereal-dev] Ethereal DNS Traffic Storm
- Next by thread: Re: [Ethereal-dev] Ethereal patch for IEEE 802.11i/RSN IE / packet-ieee80211.c
- Index(es):