FIXUP: WIP: verification_trailer
[wireshark-wip.git] / epan / dissectors / packet-eapol.c
blob8971db66ff2d0a2d2016cf7c4071d3c9bbfb7f06
1 /* packet-eapol.c
2 * Routines for EAPOL 802.1X authentication header disassembly
3 * (From IEEE Draft P802.1X/D11; is there a later draft, or a
4 * final standard? If so, check it.)
6 * $Id$
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1998 Gerald Combs
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 #include "config.h"
29 #include <glib.h>
30 #include <epan/packet.h>
31 #include <epan/crypt/wep-wpadefs.h>
32 #include "packet-ieee80211.h"
33 #include <epan/etypes.h>
35 void proto_register_eapol(void);
36 void proto_reg_handoff_eapol(void);
38 static int proto_eapol = -1;
39 static int hf_eapol_version = -1;
40 static int hf_eapol_type = -1;
41 static int hf_eapol_len = -1;
42 static int hf_eapol_keydes_type = -1;
43 static int hf_eapol_keydes_key_len = -1;
44 static int hf_eapol_keydes_replay_counter = -1;
45 static int hf_eapol_keydes_key_iv = -1;
46 static int hf_eapol_keydes_key_index = -1;
47 static int hf_eapol_keydes_key_index_type = -1;
48 static int hf_eapol_keydes_key_index_number = -1;
49 static int hf_eapol_keydes_key_signature = -1;
50 static int hf_eapol_keydes_key = -1;
51 static int hf_eapol_keydes_key_generated_locally = -1;
53 static int hf_eapol_wpa_keydes_keyinfo = -1;
54 static int hf_eapol_wpa_keydes_keyinfo_keydes_version = -1;
55 static int hf_eapol_wpa_keydes_keyinfo_key_type = -1;
56 static int hf_eapol_wpa_keydes_keyinfo_key_index = -1;
57 static int hf_eapol_wpa_keydes_keyinfo_install = -1;
58 static int hf_eapol_wpa_keydes_keyinfo_key_ack = -1;
59 static int hf_eapol_wpa_keydes_keyinfo_key_mic = -1;
60 static int hf_eapol_wpa_keydes_keyinfo_secure = -1;
61 static int hf_eapol_wpa_keydes_keyinfo_error = -1;
62 static int hf_eapol_wpa_keydes_keyinfo_request = -1;
63 static int hf_eapol_wpa_keydes_keyinfo_encrypted_key_data = -1;
64 static int hf_eapol_wpa_keydes_nonce = -1;
65 static int hf_eapol_wpa_keydes_rsc = -1;
66 static int hf_eapol_wpa_keydes_id = -1;
67 static int hf_eapol_wpa_keydes_mic = -1;
68 static int hf_eapol_wpa_keydes_data_len = -1;
69 static int hf_eapol_wpa_keydes_data = -1;
71 static gint ett_eapol = -1;
72 static gint ett_eapol_keydes_data = -1;
73 static gint ett_eapol_key_index = -1;
74 static gint ett_keyinfo = -1;
76 static dissector_handle_t eapol_handle;
78 static dissector_handle_t eap_handle;
79 static dissector_handle_t data_handle;
81 #define EAPOL_HDR_LEN 4
83 #define EAPOL_2001 1
84 #define EAPOL_2004 2
85 #define EAPOL_2010 3
87 #define EAP_PACKET 0
88 #define EAPOL_START 1
89 #define EAPOL_LOGOFF 2
90 #define EAPOL_KEY 3
91 #define EAPOL_ENCAP_ASF_ALERT 4
93 #define EAPOL_RSN_KEY 2 /* TBD, may change in final IEEE 802.1X-REV
95 #define EAPOL_WPA_KEY 254
97 static const value_string eapol_version_vals[] = {
98 { EAPOL_2001, "802.1X-2001" },
99 { EAPOL_2004, "802.1X-2004" },
100 { EAPOL_2010, "802.1X-2010" },
101 { 0, NULL }
104 static const value_string eapol_type_vals[] = {
105 { EAP_PACKET, "EAP Packet" },
106 { EAPOL_START, "Start" },
107 { EAPOL_LOGOFF, "Logoff" },
108 { EAPOL_KEY, "Key" },
109 { EAPOL_ENCAP_ASF_ALERT, "Encapsulated ASF Alert" },
110 { 0, NULL }
113 static const value_string eapol_keydes_type_vals[] = {
114 { 1, "RC4 Descriptor" },
115 { EAPOL_RSN_KEY, "EAPOL RSN Key" },
116 { EAPOL_WPA_KEY, "EAPOL WPA Key" },
117 { 0, NULL }
120 #define KEY_INFO_KEYDES_VERSION_MASK 0x0007
121 #define KEY_INFO_KEY_TYPE_MASK 0x0008
122 #define KEY_INFO_KEY_INDEX_MASK 0x0030
123 #define KEY_INFO_INSTALL_MASK 0x0040
124 #define KEY_INFO_KEY_ACK_MASK 0x0080
125 #define KEY_INFO_KEY_MIC_MASK 0x0100
126 #define KEY_INFO_SECURE_MASK 0x0200
127 #define KEY_INFO_ERROR_MASK 0x0400
128 #define KEY_INFO_REQUEST_MASK 0x0800
129 #define KEY_INFO_ENCRYPTED_KEY_DATA_MASK 0x1000
131 static const true_false_string keytype_tfs = { "Unicast", "Broadcast" };
133 static const true_false_string keyinfo_key_type_tfs = { "Pairwise Key", "Group Key" };
135 #define KEYDES_KEY_INDEX_TYPE_MASK 0x80
136 #define KEYDES_KEY_INDEX_NUMBER_MASK 0x7F
138 #define KEYDES_VER_TYPE1 0x01
139 #define KEYDES_VER_TYPE2 0x02
140 #define KEYDES_VER_TYPE3 0x03
142 static const value_string keydes_version_vals[] = {
143 { KEYDES_VER_TYPE1, "RC4 Cipher, HMAC-MD5 MIC" },
144 { KEYDES_VER_TYPE2, "AES Cipher, HMAC-SHA1 MIC" },
145 { KEYDES_VER_TYPE3, "AES Cipher, AES-128-CMAC MIC" },
146 { 0, NULL }
149 static void
150 dissect_eapol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
152 int offset = 0;
153 guint8 eapol_type;
154 guint8 keydesc_type;
155 guint16 eapol_len;
156 guint len;
157 guint16 eapol_key_len, eapol_data_len;
158 guint16 keyinfo;
159 gboolean generated_locally;
160 proto_tree *ti = NULL;
161 proto_tree *eapol_tree = NULL;
162 proto_tree *keyinfo_item = NULL;
163 proto_tree *keyinfo_tree = NULL;
164 proto_tree *key_index_tree, *keydes_tree;
165 tvbuff_t *next_tvb;
166 guint8 counter;
168 col_set_str(pinfo->cinfo, COL_PROTOCOL, "EAPOL");
169 col_clear(pinfo->cinfo, COL_INFO);
171 if (tree) {
172 ti = proto_tree_add_item(tree, proto_eapol, tvb, 0, -1, ENC_NA);
173 eapol_tree = proto_item_add_subtree(ti, ett_eapol);
175 proto_tree_add_item(eapol_tree, hf_eapol_version, tvb, offset, 1, ENC_BIG_ENDIAN);
177 offset++;
179 eapol_type = tvb_get_guint8(tvb, offset);
180 if (tree)
181 proto_tree_add_item(eapol_tree, hf_eapol_type, tvb, offset, 1, ENC_BIG_ENDIAN);
182 col_add_str(pinfo->cinfo, COL_INFO,
183 val_to_str(eapol_type, eapol_type_vals, "Unknown Type (0x%02X)"));
184 offset++;
186 eapol_len = tvb_get_ntohs(tvb, offset);
187 len = EAPOL_HDR_LEN + eapol_len;
188 set_actual_length(tvb, len);
189 if (tree) {
190 proto_item_set_len(ti, len);
191 proto_tree_add_item(eapol_tree, hf_eapol_len, tvb, offset, 2, ENC_BIG_ENDIAN);
193 offset += 2;
195 switch (eapol_type) {
197 case EAP_PACKET:
198 next_tvb = tvb_new_subset_remaining(tvb, offset);
199 call_dissector(eap_handle, next_tvb, pinfo, eapol_tree);
200 break;
202 case EAPOL_KEY:
203 if (tree) {
204 keydesc_type = tvb_get_guint8(tvb, offset);
205 proto_tree_add_item(eapol_tree, hf_eapol_keydes_type, tvb, offset, 1, ENC_BIG_ENDIAN);
206 offset += 1;
207 if (keydesc_type == EAPOL_WPA_KEY || keydesc_type == EAPOL_RSN_KEY) {
208 keyinfo = tvb_get_ntohs(tvb, offset);
209 if (keyinfo & KEY_INFO_REQUEST_MASK) {
210 col_set_str(pinfo->cinfo, COL_INFO, "Key (Request)");
211 if (keyinfo & KEY_INFO_ERROR_MASK)
212 col_set_str(pinfo->cinfo, COL_INFO, "Key (Request, Error)");
213 } else if (keyinfo & KEY_INFO_KEY_TYPE_MASK) {
214 guint16 masked;
215 masked = keyinfo &
216 (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK |
217 KEY_INFO_KEY_MIC_MASK | KEY_INFO_SECURE_MASK);
219 if (keydesc_type == EAPOL_WPA_KEY) {
220 switch (masked) {
221 case KEY_INFO_KEY_ACK_MASK:
222 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 1 of 4)");
223 break;
224 case KEY_INFO_KEY_MIC_MASK:
225 counter = tvb_get_guint8(tvb, offset+11);
226 if (!counter)
227 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 2 of 4)");
228 else
229 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 4 of 4)");
230 break;
231 case (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK |
232 KEY_INFO_KEY_MIC_MASK):
233 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 3 of 4)");
234 break;
238 if (keydesc_type == EAPOL_RSN_KEY) {
239 switch (masked) {
240 case KEY_INFO_KEY_ACK_MASK:
241 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 1 of 4)");
242 break;
243 case KEY_INFO_KEY_MIC_MASK:
244 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 2 of 4)");
245 break;
246 case (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK |
247 KEY_INFO_KEY_MIC_MASK | KEY_INFO_SECURE_MASK):
248 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 3 of 4)");
249 break;
250 case (KEY_INFO_KEY_MIC_MASK | KEY_INFO_SECURE_MASK):
251 col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 4 of 4)");
252 break;
256 } else {
257 if (keyinfo & KEY_INFO_KEY_ACK_MASK)
258 col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 1 of 2)");
259 else
260 col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 2 of 2)");
262 keyinfo_item =
263 proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_keyinfo, tvb,
264 offset, 2, ENC_BIG_ENDIAN);
266 keyinfo_tree = proto_item_add_subtree(keyinfo_item, ett_keyinfo);
267 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_keydes_version, tvb, offset, 2, ENC_BIG_ENDIAN);
268 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_type, tvb, offset, 2, ENC_BIG_ENDIAN);
269 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_index, tvb, offset, 2, ENC_BIG_ENDIAN);
270 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_install, tvb, offset, 2, ENC_BIG_ENDIAN);
271 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_ack, tvb, offset, 2, ENC_BIG_ENDIAN);
272 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_key_mic, tvb, offset, 2, ENC_BIG_ENDIAN);
273 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_secure, tvb, offset, 2, ENC_BIG_ENDIAN);
274 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_error, tvb, offset, 2, ENC_BIG_ENDIAN);
275 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_request, tvb, offset, 2, ENC_BIG_ENDIAN);
276 proto_tree_add_item(keyinfo_tree, hf_eapol_wpa_keydes_keyinfo_encrypted_key_data, tvb, offset, 2, ENC_BIG_ENDIAN);
278 offset += 2;
279 proto_tree_add_item(eapol_tree, hf_eapol_keydes_key_len, tvb, offset,
280 2, ENC_BIG_ENDIAN);
281 offset += 2;
282 proto_tree_add_item(eapol_tree, hf_eapol_keydes_replay_counter, tvb,
283 offset, 8, ENC_BIG_ENDIAN);
284 offset += 8;
285 proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_nonce, tvb, offset,
286 32, ENC_NA);
287 offset += 32;
288 proto_tree_add_item(eapol_tree, hf_eapol_keydes_key_iv, tvb,
289 offset, 16, ENC_NA);
290 offset += 16;
291 proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_rsc, tvb, offset,
292 8, ENC_NA);
293 offset += 8;
294 proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_id, tvb, offset, 8,
295 ENC_NA);
296 offset += 8;
297 proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_mic, tvb, offset,
298 16, ENC_NA);
299 offset += 16;
300 eapol_data_len = tvb_get_ntohs(tvb, offset);
301 proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_data_len, tvb,
302 offset, 2, ENC_BIG_ENDIAN);
303 offset += 2;
304 if (eapol_data_len != 0) {
305 ti = proto_tree_add_item(eapol_tree, hf_eapol_wpa_keydes_data,
306 tvb, offset, eapol_data_len, ENC_NA);
307 if ((keyinfo & KEY_INFO_ENCRYPTED_KEY_DATA_MASK) ||
308 !(keyinfo & KEY_INFO_KEY_TYPE_MASK)) {
309 /* RSN: EAPOL-Key Key Data is encrypted.
310 * WPA: Group Keys use encrypted Key Data.
311 * Cannot parse this without knowing the key.
312 * IEEE 802.11i-2004 8.5.2.
314 } else {
315 keydes_tree = proto_item_add_subtree(ti, ett_eapol_keydes_data);
316 ieee_80211_add_tagged_parameters(tvb, offset, pinfo, keydes_tree,
317 eapol_data_len, -1);
320 } else {
321 eapol_key_len = tvb_get_ntohs(tvb, offset);
322 proto_tree_add_item(eapol_tree, hf_eapol_keydes_key_len, tvb, offset, 2, ENC_BIG_ENDIAN);
323 offset += 2;
324 proto_tree_add_item(eapol_tree, hf_eapol_keydes_replay_counter, tvb,
325 offset, 8, ENC_BIG_ENDIAN);
326 offset += 8;
327 proto_tree_add_item(eapol_tree, hf_eapol_keydes_key_iv, tvb,
328 offset, 16, ENC_NA);
329 offset += 16;
330 ti = proto_tree_add_item(eapol_tree, hf_eapol_keydes_key_index, tvb, offset, 1, ENC_BIG_ENDIAN);
331 key_index_tree = proto_item_add_subtree(ti, ett_eapol_key_index);
332 proto_tree_add_item(key_index_tree, hf_eapol_keydes_key_index_type,
333 tvb, offset, 1, ENC_BIG_ENDIAN);
334 proto_tree_add_item(key_index_tree, hf_eapol_keydes_key_index_number,
335 tvb, offset, 1, ENC_BIG_ENDIAN);
336 offset += 1;
337 proto_tree_add_item(eapol_tree, hf_eapol_keydes_key_signature, tvb,
338 offset, 16, ENC_NA);
339 offset += 16;
340 if (eapol_key_len != 0) {
341 /* IEEE 802.1X-2004 7.6.3.6: If no bytes remain, then */
342 generated_locally = eapol_len <= 44; /* Size of rc4 key with no key content */
343 if (!generated_locally) {
344 proto_tree_add_item(eapol_tree, hf_eapol_keydes_key, tvb, offset,
345 eapol_key_len, ENC_NA);
348 proto_tree_add_boolean(eapol_tree, hf_eapol_keydes_key_generated_locally, tvb, offset,
349 0, generated_locally);
353 break;
355 case EAPOL_ENCAP_ASF_ALERT: /* XXX - is this an SNMP trap? */
356 default:
357 next_tvb = tvb_new_subset_remaining(tvb, offset);
358 call_dissector(data_handle, next_tvb, pinfo, eapol_tree);
359 break;
363 void
364 proto_register_eapol(void)
366 static hf_register_info hf[] = {
367 { &hf_eapol_version, {
368 "Version", "eapol.version",
369 FT_UINT8, BASE_DEC, VALS(eapol_version_vals), 0x0,
370 NULL, HFILL }},
372 { &hf_eapol_type, {
373 "Type", "eapol.type",
374 FT_UINT8, BASE_DEC, VALS(eapol_type_vals), 0x0,
375 NULL, HFILL }},
377 { &hf_eapol_len, {
378 "Length", "eapol.len",
379 FT_UINT16, BASE_DEC, NULL, 0x0,
380 NULL, HFILL }},
382 { &hf_eapol_keydes_type, {
383 "Key Descriptor Type", "eapol.keydes.type",
384 FT_UINT8, BASE_DEC, VALS(eapol_keydes_type_vals), 0x0,
385 NULL, HFILL }},
387 { &hf_eapol_keydes_key_len, {
388 "Key Length", "eapol.keydes.key_len",
389 FT_UINT16, BASE_DEC, NULL, 0x0,
390 NULL, HFILL }},
392 { &hf_eapol_keydes_replay_counter, {
393 "Replay Counter", "eapol.keydes.replay_counter",
394 FT_UINT64, BASE_DEC, NULL, 0x0,
395 NULL, HFILL }},
397 { &hf_eapol_keydes_key_iv, {
398 "Key IV", "eapol.keydes.key_iv",
399 FT_BYTES, BASE_NONE, NULL, 0x0,
400 NULL, HFILL }},
402 { &hf_eapol_keydes_key_index, {
403 "Key Index", "eapol.keydes.key_index",
404 FT_UINT8, BASE_HEX, NULL, 0x0,
405 NULL, HFILL }},
407 { &hf_eapol_keydes_key_index_type, {
408 "Type", "eapol.keydes.key_index.type",
409 FT_BOOLEAN, 8, TFS(&keytype_tfs), KEYDES_KEY_INDEX_TYPE_MASK ,
410 NULL, HFILL }},
412 { &hf_eapol_keydes_key_index_number, {
413 "Number", "eapol.keydes.key_index.number",
414 FT_UINT8, BASE_DEC, NULL, KEYDES_KEY_INDEX_NUMBER_MASK,
415 NULL, HFILL }},
417 { &hf_eapol_keydes_key_signature, {
418 "Key Signature", "eapol.keydes.key_signature",
419 FT_BYTES, BASE_NONE, NULL, 0x0,
420 NULL, HFILL }},
422 { &hf_eapol_keydes_key, {
423 "Key", "eapol.keydes.key",
424 FT_BYTES, BASE_NONE, NULL, 0x0,
425 NULL, HFILL }},
427 { &hf_eapol_keydes_key_generated_locally, {
428 "Key Generated Locally", "eapol.keydes.key.generated_locally",
429 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
430 NULL, HFILL }},
432 { &hf_eapol_wpa_keydes_keyinfo, {
433 "Key Information", "eapol.keydes.key_info",
434 FT_UINT16, BASE_HEX, NULL, 0x0,
435 NULL, HFILL }},
437 { &hf_eapol_wpa_keydes_keyinfo_keydes_version, {
438 "Key Descriptor Version", "eapol.keydes.key_info.keydes_version",
439 FT_UINT16, BASE_DEC, VALS(keydes_version_vals), KEY_INFO_KEYDES_VERSION_MASK,
440 NULL, HFILL }},
442 { &hf_eapol_wpa_keydes_keyinfo_key_type, {
443 "Key Type", "eapol.keydes.key_info.key_type",
444 FT_BOOLEAN, 16, TFS(&keyinfo_key_type_tfs), KEY_INFO_KEY_TYPE_MASK,
445 NULL, HFILL }},
447 { &hf_eapol_wpa_keydes_keyinfo_key_index, {
448 "Key Index", "eapol.keydes.key_info.key_index",
449 FT_UINT16, BASE_DEC, NULL, KEY_INFO_KEY_INDEX_MASK,
450 NULL, HFILL }},
452 { &hf_eapol_wpa_keydes_keyinfo_install, {
453 "Install", "eapol.keydes.key_info.install",
454 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_INSTALL_MASK,
455 NULL, HFILL }},
457 { &hf_eapol_wpa_keydes_keyinfo_key_ack, {
458 "Key ACK", "eapol.keydes.key_info.key_ack",
459 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_KEY_ACK_MASK,
460 NULL, HFILL }},
462 { &hf_eapol_wpa_keydes_keyinfo_key_mic, {
463 "Key MIC", "eapol.keydes.key_info.key_mic",
464 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_KEY_MIC_MASK,
465 NULL, HFILL }},
467 { &hf_eapol_wpa_keydes_keyinfo_secure, {
468 "Secure", "eapol.keydes.key_info.secure",
469 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_SECURE_MASK,
470 NULL, HFILL }},
472 { &hf_eapol_wpa_keydes_keyinfo_error, {
473 "Error", "eapol.keydes.key_info.error",
474 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_ERROR_MASK,
475 NULL, HFILL }},
477 { &hf_eapol_wpa_keydes_keyinfo_request, {
478 "Request", "eapol.keydes.key_info.request",
479 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_REQUEST_MASK,
480 NULL, HFILL }},
482 { &hf_eapol_wpa_keydes_keyinfo_encrypted_key_data, {
483 "Encrypted Key Data", "eapol.keydes.key_info.encrypted_key_data",
484 FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_ENCRYPTED_KEY_DATA_MASK,
485 NULL, HFILL }},
487 { &hf_eapol_wpa_keydes_nonce, {
488 "WPA Key Nonce", "eapol.keydes.nonce",
489 FT_BYTES, BASE_NONE, NULL, 0x0,
490 NULL, HFILL }},
492 { &hf_eapol_wpa_keydes_rsc, {
493 "WPA Key RSC", "eapol.keydes.rsc",
494 FT_BYTES, BASE_NONE, NULL, 0x0,
495 NULL, HFILL }},
497 { &hf_eapol_wpa_keydes_id, {
498 "WPA Key ID", "eapol.keydes.id",
499 FT_BYTES, BASE_NONE, NULL, 0x0,
500 NULL, HFILL }},
502 { &hf_eapol_wpa_keydes_mic, {
503 "WPA Key MIC", "eapol.keydes.mic",
504 FT_BYTES, BASE_NONE, NULL, 0x0,
505 NULL, HFILL }},
507 { &hf_eapol_wpa_keydes_data_len, {
508 "WPA Key Data Length", "eapol.keydes.data_len",
509 FT_UINT16, BASE_DEC, NULL, 0x0,
510 NULL, HFILL }},
512 { &hf_eapol_wpa_keydes_data, {
513 "WPA Key Data", "eapol.keydes.data",
514 FT_BYTES, BASE_NONE, NULL, 0x0,
515 NULL, HFILL }},
518 static gint *ett[] = {
519 &ett_eapol,
520 &ett_eapol_keydes_data,
521 &ett_keyinfo,
522 &ett_eapol_key_index
525 proto_eapol = proto_register_protocol("802.1X Authentication", "EAPOL", "eapol");
526 eapol_handle = register_dissector("eapol", dissect_eapol, proto_eapol);
528 proto_register_field_array(proto_eapol, hf, array_length(hf));
529 proto_register_subtree_array(ett, array_length(ett));
532 void
533 proto_reg_handoff_eapol(void)
536 * Get handles for the EAP and raw data dissectors.
538 eap_handle = find_dissector("eap");
539 data_handle = find_dissector("data");
541 dissector_add_uint("ethertype", ETHERTYPE_EAPOL, eapol_handle);
542 dissector_add_uint("ethertype", ETHERTYPE_RSN_PREAUTH, eapol_handle);
546 * Editor modelines
548 * Local Variables:
549 * c-basic-offset: 2
550 * tab-width: 8
551 * indent-tabs-mode: nil
552 * End:
554 * ex: set shiftwidth=2 tabstop=8 expandtab:
555 * :indentSize=2:tabSize=8:noTabs=true: