One document matched: draft-ietf-tls-rfc4492bis-03.xml


<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?>

<?rfc compact="yes" ?>
<?rfc sortrefs="yes" ?>
<?rfc strict="yes" ?>
<?rfc linkmailto="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" >

<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?>

<?rfc symrefs="yes"?>
<?rfc compact="yes" ?>
<?rfc subcompact="yes" ?>
<?rfc sortrefs="yes" ?>
<rfc ipr="trust200902" docName="draft-ietf-tls-rfc4492bis-03" category="std">
  <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>
    <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>
    <date year="2015"/>
    <area>Security Area</area>
    <workgroup>TLS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <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) as 
        a new authentication mechanism.</t>
    </abstract>
  </front>
 <!-- 
 Changes from RFC 4492:
  * Added mention of TLS 1.2
  * Removed "required reading" for ECC from the Introduction. ECC is not longer "exotic"
  * Moved the original authors to the Acknowledgement section.
  -->
  <middle>
    <!-- ====================================================================== -->
    <section anchor="introduction" title="Introduction">
      <t> Elliptic Curve Cryptography (ECC) is emerging as an attractive public-key cryptosystem, in particular for 
        mobile (i.e., wireless) environments.  Compared to currently prevalent cryptosystems such as RSA, ECC offers 
        equivalent security with smaller key sizes.  This is illustrated in the following table, based on 
        <xref target="Lenstra_Verheul"/>, which gives approximate comparable key sizes for symmetric- and 
        asymmetric-key cryptosystems based on the best-known algorithms for attacking them.</t>
      <texttable anchor="tbl1" title="Comparable Key Sizes (in bits)">
        <ttcol align="center">Symmetric</ttcol>
        <ttcol align="center">ECC</ttcol>
        <ttcol align="center">DH/DSA/RSA</ttcol>
        <c>80</c><c>163</c><c>1024</c>
        <c>112</c><c>233</c><c>2048</c>
        <c>128</c><c>283</c><c>3072</c>
        <c>192</c><c>409</c><c>7680</c>
        <c>256</c><c>571</c><c>15360</c>
      </texttable>
      <t> Smaller key sizes result in savings for power, memory, bandwidth, and computational cost that make ECC 
        especially attractive for constrained environments.</t>
      <t> This document describes additions to TLS to support ECC, applicable to TLS versions 1.0 
        <xref target="RFC2246"/>, 1.1 <xref target="RFC4346"/>, and 1.2 <xref target="RFC5246"/>.  The use of ECC in 
        TLS 1.3 is defined in <xref target="I-D.ietf-tls-tls13" />, and is explicitly out of scope for this document. 
        In particular, this document defines:<list style="symbols">
        <t> the use of the Elliptic Curve Diffie-Hellman key agreement scheme with ephemeral keys to establish the 
          TLS premaster secret, and</t>
        <t>the use of ECDSA certificates for authentication of TLS peers.</t></list></t>
      <t> The remainder of this document is organized as follows. <xref target="ecdh"/> provides an overview of 
        ECC-based key exchange algorithms for TLS. <xref target="clientauth"/> 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"/>. <xref target="structs"/> specifies various data 
        structures needed for an ECC-based handshake, their encoding in TLS messages, and the processing of those 
        messages.  <xref target="suites"/> defines ECC-based cipher suites and identifies a small subset of these 
        as recommended for all implementations of this specification. <xref target="sec"/> discusses security 
        considerations. <xref target="iana"/> describes IANA considerations for the name spaces created by this 
        document's predecessor. <xref target="ack" /> gives acknowledgements. <xref target="rfc4492diff" /> 
        provides differences from <xref target="RFC4492" />, the document that this one replaces.</t>
      <t> Implementation of this specification requires familiarity with TLS, TLS extensions 
        <xref target="RFC4366" />, and ECC (TBD: reference Wikipedia here?).</t>
      <section anchor="mustshouldmay" title="Conventions Used in This Document">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT",
          "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described
          in <xref target="RFC2119"/>.</t>
      </section>
    </section>
    <section anchor="ecdh" title="Key Exchange Algorithm">
      <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> The table below summarizes the new key exchange algorithms, which mimic DHE_DSS, DHE_RSA, and DH_anon, 
        respectively.</t>
      <texttable anchor="tbl2" title="ECC Key Exchange Algorithms">
        <ttcol align="left">Algorithm</ttcol>
        <ttcol align="left">Description</ttcol>
        <c>ECDHE_ECDSA</c><c>Ephemeral ECDH with ECDSA signatures.</c>
        <c>ECDHE_RSA</c><c>Ephemeral ECDH with RSA signatures.</c>
        <c>ECDH_anon</c><c>Anonymous ECDH, no signatures.</c>
      </texttable>
      <t> The ECDHE_ECDSA and ECDHE_RSA key exchange mechanisms provide forward secrecy.  With ECDHE_RSA, a server 
        can reuse its existing RSA certificate and easily comply with a constrained client's elliptic curve p
        references (see <xref target="tlsext"/>).  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. Implementations of this 
        algorithm SHOULD provide authentication by other means.</t>
      <t> Note that there is no structural difference between ECDH and ECDSA keys.  A certificate issuer may use 
        X.509 v3 keyUsage and extendedKeyUsage extensions to restrict the use of an ECC public key to certain 
        computations.  This document refers to an ECC key as ECDH-capable if its use in ECDH is permitted.  
        ECDSA-capable is defined similarly. <figure>
        <artwork><![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><postamble>Figure 1: Message flow in a full TLS handshake</postamble>
        </figure></t>
      <t> Figure 1 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 Figure 1) until 
        <xref target="clientauth" /> and of the optional ECC-specific extensions (which impact the Hello messages) 
        until <xref target="tlsext" />.</t>
      <section anchor="ecdhe_ecdsa" title="ECDHE_ECDSA">
        <t> In ECDHE_ECDSA, the server's certificate MUST contain an ECDSA-capable public key and be signed with 
          ECDSA.</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 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 <xref target="alg_computes"/> and use the resultant 
          shared secret as the premaster secret.</t>
      </section>
      <section anchor="ecdhe_rsa" title="ECDHE_RSA">
        <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 that the signature in the ServerKeyExchange message must be 
          computed with the corresponding RSA private key.  The server certificate MUST be signed with RSA.</t>
      </section>
      <section anchor="ecdh_anon" title="ECDH_anon">
        <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"/>.</t>
        <t> Note that while the ECDHE_ECDSA and ECDHE_RSA key exchange algorithms require the server's certificate 
          to be signed with a particular signature scheme, this specification (following the similar cases of 
          DHE_DSS, and DHE_RSA in the TLS base documents) does not impose restrictions on signature schemes used 
          elsewhere in the certificate chain.  (Often such restrictions will be useful, and it is expected that this 
          will be taken into account in certification authorities' signing practices.  However, such restrictions are 
          not strictly required in general: Even if it is beyond the capabilities of a client to completely validate 
          a given chain, the client may be able to validate the server's certificate by relying on a trusted 
          certification authority whose certificate appears as one of the intermediate certificates in the chain.)</t>
      </section>
    </section>
    <section anchor="clientauth" title="Client Authentication">
      <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"/> as well as other non-anonymous (non-ECC) key exchange 
        algorithms defined in TLS.</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 should be sent as described in <xref target="ecdh"/>, and 
        the CertificateVerify should 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"/>) 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 
        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" title="ECDSA_sign">
        <t> To use this authentication mechanism, the client MUST possess a certificate containing an ECDSA-capable 
          public key and signed with ECDSA.</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"/>.</t>
      </section>
    </section>
    <section anchor="tlsext" title="TLS Extensions for ECC">
      <t> Two new 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"/>; message 
        details are specified in <xref target="structs"/>.  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 and compression techniques 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"/>.  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" title="Data Structures and Computations">
      <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" title="Client Hello Extensions">
        <t> This section specifies two TLS extensions that can be included with the ClientHello message as described 
          in <xref target="RFC4366"/>, 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"/>, and this specification 
          adds two new types to ExtensionType.<figure><artwork><![CDATA[
   enum { elliptic_curves(10), ec_point_formats(11) } ExtensionType;
]]></artwork></figure><list style="hanging">
          <t hangText="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 
            EllipticCurveList.  See <xref target="supp_ec_ext"/> for details.</t>
          <t hangText="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"/> for details.</t></list></t>
        <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. <xref target="server_cert"/> and 
          <xref target="ske"/>).</t>
        <t> NOTE: A server participating in an ECDHE-ECDSA key exchange may use different curves for (i) the ECDSA 
          key in its certificate, and (ii) 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" title="Supported Elliptic Curves Extension">
          <t> RFC 4492 defined 25 different curves in the NamedCurve registry for use in TLS. Only three have seen 
            any use. This specification is deprecating the rest (with numbers 1-22). This specification also 
            deprecates the explicit curves with identifiers 0xFF01 and 0xFF02. This leaves only the following:</t>
          <figure><artwork><![CDATA[
        enum {
            deprecated(1..22),
            secp256r1 (23), secp384r1 (24), secp521r1 (25),
            reserved (0xFE00..0xFEFF),
            deprecated(0xFF01..0xFF02),
            (0xFFFF)
        } NamedCurve;
]]></artwork></figure>
          <t> Note that other specification have since added other values to this enumeration.</t>
          <t> secp256r1, etc: Indicates support of the corresponding named curve or class of explicitly defined 
            curves.  The named curves defined here are those specified in SEC 2 <xref target="SECG-SEC2"/>.  Note 
            that many of these curves are also recommended in ANSI X9.62 <xref target="ANSI.X9-62.2005"/> and 
            FIPS 186-4 <xref target="FIPS.186-4"/>. Values 0xFE00 through 0xFEFF are reserved for private use.</t>
          <t> The NamedCurve name space is maintained by IANA.  See <xref target="iana"/> for information on how new 
            value assignments are added.</t>
          <figure><artwork><![CDATA[
        struct {
            NamedCurve elliptic_curve_list<1..2^16-1>
        } EllipticCurveList;
]]></artwork></figure>
          <t> Items in elliptic_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>
          <figure><artwork><![CDATA[
        00 0A 00 06 00 04 00 17 00 18
]]></artwork></figure>
        </section>
        <section anchor="supp_pf_ext" title="Supported Point Formats Extension">
          <figure><artwork><![CDATA[
        enum { uncompressed (0), ansiX962_compressed_prime (1),
               ansiX962_compressed_char2 (2), reserved (248..255)
        } ECPointFormat;
        struct {
            ECPointFormat ec_point_format_list<1..2^8-1>
        } ECPointFormatList;
]]></artwork></figure>
          <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 support no other formats for curves
            defined in this specification. For backwards compatibility purposes, the point format list extension
            MUST still be included, and contain exactly one value: the uncomptessed point format (0).</t>
          <t> The ECPointFormat name space is maintained by IANA.  See <xref target="iana"/> for information on how 
            new value assignments are added.</t>
          <t> Items in ec_point_format_list are ordered according to the client's preferences (favorite choice first).</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):<figure><artwork><![CDATA[
        00 0B 00 02 01 00
]]></artwork></figure></t>
        </section>
      </section>
      <section anchor="serverhello_ext" title="Server Hello Extension">
        <t> This section specifies a TLS extension that can be included with the ServerHello message as described 
          in <xref target="RFC4366"/>, 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"/>).  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 (e.g., the server may prefer to receive points in compressed format 
          even when a client cannot parse this format: the same client may nevertheless be capable of outputting 
          points in compressed format).</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. <xref target="client_cert"/> and 
          <xref target="cke"/>).  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" title="Server Certificate">
        <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"/>.</t>
        <t> NOTE: The server's Certificate message is capable of carrying a chain of certificates.  The restrictions 
          mentioned in Table 3 apply only to the server's certificate (first in the chain).</t>
        <texttable anchor="tbl3" title="Server Certificate Types">
        <ttcol align="left">Algorithm</ttcol>
        <ttcol align="left">Server Certificate Type</ttcol>
        <c>ECDHE_ECDSA</c><c>Certificate MUST contain an ECDSA-capable public key.  It MUST be signed with ECDSA.</c>
        <c>ECDHE_RSA</c><c>Certificate MUST contain an RSA public key authorized for use in digital signatures.  
          It MUST be signed with RSA.</c>
      </texttable>
      <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; in particular, the public key MUST employ 
        a named curve (not the same curve as an explicit curve) unless the client has indicated support for 
        explicit curves of the appropriate type.  If the client has used a Supported Point Formats Extension, both 
        the server's public key point and (in the case of an explicit curve) the curve's base point MUST respect 
        the client's choice of point formats.  (A server that cannot satisfy these requirements 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"/>.)</t>
      </section>
      <section anchor="ske" title="Server Key Exchange">
        <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> Structure of this message:<figure><artwork><![CDATA[
        enum { explicit_prime (1), explicit_char2 (2),
               named_curve (3), reserved(248..255) } ECCurveType;
]]></artwork></figure><list style="hanging">
          <t hangText="explicit_prime:"> Indicates the elliptic curve domain parameters are conveyed verbosely, 
            and the underlying finite field is a prime field.</t>
          <t hangText="explicit_char2:"> Indicates the elliptic curve domain parameters are conveyed verbosely, 
            and the underlying finite field is a characteristic-2 field.</t>
          <t hangText="named_curve:"> Indicates that a named curve is used.  This option SHOULD be used when 
            applicable.</t></list></t>
        <t> Values 248 through 255 are reserved for private use.</t>
        <t> The ECCurveType name space is maintained by IANA.  See <xref target="iana"/> for information on how new 
          value assignments are added.<figure><artwork><![CDATA[
        struct {
            opaque a <1..2^8-1>;
            opaque b <1..2^8-1>;
        } ECCurve;
]]></artwork></figure><list style="hanging">
          <t hangText="a, b:"> These parameters specify the coefficients of the elliptic curve.  Each value contains 
            the byte string representation of a field element following the conversion routine in Section 4.3.3 of 
            <xref target="ANSI.X9-62.2005"/>.<figure><artwork><![CDATA[
        struct {
            opaque point <1..2^8-1>;
        } ECPoint;
]]></artwork></figure></t>
          <t hangText="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"/>.  This byte string may 
            represent an elliptic curve point in uncompressed or compressed format; it MUST conform to what the 
            client has requested through a Supported Point Formats Extension if this extension was used.<figure><artwork><![CDATA[
        enum {
            ec_basis_trinomial(1), ec_basis_pentanomial(2),
            (255)
        } ECBasisType;
]]></artwork></figure></t>
          <t hangText="ec_basis_trinomial:"> Indicates representation of a characteristic-2 field using a trinomial basis.</t>
          <t hangText="ec_basis_pentanomial:"> Indicates representation of a characteristic-2 field using a pentanomial basis.<figure><artwork><![CDATA[
        struct {
            ECCurveType    curve_type;
            select (curve_type) {
                case explicit_prime:
                    opaque      prime_p <1..2^8-1>;
                    ECCurve     curve;
                    ECPoint     base;
                    opaque      order <1..2^8-1>;
                    opaque      cofactor <1..2^8-1>;
                case explicit_char2:
                    uint16      m;
                    ECBasisType basis;
                    select (basis) {
                        case ec_basis_trinomial:
                            opaque  k <1..2^8-1>;
                        case ec_basis_pentanomial:
                            opaque  k1 <1..2^8-1>;
                            opaque  k2 <1..2^8-1>;
                            opaque  k3 <1..2^8-1>;
                    };
                    ECCurve     curve;
                    ECPoint     base;
                    opaque      order <1..2^8-1>;
                    opaque      cofactor <1..2^8-1>;
                case named_curve:
                    NamedCurve namedcurve;
            };
        } ECParameters;
]]></artwork></figure></t>
          <t hangText="curve_type:"> This identifies the type of the elliptic curve domain parameters.</t>
          <t hangText="prime_p:"> This is the odd prime defining the field Fp.</t>
          <t hangText="curve:"> Specifies the coefficients a and b of the elliptic curve E.</t>
          <t hangText="base:"> Specifies the base point G on the elliptic curve.</t>
          <t hangText="order:"> Specifies the order n of the base point.</t>
          <t hangText="cofactor:"> Specifies the cofactor h = #E(Fq)/n, where #E(Fq) represents the number of 
            points on the elliptic curve E defined over the field Fq (either Fp or F2^m).</t>
          <t hangText="m:"> This is the degree of the characteristic-2 field F2^m.</t>
          <t hangText="k:"> The exponent k for the trinomial basis representation x^m + x^k+1.</t>
          <t hangText="k1, k2, k3:"> The exponents for the pentanomial representation x^m + x^k3 + x^k2 + x^k1 + 1 
            (such that k3 > k2 > k1).</t>
          <t hangText="namedcurve:"> Specifies a recommended set of elliptic curve domain parameters.  All those 
            values of NamedCurve are allowed that refer to a specific curve.  Values of NamedCurve that indicate 
            support for a class of explicitly defined curves are not allowed here (they are only permissible in 
            the ClientHello extension); this applies to arbitrary_explicit_prime_curves(0xFF01) and 
            arbitrary_explicit_char2_curves(0xFF02).<figure><artwork><![CDATA[
        struct {
            ECParameters    curve_params;
            ECPoint         public;
        } ServerECDHParams;
]]></artwork></figure></t>
          <t hangText="curve_params:"> Specifies the elliptic curve domain parameters associated with the ECDH 
            public key.</t>
          <t hangText="public:"> The ephemeral ECDH public key.</t></list></t>
        <t> The ServerKeyExchange message is extended as follows.<figure><artwork><![CDATA[
        enum { ec_diffie_hellman } KeyExchangeAlgorithm;
]]></artwork></figure><list style="hanging">
          <t hangText="ec_diffie_hellman:"> Indicates the ServerKeyExchange message contains an ECDH public key.</t></list><figure><artwork><![CDATA[
   select (KeyExchangeAlgorithm) {
       case ec_diffie_hellman:
           ServerECDHParams    params;
           Signature           signed_params;
   } ServerKeyExchange;
]]></artwork></figure><list style="hanging">
          <t hangText="params:"> Specifies the ECDH public key and associated domain parameters.</t>
          <t hangText="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.<figure><artwork><![CDATA[
     enum { ecdsa } SignatureAlgorithm;
     select (SignatureAlgorithm) {
        case ecdsa:
             digitally-signed struct {
                 opaque sha_hash[sha_size];
             };
     } Signature;
   ServerKeyExchange.signed_params.sha_hash
       SHA(ClientHello.random + ServerHello.random +
                              ServerKeyExchange.params);
]]></artwork></figure></t></list></t>
        <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" for ECDHE_ECDSA.  ECDSA signatures are 
          generated and verified as described in <xref target="alg_computes"/>, 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 
          <0..2^16-1>, the contents of which are the DER encoding corresponding to the following ASN.1 
          notation.<figure><artwork><![CDATA[
           Ecdsa-Sig-Value ::= SEQUENCE {
               r       INTEGER,
               s       INTEGER
           }
]]></artwork></figure></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.1998"/>.  
          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"/>.)</t>
      </section>
      <section anchor="certreq" title="Certificate Request">
        <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.<figure><artwork><![CDATA[
        enum {
            ecdsa_sign(64), rsa_fixed_ecdh(65),
            ecdsa_fixed_ecdh(66), (255)
        } ClientCertificateType;
]]></artwork></figure><list style="hanging">
          <t hangText="ecdsa_sign, etc."> Indicates that the server would like to use the corresponding client 
            authentication method specified in <xref target="clientauth"/>.</t></list></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" title="Client Certificate">
        <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, RSA_fixed_ECDH, 
          and ECDSA_fixed_ECDH authentication methods if the public key point specified in it respects the server's 
          choice of point formats.  If no Supported Point Formats Extension has been used, a certificate can only 
          be considered suitable for use with these authentication methods if the point is represented in 
          uncompressed point format.)</t>
        <t> Meaning of this message:</t>
        <t> This message is used to authentically convey the client's static public key to the server.  The 
          following table summarizes what client certificate types are appropriate for the ECC-based client 
          authentication mechanisms described in <xref target="clientauth"/>.  ECC public keys must be encoded in 
          certificates as described in <xref target="eccerts"/>.</t>
        <t> NOTE: The client's Certificate message is capable of carrying a chain of certificates.  The 
          restrictions mentioned in Table 4 apply only to the client's certificate (first in the chain).</t>
    	<texttable anchor="tbl4" title="Client Certificate Types">
          <ttcol align="left">Client Authentication Method</ttcol>
          <ttcol align="left">Client Certificate Type</ttcol>
          <c>ECDSA_sign</c><c>Certificate MUST contain an ECDSA-capable public key and be signed with ECDSA.</c>
          <c>ECDSA_fixed_ECDH</c><c>Certificate MUST contain an ECDH-capable public key on the same elliptic curve 
            as the server's long-term ECDH key.  This certificate MUST be signed with ECDSA.</c>
          <c>RSA_fixed_ECDH</c><c>Certificate MUST contain an ECDH-capable public key on the same elliptic curve 
            as the server's long-term ECDH key.  This certificate MUST be signed with RSA.</c>
      </texttable>
      <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" title="Client Key Exchange">
        <t> When this message is sent:</t>
        <t> This message is sent in all key exchange algorithms.  If client authentication with ECDSA_fixed_ECDH 
          or RSA_fixed_ECDH is used, this message is empty.  Otherwise, 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.<figure><artwork><![CDATA[
        enum { implicit, explicit } PublicValueEncoding;
]]></artwork></figure><list style="hanging">
          <t hangText="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").  (This is "explicit" in ECC cipher suites except when the client 
            uses the ECDSA_fixed_ECDH or RSA_fixed_ECDH client authentication mechanism.)<figure><artwork><![CDATA[
        struct {
            select (PublicValueEncoding) {
                case implicit: struct { };
                case explicit: ECPoint ecdh_Yc;
            } ecdh_public;
        } ClientECDiffieHellmanPublic;
]]></artwork></figure></t>
          <t hangText="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 or compressed format.  Here, the format 
            MUST conform to what the server has requested through a Supported Point Formats Extension if this 
            extension was used, and MUST be uncompressed if this extension was not used.<figure><artwork><![CDATA[
        struct {
            select (KeyExchangeAlgorithm) {
                case ec_diffie_hellman: ClientECDiffieHellmanPublic;
            } exchange_keys;
        } ClientKeyExchange;
]]></artwork></figure></t></list></t>
        <t> Actions of the sender:</t>
        <t> The client selects an ephemeral ECDH public key corresponding to the parameters it received from the 
          server according to the ECKAS-DH1 scheme from IEEE 1363.  It conveys this information to the client in 
          the ClientKeyExchange message using the format defined above.</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" title="Certificate Verify">
        <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, e.g., when the client is authenticated using the ECDSA_sign mechanism.</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"/>.  For the ecdsa case, the signature 
          field in the CertificateVerify message contains an ECDSA signature computed over handshake messages 
          exchanged so far, exactly similar to CertificateVerify with other signing algorithms:<figure><artwork><![CDATA[
        CertificateVerify.signature.sha_hash
            SHA(handshake_messages);
]]></artwork></figure></t>
        <t> ECDSA signatures are computed as described in <xref target="alg_computes"/>, 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 <0..2^16-1>, the contents of which are the DER encoding <xref target="CCITT.X690"/> 
          corresponding to the following ASN.1 notation <xref target="CCITT.X680"/>.<figure><artwork><![CDATA[
        Ecdsa-Sig-Value ::= SEQUENCE {
            r       INTEGER,
            s       INTEGER
        }
]]></artwork></figure></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" title="Elliptic Curve Certificates">
        <t> X.509 certificates containing ECC public keys or signed using ECDSA MUST comply with 
          <xref target="RFC3279"/> or another RFC that replaces or extends it. Clients SHOULD use the elliptic 
          curve domain parameters recommended in ANSI X9.62, FIPS 186-4, and SEC 2 <xref target="SECG-SEC2"/>.</t>
      </section>
      <section anchor="alg_computes" title="ECDH, ECDSA, and RSA Computations">
        <t> All ECDH calculations (including parameter and key generation as well as the shared secret calculation) 
          are performed according to <xref target="IEEE.P1363.1998"/> using the ECKAS-DH1 scheme with the identity 
          map as 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, the 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 
          PRF serves as a KDF; in TLS 1.2 the KDF is determined by ciphersuite; it is conceivable that future TLS 
          versions or new TLS extensions introduced in the future may vary this computation.)</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 run directly through the ECDSA algorithm with no additional 
          hashing.  The default hash function is SHA-1 <xref target="FIPS.180-2"/>, and sha_size (see 
          <xref target="ske"/> and <xref target="cert_verify"/>) is 20. However, an alternative hash function, such 
          as one of the new SHA hash functions specified in FIPS 180-2 <xref target="FIPS.180-2"/>, may be used instead.</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. TLS 1.2 added a SignatureAndHashAlgorithm parameter to the DigitallySigned struct, 
        thus allowing agility in choosing the signature hash.</t>
        <t> All RSA signatures must be generated and verified according to <xref target="PKCS1"/> block type 1.</t>
      </section>
    </section>
    <section anchor="suites" title="Cipher Suites">
      <t> The table below defines new ECC cipher suites that use the key exchange algorithms specified in <xref target="ecdh"/>.</t>
      <texttable anchor="tbl5" title="TLS ECC cipher suites">
          <ttcol align="left">CipherSuite</ttcol>
          <ttcol align="left">Identifier</ttcol>
          <c>TLS_ECDHE_ECDSA_WITH_NULL_SHA</c><c>{ 0xC0, 0x06 }</c>
          <c>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</c><c>{ 0xC0, 0x07 }</c>
          <c>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</c><c>{ 0xC0, 0x08 }</c>
          <c>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</c><c>{ 0xC0, 0x09 }</c>
          <c>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA</c><c>{ 0xC0, 0x0A }</c>
                    <c> </c><c> </c>
          <c>TLS_ECDHE_RSA_WITH_NULL_SHA</c><c>{ 0xC0, 0x10 }</c>
          <c>TLS_ECDHE_RSA_WITH_RC4_128_SHA</c><c>{ 0xC0, 0x11 }</c>
          <c>TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</c><c>{ 0xC0, 0x12 }</c>
          <c>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</c><c>{ 0xC0, 0x13 }</c>
          <c>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</c><c>{ 0xC0, 0x14 }</c>
                    <c> </c><c> </c>
          <c>TLS_ECDH_anon_WITH_NULL_SHA</c><c>{ 0xC0, 0x15 }</c>
          <c>TLS_ECDH_anon_WITH_RC4_128_SHA</c><c>{ 0xC0, 0x16 }</c>
          <c>TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</c><c>{ 0xC0, 0x17 }</c>
          <c>TLS_ECDH_anon_WITH_AES_128_CBC_SHA</c><c>{ 0xC0, 0x18 }</c>
          <c>TLS_ECDH_anon_WITH_AES_256_CBC_SHA</c><c>{ 0xC0, 0x19 }</c>
      </texttable>
      <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"/> and <xref target="RFC4346"/>. AES ciphers are defined in <xref target="RFC5246"/>.</t>
      <t> Server implementations SHOULD support all of the following cipher suites, and client implementations 
        SHOULD support at least one of them:<list style="symbols">
        <t> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</t>
        <t> TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</t>
        <t> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256</t>
        <t> TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256</t></list></t>
    </section>
    <section anchor="sec" title="Security Considerations">
      <t> Security issues are discussed throughout this memo.</t>
      <t> For TLS handshakes using ECC cipher suites, the security considerations in appendices D of all three TLS 
        base documemts apply accordingly.</t>
      <t> Security discussions specific to ECC can be found in <xref target="IEEE.P1363.1998"/> and 
        <xref target="ANSI.X9-62.2005"/>. 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.</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 might be 
        considered more conservative than curves over F_2^m as there is no choice between multiple fields of similar 
        size for characteristic 2).  Note, however, that algebraic structure can also lead to implementation 
        efficiencies, and implementers and users may, therefore, need to balance conservatism against a need for 
        efficiency.  Concrete attacks are known against only very few special classes of curves, such as supersingular 
        curves, and these classes are excluded from the ECC standards that this document references 
        <xref target="IEEE.P1363.1998"/>, <xref target="ANSI.X9-62.2005"/>.</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.1998"/>, <xref target="ANSI.X9-62.2005"/>, and <xref target="FIPS.186-4"/>.</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" title="IANA Considerations">
      <t> <xref target="RFC4492" />, the predecessor of this document has already defined the IANA registries for 
        the following:<list style="symbols">
        <t> NamedCurve <xref target="ch_extensions"/></t>
        <t> ECPointFormat <xref target="ch_extensions"/></t>
        <t> ECCurveType <xref target="ske"/></t></list></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.  Any additional 
        assignments require IETF Consensus action.</t>
    </section>
    <section anchor="ack" title="Acknowledgements">
      <t> Most of the text is this document is taken from <xref target="RFC4492"/>, the predecessor of this 
        document. The authors of that document were:<list style="symbols">
        <t> Simon Blake-Wilson</t>
        <t> Nelson Bolyard</t>
        <t> Vipul Gupta</t>
        <t> Chris Hawk</t>
        <t> Bodo Moeller</t></list></t>
      <t> In the predecessor document, the authors acknowledged the contributions of Bill Anderson and Tim Dierks.</t>
    </section>
    <section anchor="history" title="Version History for This Draft">
      <t> NOTE TO RFC EDITOR: PLEASE REMOVE THIS SECTION</t>
      <t> Changes from draft-ietf-tls-rfc4492bis-01 to draft-nir-tls-rfc4492bis-03:<list style="symbols">
        <t> Removed unused curves.</t>
        <t> Removed unused point formats (all but uncompressed)</t>
        </list></t>
      <t> Changes from draft-nir-tls-rfc4492bis-00 and draft-ietf-tls-rfc4492bis-00 to 
        draft-nir-tls-rfc4492bis-01:<list style="symbols">
        <t> Merged errata</t>
        <t> Removed ECDH_RSA and ECDH_ECDSA</t>
        </list></t>
      <t> Changes from RFC 4492 to draft-nir-tls-rfc4492bis-00:<list style="symbols">
        <t> Added TLS 1.2 to references.</t>
        <t> Moved RFC 4492 authors to acknowledgements.</t>
        <t> Removed list of required reading for ECC.</t></list></t>
    </section>

    <!-- ====================================================================== -->
  </middle>
  <!-- ====================================================================== -->
  <back>
    <references title="Normative References"> 
      <reference anchor='RFC2246'>
        <front>
          <title>The TLS Protocol Version 1.0</title>
          <author initials='T.' surname='Dierks' fullname='Tim Dierks'/>
          <author initials='C.' surname='Allen' fullname='Christopher Allen' />
          <date year='1999' month='January' />
        </front>
        <seriesInfo name='RFC' value='2246' />
        <format type='HTML' target='http://tools.ietf.org/html/rfc2246' />
      </reference>
      <reference anchor='RFC4346'>
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.1</title>
          <author initials='T.' surname='Dierks' fullname='T. Dierks' />
          <author initials='E.' surname='Rescorla' fullname='E. Rescorla' />
          <date year='2006' month='April' />
        </front>
        <seriesInfo name='RFC' value='4346' />
        <format type='HTML' target='http://tools.ietf.org/html/rfc4346' />
      </reference>
      <reference anchor='RFC5246'>
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
          <author initials='T.' surname='Dierks' fullname='T. Dierks' />
          <author initials='E.' surname='Rescorla' fullname='E. Rescorla' />
          <date year='2008' month='August' />
        </front>
        <seriesInfo name='RFC' value='5246' />
        <format type='HTML' target='http://tools.ietf.org/html/rfc5246' />
      </reference>
      <reference anchor='SECG-SEC2'>
        <front>
          <title>Recommended Elliptic Curve Domain Parameters</title>
          <author>
            <organization>CECG</organization>
          </author>
          <date year='2000'/>
        </front>
        <seriesInfo name='SEC' value='2' />
        <format type='PDF' target='http://www.secg.org/download/aid-784/sec2-v2.pdf' />
      </reference>
      <reference anchor='RFC4366'>
        <front>
          <title>Transport Layer Security (TLS) Extensions</title>
          <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' />
        </front>
        <seriesInfo name='RFC' value='4366' />
        <format type='TXT' octets='66344' target='http://www.ietf.org/rfc/rfc4366.txt' />
      </reference>
      <reference anchor='RFC3279'>
        <front>
          <title>Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
          <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' />
        </front>
        <seriesInfo name='RFC' value='3279' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc3279.txt' />
      </reference>
      <reference anchor="CCITT.X680">
        <front>
          <title>Abstract Syntax Notation One (ASN.1): Specification of basic notation</title>
          <author>
            <organization>International Telephone and Telegraph Consultative Committee</organization>
          </author>
          <date month="July" year="2002" />
        </front>
        <seriesInfo name="CCITT" value="Recommendation X.680" />
      </reference>
      <reference anchor="CCITT.X690">
        <front>
          <title>ASN.1 encoding rules: Specification of basic encoding Rules (BER), Canonical encoding rules (CER) and Distinguished encoding rules (DER)</title>
          <author>
            <organization>International Telephone and Telegraph Consultative Committee</organization>
          </author>
          <date month="July" year="2002" />
        </front>
        <seriesInfo name="CCITT" value="Recommendation X.690" />
      </reference>
      <reference anchor="FIPS.186-4" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf">
        <front>
          <title>Digital Signature Standard</title>
          <author>
            <organization>National Institute of Standards and Technology</organization>
          </author>
          <date year="2013" />
        </front>
        <seriesInfo name="FIPS" value="PUB 186-4" />
      </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>
          <author>
            <organization>American National Standards Institute</organization>
          </author>
          <date year="2005" />
        </front>
        <seriesInfo name="ANSI" value="X9.62" />
      </reference>
      <reference anchor='RFC2119'>
        <front>
          <title abbrev='RFC Key Words'>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials='S.' surname='Bradner' fullname='Scott Bradner'>
            <organization>Harvard University</organization>
            <address>
              <postal>
                <street>1350 Mass. Ave.</street>
                <street>Cambridge</street>
                <street>MA 02138</street>
              </postal>
              <phone>- +1 617 495 3864</phone>
              <email>sob@harvard.edu</email>
            </address>
          </author>
          <date year='1997' month='March' />
          <area>General</area>
          <keyword>keyword</keyword>
        </front>
        <seriesInfo name='BCP' value='14' />
        <seriesInfo name='RFC' value='2119' />
        <format type='TXT' target='ftp://ftp.isi.edu/in-notes/rfc2119.txt' />
        <format type='HTML' octets='16553' target='http://xml.resource.org/public/rfc/html/rfc2119.html' />
        <format type='XML' octets='5703' target='http://xml.resource.org/public/rfc/xml/rfc2119.xml' />
      </reference>
      <reference anchor="PKCS1">
        <front>
          <title>RSA Encryption Standard, Version 1.5</title>
          <author>
            <organization>RSA Laboratories</organization>
          </author>
          <date month="November" year="1993" />
        </front>
        <seriesInfo name="PKCS" value="1" />
      </reference>
    </references>
    <references title="Informative References">
      <reference anchor='I-D.ietf-tls-tls13'>
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
          <author initials='T' surname='Dierks' fullname='Tim Dierks' />
          <author initials='E' surname='Rescorla' fullname='Eric Rescorla' />
          <date month='July' day='8' year='2014' />
        </front>
        <seriesInfo name='Internet-Draft' value='draft-ietf-tls-tls13-02' />
        <format type='HTML' target='http://tools.ietf.org/html/draft-ietf-tls-tls13-02' />
      </reference> 
      <reference anchor="IEEE.P1363.1998">
        <front>
          <title>Standard Specifications for Public Key Cryptography</title>
          <author>
            <organization>Institute of Electrical and Electronics Engineers</organization>
          </author>
          <date month="" year="1998" />
        </front>
        <seriesInfo name="IEEE" value="Draft P1363" />
      </reference>
      <reference anchor='RFC4492'>
        <front>
          <title>Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)</title>
          <author initials='S.' surname='Blake-Wilson' fullname='S. Blake-Wilson' />
          <author initials='N.' surname='Bolyard' fullname='N. Bolyard' />
          <author initials='V.' surname='Gupta' fullname='V. Gupta' />
          <author initials='C.' surname='Hawk' fullname='C. Hawk' />
          <author initials='B.' surname='Moeller' fullname='B. Moeller' />
          <date year='2006' month='May' />
        </front>
        <seriesInfo name='RFC' value='4492' />
        <format type='HTML' target='http://tools.ietf.org/html/rfc4492' />
      </reference>
      <reference anchor="Lenstra_Verheul">
        <front>
          <title>Selecting Cryptographic Key Sizes</title>
          <author initials="A." surname="Lenstra" fullname="Arjen Klaas Lenstra"/>
          <author initials="E." surname="Verheul" fullname="Eric Verheul"/>
          <date year="2001"/>
        </front>
        <seriesInfo name="Journal of Cryptology" value="14 (2001) 255-293"/>
        <format type='PDF' target='http://www.cs.ru.nl/E.Verheul/papers/Joc2001/joc2001.pdf' />
      </reference>
      <reference anchor="FIPS.180-2" target="http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf">
        <front>
          <title>Secure Hash Standard</title>
          <author>
            <organization>National Institute of Standards and Technology</organization>
          </author>
          <date month="August" year="2002" />
        </front>
        <seriesInfo name="FIPS" value="PUB 180-2" />
      </reference>
    </references>
    <!-- ====================================================================== -->
    <section anchor="equiv" title="Equivalent Curves (Informative)">
      <t> All of the NIST curves <xref target="FIPS.186-4"/> and several of the ANSI curves <xref target="ANSI.X9-62.2005"/> are equivalent to curves listed in <xref target="supp_ec_ext"/>.  In the following table, multiple names in one row represent aliases for the same curve.</t>
      <texttable anchor="tbl6" title="Equivalent curves defined by SECG, ANSI, and NIST">
        <preamble>Curve names chosen by different standards organizations</preamble>
        <ttcol align="left">SECG</ttcol>
        <ttcol align="left">ANSI X9.62</ttcol>
        <ttcol align="left">NIST</ttcol>
        <c>sect163k1</c><c></c><c>NIST K-163</c>
        <c>sect163r1</c><c></c><c></c>
        <c>sect163r2</c><c></c><c>NIST B-163</c>
        <c>sect193r1</c><c></c><c></c>
        <c>sect193r2</c><c></c><c></c>
        <c>sect233k1</c><c></c><c>NIST K-233</c>
        <c>sect233r1</c><c></c><c>NIST B-233</c>
        <c>sect239k1</c><c></c><c></c>
        <c>sect283k1</c><c></c><c>NIST K-283</c>
        <c>sect283r1</c><c></c><c>NIST B-283</c>
        <c>sect409k1</c><c></c><c>NIST K-409</c>
        <c>sect409r1</c><c></c><c>NIST B-409</c>
        <c>sect571k1</c><c></c><c>NIST K-571</c>
        <c>sect571r1</c><c></c><c>NIST B-571</c>
        <c>secp160k1</c><c></c><c></c>
        <c>secp160r1</c><c></c><c></c>
        <c>secp160r2</c><c></c><c></c>
        <c>secp192k1</c><c></c><c></c>
        <c>secp192r1</c><c>prime192v1</c><c>NIST P-192</c>
        <c>secp224k1</c><c></c><c></c>
        <c>secp224r1</c><c></c><c>NIST P-224</c>
        <c>secp256k1</c><c></c><c></c>
        <c>secp256r1</c><c>prime256v1</c><c>NIST P-256</c>
        <c>secp384r1</c><c></c><c>NIST P-384</c>
        <c>secp521r1</c><c></c><c>NIST P-521</c>
      </texttable>
    </section>
    <section anchor="rfc4492diff" title="Differences from RFC 4492">
      <t><list style="symbols">
        <t> Added TLS 1.2</t>
        <t> Merged Errata</t>
        <t> Removed the ECDH key exchange algorithms: ECDH_RSA and ECDH_ECDSA</t>
        <t> Deprecated a bunch of ciphersuites:<list style="synmbols">
          <t>TLS_ECDH_ECDSA_WITH_NULL_SHA</t>
          <t>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</t>
          <t>TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA</t>
          <t>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA</t>
          <t>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA</t>
          <t>TLS_ECDH_RSA_WITH_NULL_SHA</t>
          <t>TLS_ECDH_RSA_WITH_RC4_128_SHA</t>
          <t>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</t>
          <t>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA</t>
          <t>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA</t></list></t>
      </list></t>
        <t> Removed unused curves and all but the uncompressed point format.</t>
    </section>
  </back>
</rfc>


PAFTECH AB 2003-20262026-04-24 03:32:54