Blame SOURCES/wireshark-1.10.3-dtls-elliptic-curves.patch

dbc6ab
diff --git a/epan/dissectors/packet-dtls.c b/epan/dissectors/packet-dtls.c
dbc6ab
index f0c8a3e..5e287e0 100644
dbc6ab
--- a/epan/dissectors/packet-dtls.c
dbc6ab
+++ b/epan/dissectors/packet-dtls.c
dbc6ab
@@ -119,6 +119,9 @@ static gint hf_dtls_handshake_extensions_len    = -1;
dbc6ab
 static gint hf_dtls_handshake_extension_type    = -1;
dbc6ab
 static gint hf_dtls_handshake_extension_len     = -1;
dbc6ab
 static gint hf_dtls_handshake_extension_data    = -1;
dbc6ab
+static gint hf_ssl_handshake_extension_elliptic_curves_len  = -1;
dbc6ab
+static gint hf_ssl_handshake_extension_elliptic_curves      = -1;
dbc6ab
+static gint hf_ssl_handshake_extension_elliptic_curve       = -1;
dbc6ab
 static gint hf_dtls_handshake_session_ticket_lifetime_hint = -1;
dbc6ab
 static gint hf_dtls_handshake_session_ticket_len = -1;
dbc6ab
 static gint hf_dtls_handshake_session_ticket    = -1;
dbc6ab
@@ -165,6 +168,7 @@ static gint ett_dtls_heartbeat         = -1;
dbc6ab
 static gint ett_dtls_cipher_suites     = -1;
dbc6ab
 static gint ett_dtls_comp_methods      = -1;
dbc6ab
 static gint ett_dtls_extension         = -1;
dbc6ab
+static gint ett_dtls_extension_curves  = -1;
dbc6ab
 static gint ett_dtls_new_ses_ticket    = -1;
dbc6ab
 static gint ett_dtls_certs             = -1;
dbc6ab
 static gint ett_dtls_cert_types        = -1;
dbc6ab
@@ -1654,6 +1658,43 @@ dissect_dtls_hnd_hello_common(tvbuff_t *tvb, proto_tree *tree,
dbc6ab
 }
dbc6ab
 
dbc6ab
 static gint
dbc6ab
+dissect_dtls_hnd_hello_ext_elliptic_curves(tvbuff_t *tvb,
dbc6ab
+                                           proto_tree *tree, guint32 offset)
dbc6ab
+{
dbc6ab
+    gint16      curves_length;
dbc6ab
+    proto_tree *curves_tree;
dbc6ab
+    proto_item *ti;
dbc6ab
+
dbc6ab
+    curves_length = tvb_get_ntohs(tvb, offset);
dbc6ab
+    proto_tree_add_item(tree, hf_ssl_handshake_extension_elliptic_curves_len,
dbc6ab
+        tvb, offset, 2, ENC_BIG_ENDIAN);
dbc6ab
+
dbc6ab
+    offset += 2;
dbc6ab
+    tvb_ensure_bytes_exist(tvb, offset, curves_length);
dbc6ab
+    ti = proto_tree_add_none_format(tree,
dbc6ab
+                                    hf_ssl_handshake_extension_elliptic_curves,
dbc6ab
+                                    tvb, offset, curves_length,
dbc6ab
+                                    "Elliptic curves (%d curve%s)",
dbc6ab
+                                    curves_length / 2,
dbc6ab
+                                    plurality(curves_length/2, "", "s"));
dbc6ab
+
dbc6ab
+    /* make this a subtree */
dbc6ab
+    curves_tree = proto_item_add_subtree(ti, ett_dtls_extension_curves);
dbc6ab
+
dbc6ab
+    /* loop over all curves */
dbc6ab
+    while (curves_length > 0)
dbc6ab
+    {
dbc6ab
+        proto_tree_add_item(curves_tree,
dbc6ab
+                            hf_ssl_handshake_extension_elliptic_curve,
dbc6ab
+                            tvb, offset, 2, ENC_BIG_ENDIAN);
dbc6ab
+        offset += 2;
dbc6ab
+        curves_length -= 2;
dbc6ab
+    }
dbc6ab
+
dbc6ab
+    return offset;
dbc6ab
+}
dbc6ab
+
dbc6ab
+static gint
dbc6ab
 dissect_dtls_hnd_hello_ext(tvbuff_t *tvb,
dbc6ab
                            proto_tree *tree, guint32 offset, guint32 left)
dbc6ab
 {
dbc6ab
@@ -1700,6 +1741,9 @@ dissect_dtls_hnd_hello_ext(tvbuff_t *tvb,
dbc6ab
                               tvb, offset, 1, ENC_BIG_ENDIAN);
dbc6ab
           offset += ext_len;
dbc6ab
           break;
dbc6ab
+      case SSL_HND_HELLO_EXT_ELLIPTIC_CURVES:
dbc6ab
+          offset = dissect_dtls_hnd_hello_ext_elliptic_curves(tvb, ext_tree, offset);
dbc6ab
+          break;
dbc6ab
       default:
dbc6ab
           proto_tree_add_bytes_format(ext_tree, hf_dtls_handshake_extension_data,
dbc6ab
                                       tvb, offset, ext_len, NULL,
dbc6ab
@@ -2534,6 +2578,21 @@ proto_register_dtls(void)
dbc6ab
         FT_BYTES, BASE_NONE, NULL, 0x0,
dbc6ab
         "Hello Extension data", HFILL }
dbc6ab
     },
dbc6ab
+    { &hf_ssl_handshake_extension_elliptic_curves_len,
dbc6ab
+      { "Elliptic Curves Length", "dtls.handshake.extensions_elliptic_curves_length",
dbc6ab
+        FT_UINT16, BASE_DEC, NULL, 0x0,
dbc6ab
+        "Length of elliptic curves field", HFILL }
dbc6ab
+    },
dbc6ab
+    { &hf_ssl_handshake_extension_elliptic_curves,
dbc6ab
+      { "Elliptic Curves List", "dtls.handshake.extensions_elliptic_curves",
dbc6ab
+        FT_NONE, BASE_NONE, NULL, 0x0,
dbc6ab
+        "List of elliptic curves supported", HFILL }
dbc6ab
+    },
dbc6ab
+    { &hf_ssl_handshake_extension_elliptic_curve,
dbc6ab
+      { "Elliptic curve", "dtls.handshake.extensions_elliptic_curve",
dbc6ab
+        FT_UINT16, BASE_HEX, VALS(ssl_extension_curves), 0x0,
dbc6ab
+        NULL, HFILL }
dbc6ab
+    },
dbc6ab
     { &hf_dtls_handshake_session_ticket_lifetime_hint,
dbc6ab
       { "Session Ticket Lifetime Hint", "dtls.handshake.session_ticket_lifetime_hint",
dbc6ab
         FT_UINT32, BASE_DEC, NULL, 0x0,
dbc6ab
@@ -2707,6 +2766,7 @@ proto_register_dtls(void)
dbc6ab
     &ett_dtls_cipher_suites,
dbc6ab
     &ett_dtls_comp_methods,
dbc6ab
     &ett_dtls_extension,
dbc6ab
+    &ett_dtls_extension_curves,
dbc6ab
     &ett_dtls_new_ses_ticket,
dbc6ab
     &ett_dtls_certs,
dbc6ab
     &ett_dtls_cert_types,