Update a URL.
[obnox/wireshark/wip.git] / packet-wtls.c
index 10e4b74f8dbb4d80114862022391488f9eb66891..bb9ab14fd0704db822a9876da08d4877b269365a 100644 (file)
@@ -1,12 +1,12 @@
 /* packet-wtls.c
  *
  * Routines to dissect WTLS component of WAP traffic.
- * 
- * $Id: packet-wtls.c,v 1.3 2001/02/19 21:02:33 guy Exp $
+ *
+ * $Id: packet-wtls.c,v 1.23 2003/12/15 22:38:29 obiot Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
- * Copyright 1998 Didier Jorand
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
  *
  * WAP dissector based on original work by Ben Fowler
  * Updated by Neil Hunter <neil.hunter@energis-squared.com>
  * 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.
 #include <stdio.h>
 #include <stdlib.h>
 
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-
 #ifdef NEED_SNPRINTF_H
-# ifdef HAVE_STDARG_H
-#  include <stdarg.h>
-# else
-#  include <varargs.h>
-# endif
 # include "snprintf.h"
 #endif
 
 #include <string.h>
 #include <glib.h>
-#include "packet.h"
+#include <epan/packet.h>
 #include "packet-wap.h"
 #include "packet-wtls.h"
 
@@ -74,17 +61,21 @@ static int hf_wtls_hands_cli_hello_version    = HF_EMPTY;
 static int hf_wtls_hands_cli_hello_gmt                = HF_EMPTY;
 static int hf_wtls_hands_cli_hello_random     = HF_EMPTY;
 static int hf_wtls_hands_cli_hello_session    = HF_EMPTY;
+static int hf_wtls_hands_cli_hello_session_str    = HF_EMPTY;
 static int hf_wtls_hands_cli_hello_cli_key_id    = HF_EMPTY;
-static int hf_wtls_hands_cli_hello_trust_key_id    = HF_EMPTY; 
+static int hf_wtls_hands_cli_hello_cli_key_len    = HF_EMPTY;
+static int hf_wtls_hands_cli_hello_trust_key_id    = HF_EMPTY;
 static int hf_wtls_hands_cli_hello_key_exchange               =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_key_exchange_suite         =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_key_parameter_index                =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_key_parameter_set          =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_key_identifier_type                =HF_EMPTY;
+static int hf_wtls_hands_cli_hello_key_identifier_charset             =HF_EMPTY;
+static int hf_wtls_hands_cli_hello_key_identifier_size                =HF_EMPTY;
+static int hf_wtls_hands_cli_hello_key_identifier                     =HF_EMPTY;
+static int hf_wtls_hands_cli_hello_key_identifier_str                 =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_cipher_suite               =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_cipher_suite_item  =HF_EMPTY;
-static int hf_wtls_hands_cli_hello_cipher_bulk                =HF_EMPTY;
-static int hf_wtls_hands_cli_hello_cipher_mac         =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_compression_methods                =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_compression                =HF_EMPTY;
 static int hf_wtls_hands_cli_hello_sequence_mode      =HF_EMPTY;
@@ -94,6 +85,7 @@ static int hf_wtls_hands_serv_hello_version   = HF_EMPTY;
 static int hf_wtls_hands_serv_hello_gmt               = HF_EMPTY;
 static int hf_wtls_hands_serv_hello_random    = HF_EMPTY;
 static int hf_wtls_hands_serv_hello_session   = HF_EMPTY;
+static int hf_wtls_hands_serv_hello_session_str   = HF_EMPTY;
 static int hf_wtls_hands_serv_hello_cli_key_id                =HF_EMPTY;
 static int hf_wtls_hands_serv_hello_cipher_suite_item =HF_EMPTY;
 static int hf_wtls_hands_serv_hello_cipher_bulk               =HF_EMPTY;
@@ -108,11 +100,13 @@ static int hf_wtls_hands_certificate_wtls_version     =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_signature_type      =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_issuer_type =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_issuer_charset      =HF_EMPTY;
+static int hf_wtls_hands_certificate_wtls_issuer_size =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_issuer_name =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_valid_not_before    =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_valid_not_after     =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_subject_type        =HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_subject_charset     =HF_EMPTY;
+static int hf_wtls_hands_certificate_wtls_subject_size        = HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_subject_name        = HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_public_key_type = HF_EMPTY;
 static int hf_wtls_hands_certificate_wtls_key_parameter_index = HF_EMPTY;
@@ -132,42 +126,38 @@ static gint ett_wtls_msg_type_item                    = ETT_EMPTY;
 static gint ett_wtls_msg_type_item_sub                        = ETT_EMPTY;
 static gint ett_wtls_msg_type_item_sub_sub            = ETT_EMPTY;
 
-/* Handles for WTP and WSP dissectors */
-static dissector_handle_t wtp_handle;
-static dissector_handle_t wsp_handle;
-
 static const value_string wtls_vals_record_type[] = {
-       { 0x01, "change_cipher_data" },
-       { 0x02, "alert" },
-       { 0x03, "handshake" },
-       { 0x04, "application_data" },
-       { 0x00, NULL }
+       { 1, "change_cipher_data" },
+       { 2, "alert" },
+       { 3, "handshake" },
+       { 4, "application_data" },
+       { 0, NULL }
 };
 
 static const value_string wtls_vals_cipher_bulk[] = {
-       { 0x00, "Null" },
-       { 0x01, "RC5 CBC 40" },
-       { 0x02, "RC5 CBC 56" },
-       { 0x03, "RC5 CBC" },
-       { 0x04, "DES CBC 40" },
-       { 0x05, "DES CBC" },
-       { 0x06, "3DES CBC cwEDE40" },
-       { 0x07, "IDEA CBC 40" },
-       { 0x08, "IDEA CBC 56" },
-       { 0x09, "IDEA CBC" },
-       { 0x00, NULL }
+       { 0, "Null" },
+       { 1, "RC5 CBC 40" },
+       { 2, "RC5 CBC 56" },
+       { 3, "RC5 CBC" },
+       { 4, "DES CBC 40" },
+       { 5, "DES CBC" },
+       { 6, "3DES CBC cwEDE40" },
+       { 7, "IDEA CBC 40" },
+       { 8, "IDEA CBC 56" },
+       { 9, "IDEA CBC" },
+       { 0, NULL }
 };
 
 static const value_string wtls_vals_cipher_mac[] = {
-       { 0x00, "SHA 0" },
-       { 0x01, "SHA 40 " },
-       { 0x02, "SHA 80" },
-       { 0x03, "SHA" },
-       { 0x04, "SHA XOR 40" },
-       { 0x05, "MD5 40" },
-       { 0x06, "MD5 80" },
-       { 0x07, "MD5" },
-       { 0x00, NULL }
+       { 0, "SHA 0" },
+       { 1, "SHA 40 " },
+       { 2, "SHA 80" },
+       { 3, "SHA" },
+       { 4, "SHA XOR 40" },
+       { 5, "MD5 40" },
+       { 6, "MD5 80" },
+       { 7, "MD5" },
+       { 0, NULL }
 };
 
 static const value_string wtls_vals_handshake_type[] = {
@@ -211,16 +201,16 @@ static const value_string wtls_vals_identifier_type[] = {
        { 0, "No identifier" },
        { 1, "Textual Name" },
        { 2, "Binary Name" },
-       { 254, "SHA-1 Hash Publie Key" },
+       { 254, "SHA-1 Hash of Public Key" },
        { 255, "x509 Distinguished Name" },
        { 0x00, NULL }
 };
 
 static const value_string wtls_vals_certificate_type[] = {
        { 1, "WTLS" },
-       { 2, "X509" },
-       { 3, "X968" },
-       { 4, "Url" },
+       { 2, "X.509" },
+       { 3, "X.968" },
+       { 4, "URL" },
        { 0x00, NULL }
 };
 
@@ -326,7 +316,6 @@ static void dissect_wtls_handshake (proto_tree *, tvbuff_t *, guint, guint);
 static void
 dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
-       frame_data *fdata = pinfo->fd;
        int offset = 0;
 
        char pdut;
@@ -340,22 +329,22 @@ dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        proto_tree *wtls_rec_tree;
        proto_tree *wtls_msg_type_tree;
 
-       if (check_col(fdata, COL_PROTOCOL)) 
+       if (check_col(pinfo->cinfo, COL_PROTOCOL))
        {
                switch ( pinfo->match_port )
                {
                        case UDP_PORT_WTLS_WSP:
-                               col_set_str(fdata, COL_PROTOCOL, "WTLS+WSP" );
+                               col_set_str(pinfo->cinfo, COL_PROTOCOL, "WTLS+WSP" );
                                break;
                        case UDP_PORT_WTLS_WTP_WSP:
-                               col_set_str(fdata, COL_PROTOCOL, "WTLS+WTP+WSP" );
+                               col_set_str(pinfo->cinfo, COL_PROTOCOL, "WTLS+WTP+WSP" );
                                break;
                }
        }
 
        /* Develop the string to put in the Info column */
-       if (check_col(fdata, COL_INFO)) {
-               col_set_str(fdata, COL_INFO, "WTLS" );
+       if (check_col(pinfo->cinfo, COL_INFO)) {
+               col_set_str(pinfo->cinfo, COL_INFO, "WTLS" );
        };
 
        /* In the interest of speed, if "tree" is NULL, don't do any work not
@@ -363,10 +352,10 @@ dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
        if (tree) {
                ti = proto_tree_add_item(tree, proto_wtls, tvb, offset_wtls,
-                                tvb_length(tvb), bo_little_endian);
+                                -1, bo_little_endian);
                wtls_tree = proto_item_add_subtree(ti, ett_wtls);
 
-               for (offset_wtls=0; offset_wtls < (tvb_length(tvb)-1);) {
+               for (offset_wtls=0; offset_wtls < (tvb_reported_length(tvb)-1);) {
                        pdut = tvb_get_guint8 (tvb, offset_wtls);
 
                        offset = offset_wtls+1;
@@ -380,7 +369,7 @@ dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                count += offset-offset_wtls;
                        }
                        else {
-                               count = tvb_length (tvb)-offset_wtls;
+                               count = tvb_length_remaining (tvb, offset_wtls);
                        }
                        ti = proto_tree_add_uint(wtls_tree, hf_wtls_record, tvb, offset_wtls,
                                 count, pdut);
@@ -407,7 +396,7 @@ dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                offset+=2;
                        }
                        else {
-                               count = tvb_length (tvb)-offset;
+                               count = tvb_length_remaining (tvb, offset);
                        }
 
                        if (pdut & WTLS_RECORD_TYPE_CIPHER_CUR) {
@@ -440,17 +429,41 @@ dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        }
 }
 
+static int
+add_text_identifier(tvbuff_t *tvb, int offset, int hf_charset,
+    int hf_size, int hf_str, proto_tree *tree)
+{
+       guint8 size;
+       int client_size = 0;
+
+       proto_tree_add_item(tree, hf_charset, tvb, offset, 2, bo_big_endian);
+       offset+=2;
+       size = tvb_get_guint8 (tvb, offset);
+       proto_tree_add_item(tree, hf_size, tvb, offset, 1, bo_big_endian);
+       offset++;
+       proto_tree_add_item(tree, hf_str, tvb, offset, size, bo_big_endian);
+       offset+=size;
+       client_size+=size+3;
+#ifdef DEBUG
+       fprintf(stderr, "text id size = %d, client_size = %d\n",
+               size, client_size);
+#endif /* DEBUG */
+       return client_size;
+}
+
 static void
 dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint count)
 {
        char pdu_msg_type;
-       struct timeval timeValue;
+       nstime_t timeValue;
        int client_size = 0;
        guint value = 0;
        int size = 0;
        guint public_key = 0;
        guint signature = 0;
        char valStr[1024];
+        char *valBulk = NULL;
+        char *valMac = NULL;
 
        proto_item *ti;
        proto_item *cli_key_item;
@@ -462,7 +475,7 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
        pdu_msg_type = tvb_get_guint8 (tvb, offset);
        ti = proto_tree_add_uint(tree, hf_wtls_hands, tvb, offset,count, pdu_msg_type);
        wtls_msg_type_tree = proto_item_add_subtree(ti, ett_wtls_msg_type);
-       
+
        ti = proto_tree_add_item (wtls_msg_type_tree, hf_wtls_hands_type,
                        tvb,offset,1,bo_big_endian);
        offset+=1;
@@ -478,8 +491,8 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                        ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_version,
                                        tvb,offset,1,bo_big_endian);
                        offset++;
-                       timeValue.tv_sec = tvb_get_ntohl (tvb, offset);
-                       timeValue.tv_usec = 0;
+                       timeValue.secs = tvb_get_ntohl (tvb, offset);
+                       timeValue.nsecs = 0;
                        ti = proto_tree_add_time (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_gmt, tvb,
                                        offset, 4, &timeValue);
                        offset+=4;
@@ -487,33 +500,77 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                        tvb,offset,12,bo_big_endian);
                        offset+=12;
                        count = tvb_get_guint8(tvb, offset);
-                       ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session,
-                                       tvb,offset,count+1,bo_big_endian);
+                        switch(count) {
+                                case 0:
+                                        ti = proto_tree_add_string (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session_str,
+                                                                        tvb,offset,count+1,"NULL");
+                                        break;
+                                case 1 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_guint8(tvb,offset+1));
+                                        break;
+                                case 2 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_ntohs(tvb,offset+1));
+                                        break;
+                                case 3 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_ntoh24(tvb,offset+1));
+                                        break;
+                                case 4 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_ntohl(tvb,offset+1));
+                                        break;
+                                default:
+                                        ti = proto_tree_add_string (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session_str,
+                                                                        tvb,offset,count+1,"Too big");
+                                        break;
+                        }
                        offset+=1+count;
+
+                       /* process client_key_ids structure */
                        count = tvb_get_ntohs (tvb, offset);
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_cli_hello_cli_key_id, tvb, offset,
                                         count+2, bo_little_endian);
                        wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub);
+
+                       /* display length of client_key_ids structure */
+                       ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
+                                       hf_wtls_hands_cli_hello_cli_key_len,
+                                       tvb,offset,2,bo_big_endian);
                        offset+=2;
+
+                       /* cycle through client_key_ids entries */
                        for (;count > 0;count-=client_size) {
+                               /* get encryption suite id (one byte) */
                                value = tvb_get_guint8 (tvb, offset);
-                               cli_key_item = proto_tree_add_uint(wtls_msg_type_item_sub_tree, 
+                               cli_key_item = proto_tree_add_uint(wtls_msg_type_item_sub_tree,
                                                hf_wtls_hands_cli_hello_key_exchange, tvb, offset,1,
                                                value);
                                client_size=1;
-                               wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item, 
+                               wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item,
                                                                  ett_wtls_msg_type_item_sub_sub);
                                ti = proto_tree_add_uint(wtls_msg_type_item_sub_sub_tree,
                                                hf_wtls_hands_cli_hello_key_exchange_suite,
                                                tvb,offset,1,value);
                                offset++;
+#ifdef DEBUG
+                               fprintf(stderr, "encryption suite = %d, client_size = %d\n", value, client_size);
+#endif /* DEBUG */
+
+                               /* get parameter index (one byte) */
                                value = tvb_get_guint8 (tvb, offset);
                                ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
                                        hf_wtls_hands_cli_hello_key_parameter_index,
                                        tvb,offset,1,bo_big_endian);
                                offset++;
                                client_size++;
+#ifdef DEBUG
+                               fprintf(stderr, "parameter index = %d, client_size = %d\n", value, client_size);
+#endif /* DEBUG */
+
+                               /* explicit parameters present in next field */
                                if (value == 0xff) {
                                        size = tvb_get_ntohs (tvb, offset);
                                        ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
@@ -522,38 +579,127 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                        offset+=size+2;
                                        client_size+=size+2;
                                }
+
+                               /* get identifier type */
                                value = tvb_get_guint8 (tvb, offset);
                                ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
                                                hf_wtls_hands_cli_hello_key_identifier_type,
                                                tvb,offset,1,bo_big_endian);
                                offset++;
                                client_size++;
+#ifdef DEBUG
+                               fprintf(stderr, "identifier type = %d, client_size = %d\n", value, client_size);
+#endif /* DEBUG */
+
+                               /* identifier present in next field */
+                               /* note: value 0x0 means no identifier */
+                               switch(value) {
+                                       case IDENTIFIER_TEXT :
+                                               /* text identifier */
+                                               /* not tested */
+                                               size = add_text_identifier(
+                                                       tvb, offset,
+                                                       hf_wtls_hands_cli_hello_key_identifier_charset,
+                                                       hf_wtls_hands_cli_hello_key_identifier_size,
+                                                       hf_wtls_hands_cli_hello_key_identifier_str,
+                                                       wtls_msg_type_item_sub_sub_tree);
+                                               offset += size;
+                                               client_size += size;
+                                               break;
+                                       case IDENTIFIER_BIN :
+                                               /* binary identifier */
+                                               size = tvb_get_guint8 (tvb, offset);
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier_size,
+                                                               tvb,offset,1,bo_big_endian);
+                                               offset++;
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier,
+                                                               tvb,offset,size,bo_big_endian);
+                                               offset+=size;
+                                               client_size+=size+1;
+#ifdef DEBUG
+                                               fprintf(stderr, "binary id size = %d, client_size = %d\n",
+                                                       size, client_size);
+#endif /* DEBUG */
+                                               break;
+                                       case IDENTIFIER_SHA_1 :
+                                               /* SHA-1 hash of the public key */
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier,
+                                                               tvb,offset,20,bo_big_endian);
+                                               offset+=20;
+                                               client_size+=20;
+#ifdef DEBUG
+                                               fprintf(stderr, "SHA-1 hash size = 20, client_size = %d\n",
+                                                       client_size);
+#endif /* DEBUG */
+                                               break;
+                                       case IDENTIFIER_X509 :
+                                               /* X.509 distinguished name */
+                                               /* not tested */
+                                               size = tvb_get_guint8 (tvb, offset);
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier_size,
+                                                               tvb,offset,1,bo_big_endian);
+                                               offset++;
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier,
+                                                               tvb,offset,size,bo_big_endian);
+                                               offset+=size;
+                                               client_size+=size+1;
+#ifdef DEBUG
+                                               fprintf(stderr, "X.509 name size = %d, client_size = %d\n",
+                                                       size, client_size);
+#endif /* DEBUG */
+                                               break;
+                               }
+
                                proto_item_set_len(cli_key_item, client_size);
                        }
+
+                       /* process trusted_keys structure */
                        count = tvb_get_ntohs (tvb, offset);
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_cli_hello_trust_key_id, tvb, offset,
                                         count+2, bo_little_endian);
                        wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub);
+
+                       /* display length of trusted_keys structure */
+                       ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
+                                       hf_wtls_hands_cli_hello_cli_key_len,
+                                       tvb,offset,2,bo_big_endian);
+
                        offset+=2;
                        for (;count > 0;count-=client_size) {
+                               /* get encryption suite id (one byte) */
                                value = tvb_get_guint8 (tvb, offset);
-                               cli_key_item = proto_tree_add_uint(wtls_msg_type_item_sub_tree, 
+                               cli_key_item = proto_tree_add_uint(wtls_msg_type_item_sub_tree,
                                                hf_wtls_hands_cli_hello_key_exchange, tvb, offset,1,
                                                value);
                                client_size=1;
-                               wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item, 
+                               wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item,
                                                                  ett_wtls_msg_type_item_sub_sub);
                                ti = proto_tree_add_uint(wtls_msg_type_item_sub_sub_tree,
                                                hf_wtls_hands_cli_hello_key_exchange_suite,
                                                tvb,offset,1,value);
                                offset++;
+#ifdef DEBUG
+                               fprintf(stderr, "encryption suite = %d, client_size = %d\n", value, client_size);
+#endif /* DEBUG */
+
+                               /* get parameter index (one byte) */
                                value = tvb_get_guint8 (tvb, offset);
                                ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
                                        hf_wtls_hands_cli_hello_key_parameter_index,
                                        tvb,offset,1,bo_big_endian);
                                offset++;
                                client_size++;
+#ifdef DEBUG
+                               fprintf(stderr, "parameter index = %d, client_size = %d\n", value, client_size);
+#endif /* DEBUG */
+
+                               /* explicit parameters present in next field */
                                if (value == 0xff) {
                                        size = tvb_get_ntohs (tvb, offset);
                                        ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
@@ -562,58 +708,146 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                        offset+=size+2;
                                        client_size+=size+2;
                                }
+
+                               /* get identifier type */
                                value = tvb_get_guint8 (tvb, offset);
                                ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
                                                hf_wtls_hands_cli_hello_key_identifier_type,
                                                tvb,offset,1,bo_big_endian);
                                offset++;
                                client_size++;
+#ifdef DEBUG
+                               fprintf(stderr, "identifier type = %d, client_size = %d\n", value, client_size);
+#endif /* DEBUG */
+
+                               /* identifier present in next field */
+                               /* note: value 0x0 means no identifier */
+                               switch (value) {
+                                       case IDENTIFIER_TEXT :
+                                               /* text identifier */
+                                               /* not tested */
+                                               size = add_text_identifier(
+                                                       tvb, offset,
+                                                       hf_wtls_hands_cli_hello_key_identifier_charset,
+                                                       hf_wtls_hands_cli_hello_key_identifier_size,
+                                                       hf_wtls_hands_cli_hello_key_identifier_str,
+                                                       wtls_msg_type_item_sub_sub_tree);
+                                               offset += size;
+                                               client_size += size;
+                                               break;
+                                       case IDENTIFIER_BIN :
+                                               /* binary identifier */
+                                               size = tvb_get_guint8 (tvb, offset);
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier_size,
+                                                               tvb,offset,1,bo_big_endian);
+                                               offset++;
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier,
+                                                               tvb,offset,size,bo_big_endian);
+                                               offset+=size;
+                                               client_size+=size+1;
+#ifdef DEBUG
+                                               fprintf(stderr, "binary id size = %d, client_size = %d\n",
+                                                       size, client_size);
+#endif /* DEBUG */
+                                               break;
+                                       case IDENTIFIER_SHA_1 :
+                                               /* SHA-1 hash of the public key */
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier,
+                                                               tvb,offset,20,bo_big_endian);
+                                               offset+=20;
+                                               client_size+=20;
+#ifdef DEBUG
+                                               fprintf(stderr, "SHA-1 hash size = 20, client_size = %d\n",
+                                                       client_size);
+#endif /* DEBUG */
+                                               break;
+                                       case IDENTIFIER_X509 :
+                                               /* X.509 distinguished name */
+                                               /* not tested */
+                                               size = tvb_get_guint8 (tvb, offset);
+                                               /* need to fetch identifier and display it */
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier_size,
+                                                               tvb,offset,1,bo_big_endian);
+                                               offset++;
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
+                                                               hf_wtls_hands_cli_hello_key_identifier,
+                                                               tvb,offset,size,bo_big_endian);
+                                               offset+=size;
+                                               client_size+=size+1;
+#ifdef DEBUG
+                                               fprintf(stderr, "X.509 name size = %d, client_size = %d\n",
+                                                       size, client_size);
+#endif /* DEBUG */
+                                               break;
+                               }
                                proto_item_set_len(cli_key_item, client_size);
                        }
+
+                       /* process cipher_suites structure */
                        count = tvb_get_guint8 (tvb, offset);
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_cli_hello_cipher_suite, tvb, offset,
                                         count+1, bo_little_endian);
                        wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub);
                        offset+=1;
                        for (;count > 0;count-=client_size) {
-                               cli_key_item = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
-                                               hf_wtls_hands_cli_hello_cipher_suite_item, tvb, offset,1,
-                                               bo_little_endian);
-                               client_size=1;
-                               wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item, 
-                                                                 ett_wtls_msg_type_item_sub_sub);
-                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
-                                               hf_wtls_hands_cli_hello_cipher_bulk,
-                                               tvb,offset,1,bo_big_endian);
-                               offset++;
-                               value = tvb_get_guint8 (tvb, offset);
-                               ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree,
-                                       hf_wtls_hands_cli_hello_cipher_mac,
-                                       tvb,offset,1,bo_big_endian);
+                              value = tvb_get_guint8 (tvb, offset);
+                               valBulk = match_strval(value, wtls_vals_cipher_bulk);
+                               offset++;
+                               client_size=1;
+                               valMac = match_strval(tvb_get_guint8 (tvb, offset), wtls_vals_cipher_mac);
+                               if (valBulk != NULL)
+                               {
+                                       if (valMac != NULL)
+                                       {
+                                               snprintf(valStr,1024,"%s, %s",valBulk,valMac);
+                                       }
+                                       else
+                                       {
+                                               snprintf(valStr,1024,"%s, Unknown MAC (0x%02x)",valBulk,tvb_get_guint8 (tvb, offset));
+                                       }
+                               }
+                               else
+                               {
+                                       if (valMac != NULL)
+                                       {
+                                               snprintf(valStr,1024,"Unknown Bulk (0x%02x), %s",value,valMac);
+                                       }
+                                       else
+                                       {
+                                               snprintf(valStr,1024,"Unknown Bulk (0x%02x), Unknown MAC (0x%02x)",value,
+                                                               tvb_get_guint8 (tvb, offset));
+                                       }
+                                }
                                offset++;
                                client_size++;
-                               proto_item_set_len(cli_key_item, client_size);
+                                cli_key_item = proto_tree_add_string(wtls_msg_type_item_sub_tree,
+                                               hf_wtls_hands_cli_hello_cipher_suite_item, tvb, offset-2,2,
+                                               valStr);
                        }
                        count = tvb_get_guint8 (tvb, offset);
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_cli_hello_compression_methods, tvb, offset,
                                         count+1, bo_little_endian);
                        wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub);
                        offset+=1;
                        for (;count > 0;count-=client_size) {
                                client_size=0;
-                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                hf_wtls_hands_cli_hello_compression, tvb, offset,1,
                                                bo_little_endian);
                                offset++;
                                client_size++;
                        }
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_cli_hello_sequence_mode, tvb, offset,
                                         1, bo_little_endian);
                        offset++;
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_cli_hello_key_refresh, tvb, offset,
                                         1, bo_little_endian);
                        break;
@@ -624,8 +858,8 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                        ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_version,
                                        tvb,offset,1,bo_big_endian);
                        offset++;
-                       timeValue.tv_sec = tvb_get_ntohl (tvb, offset);
-                       timeValue.tv_usec = 0;
+                       timeValue.secs = tvb_get_ntohl (tvb, offset);
+                       timeValue.nsecs = 0;
                        ti = proto_tree_add_time (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_gmt, tvb,
                                        offset, 4, &timeValue);
                        offset+=4;
@@ -633,17 +867,41 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                        tvb,offset,12,bo_big_endian);
                        offset+=12;
                        count = tvb_get_guint8(tvb, offset);
-                       ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session,
-                                       tvb,offset,count+1,bo_big_endian);
+                        switch(count) {
+                                case 0:
+                                        ti = proto_tree_add_string (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session_str,
+                                                                        tvb,offset,count+1,"NULL");
+                                        break;
+                                case 1 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_guint8(tvb,offset+1));
+                                        break;
+                                case 2 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_ntohs(tvb,offset+1));
+                                        break;
+                                case 3 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_ntoh24(tvb,offset+1));
+                                        break;
+                                case 4 :
+                                        ti = proto_tree_add_uint (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session,
+                                                                        tvb,offset,count+1,tvb_get_ntohl(tvb,offset+1));
+                                        break;
+                                default:
+                                        ti = proto_tree_add_string (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session_str,
+                                                                        tvb,offset,count+1,"Too big");
+                                        break;
+                        }
                        offset+=1+count;
                        ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_serv_hello_cli_key_id,
                                        tvb,offset,1,bo_big_endian);
                        offset++;
-                       cli_key_item = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       cli_key_item = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_serv_hello_cipher_suite_item, tvb, offset,2,
                                        bo_little_endian);
-                       wtls_msg_type_item_sub_tree = proto_item_add_subtree(cli_key_item, 
+                       wtls_msg_type_item_sub_tree = proto_item_add_subtree(cli_key_item,
                                                          ett_wtls_msg_type_item_sub);
                        ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                        hf_wtls_hands_serv_hello_cipher_bulk,
@@ -654,15 +912,15 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                hf_wtls_hands_serv_hello_cipher_mac,
                                tvb,offset,1,bo_big_endian);
                        offset++;
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_serv_hello_compression, tvb, offset,1,
                                        bo_little_endian);
                        offset++;
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_serv_hello_sequence_mode, tvb, offset,
                                         1, bo_little_endian);
                        offset++;
-                       ti = proto_tree_add_item(wtls_msg_type_item_tree, 
+                       ti = proto_tree_add_item(wtls_msg_type_item_tree,
                                        hf_wtls_hands_serv_hello_key_refresh, tvb, offset,
                                         1, bo_little_endian);
                        offset++;
@@ -674,36 +932,36 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                        count = tvb_get_ntohs (tvb, offset);
                        offset+=2;
                        for (;count > 0;count-=client_size) {
-                               cli_key_item = proto_tree_add_item(wtls_msg_type_item_tree, 
+                               cli_key_item = proto_tree_add_item(wtls_msg_type_item_tree,
                                                hf_wtls_hands_certificate, tvb, offset,1,
                                                bo_little_endian);
                                client_size=0;
-                               wtls_msg_type_item_sub_tree = proto_item_add_subtree(cli_key_item, 
+                               wtls_msg_type_item_sub_tree = proto_item_add_subtree(cli_key_item,
                                                                  ett_wtls_msg_type_item_sub);
                                proto_item_set_len(cli_key_item, client_size);
                                value =  tvb_get_guint8 (tvb, offset);
-                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                hf_wtls_hands_certificate_type, tvb, offset,1,
                                                bo_little_endian);
                                offset++;
                                client_size++;
                                switch(value) {
                                        case CERTIFICATE_WTLS:
-                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                        hf_wtls_hands_certificate_wtls_version,
                                                        tvb, offset,1,
                                                        bo_little_endian);
                                                offset++;
                                                client_size++;
                                                signature =  tvb_get_guint8 (tvb, offset);
-                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                        hf_wtls_hands_certificate_wtls_signature_type,
                                                        tvb, offset,1,
                                                        bo_little_endian);
                                                offset++;
                                                client_size++;
                                                value =  tvb_get_guint8 (tvb, offset);
-                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                        hf_wtls_hands_certificate_wtls_issuer_type,
                                                        tvb, offset,1,
                                                        bo_little_endian);
@@ -713,23 +971,13 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                                        case IDENTIFIER_NULL :
                                                                break;
                                                        case IDENTIFIER_TEXT :
-                                                               ti = proto_tree_add_item(
-                                                                               wtls_msg_type_item_sub_tree, 
-                                                                               hf_wtls_hands_certificate_wtls_issuer_charset,
-                                                                               tvb, offset,2,
-                                                                               bo_big_endian);
-                                                               offset+=2;
-                                                               client_size+=2;
-                                                               value =  tvb_get_guint8 (tvb, offset);
-                                                               strncpy(valStr,tvb_get_ptr (tvb, offset+1, value),value);
-                                                               valStr[value]=0;
-                                                               ti = proto_tree_add_string(
-                                                                               wtls_msg_type_item_sub_tree, 
-                                                                               hf_wtls_hands_certificate_wtls_issuer_name,
-                                                                               tvb, offset,1+value,
-                                                                               valStr);
-                                                               offset+=1+value;
-                                                               client_size+=1+value;
+                                                               value = add_text_identifier(tvb, offset,
+                                                                       hf_wtls_hands_certificate_wtls_issuer_charset,
+                                                                       hf_wtls_hands_certificate_wtls_issuer_size,
+                                                                       hf_wtls_hands_certificate_wtls_issuer_name,
+                                                                       wtls_msg_type_item_sub_tree);
+                                                               offset += value;
+                                                               client_size += value;
                                                                break;
                                                        case IDENTIFIER_BIN :
                                                                break;
@@ -738,22 +986,22 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                                        case IDENTIFIER_X509 :
                                                                break;
                                                }
-                                               timeValue.tv_sec = tvb_get_ntohl (tvb, offset);
-                                               timeValue.tv_usec = 0;
-                                               ti = proto_tree_add_time (wtls_msg_type_item_sub_tree, 
+                                               timeValue.secs = tvb_get_ntohl (tvb, offset);
+                                               timeValue.nsecs = 0;
+                                               ti = proto_tree_add_time (wtls_msg_type_item_sub_tree,
                                                                hf_wtls_hands_certificate_wtls_valid_not_before,
                                                                tvb, offset, 4, &timeValue);
                                                offset+=4;
                                                client_size+=4;
-                                               timeValue.tv_sec = tvb_get_ntohl (tvb, offset);
-                                               timeValue.tv_usec = 0;
-                                               ti = proto_tree_add_time (wtls_msg_type_item_sub_tree, 
+                                               timeValue.secs = tvb_get_ntohl (tvb, offset);
+                                               timeValue.nsecs = 0;
+                                               ti = proto_tree_add_time (wtls_msg_type_item_sub_tree,
                                                                hf_wtls_hands_certificate_wtls_valid_not_after,
                                                                tvb, offset, 4, &timeValue);
                                                offset+=4;
                                                client_size+=4;
                                                value =  tvb_get_guint8 (tvb, offset);
-                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                        hf_wtls_hands_certificate_wtls_subject_type,
                                                        tvb, offset,1,
                                                        bo_little_endian);
@@ -763,23 +1011,13 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                                        case IDENTIFIER_NULL :
                                                                break;
                                                        case IDENTIFIER_TEXT :
-                                                               ti = proto_tree_add_item(
-                                                                               wtls_msg_type_item_sub_tree, 
-                                                                               hf_wtls_hands_certificate_wtls_subject_charset,
-                                                                               tvb, offset,2,
-                                                                               bo_big_endian);
-                                                               offset+=2;
-                                                               client_size+=2;
-                                                               value =  tvb_get_guint8 (tvb, offset);
-                                                               strncpy(valStr,tvb_get_ptr (tvb, offset+1, value),value);
-                                                               valStr[value]=0;
-                                                               ti = proto_tree_add_string(
-                                                                               wtls_msg_type_item_sub_tree, 
-                                                                               hf_wtls_hands_certificate_wtls_subject_name,
-                                                                               tvb, offset,1+value,
-                                                                               valStr);
-                                                               offset+=1+value;
-                                                               client_size+=1+value;
+                                                               value = add_text_identifier(tvb, offset,
+                                                                       hf_wtls_hands_certificate_wtls_subject_charset,
+                                                                       hf_wtls_hands_certificate_wtls_subject_size,
+                                                                       hf_wtls_hands_certificate_wtls_subject_name,
+                                                                       wtls_msg_type_item_sub_tree);
+                                                               offset += value;
+                                                               client_size += value;
                                                                break;
                                                        case IDENTIFIER_BIN :
                                                                break;
@@ -789,7 +1027,7 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                                                break;
                                                }
                                                public_key =  tvb_get_guint8 (tvb, offset);
-                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, 
+                                               ti = proto_tree_add_item(wtls_msg_type_item_sub_tree,
                                                        hf_wtls_hands_certificate_wtls_public_key_type,
                                                        tvb, offset,1,
                                                        bo_little_endian);
@@ -855,7 +1093,7 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
                                proto_item_set_len(cli_key_item, client_size);
                        }
                        break;
-               default: 
+               default:
                        offset+=count;
                        break;
        }
@@ -864,446 +1102,495 @@ dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint coun
 /* Register the protocol with Ethereal */
 void
 proto_register_wtls(void)
-{                 
+{
 
 /* Setup list of header fields */
        static hf_register_info hf[] = {
                { &hf_wtls_record,
-                       {       "Record",           
-                               "wsp.wtls.record",
-                                FT_UINT8, BASE_NONE, VALS ( wtls_vals_record_type ), 0x0f,
-                               "Record" 
+                       {       "Record",
+                               "wtls.record",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_record_type ), 0x0f,
+                               "Record", HFILL
                        }
                },
                { &hf_wtls_record_type,
-                       {       "Record Type",           
-                               "wsp.wtls.rec_type",
-                                FT_UINT8, BASE_NONE, VALS ( wtls_vals_record_type ), 0x0f,
-                               "Record Type" 
+                       {       "Record Type",
+                               "wtls.rec_type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_record_type ), 0x0f,
+                               "Record Type", HFILL
                        }
                },
                { &hf_wtls_record_length,
-                       {       "Record Length",           
-                               "wsp.wtls.rec_length",
+                       {       "Record Length",
+                               "wtls.rec_length",
                                 FT_UINT16, BASE_DEC, NULL, 0x00,
-                               "Record Length" 
+                               "Record Length", HFILL
                        }
                },
                { &hf_wtls_record_sequence,
-                       {       "Record Sequence",           
-                               "wsp.wtls.rec_seq",
+                       {       "Record Sequence",
+                               "wtls.rec_seq",
                                 FT_UINT16, BASE_DEC, NULL, 0x00,
-                               "Record Sequence" 
+                               "Record Sequence", HFILL
                        }
                },
                { &hf_wtls_record_ciphered,
-                       {       "Record Ciphered",           
-                               "wsp.wtls.rec_cipher",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Record Ciphered" 
+                       {       "Record Ciphered",
+                               "wtls.rec_cipher",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Record Ciphered", HFILL
                        }
                },
                { &hf_wtls_hands,
-                       {       "Handshake",           
-                               "wsp.wtls.handshake",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_handshake_type ), 0x00,
-                               "Handshake" 
+                       {       "Handshake",
+                               "wtls.handshake",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_handshake_type ), 0x00,
+                               "Handshake", HFILL
                        }
                },
                { &hf_wtls_hands_type,
-                       {       "Type",           
-                               "wsp.wtls.handshake.type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_handshake_type ), 0x00,
-                               "Type" 
+                       {       "Type",
+                               "wtls.handshake.type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_handshake_type ), 0x00,
+                               "Type", HFILL
                        }
                },
                { &hf_wtls_hands_length,
-                       {       "Length",           
-                               "wsp.wtls.handshake.length",
+                       {       "Length",
+                               "wtls.handshake.length",
                                 FT_UINT16, BASE_DEC, NULL, 0x00,
-                               "Length" 
+                               "Length", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello,
-                       {       "Client Hello",           
-                               "wsp.wtls.handshake.client_hello",
-                                FT_NONE, BASE_NONE,NULL, 0x00,
-                               "Client Hello" 
+                       {       "Client Hello",
+                               "wtls.handshake.client_hello",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Client Hello", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_version,
-                       {       "Version",           
-                               "wsp.wtls.handshake.client_hello.version",
+                       {       "Version",
+                               "wtls.handshake.client_hello.version",
                                 FT_UINT8, BASE_DEC, NULL, 0x00,
-                               "Version" 
+                               "Version", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_gmt,
-                       {       "Time GMT",           
-                               "wsp.wtls.handshake.client_hello.gmt",
+                       {       "Time GMT",
+                               "wtls.handshake.client_hello.gmt",
                                 FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00,
-                               "Time GMT" 
+                               "Time GMT", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_random,
-                       {       "Random",           
-                               "wsp.wtls.handshake.client_hello.random",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Random" 
+                       {       "Random",
+                               "wtls.handshake.client_hello.random",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Random", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_session,
-                       {       "Session ID",           
-                               "wsp.wtls.handshake.client_hello.sessionid",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Session ID" 
+                       {       "Session ID",
+                               "wtls.handshake.client_hello.sessionid",
+                                FT_UINT32, BASE_DEC, NULL, 0x00,
+                               "Session ID", HFILL
+                       }
+               },
+               { &hf_wtls_hands_cli_hello_session_str,
+                       {       "Session ID",
+                               "wtls.handshake.client_hello.session.str",
+                                FT_STRING, BASE_NONE, NULL, 0x00,
+                               "Session ID", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_cli_key_id,
-                       {       "Client Keys",           
-                               "wsp.wtls.handshake.client_hello.client_keys_id",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Client Keys"           
+                       {       "Client Keys",
+                               "wtls.handshake.client_hello.client_keys_id",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Client Keys"     , HFILL
+                       }
+               },
+               { &hf_wtls_hands_cli_hello_cli_key_len,
+                       {       "Length",
+                               "wtls.handshake.client_hello.client_keys_len",
+                                FT_UINT16, BASE_DEC, NULL, 0x00,
+                               "Length"          , HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_trust_key_id,
-                       {       "Trusted Keys",           
-                               "wsp.wtls.handshake.client_hello.trusted_keys_id",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Trusted Keys"           
+                       {       "Trusted Keys",
+                               "wtls.handshake.client_hello.trusted_keys_id",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Trusted Keys"          , HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_key_exchange,
-                       {       "Key Exchange",           
-                               "wsp.wtls.handshake.client_hello.key.key_exchange",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_key_exchange_suite ), 0x00,
-                               "Key Exchange" 
+                       {       "Key Exchange",
+                               "wtls.handshake.client_hello.key.key_exchange",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_key_exchange_suite ), 0x00,
+                               "Key Exchange", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_key_exchange_suite,
-                       {       "Suite",           
-                               "wsp.wtls.handshake.client_hello.key.key_exchange.suite",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_key_exchange_suite ), 0x00,
-                               "Suite" 
+                       {       "Suite",
+                               "wtls.handshake.client_hello.key.key_exchange.suite",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_key_exchange_suite ), 0x00,
+                               "Suite", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_key_parameter_index,
-                       {       "Parameter Index",           
-                               "wsp.wtls.handshake.client_hello.parameter_index",
+                       {       "Parameter Index",
+                               "wtls.handshake.client_hello.parameter_index",
                                 FT_UINT8, BASE_DEC, NULL, 0x00,
-                               "Parameter Index" 
+                               "Parameter Index", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_key_parameter_set,
-                       {       "Parameter Set",           
-                               "wsp.wtls.handshake.client_hello.parameter",
+                       {       "Parameter Set",
+                               "wtls.handshake.client_hello.parameter",
                                 FT_STRING, BASE_NONE, NULL, 0x00,
-                               "Parameter Set" 
+                               "Parameter Set", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_key_identifier_type,
-                       {       "Identifier Type",           
-                               "wsp.wtls.handshake.client_hello.ident_type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_identifier_type ), 0x00,
-                               "Identifier Type" 
+                       {       "Identifier Type",
+                               "wtls.handshake.client_hello.ident_type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_identifier_type ), 0x00,
+                               "Identifier Type", HFILL
                        }
                },
-               { &hf_wtls_hands_cli_hello_cipher_suite,
-                       {       "Cipher Suites",           
-                               "wsp.wtls.handshake.client_hello.ciphers",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Cipher Suite" 
+               { &hf_wtls_hands_cli_hello_key_identifier_charset,
+                       {       "Identifier CharSet",
+                               "wtls.handshake.client_hello.ident_charset",
+                                FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00,
+                               "Identifier CharSet", HFILL
                        }
                },
-               { &hf_wtls_hands_cli_hello_cipher_suite_item,
-                       {       "Cipher",           
-                               "wsp.wtls.handshake.client_hello.cipher",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Cipher" 
+               { &hf_wtls_hands_cli_hello_key_identifier_size,
+                       {       "Identifier Size",
+                               "wtls.handshake.client_hello.ident_size",
+                                FT_UINT8, BASE_DEC, NULL, 0x00,
+                               "Identifier Size", HFILL
+                       }
+               },
+               { &hf_wtls_hands_cli_hello_key_identifier,
+                       {       "Identifier",
+                               "wtls.handshake.client_hello.identifier",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Identifier", HFILL
+                       }
+               },
+               { &hf_wtls_hands_cli_hello_key_identifier_str,
+                       {       "Identifier Name",
+                               "wtls.handshake.client_hello.ident_name",
+                                FT_STRING, BASE_NONE, NULL, 0x00,
+                               "Identifier Name", HFILL
                        }
                },
-               { &hf_wtls_hands_cli_hello_cipher_bulk,
-                       {       "Cipher Bulk",           
-                               "wsp.wtls.handshake.client_hello.cipher.bulk",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_bulk ), 0x00,
-                               "Cipher Bulk" 
+               { &hf_wtls_hands_cli_hello_cipher_suite,
+                       {       "Cipher Suites",
+                               "wtls.handshake.client_hello.ciphers",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Cipher Suite", HFILL
                        }
                },
-               { &hf_wtls_hands_cli_hello_cipher_mac,
-                       {       "Cipher MAC",           
-                               "wsp.wtls.handshake.client_hello.cipher.mac",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_mac ), 0x00,
-                               "Cipher MAC" 
+               { &hf_wtls_hands_cli_hello_cipher_suite_item,
+                       {       "Cipher",
+                               "wtls.handshake.client_hello.cipher",
+                                FT_STRING, BASE_NONE, NULL, 0x00,
+                               "Cipher", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_compression_methods,
-                       {       "Compression Methods",           
-                               "wsp.wtls.handshake.client_hello.comp_methods",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Compression Methods" 
+                       {       "Compression Methods",
+                               "wtls.handshake.client_hello.comp_methods",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Compression Methods", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_compression,
-                       {       "Compression",           
-                               "wsp.wtls.handshake.client_hello.compression",
+                       {       "Compression",
+                               "wtls.handshake.client_hello.compression",
                                 FT_UINT8, BASE_HEX, VALS ( wtls_vals_compression ), 0x00,
-                               "Compression" 
+                               "Compression", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_sequence_mode,
-                       {       "Sequence Mode",           
-                               "wsp.wtls.handshake.client_hello.sequence_mode",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_sequence_mode ), 0x00,
-                               "Sequence Mode" 
+                       {       "Sequence Mode",
+                               "wtls.handshake.client_hello.sequence_mode",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_sequence_mode ), 0x00,
+                               "Sequence Mode", HFILL
                        }
                },
                { &hf_wtls_hands_cli_hello_key_refresh,
-                       {       "Refresh",           
-                               "wsp.wtls.handshake.client_hello.refresh",
-                                FT_UINT8, BASE_DEC,NULL, 0x00,
-                               "Refresh" 
+                       {       "Refresh",
+                               "wtls.handshake.client_hello.refresh",
+                                FT_UINT8, BASE_DEC, NULL, 0x00,
+                               "Refresh", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello,
-                       {       "Server Hello",           
-                               "wsp.wtls.handshake.server_hello",
-                                FT_NONE, BASE_NONE,NULL, 0x00,
-                               "Server Hello" 
+                       {       "Server Hello",
+                               "wtls.handshake.server_hello",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Server Hello", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_version,
-                       {       "Version",           
-                               "wsp.wtls.handshake.server_hello.version",
+                       {       "Version",
+                               "wtls.handshake.server_hello.version",
                                 FT_UINT8, BASE_DEC, NULL, 0x00,
-                               "Version" 
+                               "Version", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_gmt,
-                       {       "Time GMT",           
-                               "wsp.wtls.handshake.server_hello.gmt",
+                       {       "Time GMT",
+                               "wtls.handshake.server_hello.gmt",
                                 FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00,
-                               "Time GMT" 
+                               "Time GMT", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_random,
-                       {       "Random",           
-                               "wsp.wtls.handshake.server_hello.random",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Random" 
+                       {       "Random",
+                               "wtls.handshake.server_hello.random",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Random", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_session,
-                       {       "Session ID",           
-                               "wsp.wtls.handshake.server_hello.sessionid",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Session ID" 
+                       {       "Session ID",
+                               "wtls.handshake.server_hello.sessionid",
+                                FT_UINT32, BASE_DEC, NULL, 0x00,
+                               "Session ID", HFILL
+                       }
+               },
+               { &hf_wtls_hands_serv_hello_session_str,
+                       {       "Session ID",
+                               "wtls.handshake.server_hello.session.str",
+                                FT_STRING, BASE_NONE, NULL, 0x00,
+                               "Session ID", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_cli_key_id,
-                       {       "Client Key ID",           
-                               "wsp.wtls.handshake.server_hello.key",
+                       {       "Client Key ID",
+                               "wtls.handshake.server_hello.key",
                                 FT_UINT8, BASE_HEX, NULL, 0x00,
-                               "Client Key ID" 
+                               "Client Key ID", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_cipher_suite_item,
-                       {       "Cipher",           
-                               "wsp.wtls.handshake.server_hello.cipher",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Cipher" 
+                       {       "Cipher",
+                               "wtls.handshake.server_hello.cipher",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Cipher", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_cipher_bulk,
-                       {       "Cipher Bulk",           
-                               "wsp.wtls.handshake.server_hello.cipher.bulk",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_bulk ), 0x00,
-                               "Cipher Bulk" 
+                       {       "Cipher Bulk",
+                               "wtls.handshake.server_hello.cipher.bulk",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_cipher_bulk ), 0x00,
+                               "Cipher Bulk", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_cipher_mac,
-                       {       "Cipher MAC",           
-                               "wsp.wtls.handshake.server_hello.cipher.mac",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_mac ), 0x00,
-                               "Cipher MAC" 
+                       {       "Cipher MAC",
+                               "wtls.handshake.server_hello.cipher.mac",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_cipher_mac ), 0x00,
+                               "Cipher MAC", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_compression,
-                       {       "Compression",           
-                               "wsp.wtls.handshake.server_hello.compression",
+                       {       "Compression",
+                               "wtls.handshake.server_hello.compression",
                                 FT_UINT8, BASE_HEX, VALS ( wtls_vals_compression ), 0x00,
-                               "Compression" 
+                               "Compression", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_sequence_mode,
-                       {       "Sequence Mode",           
-                               "wsp.wtls.handshake.server_hello.sequence_mode",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_sequence_mode ), 0x00,
-                               "Sequence Mode" 
+                       {       "Sequence Mode",
+                               "wtls.handshake.server_hello.sequence_mode",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_sequence_mode ), 0x00,
+                               "Sequence Mode", HFILL
                        }
                },
                { &hf_wtls_hands_serv_hello_key_refresh,
-                       {       "Refresh",           
-                               "wsp.wtls.handshake.server_hello.refresh",
-                                FT_UINT8, BASE_DEC,NULL, 0x00,
-                               "Refresh" 
+                       {       "Refresh",
+                               "wtls.handshake.server_hello.refresh",
+                                FT_UINT8, BASE_DEC, NULL, 0x00,
+                               "Refresh", HFILL
                        }
                },
                { &hf_wtls_hands_certificates,
                        {       "Certificates",
-                               "wsp.wtls.handshake.certificates",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Certificates" 
+                               "wtls.handshake.certificates",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Certificates", HFILL
                        }
                },
                { &hf_wtls_hands_certificate,
-                       {       "Certificate",           
-                               "wsp.wtls.handshake.certificate",
-                                FT_NONE, BASE_DEC, NULL, 0x00,
-                               "Certificate" 
+                       {       "Certificate",
+                               "wtls.handshake.certificate",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Certificate", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_type,
-                       {       "Type",           
-                               "wsp.wtls.handshake.certificate.type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_certificate_type ), 0x00,
-                               "Type" 
+                       {       "Type",
+                               "wtls.handshake.certificate.type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_certificate_type ), 0x00,
+                               "Type", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_version,
-                       {       "Version",           
-                               "wsp.wtls.handshake.certificate.version",
+                       {       "Version",
+                               "wtls.handshake.certificate.version",
                                 FT_UINT8, BASE_HEX, NULL, 0x00,
-                               "Version" 
+                               "Version", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_signature_type,
-                       {       "Signature Type",           
-                               "wsp.wtls.handshake.certificate.signature.type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_certificate_signature ), 0x00,
-                               "Signature Type" 
+                       {       "Signature Type",
+                               "wtls.handshake.certificate.signature.type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_certificate_signature ), 0x00,
+                               "Signature Type", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_signature,
-                       {       "Signature Size",           
-                               "wsp.wtls.handshake.certificate.signature.signature",
+                       {       "Signature Size",
+                               "wtls.handshake.certificate.signature.signature",
                                 FT_UINT32, BASE_DEC, NULL, 0x00,
-                               "Signature Size" 
+                               "Signature Size", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_issuer_type,
-                       {       "Issuer",           
-                               "wsp.wtls.handshake.certificate.issuer.type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_identifier_type ), 0x00,
-                               "Issuer" 
+                       {       "Issuer",
+                               "wtls.handshake.certificate.issuer.type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_identifier_type ), 0x00,
+                               "Issuer", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_issuer_charset,
-                       {       "Charset",           
-                               "wsp.wtls.handshake.certificate.issuer.charset",
+                       {       "Charset",
+                               "wtls.handshake.certificate.issuer.charset",
                                 FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00,
-                               "Charset" 
+                               "Charset", HFILL
+                       }
+               },
+               { &hf_wtls_hands_certificate_wtls_issuer_size,
+                       {       "Size",
+                               "wtls.handshake.certificate.issuer.size",
+                                FT_UINT8, BASE_DEC, NULL, 0x00,
+                               "Size", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_issuer_name,
-                       {       "Name",           
-                               "wsp.wtls.handshake.certificate.issuer.name",
+                       {       "Name",
+                               "wtls.handshake.certificate.issuer.name",
                                 FT_STRING, BASE_NONE, NULL, 0x00,
-                               "Name" 
+                               "Name", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_valid_not_before,
-                       {       "Valid not before",           
-                               "wsp.wtls.handshake.certificate.before",
+                       {       "Valid not before",
+                               "wtls.handshake.certificate.before",
                                 FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00,
-                               "Valid not before" 
+                               "Valid not before", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_valid_not_after,
-                       {       "Valid not after",           
-                               "wsp.wtls.handshake.certificate.after",
+                       {       "Valid not after",
+                               "wtls.handshake.certificate.after",
                                 FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00,
-                               "Valid not after" 
+                               "Valid not after", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_subject_type,
-                       {       "Subject",           
-                               "wsp.wtls.handshake.certificate.subject.type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_identifier_type ), 0x00,
-                               "Subject" 
+                       {       "Subject",
+                               "wtls.handshake.certificate.subject.type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_identifier_type ), 0x00,
+                               "Subject", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_subject_charset,
-                       {       "Charset",           
-                               "wsp.wtls.handshake.certificate.subject.charset",
+                       {       "Charset",
+                               "wtls.handshake.certificate.subject.charset",
                                 FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00,
-                               "Charset" 
+                               "Charset", HFILL
+                       }
+               },
+               { &hf_wtls_hands_certificate_wtls_subject_size,
+                       {       "Size",
+                               "wtls.handshake.certificate.subject.size",
+                                FT_UINT8, BASE_DEC, NULL, 0x00,
+                               "Size", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_subject_name,
-                       {       "Name",           
-                               "wsp.wtls.handshake.certificate.subject.name",
+                       {       "Name",
+                               "wtls.handshake.certificate.subject.name",
                                 FT_STRING, BASE_NONE, NULL, 0x00,
-                               "Name" 
+                               "Name", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_public_key_type,
-                       {       "Public Key Type",           
-                               "wsp.wtls.handshake.certificate.public.type",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_public_key_type ), 0x00,
-                               "Public Key Type" 
+                       {       "Public Key Type",
+                               "wtls.handshake.certificate.public.type",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_public_key_type ), 0x00,
+                               "Public Key Type", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_key_parameter_index,
-                       {       "Parameter Index",           
-                               "wsp.wtls.handshake.certificate.parameter_index",
+                       {       "Parameter Index",
+                               "wtls.handshake.certificate.parameter_index",
                                 FT_UINT8, BASE_DEC, NULL, 0x00,
-                               "Parameter Index" 
+                               "Parameter Index", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_key_parameter_set,
-                       {       "Parameter Set",           
-                               "wsp.wtls.handshake.certificate.parameter",
+                       {       "Parameter Set",
+                               "wtls.handshake.certificate.parameter",
                                 FT_STRING, BASE_NONE, NULL, 0x00,
-                               "Parameter Set" 
+                               "Parameter Set", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_rsa_exponent,
-                       {       "RSA Exponent Size",           
-                               "wsp.wtls.handshake.certificate.rsa.exponent",
+                       {       "RSA Exponent Size",
+                               "wtls.handshake.certificate.rsa.exponent",
                                 FT_UINT32, BASE_DEC, NULL, 0x00,
-                               "RSA Exponent Size" 
+                               "RSA Exponent Size", HFILL
                        }
                },
                { &hf_wtls_hands_certificate_wtls_rsa_modules,
-                       {       "RSA Modulus Size",           
-                               "wsp.wtls.handshake.certificate.rsa.modulus",
+                       {       "RSA Modulus Size",
+                               "wtls.handshake.certificate.rsa.modules",
                                 FT_UINT32, BASE_DEC, NULL, 0x00,
-                               "RSA Modulus Size" 
+                               "RSA Modulus Size", HFILL
                        }
                },
                { &hf_wtls_alert,
-                       {       "Alert",           
-                               "wsp.wtls.alert",
-                                FT_NONE, BASE_HEX, NULL, 0x00,
-                               "Alert" 
+                       {       "Alert",
+                               "wtls.alert",
+                                FT_NONE, BASE_NONE, NULL, 0x00,
+                               "Alert", HFILL
                        }
                },
                { &hf_wtls_alert_level,
-                       {       "Level",           
-                               "wsp.wtls.alert.level",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_alert_level ), 0x00,
-                               "Level" 
+                       {       "Level",
+                               "wtls.alert.level",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_alert_level ), 0x00,
+                               "Level", HFILL
                        }
                },
                { &hf_wtls_alert_description,
-                       {       "Description",           
-                               "wsp.wtls.alert.description",
-                                FT_UINT8, BASE_HEX, VALS ( wtls_vals_alert_description ), 0x00,
-                               "Description" 
+                       {       "Description",
+                               "wtls.alert.description",
+                                FT_UINT8, BASE_DEC, VALS ( wtls_vals_alert_description ), 0x00,
+                               "Description", HFILL
                        }
                },
        };
-       
+
 /* Setup protocol subtree array */
        static gint *ett[] = {
                &ett_wtls,
@@ -1316,9 +1603,9 @@ proto_register_wtls(void)
 
 /* Register the protocol name and description */
        proto_wtls = proto_register_protocol(
-               "Wireless Transport Layer Security",    /* protocol name for use by ethereal */ 
+               "Wireless Transport Layer Security",    /* protocol name for use by ethereal */
                "WTLS",                          /* short version of name */
-               "wap-wtls"                      /* Abbreviated protocol name, should Match IANA 
+               "wtls"                          /* Abbreviated protocol name, should Match IANA
                                                    < URL:http://www.isi.edu/in-notes/iana/assignments/port-numbers/ >
                                                  */
        );
@@ -1326,19 +1613,15 @@ proto_register_wtls(void)
 /* Required function calls to register the header fields and subtrees used  */
        proto_register_field_array(proto_wtls, hf, array_length(hf));
        proto_register_subtree_array(ett, array_length(ett));
-
-       register_dissector("wtls", dissect_wtls, proto_wtls);
-};
+}
 
 void
 proto_reg_handoff_wtls(void)
 {
-       /*
-        * Get handles for the IP WTP and WSP dissectors
-        */
-       wtp_handle = find_dissector("wtp");
-       wsp_handle = find_dissector("wsp");
-
-       dissector_add("udp.port", UDP_PORT_WTLS_WSP,     dissect_wtls, proto_wtls); 
-       dissector_add("udp.port", UDP_PORT_WTLS_WTP_WSP, dissect_wtls, proto_wtls);
+       dissector_handle_t wtls_handle;
+
+       wtls_handle = create_dissector_handle(dissect_wtls, proto_wtls);
+       dissector_add("udp.port", UDP_PORT_WTLS_WSP,     wtls_handle);
+       dissector_add("udp.port", UDP_PORT_WTLS_WTP_WSP, wtls_handle);
+       dissector_add("udp.port", UDP_PORT_WTLS_WSP_PUSH,wtls_handle);
 }