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