aboutsummaryrefslogtreecommitdiffstats
path: root/packet-eapol.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-10-14 09:11:53 +0000
committerGuy Harris <guy@alum.mit.edu>2003-10-14 09:11:53 +0000
commit8a3baa43466ae276b11478888c7d1fb28f61997b (patch)
tree8ae916cb30d177270c7bfb0be8fc37bcdb05e910 /packet-eapol.c
parent61e4447e89fac743680d3e4b4c810128dae3176f (diff)
From Motonori Shindo: Key Information dissection in EAPOL-Key messages.
svn path=/trunk/; revision=8690
Diffstat (limited to 'packet-eapol.c')
-rw-r--r--packet-eapol.c108
1 files changed, 105 insertions, 3 deletions
diff --git a/packet-eapol.c b/packet-eapol.c
index 068336e0f7..f6c58ee2fd 100644
--- a/packet-eapol.c
+++ b/packet-eapol.c
@@ -3,7 +3,7 @@
* (From IEEE Draft P802.1X/D11; is there a later draft, or a
* final standard? If so, check it.)
*
- * $Id: packet-eapol.c,v 1.14 2003/09/23 02:35:59 guy Exp $
+ * $Id: packet-eapol.c,v 1.15 2003/10/14 09:11:53 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -47,6 +47,15 @@ static int hf_eapol_keydes_key_signature = -1;
static int hf_eapol_keydes_key = -1;
static int hf_eapol_wpa_keydes_keyinfo = -1;
+static int hf_eapol_wpa_keydes_keyinfo_keydes_ver = -1;
+static int hf_eapol_wpa_keydes_keyinfo_key_type = -1;
+static int hf_eapol_wpa_keydes_keyinfo_key_index = -1;
+static int hf_eapol_wpa_keydes_keyinfo_install = -1;
+static int hf_eapol_wpa_keydes_keyinfo_key_ack = -1;
+static int hf_eapol_wpa_keydes_keyinfo_key_mic = -1;
+static int hf_eapol_wpa_keydes_keyinfo_secure = -1;
+static int hf_eapol_wpa_keydes_keyinfo_error = -1;
+static int hf_eapol_wpa_keydes_keyinfo_request = -1;
static int hf_eapol_wpa_keydes_nonce = -1;
static int hf_eapol_wpa_keydes_rsc = -1;
static int hf_eapol_wpa_keydes_id = -1;
@@ -57,6 +66,7 @@ static int hf_eapol_wpa_keydes_data = -1;
static gint ett_eapol = -1;
static gint ett_eapol_keydes_data = -1;
static gint ett_eapol_key_index = -1;
+static gint ett_keyinfo = -1;
static dissector_handle_t eap_handle;
static dissector_handle_t data_handle;
@@ -86,8 +96,27 @@ static const value_string eapol_keydes_type_vals[] = {
{ 0, NULL }
};
+#define KEY_INFO_KEYDES_VER_MASK 0x0007
+#define KEY_INFO_KEY_TYPE_MASK 0x0008
+#define KEY_INFO_KEY_INDEX_MASK 0x0030
+#define KEY_INFO_INSTALL_MASK 0x0040
+#define KEY_INFO_KEY_ACK_MASK 0x0080
+#define KEY_INFO_KEY_MIC_MASK 0x0100
+#define KEY_INFO_SECURE_MASK 0x0200
+#define KEY_INFO_ERROR_MASK 0x0400
+#define KEY_INFO_REQUEST_MASK 0x0800
+
static const true_false_string keytype_tfs =
{ "Unicast", "Broadcast" };
+static const true_false_string tfs_keyinfo_key_type =
+ { "Pairwise key", "Group key" };
+#define KEYDES_VER_TYPE1 0x01
+#define KEYDES_VER_TYPE2 0x02
+static const value_string keydes_ver[] = {
+ { KEYDES_VER_TYPE1, "HMAC-MD5 for MIC and RC4 for encryption" },
+ { KEYDES_VER_TYPE2, "AES-CBC-MAC for MIC and HMAC-SHA1 for encryption" },
+ { 0, NULL }
+};
static void
dissect_eapol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -99,8 +128,11 @@ dissect_eapol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint len;
guint16 eapol_key_len, eapol_data_len;
guint8 key_index;
+ guint16 keyinfo;
proto_tree *ti = NULL;
proto_tree *eapol_tree = NULL;
+ proto_tree *keyinfo_item = NULL;
+ proto_tree *keyinfo_tree = NULL;
proto_tree *key_index_tree, *keydes_tree;
tvbuff_t *next_tvb;
@@ -147,8 +179,22 @@ dissect_eapol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(eapol_tree, hf_eapol_keydes_type, tvb, offset, 1, FALSE);
offset += 1;
if (keydesc_type == EAPOL_WPA_KEY) {
- proto_tree_add_uint(eapol_tree, hf_eapol_wpa_keydes_keyinfo, tvb,
- offset, 2, tvb_get_ntohs(tvb, offset));
+ keyinfo = tvb_get_ntohs(tvb, offset);
+ keyinfo_item =
+ proto_tree_add_uint(eapol_tree, hf_eapol_wpa_keydes_keyinfo, tvb,
+ offset, 2, keyinfo);
+
+ keyinfo_tree = proto_item_add_subtree(keyinfo_item, ett_keyinfo);
+ proto_tree_add_uint(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_keydes_ver, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_type, tvb, offset, 2, keyinfo);
+ proto_tree_add_uint(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_index, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_install, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_ack, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_mic, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_secure, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_error, tvb, offset, 2, keyinfo);
+ proto_tree_add_boolean(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_request, tvb, offset, 2, keyinfo);
+
offset += 2;
proto_tree_add_uint(eapol_tree, hf_eapol_keydes_keylen, tvb, offset,
2, tvb_get_ntohs(tvb, offset));
@@ -263,6 +309,61 @@ proto_register_eapol(void)
{ &hf_eapol_wpa_keydes_keyinfo, {
"Key Information", "eapol.keydes.key_info", FT_UINT16,
BASE_HEX, NULL, 0x0, "WPA key info", HFILL }},
+
+ { &hf_eapol_wpa_keydes_keyinfo_keydes_ver, {
+ "Key Descriptor Version",
+ "eapol.keydes.key_info.keydes_ver",
+ FT_UINT16, BASE_DEC, VALS(&keydes_ver),
+ KEY_INFO_KEYDES_VER_MASK,
+ "Key Descriptor Version Type", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_key_type, {
+ "Key Type",
+ "eapol.keydes.key_info.key_type",
+ FT_BOOLEAN, 16, TFS(&tfs_keyinfo_key_type),
+ KEY_INFO_KEY_TYPE_MASK,
+ "Key Type (Pairwise or Group)", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_key_index, {
+ "Key Index",
+ "eapol.keydes.key_info.key_index",
+ FT_UINT16, BASE_DEC, NULL,
+ KEY_INFO_KEY_INDEX_MASK,
+ "Key Index (0-3)", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_install, {
+ "Install flag",
+ "eapol.keydes.key_info.install",
+ FT_BOOLEAN, 16, TFS(&flags_set_truth),
+ KEY_INFO_INSTALL_MASK,
+ "Install flag", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_key_ack, {
+ "Key Ack flag",
+ "eapol.keydes.key_info.key_ack",
+ FT_BOOLEAN, 16, TFS(&flags_set_truth),
+ KEY_INFO_KEY_ACK_MASK,
+ "Key Ack flag", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_key_mic, {
+ "Key MIC flag",
+ "eapol.keydes.key_info.key_mic",
+ FT_BOOLEAN, 16, TFS(&flags_set_truth),
+ KEY_INFO_KEY_MIC_MASK,
+ "Key MIC flag", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_secure, {
+ "Secure flag",
+ "eapol.keydes.key_info.secure",
+ FT_BOOLEAN, 16, TFS(&flags_set_truth),
+ KEY_INFO_SECURE_MASK,
+ "Secure flag", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_error, {
+ "Error flag",
+ "eapol.keydes.key_info.error",
+ FT_BOOLEAN, 16, TFS(&flags_set_truth),
+ KEY_INFO_ERROR_MASK,
+ "Error flag", HFILL }},
+ { &hf_eapol_wpa_keydes_keyinfo_request, {
+ "Request flag",
+ "eapol.keydes.key_info.request",
+ FT_BOOLEAN, 16, TFS(&flags_set_truth),
+ KEY_INFO_REQUEST_MASK,
+ "Request flag", HFILL }},
{ &hf_eapol_wpa_keydes_nonce, {
"Nonce", "eapol.keydes.nonce", FT_BYTES, BASE_NONE,
NULL, 0x0, "WPA Key Nonce", HFILL }},
@@ -285,6 +386,7 @@ proto_register_eapol(void)
static gint *ett[] = {
&ett_eapol,
&ett_eapol_keydes_data,
+ &ett_keyinfo,
&ett_eapol_key_index
};