<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?>
<?rfc symrefs="yes"?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<?rfc sortrefs="yes" ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" number="8422" ipr="trust200902" submissionType="IETF" consensus="yes" category="std" obsoletes="4492" updates="" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 2.17.0 -->
  <front>
    <title abbrev="ECC Cipher Suites for TLS">Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlier</title>
    <seriesInfo name="RFC" value="8422"/>
    <author initials="Y." surname="Nir" fullname="Yoav Nir">
      <organization abbrev="Check Point">Check Point Software Technologies Ltd.</organization>
      <address>
        <postal>
          <street>5 Hasolelim st.</street>
          <city>Tel Aviv</city>
          <code>6789735</code>
          <country>Israel</country>
        </postal>
        <email>ynir.ietf@gmail.com</email>
      </address>
    </author>
    <author fullname="Simon Josefsson" initials="S." surname="Josefsson">
      <organization>SJD AB</organization>
      <address>
        <email>simon@josefsson.org</email>
      </address>
    </author>
    <author fullname="Manuel Pegourie-Gonnard" initials="M." surname="Pegourie-Gonnard">
      <organization>ARM</organization>
      <address>
        <email>mpg@elzevir.fr</email>
      </address>
    </author>
    <date month="August" year="2018"/>
    <area>Security Area</area>
    <workgroup>TLS Working Group</workgroup>
    <abstract>
      <t> This document describes key exchange algorithms based on Elliptic Curve Cryptography (ECC) for the Transport
        Layer Security (TLS) protocol.  In particular, it specifies the use of Ephemeral Elliptic Curve Diffie-Hellman
        (ECDHE) key agreement in a TLS handshake and the use of Elliptic Curve Digital Signature Algorithm (ECDSA) and
        Edwards-curve Digital Signature Algorithm (EdDSA) as authentication mechanisms.</t>
      <t> This document obsoletes RFC 4492.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t> This document describes additions to TLS to support ECC that are
      applicable to TLS versions 1.0
        <xref target="RFC2246" format="default"/>, 1.1 <xref target="RFC4346" format="default"/>, and 1.2 <xref target="RFC5246" format="default"/>.  The use of ECC in
        TLS 1.3 is defined in <xref target="TLS1.3" format="default"/> and is explicitly out of scope for this document.
        In particular, this document defines:</t>
      <ul spacing="normal">
        <li>the use of the ECDHE key agreement scheme with ephemeral keys to establish the
          TLS premaster secret, and</li>
        <li>the use of ECDSA and EdDSA signatures for authentication of TLS peers.</li>
      </ul>
      <t> The remainder of this document is organized as follows. <xref target="ecdh" format="default"/> provides an overview of
        ECC-based key exchange algorithms for TLS. <xref target="clientauth" format="default"/> describes the use of ECC certificates
        for client authentication.  TLS extensions that allow a client to negotiate the use of specific curves and
        point formats are presented in <xref target="tlsext" format="default"/>. <xref target="structs" format="default"/> specifies various data
        structures needed for an ECC-based handshake, their encoding in TLS messages, and the processing of those
        messages.  <xref target="suites" format="default"/> defines ECC-based cipher suites and identifies a small subset of these
        as recommended for all implementations of this specification. <xref target="sec" format="default"/> discusses security
        considerations. <xref target="iana" format="default"/> describes IANA considerations for the name spaces created by this
        document's predecessor. <xref target="rfc4492diff" format="default"/>
        provides differences from <xref target="RFC4492" format="default"/>, the document that this one replaces.</t>
      <t> Implementation of this specification requires familiarity with TLS, TLS extensions
        <xref target="RFC4366" format="default"/>, and ECC.</t>
      <section anchor="mustshouldmay" numbered="true" toc="default">
        <name>Conventions Used in This Document</name>
        <t>
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
    NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
    "MAY", and "OPTIONAL" in this document are to be interpreted as
    described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> 
    when, and only when, they appear in all capitals, as shown here.
        </t>
      </section>
    </section>
    <section anchor="ecdh" numbered="true" toc="default">
      <name>Key Exchange Algorithm</name>
      <t> This document defines three new ECC-based key exchange algorithms for TLS.  All of them use Ephemeral
        ECDH (ECDHE) to compute the TLS premaster secret, and they differ only in the mechanism (if any) used to
        authenticate them.  The derivation of the TLS master secret from the premaster secret and the subsequent
        generation of bulk encryption/MAC keys and initialization vectors is independent of the key exchange
        algorithm and not impacted by the introduction of ECC.</t>
      <t> <xref target="tbl2" format="default"/> summarizes the new key exchange algorithms.  All of these key exchange algorithms
        provide forward secrecy if and only if fresh ephemeral keys are generated and used, and also destroyed
        after use.</t>
      <table anchor="tbl2" align="center">
        <name>ECC Key Exchange Algorithms</name>
        <thead>
          <tr>
            <th align="left">Algorithm</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">ECDHE_ECDSA</td>
            <td align="left">Ephemeral ECDH with ECDSA or EdDSA signatures.</td>
          </tr>
          <tr>
            <td align="left">ECDHE_RSA</td>
            <td align="left">Ephemeral ECDH with RSA signatures.</td>
          </tr>
          <tr>
            <td align="left">ECDH_anon</td>
            <td align="left">Anonymous ephemeral ECDH, no signatures.</td>
          </tr>
        </tbody>
      </table>
      <t> These key exchanges are analogous to DHE_DSS, DHE_RSA, and DH_anon, respectively.</t>
      <t> With ECDHE_RSA, a server
        can reuse its existing RSA certificate and easily comply with a constrained client's elliptic curve
        preferences (see <xref target="tlsext" format="default"/>).  However, the computational cost incurred by a server is higher
        for ECDHE_RSA than for the traditional RSA key exchange, which does not provide forward secrecy.</t>
      <t> The anonymous key exchange algorithm does not provide authentication of the server or the client.  Like
        other anonymous TLS key exchanges, it is subject to man-in-the-middle attacks. Applications using TLS with
        this algorithm SHOULD provide authentication by other means.</t>
      <figure anchor="figure_1">
        <name>Message Flow in a Full TLS 1.2 Handshake</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
       Client                                        Server
       ------                                        ------
       ClientHello          -------->
                                                ServerHello
                                               Certificate*
                                         ServerKeyExchange*
                                       CertificateRequest*+
                            <--------       ServerHelloDone
       Certificate*+
       ClientKeyExchange
       CertificateVerify*+
       [ChangeCipherSpec]
       Finished             -------->
                                         [ChangeCipherSpec]
                            <--------              Finished
       Application Data     <------->      Application Data
            * message is not sent under some conditions
            + message is not sent unless client authentication
              is desired
]]></artwork>
      </figure>
      <t> <xref target="figure_1" format="default"/> shows all messages involved in the TLS key establishment protocol (aka full handshake).  The
        addition of ECC has direct impact only on the ClientHello, the ServerHello, the server's Certificate
        message, the ServerKeyExchange, the ClientKeyExchange, the CertificateRequest, the client's Certificate
        message, and the CertificateVerify.  Next, we describe the ECC key exchange algorithm in greater detail
        in terms of the content and processing of these messages.  For ease of exposition, we defer discussion of
        client authentication and associated messages (identified with a '+' in
	<xref target="figure_1" format="default"/>) until
        <xref target="clientauth" format="default"/> and of the optional ECC-specific extensions (which impact the Hello messages)
        until <xref target="tlsext" format="default"/>.</t>
      <section anchor="ecdhe_ecdsa" numbered="true" toc="default">
        <name>ECDHE_ECDSA</name>
        <t> In ECDHE_ECDSA, the server's certificate MUST contain an ECDSA- or EdDSA-capable public key.</t>
        <t> The server sends its ephemeral ECDH public key and a specification of the corresponding curve in the
          ServerKeyExchange message.  These parameters MUST be signed with ECDSA or EdDSA using the private key
          corresponding to the public key in the server's Certificate.</t>
        <t> The client generates an ECDH key pair on the same curve as the server's ephemeral ECDH key and sends its
          public key in the ClientKeyExchange message.</t>
        <t> Both client and server perform an ECDH operation (see <xref target="alg_computes" format="default"/>) and use the resultant
          shared secret as the premaster secret.</t>
      </section>
      <section anchor="ecdhe_rsa" numbered="true" toc="default">
        <name>ECDHE_RSA</name>
        <t> This key exchange algorithm is the same as ECDHE_ECDSA except that the server's certificate MUST contain
          an RSA public key authorized for signing and the signature in the ServerKeyExchange message must be
          computed with the corresponding RSA private key.</t>
      </section>
      <section anchor="ecdh_anon" numbered="true" toc="default">
        <name>ECDH_anon</name>
        <t> NOTE: Despite the name beginning with "ECDH_" (no E), the key used in ECDH_anon is ephemeral just like
          the key in ECDHE_RSA and ECDHE_ECDSA. The naming follows the example of DH_anon, where the key is also
          ephemeral but the name does not reflect it.</t>
        <t> In ECDH_anon, the server's Certificate, the CertificateRequest, the client's Certificate, and the
          CertificateVerify messages MUST NOT be sent.</t>
        <t> The server MUST send an ephemeral ECDH public key and a specification of the corresponding curve in
          the ServerKeyExchange message.  These parameters MUST NOT be signed.</t>
        <t> The client generates an ECDH key pair on the same curve as the server's ephemeral ECDH key and sends
          its public key in the ClientKeyExchange message.</t>
        <t> Both client and server perform an ECDH operation and use the resultant shared secret as the premaster
          secret.  All ECDH calculations are performed as specified in <xref target="alg_computes" format="default"/>.</t>
      </section>
      <section anchor="certchainalgs" numbered="true" toc="default">
        <name>Algorithms in Certificate Chains</name>
        <t> This specification does not impose restrictions on signature schemes used anywhere in the certificate chain.
          The previous version of this document required the signatures to match, but this restriction, originating
          in previous TLS versions, is lifted here as it had been in RFC 5246.</t>
      </section>
    </section>
    <section anchor="clientauth" numbered="true" toc="default">
      <name>Client Authentication</name>
      <t> This document defines a client authentication mechanism named after the type of client certificate
        involved: ECDSA_sign. The ECDSA_sign mechanism is usable with any of the non-anonymous ECC key exchange
        algorithms described in <xref target="ecdh" format="default"/> as well as other non-anonymous (non-ECC) key exchange
        algorithms defined in TLS.</t>
      <t> Note that client certificates with EdDSA public keys also use this mechanism. </t>
      <t> The server can request ECC-based client authentication by including this certificate type in its
        CertificateRequest message. The client must check if it possesses a certificate appropriate for the method
        suggested by the server and is willing to use it for authentication.</t>
      <t> If these conditions are not met, the client SHOULD send a client Certificate message containing no
        certificates.  In this case, the ClientKeyExchange MUST be sent as described in <xref target="ecdh" format="default"/>, and
        the CertificateVerify MUST NOT be sent.  If the server requires client authentication, it may respond with
        a fatal handshake failure alert.</t>
      <t> If the client has an appropriate certificate and is willing to use it for authentication, it must send
        that certificate in the client's Certificate message (as per <xref target="client_cert" format="default"/>) and prove
        possession of the private key corresponding to the certified key.  The process of determining an
        appropriate certificate and proving possession is different for each
	authentication mechanism and is
        described below.</t>
      <t> NOTE: It is permissible for a server to request (and the client to send) a client certificate of a
        different type than the server certificate.</t>
      <section anchor="ecdsa_sign" numbered="true" toc="default">
        <name>ECDSA_sign</name>
        <t> To use this authentication mechanism, the client MUST possess a certificate containing an ECDSA-
          or EdDSA-capable public key.</t>
        <t> The client proves possession of the private key corresponding to the certified key by including a
          signature in the CertificateVerify message as described in <xref target="cert_verify" format="default"/>.</t>
      </section>
    </section>
    <section anchor="tlsext" numbered="true" toc="default">
      <name>TLS Extensions for ECC</name>
      <t> Two TLS extensions are defined in this specification: (i) the Supported Elliptic Curves Extension
        and (ii) the Supported Point Formats Extension.  These allow negotiating the use of specific curves and
        point formats (e.g., compressed vs. uncompressed, respectively) during a handshake starting a new session.
        These extensions are especially relevant for constrained clients that may only support a limited number of
        curves or point formats.  They follow the general approach outlined in <xref target="RFC4366" format="default"/>; message
        details are specified in <xref target="structs" format="default"/>.  The client enumerates the curves it supports and the
        point formats it can parse by including the appropriate extensions in its ClientHello message.  The server
        similarly enumerates the point formats it can parse by including an extension in its ServerHello message.</t>
      <t> A TLS client that proposes ECC cipher suites in its ClientHello message SHOULD include these extensions.
        Servers implementing ECC cipher suites MUST support these extensions, and when a client uses these
        extensions, servers MUST NOT negotiate the use of an ECC cipher suite unless they can complete the
        handshake while respecting the choice of curves specified by the client.
        This eliminates the possibility that a negotiated ECC handshake will be subsequently aborted due to a
        client's inability to deal with the server's EC key.</t>
      <t> The client MUST NOT include these extensions in the ClientHello message if it does not propose any ECC
        cipher suites.  A client that proposes ECC cipher suites may choose not to include these extensions.  In
        this case, the server is free to choose any one of the elliptic curves or point formats listed in
        <xref target="structs" format="default"/>.  That section also describes the structure and processing of these extensions
        in greater detail.</t>
      <t> In the case of session resumption, the server simply ignores the Supported Elliptic Curves Extension and
        the Supported Point Formats Extension appearing in the current ClientHello message. These extensions only
        play a role during handshakes negotiating a new session.</t>
    </section>
    <section anchor="structs" numbered="true" toc="default">
      <name>Data Structures and Computations</name>
      <t> This section specifies the data structures and computations used by ECC-based key mechanisms specified
        in the previous three sections.  The presentation language used here is the same as that used in TLS.
        Since this specification extends TLS, these descriptions should be merged with those in the TLS specification
        and any others that extend TLS.  This means that enum types may not specify all possible values, and
        structures with multiple formats chosen with a select() clause may not indicate all possible cases.</t>
      <section anchor="ch_extensions" numbered="true" toc="default">
        <name>Client Hello Extensions</name>
        <t> This section specifies two TLS extensions that can be included with the ClientHello message as described
          in <xref target="RFC4366" format="default"/>: the Supported Elliptic Curves Extension and the Supported Point Formats
          Extension.</t>
        <t> When these extensions are sent:</t>
        <t> The extensions SHOULD be sent along with any ClientHello message that proposes ECC cipher suites.</t>
        <t> Meaning of these extensions:</t>
        <t> These extensions allow a client to enumerate the elliptic curves it supports and/or the point formats
          it can parse.</t>
        <t> Structure of these extensions:</t>
        <t> The general structure of TLS extensions is described in <xref target="RFC4366" format="default"/>, and this specification
          adds two types to ExtensionType.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   enum {
       elliptic_curves(10),
       ec_point_formats(11)
   } ExtensionType;
]]></artwork>
        <ul spacing="normal">
          <li> elliptic_curves (Supported Elliptic Curves Extension): Indicates the set of elliptic
            curves supported by the client.  For this extension, the opaque extension_data field contains
            NamedCurveList.  See <xref target="supp_ec_ext" format="default"/> for details.</li>
          <li> ec_point_formats (Supported Point Formats Extension): Indicates the set of point formats
            that the client can parse.  For this extension, the opaque extension_data field contains ECPointFormatList.
            See <xref target="supp_pf_ext" format="default"/> for details.</li>
        </ul>
        <t> Actions of the sender:</t>
        <t> A client that proposes ECC cipher suites in its ClientHello message appends these extensions (along
          with any others), enumerating the curves it supports and the point formats it can parse.  Clients SHOULD
          send both the Supported Elliptic Curves Extension and the Supported Point Formats Extension.  If the
          Supported Point Formats Extension is indeed sent, it MUST contain the value 0 (uncompressed) as one of the
          items in the list of point formats.</t>
        <t> Actions of the receiver:</t>
        <t> A server that receives a ClientHello containing one or both of these extensions MUST use the client's
          enumerated capabilities to guide its selection of an appropriate cipher suite.  One of the proposed ECC
          cipher suites must be negotiated only if the server can successfully complete the handshake while using
          the curves and point formats supported by the client (cf. Sections
   <xref target="server_cert" format="counter"/> and
          <xref target="ske" format="counter"/>).</t>
        <t> NOTE: A server participating in an ECDHE_ECDSA key exchange may use different curves for the ECDSA or
          EdDSA key in its certificate and for the ephemeral ECDH key in the ServerKeyExchange message.  The server
          MUST consider the extensions in both cases.</t>
        <t> If a server does not understand the Supported Elliptic Curves Extension, does not understand the
          Supported Point Formats Extension, or is unable to complete the ECC handshake while restricting itself
          to the enumerated curves and point formats, it MUST NOT negotiate the use of an ECC cipher suite.
          Depending on what other cipher suites are proposed by the client and supported by the server, this may
          result in a fatal handshake failure alert due to the lack of common cipher suites.</t>
        <section anchor="supp_ec_ext" numbered="true" toc="default">
          <name>Supported Elliptic Curves Extension</name>
          <t> RFC 4492 defined 25 different curves in the NamedCurve registry
	  (now renamed the "TLS Supported Groups" registry,
            although the enumeration below is still named NamedCurve) for use in TLS. Only three have seen
            much use. This specification is deprecating the rest (with numbers 1-22). This specification also
            deprecates the explicit curves with identifiers 0xFF01 and 0xFF02. It also adds the new curves
            defined in <xref target="RFC7748" format="default"/>. The end result is as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
        enum {
            deprecated(1..22),
            secp256r1 (23), secp384r1 (24), secp521r1 (25),
            x25519(29), x448(30),
            reserved (0xFE00..0xFEFF),
            deprecated(0xFF01..0xFF02),
            (0xFFFF)
        } NamedCurve;
]]></artwork>
          <t> Note that other specifications have since added other values to this enumeration. Some of those values
            are not curves at all, but finite field groups. See <xref target="RFC7919" format="default"/>.</t>
          <t> secp256r1, etc: Indicates support of the corresponding named curve or groups.  
            The named curves secp256r1, secp384r1, and secp521r1 are specified in SEC 2
            <xref target="SECG-SEC2" format="default"/>. These curves are also recommended in ANSI X9.62
            <xref target="ANSI.X9-62.2005" format="default"/> and FIPS 186-4 <xref target="FIPS.186-4" format="default"/>. The rest of this document
            refers to these three curves as the "NIST curves" because they were originally standardized by the National
            Institute of Standards and Technology. The curves x25519 and x448
            are defined in <xref target="RFC7748" format="default"/>.  Values 0xFE00 through 0xFEFF are reserved for private use.</t>
          <t> The predecessor of this document also supported explicitly defined prime and char2 curves, but these are
            deprecated by this specification.</t>
          <t> The NamedCurve name space (now titled "TLS Supported Groups") is maintained by IANA.  See <xref target="iana" format="default"/> for information on how new
            value assignments are added.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
        struct {
            NamedCurve named_curve_list<2..2^16-1>
        } NamedCurveList;
]]></artwork>
          <t> Items in named_curve_list are ordered according to the client's preferences (favorite choice
            first).</t>
          <t> As an example, a client that only supports secp256r1 (aka NIST P-256; value 23 = 0x0017) and secp384r1
            (aka NIST P-384; value 24 = 0x0018) and prefers to use secp256r1 would include a TLS extension consisting
            of the following octets.  Note that the first two octets indicate the extension type (Supported Elliptic
            Curves Extension):</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
        00 0A 00 06 00 04 00 17 00 18
]]></artwork>
        </section>
        <section anchor="supp_pf_ext" numbered="true" toc="default">
          <name>Supported Point Formats Extension</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
        enum {
            uncompressed (0),
            deprecated (1..2),
            reserved (248..255)
        } ECPointFormat;
        struct {
            ECPointFormat ec_point_format_list<1..2^8-1>
        } ECPointFormatList;
]]></artwork>
          <t> Three point formats were included in the definition of ECPointFormat above. This specification
            deprecates all but the uncompressed point format. Implementations of this document MUST support the
            uncompressed format for all of their supported curves and MUST NOT support other formats for curves
            defined in this specification. For backwards compatibility purposes, the point format list extension
            MAY still be included and contain exactly one value: the uncompressed point format (0). RFC 4492 
            specified that if this extension is missing, it means that only the uncompressed point format is 
            supported, so interoperability with implementations that support the uncompressed format should work
            with or without the extension.</t>
          <t> If the client sends the extension and the extension does not contain the uncompressed point format,
            and the client has used the Supported Groups extension to indicate support for any of the curves defined
            in this specification, then the server MUST abort the handshake and return an illegal_parameter alert.</t>
          <t> The ECPointFormat name space (now titled "TLS EC Point Formats") is maintained by IANA.  See <xref target="iana" format="default"/> for information on how
            new value assignments are added.</t>
          <t> A client compliant with this specification that supports no other curves MUST send the following octets;
            note that the first two octets indicate the extension type (Supported Point Formats Extension):</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
        00 0B 00 02 01 00
]]></artwork>
        </section>
        <section anchor="sighash_ext" numbered="true" toc="default">
          <name>The signature_algorithms Extension and EdDSA</name>
          <t> The signature_algorithms extension, defined in Section 7.4.1.4.1 of <xref target="RFC5246" format="default"/>, advertises
            the combinations of signature algorithm and hash function that the client supports. The pure (non-prehashed)
            forms of EdDSA do not hash the data before signing it. For this reason, it does not make sense to combine them
            with a hash function in the extension.</t>
          <t> For bits-on-the-wire compatibility with TLS 1.3, we define a new
	  dummy value in the "TLS HashAlgorithm" registry
            that we call "Intrinsic" (value 8), meaning that hashing is intrinsic to the signature algorithm.</t>
          <t> To represent ed25519 and ed448 in the signature_algorithms extension, the value shall be (8,7) and 
            (8,8), respectively.</t>
        </section>
      </section>
      <section anchor="serverhello_ext" numbered="true" toc="default">
        <name>Server Hello Extension</name>
        <t> This section specifies a TLS extension that can be included with the ServerHello message as described
          in <xref target="RFC4366" format="default"/>, the Supported Point Formats Extension.</t>
        <t> When this extension is sent:</t>
        <t> The Supported Point Formats Extension is included in a ServerHello message in response to a ClientHello
          message containing the Supported Point Formats Extension when negotiating an ECC cipher suite.</t>
        <t> Meaning of this extension:</t>
        <t> This extension allows a server to enumerate the point formats it can parse (for the curve that will appear
          in its ServerKeyExchange message when using the ECDHE_ECDSA, ECDHE_RSA, or ECDH_anon key exchange algorithm.</t>
        <t> Structure of this extension:</t>
        <t> The server's Supported Point Formats Extension has the same structure as the client's Supported Point
          Formats Extension (see <xref target="supp_pf_ext" format="default"/>).  Items in ec_point_format_list here are ordered
          according to the server's preference (favorite choice first).  Note that the server MAY include items that
          were not found in the client's list. However, without extensions, this specification allows exactly one point
          format, so there is not really any opportunity for mismatches.</t>
        <t> Actions of the sender:</t>
        <t> A server that selects an ECC cipher suite in response to a ClientHello message including a Supported
          Point Formats Extension appends this extension (along with others) to its ServerHello message, enumerating
          the point formats it can parse.  The Supported Point Formats Extension, when used, MUST contain the value 0
          (uncompressed) as one of the items in the list of point formats.</t>
        <t> Actions of the receiver:</t>
        <t> A client that receives a ServerHello message containing a Supported Point Formats Extension MUST respect
          the server's choice of point formats during the handshake
	  (cf. Sections <xref target="client_cert" format="counter"/> and
          <xref target="cke" format="counter"/>).  If no Supported Point Formats Extension is received with the ServerHello, this is
          equivalent to an extension allowing only the uncompressed point format.</t>
      </section>
      <section anchor="server_cert" numbered="true" toc="default">
        <name>Server Certificate</name>
        <t> When this message is sent:</t>
        <t> This message is sent in all non-anonymous, ECC-based key exchange algorithms.</t>
        <t> Meaning of this message:</t>
        <t> This message is used to authentically convey the server's static public key to the client.  The following
          table shows the server certificate type appropriate for each key exchange algorithm.  ECC public keys MUST
          be encoded in certificates as described in <xref target="eccerts" format="default"/>.</t>
        <t> NOTE: The server's Certificate message is capable of carrying a chain of certificates.  The restrictions
          mentioned in <xref target="tbl3" format="default"/> apply only to the server's
	certificate (first in the chain).</t>
        <table anchor="tbl3" align="center">
          <name>Server Certificate Types</name>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="left">Server Certificate Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ECDHE_ECDSA</td>
              <td align="left">Certificate MUST contain an ECDSA- or EdDSA-capable public key.</td>
            </tr>
            <tr>
              <td align="left">ECDHE_RSA</td>
              <td align="left">Certificate MUST contain an RSA public key.</td>
            </tr>
          </tbody>
        </table>
        <t> Structure of this message:</t>
        <t> Identical to the TLS Certificate format.</t>
        <t> Actions of the sender:</t>
        <t> The server constructs an appropriate certificate chain and conveys it to the client in the Certificate
        message.  If the client has used a Supported Elliptic Curves Extension, the public key in the server's
        certificate MUST respect the client's choice of elliptic curves. A server that cannot satisfy this requirement 
        MUST NOT choose an ECC cipher suite in its ServerHello message.)</t>
        <t> Actions of the receiver:</t>
        <t> The client validates the certificate chain, extracts the server's public key, and checks that the key
        type is appropriate for the negotiated key exchange algorithm.  (A possible reason for a fatal handshake
        failure is that the client's capabilities for handling elliptic curves and point formats are exceeded;
        cf. <xref target="ch_extensions" format="default"/>.)</t>
      </section>
      <section anchor="ske" numbered="true" toc="default">
        <name>Server Key Exchange</name>
        <t> When this message is sent:</t>
        <t> This message is sent when using the ECDHE_ECDSA, ECDHE_RSA, and ECDH_anon key exchange algorithms.</t>
        <t> Meaning of this message:</t>
        <t> This message is used to convey the server's ephemeral ECDH public key (and the corresponding elliptic
          curve domain parameters) to the client.</t>
        <t> The ECCCurveType enum used to have values for explicit prime and for explicit char2 curves. Those
          values are now deprecated, so only one value remains:</t>
        <t> Structure of this message:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        enum {
            deprecated (1..2),
            named_curve (3),
            reserved(248..255)
        } ECCurveType;
]]></artwork>
        <t> The value named_curve indicates that a named curve is used. This option is now the only remaining format.</t>
        <t> Values 248 through 255 are reserved for private use.</t>
        <t> The ECCurveType name space (now titled "TLS EC Curve Types") is maintained by IANA.  See <xref target="iana" format="default"/> for information on how new
          value assignments are added.</t>
        <t> RFC 4492 had a specification for an ECCurve structure and an ECBasisType structure. Both of these are
          omitted now because they were only used with the now deprecated explicit curves.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        struct {
            opaque point <1..2^8-1>;
        } ECPoint;
]]></artwork>
        <t> point: This is the byte string representation of an elliptic curve point following the
            conversion routine in Section 4.3.6 of <xref target="ANSI.X9-62.2005" format="default"/>.  This byte string may
            represent an elliptic curve point in uncompressed, compressed, or hybrid format, but this specification
            deprecates all but the uncompressed format. For the NIST curves, the format is repeated in <xref target="UncompressedFormat" format="default"/> for convenience. For the X25519 and X448 curves, the only valid 
            representation is the one specified in <xref target="RFC7748" format="default"/>, a 32- or 56-octet representation of 
            the u value of the point. This structure MUST NOT be used with Ed25519 and Ed448 public keys.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        struct {
            ECCurveType    curve_type;
            select (curve_type) {
                case named_curve:
                    NamedCurve namedcurve;
            };
        } ECParameters;
]]></artwork>
        <t> curve_type: This identifies the type of the elliptic curve domain parameters.</t>
        <t> namedCurve: Specifies a recommended set of elliptic curve domain parameters.  All those
            values of NamedCurve are allowed that refer to a curve capable of Diffie-Hellman.  With the deprecation
            of the explicit curves, this now includes all of the NamedCurve values.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        struct {
            ECParameters    curve_params;
            ECPoint         public;
        } ServerECDHParams;
]]></artwork>
        <t> curve_params: Specifies the elliptic curve domain parameters associated with the ECDH
            public key.</t>
        <t> public: The ephemeral ECDH public key.</t>
        <t> The ServerKeyExchange message is extended as follows.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        enum {
            ec_diffie_hellman
        } KeyExchangeAlgorithm;
]]></artwork>
        <ul spacing="normal">
          <li> ec_diffie_hellman: Indicates the ServerKeyExchange message contains an ECDH public key.</li>
        </ul>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   select (KeyExchangeAlgorithm) {
       case ec_diffie_hellman:
           ServerECDHParams    params;
           Signature           signed_params;
   } ServerKeyExchange;
]]></artwork>
        <ul spacing="normal">
          <li> params: Specifies the ECDH public key and associated domain parameters.</li>
          <li>
            <t> signed_params: A hash of the params, with the signature appropriate to that hash applied.
            The private key corresponding to the certified public key in the server's Certificate message is used
            for signing.</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
     enum {
         ecdsa(3),
         ed25519(7)
         ed448(8)
     } SignatureAlgorithm;
     select (SignatureAlgorithm) {
        case ecdsa:
             digitally-signed struct {
                 opaque sha_hash[sha_size];
             };
        case ed25519,ed448:
             digitally-signed struct {
                 opaque rawdata[rawdata_size];
             };
     } Signature;
   ServerKeyExchange.signed_params.sha_hash
       SHA(ClientHello.random + ServerHello.random +
                              ServerKeyExchange.params);
   ServerKeyExchange.signed_params.rawdata
       ClientHello.random + ServerHello.random +
                              ServerKeyExchange.params;
]]></artwork>
          </li>
        </ul>
        <t> NOTE: SignatureAlgorithm is "rsa" for the ECDHE_RSA key exchange algorithm and "anonymous" for ECDH_anon.
          These cases are defined in TLS.  SignatureAlgorithm is "ecdsa" or
	  "eddsa" for ECDHE_ECDSA.  
   ECDSA signatures are generated and verified as described in
   <xref target="alg_computes" format="default"/>.  SHA, in the above template for sha_hash,
   may denote a hash algorithm other than SHA-1. As per ANSI X9.62, an ECDSA signature
          consists of a pair of integers, r and s.  The digitally-signed element is encoded as an opaque vector
          &lt;0..2^16-1&gt;, the contents of which are the DER encoding corresponding to the following ASN.1
          notation.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
           Ecdsa-Sig-Value ::= SEQUENCE {
               r       INTEGER,
               s       INTEGER
           }
]]></artwork>
        <t>EdDSA signatures in both the protocol and in certificates that conform to <xref target="RFC8410" format="default"/> are 
          generated and verified according to <xref target="RFC8032" format="default"/>. The digitally-signed
          element is encoded as an opaque vector &lt;0..2^16-1&gt;, the contents of which include the octet string output of
          the EdDSA signing algorithm.</t>
        <t> Actions of the sender:</t>
        <t> The server selects elliptic curve domain parameters and an ephemeral ECDH public key corresponding to
          these parameters according to the ECKAS-DH1 scheme from IEEE 1363 <xref target="IEEE.P1363" format="default"/>.
          It conveys this information to the client in the ServerKeyExchange message using the format defined above.</t>
        <t> Actions of the receiver:</t>
        <t> The client verifies the signature (when present) and retrieves the server's elliptic curve domain
          parameters and ephemeral ECDH public key from the ServerKeyExchange message.  (A possible reason for a
          fatal handshake failure is that the client's capabilities for handling elliptic curves and point formats
          are exceeded; cf. <xref target="ch_extensions" format="default"/>.)</t>
        <section anchor="UncompressedFormat" numbered="true" toc="default">
          <name>Uncompressed Point Format for NIST Curves</name>
          <t> The following represents the wire format for representing ECPoint in ServerKeyExchange records.
            The first octet of the representation indicates the form, which may be compressed, uncompressed, or
            hybrid. This specification supports only the uncompressed format for these curves. This is followed by
            the binary representation of the X value in "big-endian" or "network" format, followed by the binary
            representation of the Y value in "big-endian" or "network" format. There are no internal length markers, 
            so each number representation occupies as many octets as implied by the curve parameters. For P-256 this
            means that each of X and Y use 32 octets, padded on the left by zeros if necessary. For P-384, they take 48 
            octets each, and for P-521, they take 66 octets each.</t>
          <t> Here's a more formal representation:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
          enum {
              uncompressed(4),
              (255)
            } PointConversionForm;
            
          struct {
              PointConversionForm  form;
              opaque               X[coordinate_length];
              opaque               Y[coordinate_length];
          } UncompressedPointRepresentation;
          ]]></artwork>
        </section>
      </section>
      <section anchor="certreq" numbered="true" toc="default">
        <name>Certificate Request</name>
        <t> When this message is sent:</t>
        <t> This message is sent when requesting client authentication.</t>
        <t> Meaning of this message:</t>
        <t> The server uses this message to suggest acceptable client authentication methods.</t>
        <t> Structure of this message:</t>
        <t> The TLS CertificateRequest message is extended as follows.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        enum {
            ecdsa_sign(64),
            deprecated1(65),  /* was rsa_fixed_ecdh */
            deprecated2(66),  /* was ecdsa_fixed_ecdh */
            (255)
        } ClientCertificateType;
]]></artwork>
        <ul spacing="normal">
          <li> ecdsa_sign: Indicates that the server would like to use the corresponding client
            authentication method specified in <xref target="clientauth" format="default"/>.</li>
        </ul>
        <t> Note that RFC 4492 also defined RSA and ECDSA certificates that included a fixed ECDH
          public key. These mechanisms saw very little implementation, so this specification is deprecating them.</t>
        <t> Actions of the sender:</t>
        <t> The server decides which client authentication methods it would like to use and conveys this information
          to the client using the format defined above.</t>
        <t> Actions of the receiver:</t>
        <t> The client determines whether it has a suitable certificate for use with any of the requested methods
          and whether to proceed with client authentication.</t>
      </section>
      <section anchor="client_cert" numbered="true" toc="default">
        <name>Client Certificate</name>
        <t> When this message is sent:</t>
        <t> This message is sent in response to a CertificateRequest when a client has a suitable certificate and
          has decided to proceed with client authentication.  (Note that if the server has used a Supported Point
          Formats Extension, a certificate can only be considered suitable for use with the ECDSA_sign
          authentication method if the public key point specified in it is uncompressed, as that is the only point
          format still supported.</t>
        <t> Meaning of this message:</t>
        <t>This message is used to authentically convey the client's static
	public key to the server.  ECC public keys must be encoded in
	certificates as described in <xref target="eccerts" format="default"/>. The certificate MUST contain
	an ECDSA- or EdDSA-capable public key.</t>
        <t>NOTE: The client's Certificate message is capable of carrying a
	chain of certificates.  The restrictions mentioned above apply only to
	the client's certificate (first in the chain).</t>
        <t> Structure of this message:</t>
        <t> Identical to the TLS client Certificate format.</t>
        <t> Actions of the sender:</t>
        <t> The client constructs an appropriate certificate chain and conveys it to the server in the Certificate message.</t>
        <t> Actions of the receiver:</t>
        <t> The TLS server validates the certificate chain, extracts the client's public key, and checks that the key
        type is appropriate for the client authentication method.</t>
      </section>
      <section anchor="cke" numbered="true" toc="default">
        <name>Client Key Exchange</name>
        <t> When this message is sent:</t>
        <t> This message is sent in all key exchange algorithms.  It contains the client's ephemeral ECDH
          public key.</t>
        <t> Meaning of the message:</t>
        <t> This message is used to convey ephemeral data relating to the key exchange belonging to the client (such
          as its ephemeral ECDH public key).</t>
        <t> Structure of this message:</t>
        <t> The TLS ClientKeyExchange message is extended as follows.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        enum {
            implicit,
            explicit
        } PublicValueEncoding;
]]></artwork>
        <ul spacing="normal">
          <li> implicit, explicit: For ECC cipher suites, this indicates whether the client's ECDH public
            key is in the client's certificate ("implicit") or is provided, as an ephemeral ECDH public key, in the
            ClientKeyExchange message ("explicit").  The implicit encoding is deprecated and is retained here for 
            backward compatibility only.</li>
        </ul>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        struct {
            ECPoint ecdh_Yc;
        } ClientECDiffieHellmanPublic;
]]></artwork>
        <t> ecdh_Yc: Contains the client's ephemeral ECDH public key as a byte string ECPoint.point,
            which may represent an elliptic curve point in uncompressed format.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        struct {
            select (KeyExchangeAlgorithm) {
                case ec_diffie_hellman: ClientECDiffieHellmanPublic;
            } exchange_keys;
        } ClientKeyExchange;
]]></artwork>
        <t> Actions of the sender:</t>
        <t> The client selects an ephemeral ECDH public key corresponding to the parameters it received from the
          server. The format is the same as in <xref target="ske" format="default"/>.</t>
        <t> Actions of the receiver:</t>
        <t> The server retrieves the client's ephemeral ECDH public key from the ClientKeyExchange message and checks
          that it is on the same elliptic curve as the server's ECDH key.</t>
      </section>
      <section anchor="cert_verify" numbered="true" toc="default">
        <name>Certificate Verify</name>
        <t> When this message is sent:</t>
        <t> This message is sent when the client sends a client certificate containing a public key usable for
          digital signatures.</t>
        <t> Meaning of the message:</t>
        <t> This message contains a signature that proves possession of the private key corresponding to the public
          key in the client's Certificate message.</t>
        <t> Structure of this message:</t>
        <t> The TLS CertificateVerify message and the underlying signature type are defined in the TLS base
          specifications, and the latter is extended here in <xref target="ske" format="default"/>.  

For the "ecdsa" and "eddsa" cases, the
          signature field in the CertificateVerify message contains an ECDSA or EdDSA (respectively) signature computed
          over handshake messages exchanged so far, exactly similar to CertificateVerify with other signing
          algorithms:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        CertificateVerify.signature.sha_hash
            SHA(handshake_messages);
        CertificateVerify.signature.rawdata
            handshake_messages;
]]></artwork>
        <t> ECDSA signatures are computed as described in <xref target="alg_computes" format="default"/>, and SHA in the above
          template for sha_hash accordingly may denote a hash algorithm other than SHA-1.  As per ANSI X9.62, an
          ECDSA signature consists of a pair of integers, r and s.  The digitally-signed element is encoded as an
          opaque vector &lt;0..2^16-1&gt;, the contents of which are the DER encoding <xref target="X.690" format="default"/>
          corresponding to the following ASN.1 notation <xref target="X.680" format="default"/>.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
        Ecdsa-Sig-Value ::= SEQUENCE {
            r       INTEGER,
            s       INTEGER
        }
]]></artwork>
        <t>EdDSA signatures are generated and verified according to <xref target="RFC8032" format="default"/>. The digitally-signed
          element is encoded as an opaque vector &lt;0..2^16-1&gt;, the contents of which include the octet string output of
          the EdDSA signing algorithm.</t>
        <t> Actions of the sender:</t>
        <t> The client computes its signature over all handshake messages sent or received starting at client hello
          and up to but not including this message.  It uses the private key corresponding to its certified public
          key to compute the signature, which is conveyed in the format defined above.</t>
        <t> Actions of the receiver:</t>
        <t> The server extracts the client's signature from the CertificateVerify message and verifies the
          signature using the public key it received in the client's Certificate message.</t>
      </section>
      <section anchor="eccerts" numbered="true" toc="default">
        <name>Elliptic Curve Certificates</name>
        <t> X.509 certificates containing ECC public keys or signed using ECDSA MUST comply with
          <xref target="RFC3279" format="default"/> or another RFC that replaces or extends it. X.509 certificates containing ECC
          public keys or signed using EdDSA MUST comply with <xref target="RFC8410" format="default"/>. Clients SHOULD use the
          elliptic curve domain parameters recommended in ANSI X9.62, FIPS 186-4, and SEC 2
          <xref target="SECG-SEC2" format="default"/>, or in <xref target="RFC8032" format="default"/>.</t>
        <t>EdDSA keys using the Ed25519 algorithm MUST use the ed25519 signature algorithm, and Ed448
          keys MUST use the ed448 signature algorithm. This document does not define use of Ed25519ph and Ed448ph keys
          with TLS. Ed25519, Ed25519ph, Ed448, and Ed448ph keys MUST NOT be used with ECDSA.</t>
      </section>
      <section anchor="alg_computes" numbered="true" toc="default">
        <name>ECDH, ECDSA, and RSA Computations</name>
        <t> All ECDH calculations for the NIST curves (including parameter and key generation as well as the shared
          secret calculation) are performed according to <xref target="IEEE.P1363" format="default"/> using the ECKAS-DH1 scheme
          with the identity map as the Key Derivation Function (KDF) so that the premaster secret is the x-coordinate
          of the ECDH shared secret elliptic curve point represented as an
	  octet string.  


Note that this octet string
          (Z in IEEE 1363 terminology), as output by FE2OSP (Field Element to Octet String Conversion Primitive),
          has constant length for any given field; leading zeros found in this octet string MUST NOT be truncated.</t>
        <t> (Note that this use of the identity KDF is a technicality.  The complete picture is that ECDH is
          employed with a non-trivial KDF because TLS does not directly use the premaster secret for anything other
          than for computing the master secret.  In TLS 1.0 and 1.1, this means that the MD5- and SHA-1-based TLS
          Pseudorandom Function (PRF) serves as a KDF; in TLS 1.2, the KDF is
	  determined by ciphersuite, and it is conceivable that future TLS
          versions or new TLS extensions introduced in the future may vary this computation.)</t>
        <t> An ECDHE key exchange using X25519 (curve x25519) goes as follows:
	(1) each party picks a secret key d
          uniformly at random and computes the corresponding public key x =
	  X25519(d, G); (2) parties exchange their
          public keys and compute a shared secret as x_S = X25519(d, x_peer);
	  and (3), if either party obtains all-zeroes x_S,
          it MUST abort the handshake (as required by definition of X25519 and X448). ECDHE for X448 works similarly,
          replacing X25519 with X448 and x25519 with x448.  The derived shared secret is used directly as
          the premaster secret, which is always exactly 32 bytes when ECDHE with X25519 is used and 56 bytes when
          ECDHE with X448 is used.</t>
        <t> All ECDSA computations MUST be performed according to ANSI X9.62 or its successors.  Data to be 
          signed/verified is hashed, and the result runs directly through the ECDSA algorithm with no additional 
          hashing. A secure hash function such as SHA-256, SHA-384, or SHA-512 from <xref target="FIPS.180-4" format="default"/>
          MUST be used.</t>
        <t> All EdDSA computations MUST be performed according to <xref target="RFC8032" format="default"/> or its successors. Data
          to be signed/verified is run through the EdDSA algorithm with no hashing (EdDSA will internally run the data
          through the "prehash" function PH). The context parameter for Ed448 MUST be set to the empty string.</t>
        <t> RFC 4492 anticipated the standardization of a mechanism for specifying the required hash function in the certificate,
        perhaps in the parameters field of the subjectPublicKeyInfo. Such standardization never took place, and as a result,
        SHA-1 is used in TLS 1.1 and earlier (except for EdDSA, which uses identity function). TLS 1.2 added a
        SignatureAndHashAlgorithm parameter to the DigitallySigned struct, thus allowing agility in choosing the
        signature hash. EdDSA signatures MUST have HashAlgorithm of 8 (Intrinsic).</t>
        <t> All RSA signatures must be generated and verified according to
	Section 7.2 of <xref target="RFC8017" format="default"/>.</t>
      </section>
      <section anchor="valid25519" numbered="true" toc="default">
        <name>Public Key Validation</name>
        <t> With the NIST curves, each party MUST validate the public key sent by its peer in the ClientKeyExchange
          and ServerKeyExchange messages. A receiving party MUST 
          check that the x and y parameters from the peer's public value
	  satisfy the curve equation, y<sup>2</sup> = x<sup>3</sup> + ax + b  mod p. See Section
	  2.3 of <xref target="Menezes" format="default"/> for details. </t>
<t>testing subscript and superscript:</t>
<ul spacing="normal">
<li>y<sup>2</sup> = x<sup>3</sup> + ax + b  mod p</li>
<li>log<sub>3</sub>(x-2)</li>
<li>e*u<sup>2</sup> + v<sup>2</sup> = 1 + d*u<sup>2</sup>*v<sup>2</sup> (mod p)</li>
<li>x<sup>5-2</sup></li>
<li>x<sup>2/3</sup></li>
<li>x<sup>2</sup>/3</li>
</ul>

<t>
Failing to do so allows
	  attackers to gain  information about the private key to the point that they may recover the entire private key in a few requests 
          if that key is not really ephemeral.</t>
        <t>With X25519 and X448, a receiving party MUST check whether the computed premaster secret is the all-zero
          value and abort the handshake if so, as described in Section 6 of <xref target="RFC7748" format="default"/>.</t>
        <t>Ed25519 and Ed448 internally do public key validation as part of signature verification.</t>
      </section>
    </section>
    <section anchor="suites" numbered="true" toc="default">
      <name>Cipher Suites</name>
      <t> The table below defines ECC cipher suites that use the key exchange algorithms specified in <xref target="ecdh" format="default"/>.</t>
      <table anchor="tbl5" align="center">
        <name>TLS ECC Cipher Suites</name>
        <thead>
          <tr>
            <th align="left">CipherSuite</th>
            <th align="left">Identifier</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">TLS_ECDHE_ECDSA_WITH_NULL_SHA</td>
            <td align="left">{ 0xC0, 0x06 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x08 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x09 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x0A }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256</td>
            <td align="left">{ 0xC0, 0x2B }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384</td>
            <td align="left">{ 0xC0, 0x2C }</td>
          </tr>
          <tr>
            <td align="left"> </td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_RSA_WITH_NULL_SHA</td>
            <td align="left">{ 0xC0, 0x10 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x12 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x13 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x14 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</td>
            <td align="left">{ 0xC0, 0x2F }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</td>
            <td align="left">{ 0xC0, 0x30 }</td>
          </tr>
          <tr>
            <td align="left"> </td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">TLS_ECDH_anon_WITH_NULL_SHA</td>
            <td align="left">{ 0xC0, 0x15 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x17 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDH_anon_WITH_AES_128_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x18 }</td>
          </tr>
          <tr>
            <td align="left">TLS_ECDH_anon_WITH_AES_256_CBC_SHA</td>
            <td align="left">{ 0xC0, 0x19 }</td>
          </tr>
        </tbody>
      </table>
      <t> The key exchange method, cipher, and hash algorithm for each of these cipher suites are easily determined
        by examining the name.  Ciphers (other than AES ciphers) and hash algorithms are defined in
        <xref target="RFC2246" format="default"/> and <xref target="RFC4346" format="default"/>. AES ciphers are defined in <xref target="RFC5246" format="default"/>, 
        and AES-GCM ciphersuites are in <xref target="RFC5289" format="default"/>.</t>
      <t> Server implementations SHOULD support all of the following cipher suites, and client implementations
        SHOULD support at least one of them:</t>
      <ul spacing="normal">
        <li> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</li>
        <li> TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</li>
        <li> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256</li>
        <li> TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</li>
      </ul>
    </section>
    <section anchor="impstat" numbered="true" toc="default">
      <name>Implementation Status</name>
      <t> Both ECDHE and ECDSA with the NIST curves are widely implemented and supported in all major browsers and all 
        widely used TLS libraries. ECDHE with Curve25519 is by now implemented in several browsers and several TLS 
        libraries including OpenSSL. Curve448 and EdDSA have working
	interoperable implementations, but they are not yet
        as widely deployed.</t>
    </section>
    <section anchor="sec" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t> Security issues are discussed throughout this memo.</t>
      <t> For TLS handshakes using ECC cipher suites, the security
      considerations in Appendix D of each of the three TLS
        base documents apply accordingly.</t>
      <t> Security discussions specific to ECC can be found in <xref target="IEEE.P1363" format="default"/> and
        <xref target="ANSI.X9-62.2005" format="default"/>. One important issue that implementers and users must consider is elliptic
        curve selection.  Guidance on selecting an appropriate elliptic curve size is given in Table 1. Security
        considerations specific to X25519 and X448 are discussed in Section 7 of <xref target="RFC7748" format="default"/>.</t>
      <t> Beyond elliptic curve size, the main issue is elliptic curve structure.  As a general principle, it is
        more conservative to use elliptic curves with as little algebraic structure as possible. Thus, random curves
        are more conservative than special curves such as Koblitz curves, and curves over F_p with p random are more
        conservative than curves over F_p with p of a special form, and curves over F_p with p random are 
        considered more conservative than curves over F_2^m as there is no choice between multiple fields of similar
        size for characteristic 2.</t>
      <t> Another issue is the potential for catastrophic failures when a single elliptic curve is widely used.
        In this case, an attack on the elliptic curve might result in the compromise of a large number of keys.
        Again, this concern may need to be balanced against efficiency and interoperability improvements associated
        with widely used curves. Substantial additional information on elliptic curve choice can be found in
        <xref target="IEEE.P1363" format="default"/>, <xref target="ANSI.X9-62.2005" format="default"/>, and <xref target="FIPS.186-4" format="default"/>.</t>
      <t> The Introduction of <xref target="RFC8032" format="default"/> lists the security, performance, and operational advantages of 
        EdDSA signatures over ECDSA signatures using the NIST curves. </t>
      <t> All of the key exchange algorithms defined in this document provide forward secrecy. Some of the
        deprecated key exchange algorithms do not.</t>
    </section>
    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t> <xref target="RFC4492" format="default"/>, the predecessor of this document, defined the IANA registries for
        the following:</t>
      <ul spacing="normal">
        <li> Supported Groups (<xref target="ch_extensions" format="default"/>)</li>
        <li> EC Point Format (<xref target="ch_extensions" format="default"/>)</li>
        <li> EC Curve Type (<xref target="ske" format="default"/></li>
      </ul>
      <t>)</t>
      <t> IANA has prepended "TLS" to the names of these three registries.</t>
      <t> For each name space, this document defines the initial value assignments and defines a range of 256 values
        (NamedCurve) or eight values (ECPointFormat and ECCurveType) reserved for Private Use.  The policy for any additional
        assignments is "Specification Required". (RFC 4492 required IETF review.)</t>
      <t>
All existing entries in the "ExtensionType Values", "TLS ClientCertificateType
Identifiers", "TLS Cipher Suites", "TLS Supported Groups", "TLS EC Point Format", and
"TLS EC Curve Type" registries that referred to RFC 4492 have been updated to
refer to this document.
      </t>
      <t> IANA has assigned the value 29 to x25519 and the value
        30 to x448 in the "TLS Supported Groups" registry. 
</t>
      <t> IANA has assigned two values in the "TLS SignatureAlgorithm"
      registry for ed25519 (7) and ed448 (8) with this document as
      reference. This keeps compatibility with TLS 1.3.</t>
      <t> IANA has assigned one value from the "TLS HashAlgorithm"
      registry for Intrinsic (8) with DTLS-OK set to true (Y)
        and this document as reference. This keeps compatibility with TLS 1.3.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="BCP" value="14"/>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization/>
            </author>
            <date year="2017" month="May"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC7748" target="https://www.rfc-editor.org/info/rfc7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <seriesInfo name="DOI" value="10.17487/RFC7748"/>
            <seriesInfo name="RFC" value="7748"/>
            <author initials="A." surname="Langley" fullname="A. Langley">
              <organization/>
            </author>
            <author initials="M." surname="Hamburg" fullname="M. Hamburg">
              <organization/>
            </author>
            <author initials="S." surname="Turner" fullname="S. Turner">
              <organization/>
            </author>
            <date year="2016" month="January"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS).  These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <seriesInfo name="DOI" value="10.17487/RFC8032"/>
            <seriesInfo name="RFC" value="8032"/>
            <author initials="S." surname="Josefsson" fullname="S. Josefsson">
              <organization/>
            </author>
            <author initials="I." surname="Liusvaara" fullname="I. Liusvaara">
              <organization/>
            </author>
            <date year="2017" month="January"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA).  The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves.  An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC2246" target="https://www.rfc-editor.org/info/rfc2246">
          <front>
            <title>The TLS Protocol Version 1.0</title>
            <seriesInfo name="DOI" value="10.17487/RFC2246"/>
            <seriesInfo name="RFC" value="2246"/>
            <author initials="T." surname="Dierks" fullname="T. Dierks">
              <organization/>
            </author>
            <author initials="C." surname="Allen" fullname="C. Allen">
              <organization/>
            </author>
            <date year="1999" month="January"/>
            <abstract>
              <t>This document specifies Version 1.0 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications privacy over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <!--draft-ietf-curdle-pkix-04 in AUTH48 as RFC-to-be 8410 -->
        <reference anchor="RFC8410" target="https://www.rfc-editor.org/info/rfc8410">
          <front>
            <title>Algorithm Identifiers for Ed25519, Ed448, X25519 and X448 for Use in the Internet X.509 Public Key Infrastructure</title>
            <seriesInfo name="DOI" value="10.17487/RFC8410"/>
            <seriesInfo name="RFC" value="8410"/>
            <author initials="S" surname="Josefsson" fullname="Simon Josefsson">
              <organization/>
            </author>
            <author initials="J" surname="Schaad" fullname="Jim Schaad">
              <organization/>
            </author>
            <date month="August" year="2018"/>
          </front>
        </reference>
        <reference anchor="RFC4346" target="https://www.rfc-editor.org/info/rfc4346">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.1</title>
            <seriesInfo name="DOI" value="10.17487/RFC4346"/>
            <seriesInfo name="RFC" value="4346"/>
            <author initials="T." surname="Dierks" fullname="T. Dierks">
              <organization/>
            </author>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization/>
            </author>
            <date year="2006" month="April"/>
            <abstract>
              <t>This document specifies Version 1.1 of the Transport Layer Security (TLS) protocol.  The TLS protocol provides communications security over the Internet.  The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC5289" target="https://www.rfc-editor.org/info/rfc5289">
          <front>
            <title>TLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois Counter Mode (GCM)</title>
            <seriesInfo name="DOI" value="10.17487/RFC5289"/>
            <seriesInfo name="RFC" value="5289"/>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization/>
            </author>
            <date year="2008" month="August"/>
            <abstract>
              <t>RFC 4492 describes elliptic curve cipher suites for Transport Layer Security (TLS).  However, all those cipher suites use HMAC-SHA-1 as their Message Authentication Code (MAC) algorithm.  This document describes sixteen new cipher suites for TLS that specify stronger MAC algorithms.  Eight use Hashed Message Authentication Code (HMAC) with SHA-256 or SHA-384, and eight use AES in Galois Counter Mode (GCM).   This memo provides information for the Internet community.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC5246" target="https://www.rfc-editor.org/info/rfc5246">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
            <seriesInfo name="DOI" value="10.17487/RFC5246"/>
            <seriesInfo name="RFC" value="5246"/>
            <author initials="T." surname="Dierks" fullname="T. Dierks">
              <organization/>
            </author>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization/>
            </author>
            <date year="2008" month="August"/>
            <abstract>
              <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol.  The TLS protocol provides communications security over the Internet.  The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="SECG-SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <seriesInfo name="Standards for Efficient Cryptography 2 (SEC 2)," value="Version 2.0"/>
            <author>
              <organization>Certicom Research</organization>
            </author>
            <date month="January" year="2010"/>
          </front>
        </reference>
        <reference anchor="RFC4366" target="https://www.rfc-editor.org/info/rfc4366">
          <front>
            <title>Transport Layer Security (TLS) Extensions</title>
            <seriesInfo name="DOI" value="10.17487/RFC4366"/>
            <seriesInfo name="RFC" value="4366"/>
            <author initials="S." surname="Blake-Wilson" fullname="S. Blake-Wilson">
              <organization/>
            </author>
            <author initials="M." surname="Nystrom" fullname="M. Nystrom">
              <organization/>
            </author>
            <author initials="D." surname="Hopwood" fullname="D. Hopwood">
              <organization/>
            </author>
            <author initials="J." surname="Mikkelsen" fullname="J. Mikkelsen">
              <organization/>
            </author>
            <author initials="T." surname="Wright" fullname="T. Wright">
              <organization/>
            </author>
            <date year="2006" month="April"/>
            <abstract>
              <t>This document describes extensions that may be used to add functionality to Transport Layer Security (TLS).  It provides both generic extension mechanisms for the TLS handshake client and server hellos, and specific extensions using these generic mechanisms.</t>
              <t>The extensions may be used by TLS clients and servers.  The extensions are backwards compatible: communication is possible between TLS clients that support the extensions and TLS servers that do not support the extensions, and vice versa.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC3279" target="https://www.rfc-editor.org/info/rfc3279">
          <front>
            <title>Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <seriesInfo name="DOI" value="10.17487/RFC3279"/>
            <seriesInfo name="RFC" value="3279"/>
            <author initials="L." surname="Bassham" fullname="L. Bassham">
              <organization/>
            </author>
            <author initials="W." surname="Polk" fullname="W. Polk">
              <organization/>
            </author>
            <author initials="R." surname="Housley" fullname="R. Housley">
              <organization/>
            </author>
            <date year="2002" month="April"/>
            <abstract>
              <t>This document specifies algorithm identifiers and ASN.1 encoding formats for digital signatures and subject public keys used in the Internet X.509 Public Key Infrastructure (PKI).  Digital signatures are used to sign certificates and certificate revocation list (CRLs).  Certificates include the public key of the named subject.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="X.680">
          <front>
            <title>Abstract Syntax Notation One (ASN.1): Specification of basic notation</title>
            <seriesInfo name="ITU-T Recommendation X.680," value="ISO/IEC 8824-1"/>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date month="August" year="2015"/>
          </front>
        </reference>
        <reference anchor="X.690">
          <front>
            <title>Information technology-ASN.1 encoding rules: Specification of
	  Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and
	  Distinguished Encoding Rules (DER)</title>
            <seriesInfo name="ITU-T Recommendation X.690," value="ISO/IEC 8825-1"/>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date month="August" year="2015"/>
          </front>
        </reference>
        <reference anchor="FIPS.186-4" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <seriesInfo name="DOI" value="10.6028/NIST.FIPS.186-4"/>
            <seriesInfo name="FIPS" value="PUB 186-4"/>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date month="July" year="2013"/>
          </front>
        </reference>
        <reference anchor="ANSI.X9-62.2005">
          <front>
            <title>Public Key Cryptography for the Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
            <seriesInfo name="ANSI" value="X9.62"/>
            <author>
              <organization>American National Standards Institute</organization>
            </author>
            <date month="November" year="2005"/>
          </front>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="BCP" value="14"/>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997" month="March"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC8017" target="https://www.rfc-editor.org/info/rfc8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <seriesInfo name="DOI" value="10.17487/RFC8017"/>
            <seriesInfo name="RFC" value="8017"/>
            <author initials="K." surname="Moriarty" fullname="K. Moriarty" role="editor">
              <organization/>
            </author>
            <author initials="B." surname="Kaliski" fullname="B. Kaliski">
              <organization/>
            </author>
            <author initials="J." surname="Jonsson" fullname="J. Jonsson">
              <organization/>
            </author>
            <author initials="A." surname="Rusch" fullname="A. Rusch">
              <organization/>
            </author>
            <date year="2016" month="November"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series.  By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="Menezes">
          <front>
            <title>On reusing ephemeral keys in Diffie-Hellman key agreement protocols</title>
            <seriesInfo name="DOI" value="10.1504/IJACT.2010.038308"/>
            <seriesInfo name="International Journal of Applied Cryptography," value="Vol. 2, Issue 2"/>
            <author initials="A" surname="Menezes" fullname="A. Menezes"/>
            <author initials="B" surname="Ustaoglu" fullname="B. Ustaoglu"/>
            <date month="January" year="2010"/>
          </front>
        </reference>
        <!--[rfced] The informative reference draft-ietf-tls-tls13 is currently in
AUTH48 state; do you want this document to proceed (i.e., referring to TLS 1.3 
as an Internet-Draft) or do you want to wait for it to be published
(i.e., referring to it as an RFC)?

Currently:
   [TLS1.3]   Rescorla, E., "The Transport Layer Security (TLS) Protocol
              Version 1.3", Work in Progress, draft-ietf-tls-tls13-28,
              March 2018.
-->
        <reference anchor="TLS1.3">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <seriesInfo name="Work in Progress," value="draft-ietf-tls-tls13-28"/>
            <author initials="E" surname="Rescorla" fullname="Eric Rescorla">
              <organization/>
            </author>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="IEEE.P1363" target="http://ieeexplore.ieee.org/document/891000/">
          <front>
            <title>Standard Specifications for Public Key Cryptography</title>
            <seriesInfo name="IEEE" value="Std P1363"/>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC4492" target="https://www.rfc-editor.org/info/rfc4492">
          <front>
            <title>Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)</title>
            <seriesInfo name="DOI" value="10.17487/RFC4492"/>
            <seriesInfo name="RFC" value="4492"/>
            <author initials="S." surname="Blake-Wilson" fullname="S. Blake-Wilson">
              <organization/>
            </author>
            <author initials="N." surname="Bolyard" fullname="N. Bolyard">
              <organization/>
            </author>
            <author initials="V." surname="Gupta" fullname="V. Gupta">
              <organization/>
            </author>
            <author initials="C." surname="Hawk" fullname="C. Hawk">
              <organization/>
            </author>
            <author initials="B." surname="Moeller" fullname="B. Moeller">
              <organization/>
            </author>
            <date year="2006" month="May"/>
            <abstract>
              <t>This document describes new key exchange algorithms based on Elliptic Curve Cryptography (ECC) for the Transport Layer Security (TLS) protocol.  In particular, it specifies the use of Elliptic Curve Diffie-Hellman (ECDH) key agreement in a TLS handshake and the use of Elliptic Curve Digital Signature Algorithm (ECDSA) as a new authentication mechanism.  This memo provides information for the Internet community.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="FIPS.180-4" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <seriesInfo name="FIPS PUB 180-4," value="DOI 10.6028/NIST.FIPS.180-4"/>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date month="August" year="2015"/>
          </front>
        </reference>
        <reference anchor="RFC7919" target="https://www.rfc-editor.org/info/rfc7919">
          <front>
            <title>Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS)</title>
            <seriesInfo name="DOI" value="10.17487/RFC7919"/>
            <seriesInfo name="RFC" value="7919"/>
            <author initials="D." surname="Gillmor" fullname="D. Gillmor">
              <organization/>
            </author>
            <date year="2016" month="August"/>
            <abstract>
              <t>Traditional finite-field-based Diffie-Hellman (DH) key exchange during the Transport Layer Security (TLS) handshake suffers from a number of security, interoperability, and efficiency shortcomings. These shortcomings arise from lack of clarity about which DH group parameters TLS servers should offer and clients should accept.  This document offers a solution to these shortcomings for compatible peers by using a section of the TLS "Supported Groups Registry" (renamed from "EC Named Curve Registry" by this document) to establish common finite field DH parameters with known structure and a mechanism for peers to negotiate support for these groups.</t>
              <t>This document updates TLS versions 1.0 (RFC 2246), 1.1 (RFC 4346), and 1.2 (RFC 5246), as well as the TLS Elliptic Curve Cryptography (ECC) extensions (RFC 4492).</t>
            </abstract>
          </front>
        </reference>
      </references>
    </references>
    <!-- ====================================================================== -->
    <section anchor="equiv" numbered="true" toc="default">
      <name>Equivalent Curves (Informative)</name>
      <t> All of the NIST curves <xref target="FIPS.186-4" format="default"/> and several of the
      ANSI curves <xref target="ANSI.X9-62.2005" format="default"/> are equivalent to curves
      listed in <xref target="supp_ec_ext" format="default"/>.  The following table displays
      the curve names chosen by different standards organizations; multiple names in one row represent aliases for the same curve.</t>
      <table anchor="tbl6" align="center">
        <name>Equivalent Curves Defined by SECG, ANSI, and NIST</name>
        <thead>
          <tr>
            <th align="left">SECG</th>
            <th align="left">ANSI X9.62</th>
            <th align="left">NIST</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">sect163k1</td>
            <td align="left"/>
            <td align="left">NIST K-163</td>
          </tr>
          <tr>
            <td align="left">sect163r1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">sect163r2</td>
            <td align="left"/>
            <td align="left">NIST B-163</td>
          </tr>
          <tr>
            <td align="left">sect193r1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">sect193r2</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">sect233k1</td>
            <td align="left"/>
            <td align="left">NIST K-233</td>
          </tr>
          <tr>
            <td align="left">sect233r1</td>
            <td align="left"/>
            <td align="left">NIST B-233</td>
          </tr>
          <tr>
            <td align="left">sect239k1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">sect283k1</td>
            <td align="left"/>
            <td align="left">NIST K-283</td>
          </tr>
          <tr>
            <td align="left">sect283r1</td>
            <td align="left"/>
            <td align="left">NIST B-283</td>
          </tr>
          <tr>
            <td align="left">sect409k1</td>
            <td align="left"/>
            <td align="left">NIST K-409</td>
          </tr>
          <tr>
            <td align="left">sect409r1</td>
            <td align="left"/>
            <td align="left">NIST B-409</td>
          </tr>
          <tr>
            <td align="left">sect571k1</td>
            <td align="left"/>
            <td align="left">NIST K-571</td>
          </tr>
          <tr>
            <td align="left">sect571r1</td>
            <td align="left"/>
            <td align="left">NIST B-571</td>
          </tr>
          <tr>
            <td align="left">secp160k1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">secp160r1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">secp160r2</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">secp192k1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">secp192r1</td>
            <td align="left">prime192v1</td>
            <td align="left">NIST P-192</td>
          </tr>
          <tr>
            <td align="left">secp224k1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">secp224r1</td>
            <td align="left"/>
            <td align="left">NIST P-224</td>
          </tr>
          <tr>
            <td align="left">secp256k1</td>
            <td align="left"/>
            <td align="left"/>
          </tr>
          <tr>
            <td align="left">secp256r1</td>
            <td align="left">prime256v1</td>
            <td align="left">NIST P-256</td>
          </tr>
          <tr>
            <td align="left">secp384r1</td>
            <td align="left"/>
            <td align="left">NIST P-384</td>
          </tr>
          <tr>
            <td align="left">secp521r1</td>
            <td align="left"/>
            <td align="left">NIST P-521</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="rfc4492diff" numbered="true" toc="default">
      <name>Differences from RFC 4492</name>
      <ul spacing="normal">
        <li>Renamed EllipticCurveList to NamedCurveList.</li>
        <li> Added TLS 1.2.</li>
        <li> Merged errata.</li>
        <li> Removed the ECDH key exchange algorithms: ECDH_RSA and ECDH_ECDSA</li>
        <li>
          <t> Deprecated a bunch of ciphersuites:</t>
          <ul empty="true" spacing="normal">
            <li>TLS_ECDH_ECDSA_WITH_NULL_SHA</li>
            <li>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</li>
            <li>TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA</li>
            <li>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA</li>
            <li>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA</li>
            <li>TLS_ECDH_RSA_WITH_NULL_SHA</li>
            <li>TLS_ECDH_RSA_WITH_RC4_128_SHA</li>
            <li>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</li>
            <li>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA</li>
            <li>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA</li>
            <li>All the other RC4 ciphersuites</li>
          </ul>
        </li>
        <li> Removed unused curves and all but the uncompressed point format.</li>
        <li> Added X25519 and X448.</li>
        <li> Deprecated explicit curves.</li>
        <li> Removed restriction on signature algorithm in certificate.</li>
      </ul>
    </section>
    <section anchor="ack" numbered="false" toc="default">
      <name>Acknowledgements</name>
      <t>Most of the text in this document is taken from  
<xref target="RFC4492" format="default"/>, the predecessor of this document. The authors of
      that document were:

</t>
      <ul spacing="compact">
        <li> Simon Blake-Wilson</li>
        <li> Nelson Bolyard</li>
        <li> Vipul Gupta</li>
        <li> Chris Hawk</li>
        <li> Bodo Moeller</li>
      </ul>
      <t> In the predecessor document, the authors acknowledged the
      contributions of Bill Anderson and Tim Dierks.</t>
      <t> The authors would like to thank Nikos Mavrogiannopoulos, Martin
      Thomson, and Tanja Lange for contributions                                                 
        to this document.</t>
    </section>
  </back>
</rfc>
