Ethereal-dev: [Ethereal-dev] Ethereal patch for TLS Hello Extensions (RFC 3546)
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Jouni Malinen <jkmaline@xxxxxxxxx>
Date: Fri, 24 Dec 2004 21:46:24 -0800
The attached patch adds parsing of TLS Extensions (RFC 3546) for ClientHello and ServerHello. -- Jouni Malinen PGP id EFC895FA
Index: epan/dissectors/packet-ssl.c
===================================================================
--- epan/dissectors/packet-ssl.c (revision 12830)
+++ epan/dissectors/packet-ssl.c (working copy)
@@ -137,6 +137,10 @@
static int hf_ssl_handshake_comp_methods_len = -1;
static int hf_ssl_handshake_comp_methods = -1;
static int hf_ssl_handshake_comp_method = -1;
+static int hf_ssl_handshake_extensions_len = -1;
+static int hf_ssl_handshake_extension_type = -1;
+static int hf_ssl_handshake_extension_len = -1;
+static int hf_ssl_handshake_extension_data = -1;
static int hf_ssl_handshake_certificates_len = -1;
static int hf_ssl_handshake_certificates = -1;
static int hf_ssl_handshake_certificate = -1;
@@ -186,6 +190,7 @@
static gint ett_ssl_handshake = -1;
static gint ett_ssl_cipher_suites = -1;
static gint ett_ssl_comp_methods = -1;
+static gint ett_ssl_extension = -1;
static gint ett_ssl_certs = -1;
static gint ett_ssl_cert_types = -1;
static gint ett_ssl_dnames = -1;
@@ -673,6 +678,18 @@
{ 0x00, NULL },
};
+/* RFC 3546 */
+static const value_string tls_hello_extension_types[] = {
+ { 0, "server_name" },
+ { 1, "max_fragment_length" },
+ { 2, "client_certificate_url" },
+ { 3, "trusted_ca_keys" },
+ { 4, "truncated_hmac" },
+ { 5, "status_request" },
+ { 35, "EAP-FAST PAC-Opaque" /* draft-cam-winget-eap-fast-00.txt */ },
+ { 0, NULL }
+};
+
/*********************************************************************
*
* Forward Declarations
@@ -1511,6 +1528,57 @@
return offset - initial_offset;
}
+static int
+dissect_ssl3_hnd_hello_ext(tvbuff_t *tvb,
+ proto_tree *tree, guint32 offset)
+{
+ guint16 extension_length;
+ guint16 ext_type;
+ guint16 ext_len;
+ proto_item *pi;
+ proto_tree *ext_tree;
+
+ if (tvb_length_remaining(tvb, offset) < 2)
+ return offset;
+
+ extension_length = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_uint(tree, hf_ssl_handshake_extensions_len,
+ tvb, offset, 2, extension_length);
+ offset += 2;
+
+ while (tvb_length_remaining(tvb, offset) >= 4)
+ {
+ ext_type = tvb_get_ntohs(tvb, offset);
+ ext_len = tvb_get_ntohs(tvb, offset + 2);
+
+ pi = proto_tree_add_text(tree, tvb, offset, 4 + ext_len,
+ "Extension: %s",
+ val_to_str(ext_type,
+ tls_hello_extension_types,
+ "Unknown %u"));
+ ext_tree = proto_item_add_subtree(pi, ett_ssl_extension);
+ if (!ext_tree)
+ ext_tree = tree;
+
+ proto_tree_add_uint(ext_tree, hf_ssl_handshake_extension_type,
+ tvb, offset, 2, ext_type);
+ offset += 2;
+
+ proto_tree_add_uint(ext_tree, hf_ssl_handshake_extension_len,
+ tvb, offset, 2, ext_len);
+ offset += 2;
+
+ proto_tree_add_bytes_format(ext_tree, hf_ssl_handshake_extension_data,
+ tvb, offset, ext_len,
+ tvb_get_ptr(tvb, offset, ext_len),
+ "Data (%u byte%s)",
+ ext_len, plurality(ext_len, "", "s"));
+ offset += ext_len;
+ }
+
+ return offset;
+}
+
static void
dissect_ssl3_hnd_cli_hello(tvbuff_t *tvb,
proto_tree *tree, guint32 offset)
@@ -1521,6 +1589,7 @@
* SessionID session_id;
* CipherSuite cipher_suites<2..2^16-1>;
* CompressionMethod compression_methods<1..2^8-1>;
+ * Extension client_hello_extension_list<0..2^16-1>;
* } ClientHello;
*
*/
@@ -1612,6 +1681,8 @@
compression_methods_length--;
}
}
+
+ offset = dissect_ssl3_hnd_hello_ext(tvb, tree, offset);
}
}
@@ -1625,6 +1696,7 @@
* SessionID session_id;
* CipherSuite cipher_suite;
* CompressionMethod compression_method;
+ * Extension server_hello_extension_list<0..2^16-1>;
* } ServerHello;
*/
@@ -1648,6 +1720,9 @@
/* and the server-selected compression method */
proto_tree_add_item(tree, hf_ssl_handshake_comp_method,
tvb, offset, 1, FALSE);
+ offset++;
+
+ offset = dissect_ssl3_hnd_hello_ext(tvb, tree, offset);
}
}
@@ -3206,6 +3281,26 @@
FT_UINT8, BASE_DEC, VALS(ssl_31_compression_method), 0x0,
"Compression Method", HFILL }
},
+ { &hf_ssl_handshake_extensions_len,
+ { "Extensions Length", "ssl.handshake.extensions_length",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Length of hello extensions", HFILL }
+ },
+ { &hf_ssl_handshake_extension_type,
+ { "Type", "ssl.handshake.extension.type",
+ FT_UINT16, BASE_HEX, VALS(tls_hello_extension_types), 0x0,
+ "Hello extension type", HFILL }
+ },
+ { &hf_ssl_handshake_extension_len,
+ { "Length", "ssl.handshake.extension.len",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Length of a hello extension", HFILL }
+ },
+ { &hf_ssl_handshake_extension_data,
+ { "Data", "ssl.handshake.extension.data",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Hello Extension data", HFILL }
+ },
{ &hf_ssl_handshake_certificates_len,
{ "Certificates Length", "ssl.handshake.certificates_length",
FT_UINT24, BASE_DEC, NULL, 0x0,
@@ -3416,6 +3511,7 @@
&ett_ssl_handshake,
&ett_ssl_cipher_suites,
&ett_ssl_comp_methods,
+ &ett_ssl_extension,
&ett_ssl_certs,
&ett_ssl_cert_types,
&ett_ssl_dnames,
- Follow-Ups:
- Prev by Date: RE: [Ethereal-dev] Interface not listed
- Next by Date: Re: [Ethereal-dev] Bug in reassembly (WTP-SAR)
- Previous by thread: RE: [Ethereal-dev] Interface not listed
- Next by thread: Re: [Ethereal-dev] Ethereal patch for TLS Hello Extensions (RFC 3546)
- Index(es):





