diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2007-11-23 17:48:28 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2007-11-23 17:48:28 +0000 |
commit | d6f0b0c2af0ffe31b276a011c7bc16ec6bde4c86 (patch) | |
tree | 77cea4c1b104973eb759657805f7fed57e213235 /epan | |
parent | 5e1ffde52007119e6b19a4de1ae7b91fd76d7e90 (diff) |
From Jens Braeuer:
Added support for Wifi Simple Config aka Wifi Protected Setup
From me:
Added standard copyright header to packet-wps
svn path=/trunk/; revision=23549
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/Makefile.common | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-eap.c | 75 | ||||
-rw-r--r-- | epan/dissectors/packet-ieee80211.c | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-wps.c | 1869 | ||||
-rw-r--r-- | epan/dissectors/packet-wps.h | 47 | ||||
-rw-r--r-- | epan/eap.h | 1 |
6 files changed, 1993 insertions, 6 deletions
diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common index 8ee39d281e..3b7e5f75d9 100644 --- a/epan/dissectors/Makefile.common +++ b/epan/dissectors/Makefile.common @@ -748,6 +748,7 @@ CLEAN_DISSECTOR_SRC = \ packet-wlancap.c \ packet-wlccp.c \ packet-wol.c \ + packet-wps.c \ packet-wsp.c \ packet-wtls.c \ packet-wtp.c \ diff --git a/epan/dissectors/packet-eap.c b/epan/dissectors/packet-eap.c index c5a8f67cae..0fb374f4e6 100644 --- a/epan/dissectors/packet-eap.c +++ b/epan/dissectors/packet-eap.c @@ -33,9 +33,10 @@ #include <epan/ppptypes.h> #include <epan/reassemble.h> #include <epan/emem.h> - #include <epan/eap.h> +#include "packet-wps.h" + static int proto_eap = -1; static int hf_eap_code = -1; static int hf_eap_identifier = -1; @@ -67,7 +68,6 @@ References: 5) http://www.iana.org/assignments/eap-numbers EAP registry( updated 2006-10-23) */ - const value_string eap_type_vals[] = { {EAP_TYPE_ID, "Identity [RFC3748]" }, {EAP_TYPE_NOTIFY,"Notification [RFC3748]" }, @@ -117,7 +117,7 @@ const value_string eap_type_vals[] = { { 46, "EAP-PAX [Clancy]" }, { 47, "EAP-PSK [RFC-bersani-eap-psk-11.txt]" }, { 48, "EAP-SAKE [RFC-vanderveen-eap-sake-02.txt]" }, - { 254, "RESERVED for the Expanded Type [RFC3748]" }, + {EAP_TYPE_EXT, "Expanded Type [RFC3748]" }, { 255, "EXPERIMENTAL [RFC3748]" }, { 0, NULL } @@ -208,6 +208,7 @@ static gint ett_eaptls_fragment = -1; static gint ett_eaptls_fragments = -1; static gint ett_eap_sim_attr = -1; static gint ett_eap_aka_attr = -1; +static gint ett_eap_exp_attr = -1; static const fragment_items eaptls_frag_items = { &ett_eaptls_fragment, @@ -223,8 +224,45 @@ static const fragment_items eaptls_frag_items = { "fragments" }; -/********************************************************************* -**********************************************************************/ +/********************************************************************** + Support for EAP Expanded Type. + + Currently this is limited to WifiProtectedSetup. Maybe we need + a generic method to support EAP extended types ? +*********************************************************************/ +static int hf_eapext_vendorid = -1; +static int hf_eapext_vendortype = -1; + +/* Vendor-Type and Vendor-id */ +#define WFA_VENDOR_ID 0x00372A +#define WFA_SIMPLECONFIG_TYPE 0x1 + +static const value_string eapext_vendorid_vals[] = { + { WFA_VENDOR_ID, "WFA" }, + { 0, NULL } +}; + +static const value_string eapext_vendortype_vals[] = { + { WFA_SIMPLECONFIG_TYPE, "SimpleConfig" }, + { 0, NULL } +}; + +static void +dissect_exteap(proto_tree *eap_tree, tvbuff_t *tvb, int offset, + gint size, packet_info* pinfo) +{ + + proto_tree_add_item(eap_tree, hf_eapext_vendorid, tvb, offset, 3, FALSE); + offset += 3; size -= 3; + + proto_tree_add_item(eap_tree, hf_eapext_vendortype, tvb, offset, 4, FALSE); + offset += 4; size -= 4; + + /* Generic method to support multiple vendor-defined extended types goes here :-) */ + dissect_exteap_wps(eap_tree, tvb, offset, size, pinfo); +} +/* ********************************************************************* +********************************************************************* */ static gboolean test_flag(unsigned char flag, unsigned char mask) @@ -689,7 +727,7 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str(eap_type, eap_type_vals, - "Unknown type (0x%02X)")); + "Unknown type (0x%02x)")); if (tree) proto_tree_add_uint(eap_tree, hf_eap_type, tvb, 4, 1, eap_type); @@ -1126,6 +1164,19 @@ dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_eap_aka(eap_tree, tvb, offset, size); break; /* EAP_TYPE_AKA */ /********************************************************************* + EAP Expanded Type + **********************************************************************/ + case EAP_TYPE_EXT: + if (tree) { + proto_item *expti = NULL; + proto_tree *exptree = NULL; + + expti = proto_tree_add_text(eap_tree, tvb, offset, size, "Expanded Type"); + exptree = proto_item_add_subtree(expti, ett_eap_exp_attr); + dissect_exteap(exptree, tvb, offset, size, pinfo); + } + break; + /********************************************************************* **********************************************************************/ default: if (tree) { @@ -1193,6 +1244,17 @@ proto_register_eap(void) { "Defragmentation error", "eaptls.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0, "Defragmentation error due to illegal fragments", HFILL }}, + + /* Expanded type fields */ + { &hf_eapext_vendorid, + { "Vendor Id", "eap.ext.vendor_id", + FT_UINT16, BASE_HEX, VALS(eapext_vendorid_vals), 0x0, + "", HFILL }}, + { &hf_eapext_vendortype, + { "Vendor Type", "eap.ext.vendor_type", + FT_UINT8, BASE_HEX, VALS(eapext_vendortype_vals), 0x0, + "", HFILL }}, + }; static gint *ett[] = { &ett_eap, @@ -1200,6 +1262,7 @@ proto_register_eap(void) &ett_eaptls_fragments, &ett_eap_sim_attr, &ett_eap_aka_attr, + &ett_eap_exp_attr, }; proto_eap = proto_register_protocol("Extensible Authentication Protocol", diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index c56ecc1d47..93ad7779b8 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -79,6 +79,8 @@ #include <ctype.h> #include "isprint.h" +#include "packet-wps.h" + #ifdef HAVE_AIRPCAP #include <airpcap.h> #include <airpcap_loader.h> @@ -2806,6 +2808,7 @@ static const value_string wpa_keymgmt_vals[] = {0, NULL} }; + static void dissect_vendor_ie_wpawme(proto_tree * ietree, proto_tree * tree, tvbuff_t * tag_tvb) { @@ -2990,6 +2993,9 @@ dissect_vendor_ie_wpawme(proto_tree * ietree, proto_tree * tree, tvbuff_t * tag_ out_buff); tag_off += 2; proto_item_append_text(ietree, ": WME"); + } else if (tag_off + 6 <= tag_len && !tvb_memeql(tag_tvb, tag_off, WPA_OUI"\x04", 4)) { + dissect_wps_tlvs(ietree, tag_tvb, tag_off+4, tag_len-4, NULL); + proto_item_append_text(ietree, ": WPS"); } } diff --git a/epan/dissectors/packet-wps.c b/epan/dissectors/packet-wps.c new file mode 100644 index 0000000000..49f2a4fb43 --- /dev/null +++ b/epan/dissectors/packet-wps.c @@ -0,0 +1,1869 @@ +/* packet-wps.c + * + * Wifi Simple Config aka Wifi Protected Setup + * + * Written by Jens Braeuer using WiFi-Alliance Spec 1.0h and + * parts of a patch by JP Jiang and Philippe Teuwen. November 2007 + * + * Spec: + * https://www.wi-fi.org/knowledge_center_overview.php?type=4 + * Patch: + * http://wireshark.digimirror.nl/lists/wireshark-dev/200703/msg00121.html + * + * Copyright 2007 Jens Braeuer <jensb@cs.tu-berlin.de> + * + * $Id:$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <glib.h> +#include <epan/packet.h> +#include <epan/reassemble.h> + +#include "packet-wps.h" + +static int hf_eapwps_opcode = -1; +static int hf_eapwps_flags = -1; +static int hf_eapwps_flag_mf = -1; +static int hf_eapwps_flag_lf = -1; +static int hf_eapwps_msglen = -1; + +static gint ett_eap_wps_attr = -1; +static gint ett_eap_wps_flags = -1; + +/* OPCodes */ +#define OPC_WSC_START 0x01 /* WPS OPCODE WSC_Start */ +#define OPC_WSC_ACK 0x02 /* WPS OPCODE WSC_ACK */ +#define OPC_WSC_NACK 0x03 /* WPS OPCODE WSC_NACK */ +#define OPC_WSC_MSG 0x04 /* WPS OPCODE WSC_MSG */ +#define OPC_WSC_DONE 0x05 /* WPS OPCODE WSC_Done */ +#define OPC_WSC_FRAG_ACK 0x06 /* WPS OPCODE WSC_FRAG_ACK */ + +static const value_string eapwps_opcode_vals[] = { + { OPC_WSC_START, "WSC Start"}, + { OPC_WSC_ACK, "WSC Ack"}, + { OPC_WSC_NACK, "WSC Nack" }, + { OPC_WSC_MSG, "WSC Msg" }, + { OPC_WSC_DONE, "WSC Done" }, + { OPC_WSC_FRAG_ACK, "WSC Frag Ack" }, + { 0, NULL } +}; + +/* Flag-Field masks */ +#define MASK_WSC_FLAG_MF 0x01 /* WPS Flag more frag */ +#define MASK_WSC_FLAG_LF 0x02 /* WPS flag length field */ + +#define WPS_TLV_TYPE_AP_CHANNEL 0x1001 +#define WPS_TLV_TYPE_ASSOCIATION_STATE 0x1002 +#define WPS_TLV_TYPE_AUTHENTICATION_TYPE 0x1003 +#define WPS_TLV_TYPE_AUTHENTICATION_TYPE_FLAGS 0x1004 +#define WPS_TLV_TYPE_AUTHENTICATOR 0x1005 +#define WPS_TLV_TYPE_CONFIG_METHODS 0x1008 +#define WPS_TLV_TYPE_CONFIGURATION_ERROR 0x1009 +#define WPS_TLV_TYPE_CONFIRMATION_URL4 0x100a +#define WPS_TLV_TYPE_CONFIRMATION_URL6 0x100b +#define WPS_TLV_TYPE_CONNECTION_TYPE 0x100c +#define WPS_TLV_TYPE_CONNECTION_TYPE_FLAGS 0x100d +#define WPS_TLV_TYPE_CREDENTIAL 0x100e +#define WPS_TLV_TYPE_DEVICE_NAME 0x1011 +#define WPS_TLV_TYPE_DEVICE_PASSWORD_ID 0x1012 +#define WPS_TLV_TYPE_E_HASH1 0X1014 +#define WPS_TLV_TYPE_E_HASH2 0x1015 +#define WPS_TLV_TYPE_E_SNONCE1 0x1016 +#define WPS_TLV_TYPE_E_SNONCE2 0x1017 +#define WPS_TLV_TYPE_ENCRYPTED_SETTINGS 0x1018 +#define WPS_TLV_TYPE_ENCRYPTION_TYPE 0x100f +#define WPS_TLV_TYPE_ENCRYPTION_TYPE_FLAGS 0x1010 +#define WPS_TLV_TYPE_ENROLLEE_NONCE 0x101a +#define WPS_TLV_TYPE_FEATURE_ID 0x101b +#define WPS_TLV_TYPE_IDENTITY 0x101c +#define WPS_TLV_TYPE_IDENTITY_PROOF 0x101d +#define WPS_TLV_TYPE_KEY_WRAP_AUTHENTICATOR 0x101e +#define WPS_TLV_TYPE_KEY_IDENTIFIER 0x101f +#define WPS_TLV_TYPE_MAC_ADDRESS 0x1020 +#define WPS_TLV_TYPE_MANUFACTURER 0x1021 +#define WPS_TLV_TYPE_MESSAGE_TYPE 0x1022 +#define WPS_TLV_TYPE_MODEL_NAME 0x1023 +#define WPS_TLV_TYPE_MODEL_NUMBER 0x1024 +#define WPS_TLV_TYPE_NETWORK_INDEX 0x1026 +#define WPS_TLV_TYPE_NETWORK_KEY 0x1027 +#define WPS_TLV_TYPE_NETWORK_KEY_INDEX 0x1028 +#define WPS_TLV_TYPE_NEW_DEVICE_NAME 0x1029 +#define WPS_TLV_TYPE_NEW_PASSWORD 0x102a +#define WPS_TLV_TYPE_OOB_DEVICE_PASSWORD 0x102c +#define WPS_TLV_TYPE_OS_VERSION 0x102d +#define WPS_TLV_TYPE_POWER_LEVEL 0x102f +#define WPS_TLV_TYPE_PSK_CURRENT 0x1030 +#define WPS_TLV_TYPE_PSK_MAX 0x1031 +#define WPS_TLV_TYPE_PUBLIC_KEY 0x1032 +#define WPS_TLV_TYPE_RADIO_ENABLED 0x1033 +#define WPS_TLV_TYPE_REBOOT 0x1034 +#define WPS_TLV_TYPE_REGISTRAR_CURRENT 0x1035 +#define WPS_TLV_TYPE_REGISTRAR_ESTABLISHED 0x1036 +#define WPS_TLV_TYPE_REGISTRAR_LIST 0x1037 +#define WPS_TLV_TYPE_REGISTRAR_MAX 0x1038 +#define WPS_TLV_TYPE_REGISTRAR_NONCE 0x1039 +#define WPS_TLV_TYPE_REQUEST_TYPE 0x103a +#define WPS_TLV_TYPE_RESPONSE_TYPE 0x103b +#define WPS_TLV_TYPE_RF_BANDS 0x103c +#define WPS_TLV_TYPE_R_HASH1 0x103d +#define WPS_TLV_TYPE_R_HASH2 0x103e +#define WPS_TLV_TYPE_R_SNONCE1 0x103f +#define WPS_TLV_TYPE_R_SNONCE2 0x1040 +#define WPS_TLV_TYPE_SELECTED_REGISTRAR 0x1041 +#define WPS_TLV_TYPE_SERIAL_NUMBER 0x1042 +#define WPS_TLV_TYPE_WIFI_PROTECTED_SETUP_STATE 0x1044 +#define WPS_TLV_TYPE_SSID 0x1045 +#define WPS_TLV_TYPE_TOTAL_NETWORKS 0x1046 +#define WPS_TLV_TYPE_UUID_E 0x1047 +#define WPS_TLV_TYPE_UUID_R 0x1048 +#define WPS_TLV_TYPE_VENDOR_EXTENSION 0x1049 +#define WPS_TLV_TYPE_VERSION 0x104a +#define WPS_TLV_TYPE_X509_CERTIFICATE_REQUEST 0x104b +#define WPS_TLV_TYPE_X509_CERTIFICATE 0x104c +#define WPS_TLV_TYPE_EAP_IDENTITY 0x104d +#define WPS_TLV_TYPE_MESSAGE_COUNTER 0x104e +#define WPS_TLV_TYPE_PUBLIC_KEY_HASH 0x104f +#define WPS_TLV_TYPE_REKEY_KEY 0x1050 +#define WPS_TLV_TYPE_KEY_LIFETIME 0x1051 +#define WPS_TLV_TYPE_PERMITTED_CONFIG_METHODS 0x1052 +#define WPS_TLV_TYPE_SELECTED_REGISTRAR_CONFIG_METHODS 0x1053 +#define WPS_TLV_TYPE_PRIMARY_DEVICE_TYPE 0x1054 +#define WPS_TLV_TYPE_SECONDARY_DEVICE_TYPE_LIST 0x1055 +#define WPS_TLV_TYPE_PORTABLE_DEVICE 0x1056 +#define WPS_TLV_TYPE_AP_SETUP_LOCKED 0x1057 +#define WPS_TLV_TYPE_APPLICATION_EXTENSION 0x1058 +#define WPS_TLV_TYPE_EAP_TYPE 0x1059 +#define WPS_TLV_TYPE_INITIALIZATION_VECTOR 0x1060 +#define WPS_TLV_TYPE_KEY_PROVIDED_AUTOMATICALLY 0x1061 +#define WPS_TLV_TYPE_8021X_ENABLED 0x1062 +#define WPS_TLV_TYPE_APPSESSIONKEY 0x1063 +#define WPS_TLV_TYPE_WEPTRANSMITKEY 0x1064 + + +static const value_string eapwps_tlv_types[] = { + { WPS_TLV_TYPE_AP_CHANNEL, "AP Channel" }, + { WPS_TLV_TYPE_ASSOCIATION_STATE, "Association State" }, + { WPS_TLV_TYPE_AUTHENTICATION_TYPE, "Authentication Type" }, + { WPS_TLV_TYPE_AUTHENTICATION_TYPE_FLAGS, "Authentication Type Flags" }, + { WPS_TLV_TYPE_AUTHENTICATOR, "Authenticator" }, + { WPS_TLV_TYPE_CONFIG_METHODS, "Config Methods" }, + { WPS_TLV_TYPE_CONFIGURATION_ERROR, "Configuration Error" }, + { WPS_TLV_TYPE_CONFIRMATION_URL4, "Confirmation URL4" }, + { WPS_TLV_TYPE_CONFIRMATION_URL6, "Confirmation URL6" }, + { WPS_TLV_TYPE_CONNECTION_TYPE, "Connection Type" }, + { WPS_TLV_TYPE_CONNECTION_TYPE_FLAGS, "Connection Type Flags" }, + { WPS_TLV_TYPE_CREDENTIAL, "Credential" }, + { WPS_TLV_TYPE_DEVICE_NAME, "Device Name" }, + { WPS_TLV_TYPE_DEVICE_PASSWORD_ID, "Device Password ID" }, + { WPS_TLV_TYPE_E_HASH1, "E Hash1" }, + { WPS_TLV_TYPE_E_HASH2, "E Hash2" }, + { WPS_TLV_TYPE_E_SNONCE1, "E SNonce1" }, + { WPS_TLV_TYPE_E_SNONCE2, "E SNonce2" }, + { WPS_TLV_TYPE_ENCRYPTED_SETTINGS, "Encrypted Settings" }, + { WPS_TLV_TYPE_ENCRYPTION_TYPE, "Encryption Type" }, + { WPS_TLV_TYPE_ENCRYPTION_TYPE_FLAGS, "Encryption Type Flags" }, + { WPS_TLV_TYPE_ENROLLEE_NONCE, "Enrollee Nonce" }, + { WPS_TLV_TYPE_FEATURE_ID, "Feature Id" }, + { WPS_TLV_TYPE_IDENTITY, "Identity" }, + { WPS_TLV_TYPE_IDENTITY_PROOF, "Identity Proof" }, + { WPS_TLV_TYPE_KEY_WRAP_AUTHENTICATOR, "Key Wrap Authenticator" }, + { WPS_TLV_TYPE_KEY_IDENTIFIER, "Key Identifier" }, + { WPS_TLV_TYPE_MAC_ADDRESS, "MAC Address" }, + { WPS_TLV_TYPE_MANUFACTURER, "Manufacturer" }, + { WPS_TLV_TYPE_MESSAGE_TYPE, "Message Type" }, + { WPS_TLV_TYPE_MODEL_NAME, "Model Name" }, + { WPS_TLV_TYPE_MODEL_NUMBER, "Model Number" }, + { WPS_TLV_TYPE_NETWORK_INDEX, "Network Index" }, + { WPS_TLV_TYPE_NETWORK_KEY, "Network Key" }, + { WPS_TLV_TYPE_NETWORK_KEY_INDEX, "Network Key Index" }, + { WPS_TLV_TYPE_NEW_DEVICE_NAME, "New Device Name" }, + { WPS_TLV_TYPE_NEW_PASSWORD, "New Password" }, + { WPS_TLV_TYPE_OOB_DEVICE_PASSWORD, "OOB Device Password" }, + { WPS_TLV_TYPE_OS_VERSION, "OS Version" }, + { WPS_TLV_TYPE_POWER_LEVEL, "Power Level" }, + { WPS_TLV_TYPE_PSK_CURRENT, "PSK Current" }, + { WPS_TLV_TYPE_PSK_MAX, "PSK Max" }, + { WPS_TLV_TYPE_PUBLIC_KEY, "Public Key" }, + { WPS_TLV_TYPE_RADIO_ENABLED, "Radio Enabled" }, + { WPS_TLV_TYPE_REBOOT, "Reboot" }, + { WPS_TLV_TYPE_REGISTRAR_CURRENT, "Registrar Current" }, + { WPS_TLV_TYPE_REGISTRAR_ESTABLISHED, "Registrar Established" }, + { WPS_TLV_TYPE_REGISTRAR_LIST, "Registrar List" }, + { WPS_TLV_TYPE_REGISTRAR_MAX, "registrar_max" }, + { WPS_TLV_TYPE_REGISTRAR_NONCE, "Registrar Nonce" }, + { WPS_TLV_TYPE_REQUEST_TYPE, "Request Type" }, + { WPS_TLV_TYPE_RESPONSE_TYPE, "Response Type" }, + { WPS_TLV_TYPE_RF_BANDS, "RF Bands" }, + { WPS_TLV_TYPE_R_HASH1, "R Hash1" }, + { WPS_TLV_TYPE_R_HASH2, "R Hash2" }, + { WPS_TLV_TYPE_R_SNONCE1, "R Snonce1" }, + { WPS_TLV_TYPE_R_SNONCE2, "R Snonce2" }, + { WPS_TLV_TYPE_SELECTED_REGISTRAR, "Selected Registrar" }, + { WPS_TLV_TYPE_SERIAL_NUMBER, "Serial Number" }, + { WPS_TLV_TYPE_WIFI_PROTECTED_SETUP_STATE, "Wifi Protected Setup State" }, + { WPS_TLV_TYPE_SSID, "SSID" }, + { WPS_TLV_TYPE_TOTAL_NETWORKS, "Total Networks" }, + { WPS_TLV_TYPE_UUID_E, "UUID E" }, + { WPS_TLV_TYPE_UUID_R, "UUID R" }, + { WPS_TLV_TYPE_VENDOR_EXTENSION, "Vendor Extension" }, + { WPS_TLV_TYPE_VERSION, "Version" }, + { WPS_TLV_TYPE_X509_CERTIFICATE_REQUEST, "X509 Certificate Request" }, + { WPS_TLV_TYPE_X509_CERTIFICATE, "X509 Certificate" }, + { WPS_TLV_TYPE_EAP_IDENTITY, "EAP Identity" }, + { WPS_TLV_TYPE_MESSAGE_COUNTER, "Message Counter" }, + { WPS_TLV_TYPE_PUBLIC_KEY_HASH, "Public Key Hash" }, + { WPS_TLV_TYPE_REKEY_KEY, "Rekey Key" }, + { WPS_TLV_TYPE_KEY_LIFETIME, "Key Lifetime" }, + { WPS_TLV_TYPE_PERMITTED_CONFIG_METHODS, "Permitted Config Methods" }, + { WPS_TLV_TYPE_SELECTED_REGISTRAR_CONFIG_METHODS, "Selected Registrar Config Methods" }, + { WPS_TLV_TYPE_PRIMARY_DEVICE_TYPE, "Primary Device Type" }, + { WPS_TLV_TYPE_SECONDARY_DEVICE_TYPE_LIST, "Secondary Device Type List" }, + { WPS_TLV_TYPE_PORTABLE_DEVICE, "Portable Device" }, + { WPS_TLV_TYPE_AP_SETUP_LOCKED, "Ap Setup Locked" }, + { WPS_TLV_TYPE_APPLICATION_EXTENSION, "Application Extension" }, + { WPS_TLV_TYPE_EAP_TYPE, "EAP Type" }, + { WPS_TLV_TYPE_INITIALIZATION_VECTOR, "Initialization Vector" }, + { WPS_TLV_TYPE_KEY_PROVIDED_AUTOMATICALLY, "Key Provided Automatically" }, + { WPS_TLV_TYPE_8021X_ENABLED, "8021x Enabled" }, + { WPS_TLV_TYPE_APPSESSIONKEY, "AppSessionKey" }, + { WPS_TLV_TYPE_WEPTRANSMITKEY, "WEPTransmitKey" }, + { 0, NULL } +}; + +static int proto_wps = -1; + +static int hf_eapwps_tlv_type = -1; +static int hf_eapwps_tlv_len = -1; + +static int hf_eapwps_tlv_ap_channel = -1; +static int hf_eapwps_tlv_association_state = -1; +static int hf_eapwps_tlv_authentication_type = -1; +static int hf_eapwps_tlv_authentication_type_flags = -1; +static int hf_eapwps_tlv_authentication_type_flags_open = -1; +static int hf_eapwps_tlv_authentication_type_flags_wpapsk = -1; +static int hf_eapwps_tlv_authentication_type_flags_shared = -1; +static int hf_eapwps_tlv_authentication_type_flags_wpa = -1; +static int hf_eapwps_tlv_authentication_type_flags_wpa2 = -1; +static int hf_eapwps_tlv_authentication_type_flags_wpa2psk = -1; +static int hf_eapwps_tlv_authenticator = -1; +static int hf_eapwps_tlv_config_methods = -1; +static int hf_eapwps_tlv_config_methods_usba = -1; +static int hf_eapwps_tlv_config_methods_ethernet = -1; +static int hf_eapwps_tlv_config_methods_label = -1; +static int hf_eapwps_tlv_config_methods_display = -1; +static int hf_eapwps_tlv_config_methods_nfcext = -1; +static int hf_eapwps_tlv_config_methods_nfcint = -1; +static int hf_eapwps_tlv_config_methods_nfcinf = -1; +static int hf_eapwps_tlv_config_methods_pushbutton = -1; +static int hf_eapwps_tlv_config_methods_keypad = -1; +static int hf_eapwps_tlv_configuration_error = -1; +static int hf_eapwps_tlv_confirmation_url4 = -1; +static int hf_eapwps_tlv_confirmation_url6 = -1; +static int hf_eapwps_tlv_connection_type = -1; +static int hf_eapwps_tlv_connection_type_flags = -1; +static int hf_eapwps_tlv_connection_type_flags_ess = -1; +static int hf_eapwps_tlv_connection_type_flags_ibss = -1; +static int hf_eapwps_tlv_credential = -1; +static int hf_eapwps_tlv_device_name = -1; +static int hf_eapwps_tlv_device_password_id = -1; +static int hf_eapwps_tlv_e_hash1 = -1; +static int hf_eapwps_tlv_e_hash2 = -1; +static int hf_eapwps_tlv_e_snonce1 = -1; +static int hf_eapwps_tlv_e_snonce2 = -1; +static int hf_eapwps_tlv_encrypted_settings = -1; +static int hf_eapwps_tlv_encryption_type = -1; +static int hf_eapwps_tlv_encryption_type_flags = -1; +static int hf_eapwps_tlv_encryption_type_flags_none = -1; +static int hf_eapwps_tlv_encryption_type_flags_wep = -1; +static int hf_eapwps_tlv_encryption_type_flags_tkip = -1; +static int hf_eapwps_tlv_encryption_type_flags_aes = -1; +static int hf_eapwps_tlv_enrollee_nonce = -1; +static int hf_eapwps_tlv_feature_id = -1; +static int hf_eapwps_tlv_identity = -1; +static int hf_eapwps_tlv_identity_proof = -1; +static int hf_eapwps_tlv_key_wrap_authenticator = -1; +static int hf_eapwps_tlv_key_identifier = -1; +static int hf_eapwps_tlv_mac_address = -1; +static int hf_eapwps_tlv_manufacturer = -1; +static int hf_eapwps_tlv_message_type = -1; +static int hf_eapwps_tlv_model_name = -1; +static int hf_eapwps_tlv_model_number = -1; +static int hf_eapwps_tlv_network_index = -1; +static int hf_eapwps_tlv_network_key = -1; +static int hf_eapwps_tlv_network_key_index = -1; +static int hf_eapwps_tlv_new_device_name = -1; +static int hf_eapwps_tlv_new_password = -1; +static int hf_eapwps_tlv_oob_device_password = -1; +static int hf_eapwps_tlv_os_version = -1; +static int hf_eapwps_tlv_power_level = -1; +static int hf_eapwps_tlv_psk_current = -1; +static int hf_eapwps_tlv_psk_max = -1; +static int hf_eapwps_tlv_public_key = -1; +static int hf_eapwps_tlv_radio_enabled = -1; +static int hf_eapwps_tlv_reboot = -1; +static int hf_eapwps_tlv_registrar_current = -1; +static int hf_eapwps_tlv_registrar_established = -1; +static int hf_eapwps_tlv_registrar_list = -1; +static int hf_eapwps_tlv_registrar_max = -1; +static int hf_eapwps_tlv_registrar_nonce = -1; +static int hf_eapwps_tlv_request_type = -1; +static int hf_eapwps_tlv_response_type = -1; +static int hf_eapwps_tlv_rf_bands = -1; +static int hf_eapwps_tlv_r_hash1 = -1; +static int hf_eapwps_tlv_r_hash2 = -1; +static int hf_eapwps_tlv_r_snonce1 = -1; +static int hf_eapwps_tlv_r_snonce2 = -1; +static int hf_eapwps_tlv_selected_registrar = -1; +static int hf_eapwps_tlv_serial_number = -1; +static int hf_eapwps_tlv_wifi_protected_setup_state = -1; +static int hf_eapwps_tlv_ssid = -1; +static int hf_eapwps_tlv_total_networks = -1; +static int hf_eapwps_tlv_uuid_e = -1; +static int hf_eapwps_tlv_uuid_r = -1; +static int hf_eapwps_tlv_vendor_extension = -1; +static int hf_eapwps_tlv_version = -1; +static int hf_eapwps_tlv_x509_certificate_request = -1; +static int hf_eapwps_tlv_x509_certificate = -1; +static int hf_eapwps_tlv_eap_identity = -1; +static int hf_eapwps_tlv_message_counter = -1; +static int hf_eapwps_tlv_public_key_hash = -1; +static int hf_eapwps_tlv_rekey_key = -1; +static int hf_eapwps_tlv_key_lifetime = -1; +static int hf_eapwps_tlv_permitted_config_methods = -1; +static int hf_eapwps_tlv_selected_registrar_config_methods = -1; +static int hf_eapwps_tlv_primary_device_type = -1; +static int hf_eapwps_tlv_primary_device_type_category = -1; +static int hf_eapwps_tlv_primary_device_type_oui = -1; +static int hf_eapwps_tlv_primary_device_type_subcategory = -1; +static int hf_eapwps_tlv_secondary_device_type_list = -1; +static int hf_eapwps_tlv_portable_device = -1; +static int hf_eapwps_tlv_ap_setup_locked = -1; +static int hf_eapwps_tlv_application_extension = -1; +static int hf_eapwps_tlv_eap_type = -1; +static int hf_eapwps_tlv_initialization_vector = -1; +static int hf_eapwps_tlv_key_provided_automatically = -1; +static int hf_eapwps_tlv_8021x_enabled = -1; +static int hf_eapwps_tlv_appsessionkey = -1; +static int hf_eapwps_tlv_weptransmitkey = -1; + +static gint ett_wps_tlv = -1; +static gint ett_eap_wps_ap_channel = -1; +static gint ett_eap_wps_association_state = -1; +static gint ett_eap_wps_authentication_type = -1; +static gint ett_eap_wps_authentication_type_flags = -1; +static gint ett_eap_wps_authenticator = -1; +static gint ett_eap_wps_config_methods = -1; +static gint ett_eap_wps_configuration_error = -1; +static gint ett_eap_wps_confirmation_url4 = -1; +static gint ett_eap_wps_confirmation_url6 = -1; +static gint ett_eap_wps_connection_type = -1; +static gint ett_eap_wps_connection_type_flags = -1; +static gint ett_eap_wps_credential = -1; +static gint ett_eap_wps_device_name = -1; +static gint ett_eap_wps_device_password_id = -1; +static gint ett_eap_wps_e_hash1 = -1; +static gint ett_eap_wps_e_hash2 = -1; +static gint ett_eap_wps_e_snonce1 = -1; +static gint ett_eap_wps_e_snonce2 = -1; +static gint ett_eap_wps_encrypted_settings = -1; +static gint ett_eap_wps_encryption_type = -1; +static gint ett_eap_wps_encryption_type_flags = -1; +static gint ett_eap_wps_enrollee_nonce = -1; +static gint ett_eap_wps_feature_id = -1; +static gint ett_eap_wps_identity = -1; +static gint ett_eap_wps_identity_proof = -1; +static gint ett_eap_wps_key_wrap_authenticator = -1; +static gint ett_eap_wps_key_identifier = -1; +static gint ett_eap_wps_mac_address = -1; +static gint ett_eap_wps_manufacturer = -1; +static gint ett_eap_wps_message_type = -1; +static gint ett_eap_wps_model_name = -1; +static gint ett_eap_wps_model_number = -1; +static gint ett_eap_wps_network_index = -1; +static gint ett_eap_wps_network_key = -1; +static gint ett_eap_wps_network_key_index = -1; +static gint ett_eap_wps_new_device_name = -1; +static gint ett_eap_wps_new_password = -1; +static gint ett_eap_wps_oob_device_password = -1; +static gint ett_eap_wps_os_version = -1; +static gint ett_eap_wps_power_level = -1; +static gint ett_eap_wps_psk_current = -1; +static gint ett_eap_wps_psk_max = -1; +static gint ett_eap_wps_public_key = -1; +static gint ett_eap_wps_radio_enabled = -1; +static gint ett_eap_wps_reboot = -1; +static gint ett_eap_wps_registrar_current = -1; +static gint ett_eap_wps_registrar_established = -1; +static gint ett_eap_wps_registrar_list = -1; +static gint ett_eap_wps_registrar_max = -1; +static gint ett_eap_wps_registrar_nonce = -1; +static gint ett_eap_wps_request_type = -1; +static gint ett_eap_wps_response_type = -1; +static gint ett_eap_wps_rf_bands = -1; +static gint ett_eap_wps_r_hash1 = -1; +static gint ett_eap_wps_r_hash2 = -1; +static gint ett_eap_wps_r_snonce1 = -1; +static gint ett_eap_wps_r_snonce2 = -1; +static gint ett_eap_wps_selected_registrar = -1; +static gint ett_eap_wps_serial_number = -1; +static gint ett_eap_wps_wifi_protected_setup_state = -1; +static gint ett_eap_wps_ssid = -1; +static gint ett_eap_wps_total_networks = -1; +static gint ett_eap_wps_uuid_e = -1; +static gint ett_eap_wps_uuid_r = -1; +static gint ett_eap_wps_vendor_extension = -1; +static gint ett_eap_wps_version = -1; +static gint ett_eap_wps_x509_certificate_request = -1; +static gint ett_eap_wps_x509_certificate = -1; +static gint ett_eap_wps_eap_identity = -1; +static gint ett_eap_wps_message_counter = -1; +static gint ett_eap_wps_public_key_hash = -1; +static gint ett_eap_wps_rekey_key = -1; +static gint ett_eap_wps_key_lifetime = -1; +static gint ett_eap_wps_permitted_config_methods = -1; +static gint ett_eap_wps_selected_registrar_config_methods = -1; +static gint ett_eap_wps_primary_device_type = -1; +static gint ett_eap_wps_secondary_device_type_list = -1; +static gint ett_eap_wps_portable_device = -1; +static gint ett_eap_wps_ap_setup_locked = -1; +static gint ett_eap_wps_application_extension = -1; +static gint ett_eap_wps_eap_type = -1; +static gint ett_eap_wps_initialization_vector = -1; +static gint ett_eap_wps_key_provided_automatically = -1; +static gint ett_eap_wps_8021x_enabled = -1; +static gint ett_eap_wps_appsessionkey = -1; +static gint ett_eap_wps_weptransmitkey = -1; + +static const value_string eapwps_tlv_association_state_vals[] = { + { 0, "Not associated" }, + { 1, "Connection success" }, + { 2, "Configuration Failure" }, + { 3, "Association Failure" }, + { 4, "IP Failure" }, + { 0, NULL } +}; + +#define EAPWPS_AUTHTYPE_OPEN 0x1 +#define EAPWPS_AUTHTYPE_WPAPSK 0x2 +#define EAPWPS_AUTHTYPE_SHARED 0x4 +#define EAPWPS_AUTHTYPE_WPA 0x8 +#define EAPWPS_AUTHTYPE_WPA2 0x10 +#define EAPWPS_AUTHTYPE_WPA2PSK 0x20 + +static const value_string eapwps_tlv_authentication_type_vals[] = { + { EAPWPS_AUTHTYPE_OPEN, "Open" }, + { EAPWPS_AUTHTYPE_WPA2PSK, "WPA PSK" }, + { EAPWPS_AUTHTYPE_SHARED, "Shared" }, + { EAPWPS_AUTHTYPE_WPA, "WPA" }, + { EAPWPS_AUTHTYPE_WPA2, "WPA2" }, + { EAPWPS_AUTHTYPE_WPA2PSK, "WPA2 PSK" }, + { 0, NULL } +}; + +#define EAPWPS_CONFMETH_USBA 0x1 +#define EAPWPS_CONFMETH_ETHERNET 0x2 +#define EAPWPS_CONFMETH_LABEL 0x4 +#define EAPWPS_CONFMETH_DISPLAY 0x8 +#define EAPWPS_CONFMETH_NFCEXT 0x10 +#define EAPWPS_CONFMETH_NFCINT 0x20 +#define EAPWPS_CONFMETH_NFCINF 0x40 +#define EAPWPS_CONFMETH_PUSHBUTTON 0x80 +#define EAPWPS_CONFMETH_KEYPAD 0x100 + +static const value_string eapwps_tlv_configuration_error_vals[] = { + { 0, "No Error" }, + { 1, "OOB Interface Read Error" }, + { 2, "Decryption CRC Failure" }, + { 3, "2.4 channel not supported" }, + { 4, "5.0 channel not supported" }, + { 5, "Signal too weak" }, + { 6, "Network auth failure" }, + { 7, "Network association failure" }, + { 8, "No DHCP response" }, + { 9, "failed DHCP config" }, + { 10, "IP address conflict" }, + { 11, "Couldn't connect to Registrar" }, + { 12, "Multiple PBC sessions detected" }, + { 13, "Rogue activity suspected" }, + { 14, "Device busy" }, + { 15, "Setup locked" }, + { 16, "Message Timeout" }, + { 17, "Registration Session Timeout" }, + { 18, "Device Password Auth Failure" }, + { 0, NULL } +}; + +#define EAPWPS_CONNTYPE_ESS 0x1 +#define EAPWPS_CONNTYPE_IBSS 0x2 + +static const value_string eapwps_tlv_connection_type_vals[] = { + { EAPWPS_CONNTYPE_ESS, "ESS" }, + { EAPWPS_CONNTYPE_IBSS, "IBSS" }, +}; + +#define EAPWPS_DEVPW_PIN 0x0 +#define EAPWPS_DEVPW_USER 0x1 +#define EAPWPS_DEVPW_MACHINE 0x2 +#define EAPWPS_DEVPW_REKEY 0x3 +#define EAPWPS_DEVPW_PUSHBUTTON 0x4 +#define EAPWPS_DEVPW_REGISTRAR 0x5 + +static const value_string eapwps_tlv_device_password_id_vals[] = { + { EAPWPS_DEVPW_PIN, "PIN (default)" }, + { EAPWPS_DEVPW_USER, "User specified" }, + { EAPWPS_DEVPW_MACHINE, "Machine specified" }, + { EAPWPS_DEVPW_REKEY, "Rekey" }, + { EAPWPS_DEVPW_PUSHBUTTON, "PushButton" }, + { EAPWPS_DEVPW_REGISTRAR, "Registrar specified" }, + { 0, NULL } +}; + +#define EAPWPS_ENCTYPE_NONE 0x1 +#define EAPWPS_ENCTYPE_WEP 0x2 +#define EAPWPS_ENCTYPE_TKIP 0x4 +#define EAPWPS_ENCTYPE_AES 0x8 + +static const value_string eapwps_tlv_encryption_type_vals[] = { + { EAPWPS_ENCTYPE_NONE, "none" }, + { EAPWPS_ENCTYPE_WEP, "WEP" }, + { EAPWPS_ENCTYPE_TKIP, "TKIP" }, + { EAPWPS_ENCTYPE_AES, "AES" }, + { 0, NULL } +}; + +static const value_string eapwps_tlv_message_type_vals[] = { + { 0x01, "Beacon" }, + { 0x02, "Probe Request" }, + { 0x03, "Probe Response" }, + { 0x04, "M1" }, + { 0x05, "M2" }, + { 0x06, "M2D" }, + { 0x07, "M3" }, + { 0x08, "M4" }, + { 0x09, "M5" }, + { 0x0A, "M6" }, + { 0x0B, "M7" }, + { 0x0C, "M8" }, + { 0x0D, "WSC_ACK" }, + { 0x0E, "WSC_NACK" }, + { 0x0F, "WSC_DONE" }, + { 0, NULL } +}; + + +static const value_string eapwps_tlv_request_type_vals[] = { + { 0x00, "Enrollee, Info only" }, + { 0x01, "Enrollee, open 802.1X" }, + { 0x02, "Registrar" }, + { 0x03, "WLAN Manager Registrar" }, + { 0, NULL } +}; + +static const value_string eapwps_tlv_response_type_vals[] = { + { 0x00, "Enrollee, Info only" }, + { 0x01, "Enrollee, open 802.1X" }, + { 0x02, "Registrar" }, + { 0x03, "AP" }, + { 0, NULL } +}; + +static const value_string eapwps_tlv_rf_bands_vals[] = { + { 0x01, "2.4 GHz" }, + { 0x02, "5 GHz" }, + { 0, NULL } +}; + +static const value_string eapwps_tlv_wifi_protected_setup_state[] = { + { 0x00, "Reserved" }, + { 0x01, "Not configured" }, + { 0x02, "Configured" }, + { 0, NULL } +}; + +/* ********************************************************************** */ +/* pinfo may be NULL ! */ +/* ********************************************************************** */ +static void +dissect_wps_config_methods(proto_tree *root, tvbuff_t* tvb, int offset, + gint _U_ size, packet_info _U_ *pinfo) +{ + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_usba, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_ethernet, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_label, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_display, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_nfcext, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_nfcint, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_nfcinf, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_pushbutton, tvb, offset+4, 2, FALSE); + proto_tree_add_item(root, hf_eapwps_tlv_config_methods_keypad, tvb, offset+4, 2, FALSE); +} + +/* ********************************************************************** */ +/* pinfo may be NULL ! */ +/* ********************************************************************** */ +void +dissect_wps_tlvs(proto_tree *eap_tree, tvbuff_t *tvb, int offset, + gint size, packet_info* pinfo) +{ + + while(size > 0) { + + guint16 tlv_len = 0; + guint16 tlv_type = 0; + + proto_item* tlv_item = NULL; /* the root item */ + proto_tree* tlv_root = NULL; + + int hfindex = -1; + proto_item* tmp_item = NULL; + + tlv_type = tvb_get_ntohs(tvb, offset); + tlv_len = tvb_get_ntohs(tvb, offset+2); + + /* TOP Node for each TLV-item */ + tlv_item = proto_tree_add_text(eap_tree, tvb, offset, tlv_len+4, ""); + tlv_root = proto_item_add_subtree(tlv_item, ett_wps_tlv); + + /* analog to Tagged parameters in 802.11 */ + proto_tree_add_item(tlv_root, hf_eapwps_tlv_type, tvb, offset, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_len, tvb, offset+2, 2, FALSE); + + switch(tlv_type) { + case WPS_TLV_TYPE_AP_CHANNEL: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_ap_channel, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_ap_channel; + + break; + + case WPS_TLV_TYPE_ASSOCIATION_STATE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_association_state, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_association_state; + + break; + + case WPS_TLV_TYPE_AUTHENTICATION_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_authentication_type; + + break; + + case WPS_TLV_TYPE_AUTHENTICATION_TYPE_FLAGS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_authentication_type_flags; + + proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags_open, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags_wpapsk, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags_shared, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags_wpa, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags_wpa2, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_authentication_type_flags_wpa2psk, tvb, offset+4, 2, FALSE); + + break; + + case WPS_TLV_TYPE_AUTHENTICATOR: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_authenticator, tvb, offset+4, 8, FALSE); + hfindex = hf_eapwps_tlv_authenticator; + + proto_item_append_text(tmp_item, " (1st 64 bits of HMAC)"); + break; + + case WPS_TLV_TYPE_CONFIG_METHODS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_config_methods; + + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_usba, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_ethernet, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_label, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_display, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_nfcext, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_nfcint, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_nfcinf, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_pushbutton, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_config_methods_keypad, tvb, offset+4, 2, FALSE); + + break; + + case WPS_TLV_TYPE_CONFIGURATION_ERROR: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_configuration_error, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_configuration_error; + + break; + + case WPS_TLV_TYPE_CONFIRMATION_URL4: /* max len is 64, check this here ? */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_confirmation_url4, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_confirmation_url4; + + break; + + case WPS_TLV_TYPE_CONFIRMATION_URL6: /* max len is 76, check this here ? */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_confirmation_url6, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_confirmation_url6; + + break; + + case WPS_TLV_TYPE_CONNECTION_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_connection_type, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_connection_type; + + break; + + case WPS_TLV_TYPE_CONNECTION_TYPE_FLAGS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_connection_type_flags, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_connection_type_flags; + + proto_tree_add_item(tlv_root, hf_eapwps_tlv_connection_type_flags_ess, tvb, offset+4, 1, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_connection_type_flags_ibss, tvb, offset+4, 1, FALSE); + + break; + + case WPS_TLV_TYPE_CREDENTIAL: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_credential, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_credential; + + break; + + case WPS_TLV_TYPE_DEVICE_NAME: /* len <= 32, check ? */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_device_name, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_device_name; + + break; + + case WPS_TLV_TYPE_DEVICE_PASSWORD_ID: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_device_password_id, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_device_password_id; + + break; + + case WPS_TLV_TYPE_E_HASH1: + /* assert tlv_len == 32 */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_e_hash1, tvb, offset+4, 32, FALSE); + hfindex = hf_eapwps_tlv_e_hash1; + + break; + + case WPS_TLV_TYPE_E_HASH2: + /* assert tlv_len == 32 */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_e_hash2, tvb, offset+4, 32, FALSE); + hfindex = hf_eapwps_tlv_e_hash2; + + break; + + case WPS_TLV_TYPE_E_SNONCE1: + /* assert tlv_len == 16 */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_e_snonce1, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_e_snonce1; + + break; + + case WPS_TLV_TYPE_E_SNONCE2: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_e_snonce2, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_e_snonce2; + + break; + + case WPS_TLV_TYPE_ENCRYPTED_SETTINGS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_encrypted_settings, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_encrypted_settings; + + break; + + case WPS_TLV_TYPE_ENCRYPTION_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_encryption_type, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_encryption_type; + + break; + + case WPS_TLV_TYPE_ENCRYPTION_TYPE_FLAGS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_encryption_type_flags, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_encryption_type_flags; + + proto_tree_add_item(tlv_root, hf_eapwps_tlv_encryption_type_flags_none, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_encryption_type_flags_wep, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_encryption_type_flags_tkip, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_encryption_type_flags_aes, tvb, offset+4, 2, FALSE); + + break; + + case WPS_TLV_TYPE_ENROLLEE_NONCE: + /* assert tlv_len == 16 */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_enrollee_nonce, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_enrollee_nonce; + + break; + + case WPS_TLV_TYPE_FEATURE_ID: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_feature_id, tvb, offset+4, 4, FALSE); + hfindex = hf_eapwps_tlv_feature_id; + + break; + + case WPS_TLV_TYPE_IDENTITY: + /* check that tlv_len <= 80 */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_identity, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_identity; + + break; + + case WPS_TLV_TYPE_IDENTITY_PROOF: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_identity_proof, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_identity_proof; + + break; + + case WPS_TLV_TYPE_KEY_WRAP_AUTHENTICATOR: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_key_wrap_authenticator, tvb, offset+4, 8, FALSE); + hfindex = hf_eapwps_tlv_key_wrap_authenticator; + + break; + + case WPS_TLV_TYPE_KEY_IDENTIFIER: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_key_identifier, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_key_identifier; + + break; + + case WPS_TLV_TYPE_MAC_ADDRESS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_mac_address, tvb, offset+4, 6, FALSE); + hfindex = hf_eapwps_tlv_mac_address; + + break; + + case WPS_TLV_TYPE_MANUFACTURER: + /* check tlv_len <= 64 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_manufacturer, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_manufacturer; + + break; + + case WPS_TLV_TYPE_MESSAGE_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_message_type, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_message_type; + if (pinfo != NULL && check_col(pinfo->cinfo, COL_INFO)) + col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str(tvb_get_guint8(tvb, offset+4), + eapwps_tlv_message_type_vals, + "Unknown (0x%02x)")); + break; + + case WPS_TLV_TYPE_MODEL_NAME: + /* check tlv_len <= 32 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_model_name, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_model_name; + + break; + + case WPS_TLV_TYPE_MODEL_NUMBER: + /* check tlv_len <= 32 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_model_number, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_model_number; + + break; + + case WPS_TLV_TYPE_NETWORK_INDEX: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_network_index, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_network_index; + + break; + + case WPS_TLV_TYPE_NETWORK_KEY: + /* check tlv_len <= 64 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_network_key, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_network_key; + + break; + + case WPS_TLV_TYPE_NETWORK_KEY_INDEX: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_network_key_index, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_network_key_index; + + break; + + case WPS_TLV_TYPE_NEW_DEVICE_NAME: + /* check tlv_len <= 32 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_new_device_name, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_new_device_name; + + break; + + case WPS_TLV_TYPE_NEW_PASSWORD: + /* check tlv_len <= 64 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_new_password, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_new_password; + + break; + + case WPS_TLV_TYPE_OOB_DEVICE_PASSWORD: + /* check tlv_len <= 56 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_oob_device_password, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_oob_device_password; + + break; + + case WPS_TLV_TYPE_OS_VERSION: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_os_version, tvb, offset+4, 4, FALSE); + hfindex = hf_eapwps_tlv_os_version; + + break; + + case WPS_TLV_TYPE_POWER_LEVEL: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_power_level, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_power_level; + + break; + + case WPS_TLV_TYPE_PSK_CURRENT: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_psk_current, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_psk_current; + + break; + + case WPS_TLV_TYPE_PSK_MAX: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_psk_max, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_psk_max; + + break; + + case WPS_TLV_TYPE_PUBLIC_KEY: + /* check tlv_len == 192 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_public_key, tvb, offset+4, 192, FALSE); + hfindex = hf_eapwps_tlv_public_key; + + break; + + case WPS_TLV_TYPE_RADIO_ENABLED: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_radio_enabled, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_radio_enabled; + + break; + + case WPS_TLV_TYPE_REBOOT: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_reboot, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_reboot; + + break; + + case WPS_TLV_TYPE_REGISTRAR_CURRENT: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_registrar_current, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_registrar_current; + + break; + + case WPS_TLV_TYPE_REGISTRAR_ESTABLISHED: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_registrar_established, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_registrar_established; + + break; + + case WPS_TLV_TYPE_REGISTRAR_LIST: + /* NYI: list is */ + /* - 16 bytes uuid */ + /* - NULL-Terminated device name string */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_registrar_list, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_registrar_list; + + break; + + case WPS_TLV_TYPE_REGISTRAR_MAX: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_registrar_max, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_registrar_max; + + break; + + case WPS_TLV_TYPE_REGISTRAR_NONCE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_registrar_nonce, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_registrar_nonce; + + break; + + case WPS_TLV_TYPE_REQUEST_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_request_type, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_request_type; + + break; + + case WPS_TLV_TYPE_RESPONSE_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_response_type, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_response_type; + + break; + + case WPS_TLV_TYPE_RF_BANDS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_rf_bands, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_rf_bands; + + break; + + case WPS_TLV_TYPE_R_HASH1: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_r_hash1, tvb, offset+4, 32, FALSE); + hfindex = hf_eapwps_tlv_r_hash1; + + break; + + case WPS_TLV_TYPE_R_HASH2: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_r_hash2, tvb, offset+4, 32, FALSE); + hfindex = hf_eapwps_tlv_r_hash2; + + break; + + case WPS_TLV_TYPE_R_SNONCE1: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_r_snonce1, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_r_snonce1; + + break; + + case WPS_TLV_TYPE_R_SNONCE2: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_r_snonce2, tvb, offset+4, 16, FALSE); + hfindex = hf_eapwps_tlv_r_snonce2; + + break; + + case WPS_TLV_TYPE_SELECTED_REGISTRAR: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_selected_registrar, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_selected_registrar; + + break; + + case WPS_TLV_TYPE_SERIAL_NUMBER: + /* check tlv_len <= 32 bytes */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_serial_number, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_serial_number; + + break; + + case WPS_TLV_TYPE_WIFI_PROTECTED_SETUP_STATE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_wifi_protected_setup_state, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_wifi_protected_setup_state; + + break; + + case WPS_TLV_TYPE_SSID: + /* check tlv_len <= 32 bytes */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_ssid, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_ssid; + + break; + + case WPS_TLV_TYPE_TOTAL_NETWORKS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_total_networks, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_total_networks; + + break; + + case WPS_TLV_TYPE_UUID_E: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_uuid_e, tvb, offset+4, 8, FALSE); + hfindex = hf_eapwps_tlv_uuid_e; + + break; + + case WPS_TLV_TYPE_UUID_R: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_uuid_r, tvb, offset+4, 8, FALSE); + hfindex = hf_eapwps_tlv_uuid_r; + + break; + + case WPS_TLV_TYPE_VENDOR_EXTENSION: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_vendor_extension, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_vendor_extension; + + break; + + case WPS_TLV_TYPE_VERSION: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_version, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_version; + + break; + + case WPS_TLV_TYPE_X509_CERTIFICATE_REQUEST: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_x509_certificate_request, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_x509_certificate_request; + + break; + + case WPS_TLV_TYPE_X509_CERTIFICATE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_x509_certificate, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_x509_certificate; + + break; + + case WPS_TLV_TYPE_EAP_IDENTITY: + /* check tlv_len <= 64 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_eap_identity, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_eap_identity; + + break; + + case WPS_TLV_TYPE_MESSAGE_COUNTER: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_message_counter, tvb, offset+4, 8, FALSE); + hfindex = hf_eapwps_tlv_message_counter; + + break; + + case WPS_TLV_TYPE_PUBLIC_KEY_HASH: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_public_key_hash, tvb, offset+4, 20, FALSE); + hfindex = hf_eapwps_tlv_public_key_hash; + + break; + + case WPS_TLV_TYPE_REKEY_KEY: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_rekey_key, tvb, offset+4, 32, FALSE); + hfindex = hf_eapwps_tlv_rekey_key; + + break; + + case WPS_TLV_TYPE_KEY_LIFETIME: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_key_lifetime, tvb, offset+4, 4, FALSE); + hfindex = hf_eapwps_tlv_key_lifetime; + + break; + + case WPS_TLV_TYPE_PERMITTED_CONFIG_METHODS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_permitted_config_methods, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_permitted_config_methods; + + dissect_wps_config_methods(tlv_root, tvb, offset, size, pinfo); + + break; + + case WPS_TLV_TYPE_SELECTED_REGISTRAR_CONFIG_METHODS: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_selected_registrar_config_methods, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_selected_registrar_config_methods; + + dissect_wps_config_methods(tlv_root, tvb, offset, size, pinfo); + + break; + + case WPS_TLV_TYPE_PRIMARY_DEVICE_TYPE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_primary_device_type, tvb, offset+4, 8, FALSE); + hfindex = hf_eapwps_tlv_primary_device_type; + + /* NYI: Implement vals for OUI==WFA */ + proto_tree_add_item(tlv_root, hf_eapwps_tlv_primary_device_type_category, tvb, offset+4, 2, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_primary_device_type_oui, tvb, offset+6, 4, FALSE); + proto_tree_add_item(tlv_root, hf_eapwps_tlv_primary_device_type_subcategory,tvb, offset+10, 2, FALSE); + + break; + + case WPS_TLV_TYPE_SECONDARY_DEVICE_TYPE_LIST: + /* check tlv_len <= 128 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_secondary_device_type_list, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_secondary_device_type_list; + + break; + + case WPS_TLV_TYPE_PORTABLE_DEVICE: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_portable_device, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_portable_device; + + break; + + case WPS_TLV_TYPE_AP_SETUP_LOCKED: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_ap_setup_locked, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_ap_setup_locked; + + break; + + case WPS_TLV_TYPE_APPLICATION_EXTENSION: + /* check tlv_len <= 512 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_application_extension, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_application_extension; + + break; + + case WPS_TLV_TYPE_EAP_TYPE: + /* check tlv_len <= 8 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_eap_type, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_eap_type; + + break; + + case WPS_TLV_TYPE_INITIALIZATION_VECTOR: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_initialization_vector, tvb, offset+4, 32, FALSE); + hfindex = hf_eapwps_tlv_initialization_vector; + + break; + + case WPS_TLV_TYPE_KEY_PROVIDED_AUTOMATICALLY: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_key_provided_automatically, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_key_provided_automatically; + + break; + + case WPS_TLV_TYPE_8021X_ENABLED: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_8021x_enabled, tvb, offset+4, 2, FALSE); + hfindex = hf_eapwps_tlv_8021x_enabled; + + break; + + case WPS_TLV_TYPE_APPSESSIONKEY: + /* check tlv_len <= 128 byte */ + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_appsessionkey, tvb, offset+4, tlv_len, FALSE); + hfindex = hf_eapwps_tlv_appsessionkey; + + break; + + case WPS_TLV_TYPE_WEPTRANSMITKEY: + tmp_item = proto_tree_add_item(tlv_root, hf_eapwps_tlv_weptransmitkey, tvb, offset+4, 1, FALSE); + hfindex = hf_eapwps_tlv_weptransmitkey; + + break; + default: + /* do something usefull ? */ + tmp_item = NULL; + hfindex = -1; + } + + if (tmp_item != NULL && tlv_item != NULL) { + /* make the tree look nicer :-) */ + /* tmp_item -> a proto_item specific to the _value_ */ + /* tlv_item -> root-item grouping */ + /* - "Data Element Type" */ + /* - "Date Element Length" */ + /* - tmp_item */ + guint32 value = -1; + void* valuep = NULL; + header_field_info* hf_info = NULL; + char* fmt = NULL; + + proto_item_append_text(tlv_item, + "%s", + val_to_str(tlv_type, eapwps_tlv_types, "Unknown (0x%04x)")); + + /* Rendered strings for value. Thanks to Stig Bjorlykke */ + hf_info = proto_registrar_get_nth(hfindex); + if (hf_info != NULL) { + switch(hf_info->type) { + case FT_UINT8: + fmt = hf_info->strings ? ": %s (0x%02x)": ": 0x%02x"; + value = tvb_get_guint8 (tvb, offset+4); + break; + case FT_UINT16: + fmt = hf_info->strings ? ": %s (0x%04x)": ": 0x%04x"; + value = tvb_get_ntohs (tvb, offset+4); + break; + case FT_UINT32: + fmt = hf_info->strings ? ": %s (0x%08x)": ": 0x%08x"; + value = tvb_get_ntohl (tvb, offset+4); + break; + case FT_STRING: + fmt = ": %s"; + valuep = tvb_get_ephemeral_string(tvb, offset+4, tlv_len); + break; + default: + /* make compiler happy */ + break; + } + } + + if (hf_info != NULL && hf_info->strings) { + /* item has value_string */ + proto_item_append_text(tlv_item, fmt, val_to_str(value, + hf_info->strings, + "Unknown: %d"), value); + } else if (valuep != NULL) { + /* the string-case */ + proto_item_append_text(tlv_item, fmt, valuep); + } else if (fmt != NULL) { + /* field is FT_UINT(8|16|32) but has no value_string */ + proto_item_append_text(tlv_item, fmt, value); + } else { + /* field is either FT_ETHER or FT_BYTES, dont do anything */ + } + + } + + offset += tlv_len + 2 + 2; + size -= tlv_len + 2 + 2; + } +} + +/********************************************************************** */ +/********************************************************************** */ +void +dissect_exteap_wps(proto_tree *eap_tree, tvbuff_t *tvb, int offset, + gint size, packet_info* pinfo) +{ + proto_item* pi; + proto_tree* pt; + guint8 flags; + + pi = proto_tree_add_item(eap_tree, hf_eapwps_opcode, tvb, offset, 1, FALSE); + offset += 1; size -= 1; + + pi = proto_item_get_parent(pi); + if (pi != NULL) + proto_item_append_text(pi, " (Wifi Allicance, WifiProtectedSetup)"); + if (pinfo != NULL && check_col(pinfo->cinfo, COL_INFO)) + col_append_fstr(pinfo->cinfo, COL_INFO, ", WPS"); + + + /* Flag field, if msg-len flag set, add approriate field */ + flags = tvb_get_guint8(tvb,offset); + pi = proto_tree_add_item(eap_tree, hf_eapwps_flags, tvb, offset, 1, FALSE); + pt = proto_item_add_subtree(pi, ett_eap_wps_flags); + + proto_tree_add_item(pt, hf_eapwps_flag_mf, tvb, offset, 1, FALSE); + proto_tree_add_item(pt, hf_eapwps_flag_lf, tvb, offset, 1, FALSE); + offset += 1; size -= 1; + + if (flags & MASK_WSC_FLAG_LF) { + /* length field is present in first eap-packet when msg is fragmented */ + proto_tree_add_item(eap_tree, hf_eapwps_msglen, tvb, offset, 2, FALSE); + offset += 2; size -= 2; + } + + dissect_wps_tlvs(eap_tree, tvb, offset, size, pinfo); +} + +/********************************************************************** */ +/********************************************************************** */ +void +proto_register_wps(void) +{ + static hf_register_info hf[] = { + + /* These data-elements are sent in EAP-Pakets using expanded types */ + /* (see RFC3748 Section 5.7) */ + /* Paket dissections is done here and not in (packet-eap) as */ + /* both (tlvs and fields named eap.wps.*) are defined by */ + /* WifiAlliance */ + { &hf_eapwps_opcode, + { "Opcode", "eap.wps.code", + FT_UINT8, BASE_DEC, VALS(eapwps_opcode_vals), 0x0, + "WSC Message Type", HFILL }}, + { &hf_eapwps_flags, + { "Flags", "eap.wps.flags", + FT_UINT8, BASE_HEX, NULL, 0x0, + "Flags", HFILL }}, + { &hf_eapwps_flag_mf, + { "More flag", "eap.wps.flags.more", + FT_BOOLEAN, BASE_HEX, NULL, MASK_WSC_FLAG_MF, + "More flag", HFILL }}, + { &hf_eapwps_flag_lf, + { "Length field present", "eap.wps.flags.length", + FT_BOOLEAN, BASE_HEX, NULL, MASK_WSC_FLAG_LF, + "Length field present", HFILL }}, + { &hf_eapwps_msglen, + { "Length field", "eap.wps.msglen", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Length field", HFILL }}, + + /* TLV encoded data which may be contained in */ + /* 802.11 Management frames and EAP-extended type */ + { &hf_eapwps_tlv_type, + { "Data Element Type", "wps.type", + FT_UINT16, BASE_HEX, VALS(eapwps_tlv_types), 0x0, + "Data Element Type", HFILL }}, + { &hf_eapwps_tlv_len, + { "Data Element Length", "wps.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Data Element Length", HFILL }}, + + { &hf_eapwps_tlv_ap_channel, + { "AP Channel", "wps.ap_channel", + FT_UINT16, BASE_DEC, NULL, 0x0, + "AP Channel", HFILL }}, + { &hf_eapwps_tlv_association_state, + { "Association State", "wps.association_state", + FT_UINT16, BASE_HEX, VALS(eapwps_tlv_association_state_vals), 0x0, + "Association State", HFILL }}, + + { &hf_eapwps_tlv_authentication_type, + { "Authentication Type", "wps.authentication_type", + FT_UINT16, BASE_HEX, VALS(eapwps_tlv_authentication_type_vals), 0x0, + "Authentication Type", HFILL }}, + + { &hf_eapwps_tlv_authentication_type_flags, + { "Authentication Type Flags", "wps.authentication_type_flags", + FT_UINT16, BASE_HEX, NULL, 0x0, "Authentication Type Flags", HFILL }}, + { &hf_eapwps_tlv_authentication_type_flags_open, + { "Open", "wps.authentication_type.open", + FT_UINT16, BASE_HEX, NULL, EAPWPS_AUTHTYPE_OPEN, "Open", HFILL }}, + { &hf_eapwps_tlv_authentication_type_flags_wpapsk, + { "WPA PSK", "wps.authentication_type.wpapsk", + FT_UINT16, BASE_HEX, NULL, EAPWPS_AUTHTYPE_WPAPSK, "WPA PSK", HFILL }}, + { &hf_eapwps_tlv_authentication_type_flags_shared, + { "Shared", "wps.authentication_type.shared", + FT_UINT16, BASE_HEX, NULL, EAPWPS_AUTHTYPE_SHARED, "Shared", HFILL }}, + { &hf_eapwps_tlv_authentication_type_flags_wpa, + { "WPA", "wps.authentication_type.wpa", + FT_UINT16, BASE_HEX, NULL, EAPWPS_AUTHTYPE_WPA, "WPA", HFILL }}, + { &hf_eapwps_tlv_authentication_type_flags_wpa2, + { "WPA2", "wps.authentication_type.wpa2", + FT_UINT16, BASE_HEX, NULL, EAPWPS_AUTHTYPE_WPA2, "WPA2", HFILL }}, + { &hf_eapwps_tlv_authentication_type_flags_wpa2psk, + { "WPA2PSK", "wps.authentication_type.wpa2psk", + FT_UINT16, BASE_HEX, NULL, EAPWPS_AUTHTYPE_WPA2PSK, "WPA2PSK", HFILL }}, + + { &hf_eapwps_tlv_authenticator, + { "Authenticator", "wps.authenticator", + FT_BYTES, BASE_HEX, NULL, 0x0, "Authenticator", HFILL }}, + + { &hf_eapwps_tlv_config_methods, + { "Configuration Methods", "wps.config_methods", + FT_UINT16, BASE_HEX, NULL, 0x0, "Configuration Methods", HFILL }}, + { &hf_eapwps_tlv_config_methods_usba, + { "USB", "wps.config_methods.usba", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_USBA, "USB", HFILL }}, + { &hf_eapwps_tlv_config_methods_ethernet, + { "Ethernet", "wps.config_methods.ethernet", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_ETHERNET, "Ethernet", HFILL }}, + { &hf_eapwps_tlv_config_methods_label, + { "Label", "wps.config_methods.label", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_LABEL, "Label", HFILL }}, + { &hf_eapwps_tlv_config_methods_display, + { "Display", "wps.config_methods.display", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_DISPLAY, "Display", HFILL }}, + { &hf_eapwps_tlv_config_methods_nfcext, + { "External NFC", "wps.config_methods.nfcext", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_NFCEXT, "External NFC", HFILL }}, + { &hf_eapwps_tlv_config_methods_nfcint, + { "Internal NFC", "wps.config_methods.nfcint", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_NFCINT, "Internal NFC", HFILL }}, + { &hf_eapwps_tlv_config_methods_nfcinf, + { "NFC Interface", "wps.config_methods.nfcinf", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_NFCINF, "NFC Interface", HFILL }}, + { &hf_eapwps_tlv_config_methods_pushbutton, + { "Push Button", "wps.config_methods.pushbutton", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_PUSHBUTTON, "Push Button", HFILL }}, + { &hf_eapwps_tlv_config_methods_keypad, + { "Keypad", "wps.config_methods.keypad", + FT_UINT16, BASE_HEX, NULL, EAPWPS_CONFMETH_KEYPAD, "Keypad", HFILL }}, + + + { &hf_eapwps_tlv_configuration_error, + { "Configuration Error", "wps.configuration_error", + FT_UINT16, BASE_HEX, VALS(eapwps_tlv_configuration_error_vals), 0x0, "Configuration Error", HFILL }}, + { &hf_eapwps_tlv_confirmation_url4, + { "Confirmation URL4", "wps.confirmation_url4", + FT_STRING, BASE_HEX, NULL, 0x0, "Confirmation URL4", HFILL }}, + { &hf_eapwps_tlv_confirmation_url6, + { "Confirmation URL6", "wps.confirmation_url6", + FT_STRING, BASE_HEX, NULL, 0x0, "Confirmation URL6", HFILL }}, + + { &hf_eapwps_tlv_connection_type, + { "Connection Type", "wps.connection_type", + FT_UINT8, BASE_HEX, NULL, 0x0, "Connection Type", HFILL }}, + { &hf_eapwps_tlv_connection_type_flags, + { "Connection Types", "wps.connection_type_flags", + FT_UINT8, BASE_HEX, VALS(eapwps_tlv_connection_type_vals), 0x0, "Connection Types", HFILL }}, + { &hf_eapwps_tlv_connection_type_flags_ess, + { "ESS", "wps.connection_type_flags.ess", + FT_UINT8, BASE_HEX, NULL, EAPWPS_CONNTYPE_ESS, "ESS", HFILL }}, + { &hf_eapwps_tlv_connection_type_flags_ibss, + { "IBSS", "wps.connection_type_flags.ibss", + FT_UINT8, BASE_HEX, NULL, EAPWPS_CONNTYPE_IBSS, "IBSS", HFILL }}, + + { &hf_eapwps_tlv_credential, /* Encrypted */ + { "Credential", "wps.credential", + FT_BYTES, BASE_HEX, NULL, 0x0, "Credential", HFILL }}, + + { &hf_eapwps_tlv_device_name, + { "Device Name", "wps.device_name", + FT_STRING, BASE_HEX, NULL, 0x0, "Device Name", HFILL }}, + { &hf_eapwps_tlv_device_password_id, + { "Device Password ID", "wps.device_password_id", + FT_UINT16, BASE_HEX, VALS(eapwps_tlv_device_password_id_vals), 0x0, "Device Password ID", HFILL }}, + + { &hf_eapwps_tlv_e_hash1, + { "Enrollee Hash 1", "wps.e_hash1", + FT_BYTES, BASE_HEX, NULL, 0x0, "Enrollee Hash 1", HFILL }}, + { &hf_eapwps_tlv_e_hash2, + { "Enrollee Hash 2", "wps.e_hash2", + FT_BYTES, BASE_HEX, NULL, 0x0, "Enrollee Hash 2", HFILL }}, + { &hf_eapwps_tlv_e_snonce1, + { "Enrollee SNounce 1", "wps.e_snonce1", + FT_BYTES, BASE_HEX, NULL, 0x0, "Enrollee SNounce 1", HFILL }}, + { &hf_eapwps_tlv_e_snonce2, + { "Enrollee SNounce 2", "wps.e_snonce2", + FT_BYTES, BASE_HEX, NULL, 0x0, "Enrollee SNounce 2", HFILL }}, + + { &hf_eapwps_tlv_encrypted_settings, /* Encrypted ! */ + { "Encrypted Settings", "wps.encrypted_settings", + FT_BYTES, BASE_HEX, NULL, 0x0, "Encrypted Settings", HFILL }}, + + { &hf_eapwps_tlv_encryption_type, + { "Encryption Type", "wps.encryption_type", + FT_UINT16, BASE_HEX, VALS(eapwps_tlv_encryption_type_vals), 0x0, "Encryption Type", HFILL }}, + { &hf_eapwps_tlv_encryption_type_flags, + { "Encryption Type Flags", "wps.encryption_type_flags", + FT_UINT16, BASE_HEX, NULL, 0x0, "Encryption Type Flags", HFILL }}, + { &hf_eapwps_tlv_encryption_type_flags_none, + { "None", "wps.encryption_type_flags.none", + FT_UINT16, BASE_HEX, NULL, EAPWPS_ENCTYPE_NONE, "None", HFILL }}, + { &hf_eapwps_tlv_encryption_type_flags_wep, + { "WEP", "wps.encryption_type_flags.wep", + FT_UINT16, BASE_HEX, NULL, EAPWPS_ENCTYPE_WEP, "WEP", HFILL }}, + { &hf_eapwps_tlv_encryption_type_flags_tkip, + { "TKIP", "wps.encryption_type_flags.tkip", + FT_UINT16, BASE_HEX, NULL, EAPWPS_ENCTYPE_TKIP, "TKIP", HFILL }}, + { &hf_eapwps_tlv_encryption_type_flags_aes, + { "AES", "wps.encryption_type_flags.aes", + FT_UINT16, BASE_HEX, NULL, EAPWPS_ENCTYPE_AES, "AES", HFILL }}, + + { &hf_eapwps_tlv_enrollee_nonce, + { "Enrollee Nonce", "wps.enrollee_nonce", + FT_BYTES, BASE_HEX, NULL, 0x0, "Enrollee Nonce", HFILL }}, + + { &hf_eapwps_tlv_feature_id, + { "Feature ID", "wps.feature_id", + FT_UINT32, BASE_HEX, NULL, 0x0, "Feature ID", HFILL }}, + + { &hf_eapwps_tlv_identity, + { "Identity", "wps.identity", + FT_STRING, BASE_HEX, NULL, 0x0, "Identity", HFILL }}, + { &hf_eapwps_tlv_identity_proof, /* Encrypted ! */ + { "Identity Proof", "wps.identity_proof", + FT_BYTES, BASE_HEX, NULL, 0x0, "Identity Proof", HFILL }}, + + { &hf_eapwps_tlv_key_wrap_authenticator, + { "Key Wrap Authenticator", "wps.key_wrap_authenticator", + FT_BYTES, BASE_HEX, NULL, 0x0, "Key Wrap Authenticator", HFILL }}, + { &hf_eapwps_tlv_key_identifier, + { "Key Identifier", "wps.key_identifier", + FT_BYTES, BASE_HEX, NULL, 0x0, "Key Identifier", HFILL }}, + + { &hf_eapwps_tlv_mac_address, + { "MAC", "wps.mac_address", + FT_ETHER, BASE_HEX, NULL, 0x0, "MAC", HFILL }}, + + { &hf_eapwps_tlv_manufacturer, + { "Manufacturer", "wps.manufacturer", + FT_STRING, BASE_HEX, NULL, 0x0, "Manufacturer", HFILL }}, + + { &hf_eapwps_tlv_message_type, + { "Message Type", "wps.message_type", + FT_UINT8, BASE_HEX, VALS(eapwps_tlv_message_type_vals), 0x0, "Message Type", HFILL }}, + + { &hf_eapwps_tlv_model_name, + { "Model Name", "wps.model_name", + FT_STRING, BASE_HEX, NULL, 0x0, "Model Name", HFILL }}, + { &hf_eapwps_tlv_model_number, + { "Model Number", "wps.model_number", + FT_STRING, BASE_HEX, NULL, 0x0, "Model Number", HFILL }}, + + { &hf_eapwps_tlv_network_index, + { "Network Index", "wps.network_index", + FT_UINT8, BASE_HEX, NULL, 0x0, "Network Index", HFILL }}, + + { &hf_eapwps_tlv_network_key, + { "Network Key", "wps.network_key", + FT_BYTES, BASE_HEX, NULL, 0x0, "Network Key", HFILL }}, + { &hf_eapwps_tlv_network_key_index, + { "Network Key Index", "wps.network_key_index", + FT_UINT8, BASE_HEX, NULL, 0x0, "Network Key Index", HFILL }}, + + { &hf_eapwps_tlv_new_device_name, + { "New Device Name", "wps.new_device_name", + FT_BYTES, BASE_HEX, NULL, 0x0, "New Device Name", HFILL }}, + { &hf_eapwps_tlv_new_password, + { "New Password", "wps.new_password", + FT_BYTES, BASE_HEX, NULL, 0x0, "New Password", HFILL }}, + { &hf_eapwps_tlv_oob_device_password, + { "OOB Device Password", "wps.oob_device_password", + FT_BYTES, BASE_HEX, NULL, 0x0, "OOB Device Password", HFILL }}, + + { &hf_eapwps_tlv_os_version, + { "OS Version", "wps.os_version", + FT_UINT32, BASE_HEX, NULL, 0x0, "OS Version", HFILL }}, + + { &hf_eapwps_tlv_power_level, + { "Power Level", "wps.power_level", + FT_UINT8, BASE_HEX, NULL, 0x0, "Power Level", HFILL }}, + + { &hf_eapwps_tlv_psk_current, + { "PSK Current", "wps.psk_current", + FT_UINT8, BASE_HEX, NULL, 0x0, "PSK Current", HFILL }}, + { &hf_eapwps_tlv_psk_max, + { "PSK Max", "wps.psk_max", + FT_UINT8, BASE_HEX, NULL, 0x0, "PSK Max", HFILL }}, + + { &hf_eapwps_tlv_public_key, + { "Public Key", "wps.public_key", + FT_BYTES, BASE_HEX, NULL, 0x0, "Public Key", HFILL }}, + + { &hf_eapwps_tlv_radio_enabled, /* Add info */ + { "Radio Enabled", "wps.radio_enabled", + FT_UINT16, BASE_HEX, NULL, 0x0, "Radio Enabled", HFILL }}, + { &hf_eapwps_tlv_reboot, /* Add info */ + { "Reboot", "wps.reboot", + FT_UINT16, BASE_HEX, NULL, 0x0, "Reboot", HFILL }}, + + { &hf_eapwps_tlv_registrar_current, + { "Registrar current", "wps.registrar_current", + FT_UINT8, BASE_HEX, NULL, 0x0, "Registrar current", HFILL }}, + { &hf_eapwps_tlv_registrar_established, /* Add info */ + { "Registrar established", "wps.registrar_established", + FT_UINT16, BASE_HEX, NULL, 0x0, "Registrar established", HFILL }}, + { &hf_eapwps_tlv_registrar_list, + { "Registrar list", "wps.registrar_list", + FT_BYTES, BASE_HEX, NULL, 0x0, "Registrar list", HFILL }}, + { &hf_eapwps_tlv_registrar_max, + { "Registrar max", "wps.registrar_max", + FT_UINT8, BASE_HEX, NULL, 0x0, "Registrar max", HFILL }}, + { &hf_eapwps_tlv_registrar_nonce, + { "Registrar Nonce", "wps.registrar_nonce", + FT_BYTES, BASE_HEX, NULL, 0x0, "Registrar Nonce", HFILL }}, + + { &hf_eapwps_tlv_request_type, + { "Request Type", "wps.request_type", + FT_UINT8, BASE_HEX, VALS(eapwps_tlv_request_type_vals), 0x0, "Request Type", HFILL }}, + { &hf_eapwps_tlv_response_type, + { "Response Type", "wps.response_type", + FT_UINT8, BASE_HEX, VALS(eapwps_tlv_response_type_vals), 0x0, "Response Type", HFILL }}, + + { &hf_eapwps_tlv_rf_bands, + { "RF Bands", "wps.rf_bands", + FT_UINT8, BASE_HEX, VALS(eapwps_tlv_rf_bands_vals), 0x0, "RF Bands", HFILL }}, + + { &hf_eapwps_tlv_r_hash1, + { "Registrar Hash 1", "wps.r_hash1", + FT_BYTES, BASE_HEX, NULL, 0x0, "Registrar Hash 1", HFILL }}, + { &hf_eapwps_tlv_r_hash2, + { "Registrar Hash 2", "wps.r_hash2", + FT_BYTES, BASE_HEX, NULL, 0x0, "Registrar Hash 2", HFILL }}, + { &hf_eapwps_tlv_r_snonce1, + { "Registrar Snonce1", "wps.r_snonce1", + FT_BYTES, BASE_HEX, NULL, 0x0, "Registrar Snonce1", HFILL }}, + { &hf_eapwps_tlv_r_snonce2, + { "Registrar Snonce 2", "wps.r_snonce2", + FT_BYTES, BASE_HEX, NULL, 0x0, "Registrar Snonce 2", HFILL }}, + + { &hf_eapwps_tlv_selected_registrar, + { "Selected Registrar", "wps.selected_registrar", + FT_UINT16, BASE_HEX, NULL, 0x0, "Selected Registrar", HFILL }}, + + { &hf_eapwps_tlv_serial_number, + { "Serial Number", "wps.serial_number", + FT_BYTES, BASE_HEX, NULL, 0x0, "Serial Number", HFILL }}, + + { &hf_eapwps_tlv_wifi_protected_setup_state, + { "Wifi Protected Setup State", "wps.wifi_protected_setup_state", + FT_UINT8, BASE_HEX, VALS(eapwps_tlv_wifi_protected_setup_state), 0x0, "Wifi Protected Setup State", HFILL }}, + + { &hf_eapwps_tlv_ssid, + { "SSID", "wps.ssid", + FT_STRING, BASE_HEX, NULL, 0x0, "SSID", HFILL }}, + + { &hf_eapwps_tlv_total_networks, + { "Total Networks", "wps.total_networks", + FT_UINT8, BASE_HEX, NULL, 0x0, "Total Networks", HFILL }}, + + { &hf_eapwps_tlv_uuid_e, + { "UUID Enrollee", "wps.uuid_e", + FT_BYTES, BASE_HEX, NULL, 0x0, "UUID Enrollee", HFILL }}, + { &hf_eapwps_tlv_uuid_r, + { "UUID Registrar", "wps.uuid_r", + FT_BYTES, BASE_HEX, NULL, 0x0, "UUID Registrar", HFILL }}, + + { &hf_eapwps_tlv_vendor_extension, + { "Vendor Extension", "wps.vendor_extension", + FT_BYTES, BASE_HEX, NULL, 0x0, "Vendor Extension", HFILL }}, + + { &hf_eapwps_tlv_version, + { "Version", "wps.version", + FT_UINT8, BASE_HEX, NULL, 0x0, "Version", HFILL }}, + + { &hf_eapwps_tlv_x509_certificate_request, + { "X509 Certificate Request", "wps.x509_certificate_request", + FT_BYTES, BASE_HEX, NULL, 0x0, "X509 Certificate Request", HFILL }}, + { &hf_eapwps_tlv_x509_certificate, + { "X509 Certificate", "wps.x509_certificate", + FT_BYTES, BASE_HEX, NULL, 0x0, "X509 Certificate", HFILL }}, + + { &hf_eapwps_tlv_eap_identity, + { "EAP Identity", "wps.eap_identity", + FT_BYTES, BASE_HEX, NULL, 0x0, "EAP Identity", HFILL }}, + + { &hf_eapwps_tlv_message_counter, + { "Message Counter", "wps.message_counter", + FT_UINT64, BASE_HEX, NULL, 0x0, "Message Counter", HFILL }}, + + { &hf_eapwps_tlv_public_key_hash, + { "Public Key Hash", "wps.public_key_hash", + FT_BYTES, BASE_HEX, NULL, 0x0, "Public Key Hash", HFILL }}, + + { &hf_eapwps_tlv_rekey_key, + { "Rekey Key", "wps.rekey_key", + FT_BYTES, BASE_HEX, NULL, 0x0, "Rekey Key", HFILL }}, + { &hf_eapwps_tlv_key_lifetime, + { "Key Lifetime", "wps.key_lifetime", + FT_UINT32, BASE_HEX, NULL, 0x0, "Key Lifetime", HFILL }}, + + { &hf_eapwps_tlv_permitted_config_methods, + { "Permitted COnfig Methods", "wps.permitted_config_methods", + FT_UINT16, BASE_HEX, NULL, 0x0, "Permitted COnfig Methods", HFILL }}, + + { &hf_eapwps_tlv_selected_registrar_config_methods, + { "Selected Registrar Config Methods", "wps.selected_registrar_config_methods", + FT_UINT16, BASE_HEX, NULL, 0x0, "Selected Registrar Config Methods", HFILL }}, + + { &hf_eapwps_tlv_primary_device_type, + { "Primary Device Type", "wps.primary_device_type", + FT_BYTES, BASE_HEX, NULL, 0x0, "Primary Device Type", HFILL }}, + { &hf_eapwps_tlv_primary_device_type_category, + { "Category", "wps.primary_device_type.category", + FT_UINT16, BASE_HEX, NULL, 0x0, "Category", HFILL }}, + { &hf_eapwps_tlv_primary_device_type_oui, + { "OUI", "wps.primary_device_type.oui", + FT_BYTES, BASE_HEX, NULL, 0x0, "OUI", HFILL }}, + { &hf_eapwps_tlv_primary_device_type_subcategory, + { "Subcategory", "wps.primary_device_type.subcategory", + FT_UINT16, BASE_HEX, NULL, 0x0, "Subcategory", HFILL }}, + + { &hf_eapwps_tlv_secondary_device_type_list, + { "Secondary Device Type List", "wps.secondary_device_type_list", + FT_BYTES, BASE_HEX, NULL, 0x0, "Secondary Device Type List", HFILL }}, + + { &hf_eapwps_tlv_portable_device, /* Add info */ + { "Portable Device", "wps.portable_device", + FT_UINT8, BASE_HEX, NULL, 0x0, "Portable Device", HFILL }}, + { &hf_eapwps_tlv_ap_setup_locked, /* Add info */ + { "AP Setup Locked", "wps.ap_setup_locked", + FT_UINT8, BASE_HEX, NULL, 0x0, "AP Setup Locked", HFILL }}, + + { &hf_eapwps_tlv_application_extension, + { "Application Extension", "wps.application_extension", + FT_BYTES, BASE_HEX, NULL, 0x0, "Application Extension", HFILL }}, + { &hf_eapwps_tlv_eap_type, + { "EAP Type", "wps.eap_type", + FT_BYTES, BASE_HEX, NULL, 0x0, "EAP Type", HFILL }}, + + { &hf_eapwps_tlv_initialization_vector, + { "Initialization Vector", "wps.initialization_vector", + FT_BYTES, BASE_HEX, NULL, 0x0, "Initialization Vector", HFILL }}, + + { &hf_eapwps_tlv_key_provided_automatically, /* Add info */ + { "Key Provided Automatically", "wps.key_provided_automatically", + FT_UINT16, BASE_HEX, NULL, 0x0, "Key Provided Automatically", HFILL }}, + { &hf_eapwps_tlv_8021x_enabled, /* Add info */ + { "8021x Enabled", "wps.8021x_enabled", + FT_UINT16, BASE_HEX, NULL, 0x0, "8021x Enabled", HFILL }}, + + { &hf_eapwps_tlv_appsessionkey, + { "AppSessionKey", "wps.appsessionkey", + FT_BYTES, BASE_HEX, NULL, 0x0, "AppSessionKey", HFILL }}, + { &hf_eapwps_tlv_weptransmitkey, + { "WEP Transmit Key", "wps.weptransmitkey", + FT_UINT8, BASE_HEX, NULL, 0x0, "WEP Transmit Key", HFILL }}, + }; + static gint *ett[] = { + &ett_eap_wps_attr, + &ett_eap_wps_flags, + /* EAP WPS */ + &ett_wps_tlv, + &ett_eap_wps_ap_channel, + &ett_eap_wps_association_state, + &ett_eap_wps_authentication_type, + &ett_eap_wps_authentication_type_flags, + &ett_eap_wps_authenticator, + &ett_eap_wps_config_methods, + &ett_eap_wps_configuration_error, + &ett_eap_wps_confirmation_url4, + &ett_eap_wps_confirmation_url6, + &ett_eap_wps_connection_type, + &ett_eap_wps_connection_type_flags, + &ett_eap_wps_credential, + &ett_eap_wps_device_name, + &ett_eap_wps_device_password_id, + &ett_eap_wps_e_hash1, + &ett_eap_wps_e_hash2, + &ett_eap_wps_e_snonce1, + &ett_eap_wps_e_snonce2, + &ett_eap_wps_encrypted_settings, + &ett_eap_wps_encryption_type, + &ett_eap_wps_encryption_type_flags, + &ett_eap_wps_enrollee_nonce, + &ett_eap_wps_feature_id, + &ett_eap_wps_identity, + &ett_eap_wps_identity_proof, + &ett_eap_wps_key_wrap_authenticator, + &ett_eap_wps_key_identifier, + &ett_eap_wps_mac_address, + &ett_eap_wps_manufacturer, + &ett_eap_wps_message_type, + &ett_eap_wps_model_name, + &ett_eap_wps_model_number, + &ett_eap_wps_network_index, + &ett_eap_wps_network_key, + &ett_eap_wps_network_key_index, + &ett_eap_wps_new_device_name, + &ett_eap_wps_new_password, + &ett_eap_wps_oob_device_password, + &ett_eap_wps_os_version, + &ett_eap_wps_power_level, + &ett_eap_wps_psk_current, + &ett_eap_wps_psk_max, + &ett_eap_wps_public_key, + &ett_eap_wps_radio_enabled, + &ett_eap_wps_reboot, + &ett_eap_wps_registrar_current, + &ett_eap_wps_registrar_established, + &ett_eap_wps_registrar_list, + &ett_eap_wps_registrar_max, + &ett_eap_wps_registrar_nonce, + &ett_eap_wps_request_type, + &ett_eap_wps_response_type, + &ett_eap_wps_rf_bands, + &ett_eap_wps_r_hash1, + &ett_eap_wps_r_hash2, + &ett_eap_wps_r_snonce1, + &ett_eap_wps_r_snonce2, + &ett_eap_wps_selected_registrar, + &ett_eap_wps_serial_number, + &ett_eap_wps_wifi_protected_setup_state, + &ett_eap_wps_ssid, + &ett_eap_wps_total_networks, + &ett_eap_wps_uuid_e, + &ett_eap_wps_uuid_r, + &ett_eap_wps_vendor_extension, + &ett_eap_wps_version, + &ett_eap_wps_x509_certificate_request, + &ett_eap_wps_x509_certificate, + &ett_eap_wps_eap_identity, + &ett_eap_wps_message_counter, + &ett_eap_wps_public_key_hash, + &ett_eap_wps_rekey_key, + &ett_eap_wps_key_lifetime, + &ett_eap_wps_permitted_config_methods, + &ett_eap_wps_selected_registrar_config_methods, + &ett_eap_wps_primary_device_type, + &ett_eap_wps_secondary_device_type_list, + &ett_eap_wps_portable_device, + &ett_eap_wps_ap_setup_locked, + &ett_eap_wps_application_extension, + &ett_eap_wps_eap_type, + &ett_eap_wps_initialization_vector, + &ett_eap_wps_key_provided_automatically, + &ett_eap_wps_8021x_enabled, + &ett_eap_wps_appsessionkey, + &ett_eap_wps_weptransmitkey, + }; + + proto_wps = proto_register_protocol("Wifi Protected Setup", + "WPS", "wps"); + proto_register_field_array(proto_wps, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + +} diff --git a/epan/dissectors/packet-wps.h b/epan/dissectors/packet-wps.h new file mode 100644 index 0000000000..6e5a53c7ee --- /dev/null +++ b/epan/dissectors/packet-wps.h @@ -0,0 +1,47 @@ +/* packet-wps.h + * + * Wifi Simple Config aka Wifi Protected Setup + * + * Written by Jens Braeuer using WiFi-Alliance Spec 1.0h and + * parts of a patch by JP Jiang and Philippe Teuwen. November 2007 + * + * Spec: + * https://www.wi-fi.org/knowledge_center_overview.php?type=4 + * Patch: + * http://wireshark.digimirror.nl/lists/wireshark-dev/200703/msg00121.html + * + * Copyright 2007 Jens Braeuer <jensb@cs.tu-berlin.de> + * + * $Id:$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _packet_wps_h_ +#define _packet_wps_h_ + +void +dissect_exteap_wps(proto_tree *eap_tree, tvbuff_t *tvb, int offset, + gint size, packet_info* pinfo); +void +dissect_wps_tlvs(proto_tree *eap_tree, tvbuff_t *tvb, int offset, + gint size, packet_info* pinfo); + +#endif diff --git a/epan/eap.h b/epan/eap.h index 333e9ebb59..2f77ccb0ef 100644 --- a/epan/eap.h +++ b/epan/eap.h @@ -45,6 +45,7 @@ WS_VAR_IMPORT const value_string eap_code_vals[]; #define EAP_TYPE_PEAP 25 #define EAP_TYPE_MSCHAPV2 26 #define EAP_TYPE_FAST 43 +#define EAP_TYPE_EXT 254 WS_VAR_IMPORT const value_string eap_type_vals[]; |