<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.1.1 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-ladd-cfrg-4q-01" category="std">

  <front>
    <title>Curve4Q</title>

    <author initials="W." surname="Ladd" fullname="Watson Ladd">
      <organization>UC Berkeley</organization>
      <address>
        <email>watsonbladd@gmail.com</email>
      </address>
    </author>
    <author initials="P." surname="Longa" fullname="Patrick Longa">
      <organization>Microsoft Research</organization>
      <address>
        <email>plonga@microsoft.com</email>
      </address>
    </author>
    <author initials="R." surname="Barnes" fullname="Richard Barnes">
      <organization>Mozilla</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>

    <date year="2017" month="March" day="27"/>

    <area>Security</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document specifies Curve4Q, a twisted Edwards curve proposed in <xref target="Curve4Q"/>
that takes advantage of arithmetic over the field GF(2^127-1) and two endomorphisms
to achieve the speediest Diffie-Hellman key agreements over a group of order
approximately 2^246, which provides around 128 bits of security.
Curve4Q implementations are more than two times faster than those of Curve25519
and, when not using endomorphisms, are between 1.2 and 1.6 times faster.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>Public key cryptography continues to be computationally expensive, particularly
on less powerful devices. While recent advances in efficient formulas for
addition and doubling have substantially reduced the cost of elliptic curve
operations in terms of field operations, the number of group operations involved
in scalar multiplication has not been reduced in the curves considered for IETF
use. Using curves with efficiently computable endomorphisms can reduce the
number of group operations by turning one long scalar multiplication into the
sum of several multiplications by smaller scalars, which can be evaluated more
efficiently.</t>

<t>For curves over quadratic extension fieldss, there are more endomorphism
families to choose from, and the field operations are often more efficient
compared to prime fields of the same size.  The ideal case is given by curves
equipped with two distinct endomorphisms, so that it becomes possible to divide
scalars into four parts.  We focus on curves defined over the field GF(p^2)
for the Mersenne prime p = 2^127 - 1, which offers extremely efficient
arithmetic.  Together, these improvements substantially reduce computation
time compared to other proposed Diffie-Hellman key exchange and digital
signature schemes.  However, the combined availability of these features
severely restricts the curves that can be used for cryptographic applications.</t>

<t>As described in <xref target="Curve4Q"/>, the elliptic curve “Curve4Q” defined in this
document is a special instance of the recent endomorphism-based constructions
from <xref target="Qcurve"/> and <xref target="GLV4"/>, and is the only known elliptic curve that
(1) permits a four dimensional decomposition (using two endomorphisms) over
GF(p^2) and (2) has a large prime order subgroup.  The order of this subgroup
is approximately 2^246, which provides around 128 bits of security.  No other
known elliptic curve with such a decomposition has a larger prime order subgroup
over this field.  This “uniqueness” allays concerns about selecting curves
vulnerable to undisclosed attacks.</t>

<t>Curve4Q can be used to implement Diffie-Hellman key exchange, as described
below.  It is also possible to use Curve4Q as the basis for digital signature
scheme (e.g., <xref target="SchnorrQ"/>).</t>

</section>
<section anchor="mathematical-prerequisites" title="Mathematical Prerequisites">

<t>Curve4Q is defined over the finite field GF(p^2), where p is the Mersenne prime
2^127 - 1.  Elements of this finite field have the form (a + b * i), where a and
b are elements of the finite field GF(p) (i.e., integers mod p) and i^2 = -1.</t>

<t>Let A = a0 + a1*i and B = b0 + b1*i be two elements of GF(p^2). Below we
present formulas for computing addition, subtraction, multiplication, squaring,
conjugation and inversion.</t>

<figure><artwork><![CDATA[
A + B = (a0 + b0) + (a1 + b1)*i

A - B = (a0 - b0) + (a1 - b1)*i

A * B = (a0*b0 - a1*b1) + ((a0 + a1)*(b0 + b1)-(a0*b0 + a1*b1))*i
      = (a0*b0 - a1*b1) + (a0*b1 + a1*b0)*i

A * A = (a0 + a1)*(a0 - a1) + 2*a0*a1*i

conj(A) = a0 - a1*i

1/A = conj(A) / (a0^2 + a1^2)
]]></artwork></figure>

<t>The GF(p) division in the formula for 1/A can be computed using an exponentiation
via Fermat’s little theorem: 1/a = a^(p - 2) = a^(2^127 - 3) for any element a of GF(p).
One can use a fixed addition chain to compute a^(2^127 - 3) (e.g., see <xref target="FourQlib"/>).</t>

<t>Curve4Q is the twisted Edwards curve E over GF(p^2) defined by the
following curve equation:</t>

<figure><artwork><![CDATA[
E: -x^2 + y^2 = 1 + d * x^2 * y^2, with

d = 0x00000000000000e40000000000000142 +
    0x5e472f846657e0fcb3821488f1fc0c8d * i
]]></artwork></figure>

<t>Let E(GF(p^2)) be the set of pairs (x, y) of elements of GF(p^2) satisfying this
equation. This set forms a group with the addition operation (x1, y1) + (x2, y2)
= (x3, y3), where:</t>

<figure><artwork><![CDATA[
          x1 * y2 + y1 * x2                y1 * y2 + x1 * x2
x3 = ---------------------------, y3 = ---------------------------
      1 + d * x1 * y1 * x2 * y2         1 - d * x1 * y1 * x2 * y2
]]></artwork></figure>

<t>As d is not a square in GF(p^2), and -1 is, this formula never involves a
division by zero when applied to points on the curve. That is, the formula is
complete and works without exceptions for any input in E(GF(p^2)).  The
identity element is (0, 1), and the inverse of (x, y) is (-x, y).  The order of
this group is #E = 2^3 · 7^2 · N, where N is the following 246-bit prime:</t>

<figure><artwork><![CDATA[
N = 0x29cbc14e5e0a72f05397829cbc14e5dfbd004dfe0f79992fb2540ec7768ce7
]]></artwork></figure>

<t>Points P on E such that [N]*P = (0, 1) are N-torsion points. Given a point P and
Q which are both N-torsion points, it is difficult to find m such that Q = [m]*P.
This is the elliptic curve discrete logarithm problem, which is closely related
to the security of Diffie-Hellman key exchanges as the best known attacks on the
Diffie-Hellman problem involve solving the discrete logarithm problem. The best
known algorithms take approximately 2^123 group operations.</t>

<t>This group has two different efficiently computable endomorphisms, as described
in <xref target="Curve4Q"/>. As discussed in <xref target="GLV"/> and <xref target="GLS"/>, these endomorphisms
allow a multiplication by a large scalar to be computed using multiple multiplications
by smaller scalars, which can be evaluated in much less time overall.</t>

</section>
<section anchor="representation-of-curve-points" title="Representation of Curve Points">

<t>Elements a in GF(p) are represented as 16 byte little endian integers which are
the numbers in the range [0, p). The 16 bytes b[0], b[1], … b[15] represent
b[0] + 256*b[1] + 256^2*b[2] + … + 256^15*b[15].  Since we are representing numbers
in the range [0, 2^127-1), the top bit of b[15] is always zero.</t>

<t>An element x0 + x1*i of GF(p^2) is represented on the wire by the concatenation
of the encodings for x0 and x1. A point (x, y) on Curve4Q is serialized in a
compressed form as the representation of y with a modified top bit. This top bit
is used to disambiguate between x and -x during decoding.</t>

<t>To carry out this disambiguation we use the lexicographic order of elements
in GF(p^2): define two elements a = a0 + a1*i and b = b0 + b1*i with all their
coordinates in [0, p); a is greater than b if a0 is greater than b0. If a0 and
b0 are equal, a is greater than b if a1 is greater than b1.</t>

<t>Set the coordinate value x and its negative -x. The top bit of a compressed
point is 0 if x is smaller than -x. Otherwise, the top bit is 1.</t>

<figure><artwork><![CDATA[
|--------------- y ---------------|
|       y0     |0|       y1     |s|
|..............|.|..............|.|
]]></artwork></figure>

<t>To decode an encoded point from a 32-byte sequence B:</t>

<t><list style="symbols">
  <t>Parse out the encoded values y = y0 + y1 * i and s</t>
  <t>Check that y0 and y1 are both less than p</t>
  <t>Solve x^2 = (y^2 - 1) * (d * y^2 + 1) for x</t>
  <t>If s is 0, return the smaller of x and -x (in the lexicographic ordering)</t>
  <t>If s is 1, return the larger of x and -x</t>
  <t>Check that (x,y) is a valid point on the curve</t>
</list></t>

<t>The appendix <xref target="point-decompression"/> details an algorithm for decoding a point
following the steps above.</t>

<t>We call the operation of compressing a point P into 32 bytes Compress(P),
and decompression Expand(S). Expand(Compress(P))=P for all the points P on the curve,
and Compress(Expand(S))=S if and only if S is a valid representation of a point.</t>

<t>Not all 32 byte strings represent valid points. Implementations MUST reject
invalid strings and check that decompression is successful. Strings are invalid
if they are not possible outputs of the compression operator.  In particular the
values of y0 and y1 MUST be less then p.</t>

</section>
<section anchor="scalar-multiplication" title="Scalar multiplication">

<t>Below, we present two algorithms for scalar multiplication on Curve4Q.  Each
algorithm takes as input a 256-bit unsigned integer m and an N-torsion point P
and computes the product [m]*P.</t>

<t>The first algorithm uses a simple fixed-window exponentiation without exploiting
endomorphisms.  The second algorithm uses endomorphisms to accelerate
computation.  The execution of operations in both algorithms has a regular
pattern in order to enable constant-time implementations and protect against
timing and simple side channel attacks.  Both algorithms use the same addition
and doubling formulas.</t>

<t>First, we discuss explicit formulas and efficient projective coordinate
representations.</t>

<section anchor="alternative-point-representations-and-addition-laws" title="Alternative Point Representations and Addition Laws">

<t>We use coordinates based on extended twisted Edwards coordinates introduced in
<xref target="TwistedRevisited"/>: the tuple (X, Y, Z, T) with Z nonzero and Z * T = X * Y
corresponds to a point (x, y) satisfying x = X/Z and y = Y/Z. The neutral point
in this representation is (0, 1, 1, 0). The following slight variants are used in
the optimized scalar multiplication algorithm in order to save computations:
point representation R1 is given by (X, Y, Z, Ta, Tb), where T=Ta * Tb;
representation R2 is (N, D, E, F) = (X + Y, Y- X, 2Z, 2dT); representation R3 is (N,
D, Z, T) = (X + Y, Y - X, Z, T); and representation R4 is (X, Y, Z). Similar “caching”
techniques were discussed in <xref target="TwistedRevisited"/> to accelerate repeated
additions of the same point. Converting between these representations is
straightforward.</t>

<t><list style="symbols">
  <t>R1: (X, Y, Z, Ta, Tb), Ta * Tb = T, Z * T = X * Y</t>
  <t>R2: (N, D, E, F) = (X + Y, Y - X, 2 * Z, 2 * d * T)</t>
  <t>R3: (N, D, Z, T) = (X + Y, Y - X, Z, T)</t>
  <t>R4: (X, Y, Z)</t>
</list></t>

<t>A point doubling (DBL) takes an R4 point and produces an R1 point. For addition,
we first define an operation ADD_core that takes an R2 and an R3 point and
produces an R1 point. This can be used to implement an operation ADD which takes
an R1 and an R2 point as inputs (and produces an R1 point) by first converting the
R1 point to R3, and then executing ADD_core.  Exposing these operations and the
multiple representations helps save time by avoiding redundant computations: the
conversion of the first argument to ADD can be done once if the argument will be
used in multiple additions.</t>

<t>Below, we list the explicit formulas for the required point operations. These
formulas, which are adapted from <xref target="Twisted"/> and <xref target="TwistedRevisited"/>, are
complete: they have no exceptional cases, and therefore can be used in any
algorithm for computing scalar multiples without worrying about exceptional
procedure attacks <xref target="Exceptional"/>. Note that we do not explicitly note the point
format every time an addition or doubling is used, and assume that conversions
are done when required.</t>

<t>DBL and ADD_core are computed as follows:</t>

<figure><artwork><![CDATA[
DBL(X1, Y1, Z1):
  A = X1^2
  B = Y1^2
  C = 2 * Z1^2
  D = A + B
  E = (X1 + Y1)^2 - D
  F = B - A
  G = C - F
  X3 = E * G
  Y3 = D * F
  Z3 = F * G
  Ta3 = E
  Tb3 = D
return(X3, Y3, Z3, Ta3, Tb3)

ADD\_core(N1, D1, E1, F1, N2, D2, Z2, T2):
   A = D1 * D2
   B = N1 * N2
   C = T2 * F1
   D = Z2 * E1
   E = B - A
   F = D - C
   G = D + C
   H = B + A
   X3 = E * F
   Y3 = G * H
   Z3 = F * G
   Ta3 = E
   Tb3 = H
return (X3, Y3, Z3, Ta3, Tb3)
]]></artwork></figure>

</section>
<section anchor="multiplication-without-endomorphisms" title="Multiplication without Endomorphisms">

<t>We begin by taking our input point P, and computing a table of points containing
T[0] = [1]P, T[1] = [3]P, … , T[7] = [15]P as follows:</t>

<figure><artwork><![CDATA[
Q = DBL(P)
Convert Q to R2 form
T[0] = P
Convert T[0] to R2 form
for i=1 to 7:
    T[i] = ADD_core(Q, T[i-1])
    Convert T[i] to R2 form
]]></artwork></figure>

<t>Next, take m and reduce it modulo N.  Then, add N if necessary to ensure that m
is odd. At this point, we recode m into a signed digit representation consisting
of 63 signed, odd digits d[i] in base 16. The following algorithm accomplishes
this task.</t>

<figure><artwork><![CDATA[
for i=0 to 61:
    d[i] = (m mod 32) - 16
    m = (m - d[i]) / 16
d[62] = m
]]></artwork></figure>

<t>Finally, the computation of the multiplication is as follows.</t>

<figure><artwork><![CDATA[
Let ind = (abs(d[62]) - 1) / 2
Let sign = sgn(d[62])
Q = sign * T[ind]
Convert Q into R4 form
for i from 61 to 0:
    Q = DBL(Q)
    Q = DBL(Q)
    Q = DBL(Q)
    Q = DBL(Q)
    ind = (abs(d[i]) - 1) / 2
    sign = sgn(d[i])
    S = sign * T[ind]
    Q = ADD(Q, S)
return Q
]]></artwork></figure>

<t>As sign is either -1 or 1, the multiplication sign * T[ind] is simply a
conditional negation.  To negate a point (N, D, E, F) in R2 form one computes
(D, N, E, -F). The table lookups and conditional negations must be carefully
implemented as described in ``Security Considerations’’ to avoid side-channel
attacks.  This algorithm MUST NOT be applied to points which are not N-torsion
points; it will produce the wrong answer.</t>

</section>
<section anchor="multiplication-with-endomorphisms" title="Multiplication with Endomorphisms">

<t>This algorithm makes use of the identity [m]*P = [a_1]*P + [a_2]*phi(P) +
[a_3]*psi(P) + [a_4]*psi(phi(P)), where a_1, a_2, a_3, and a_4 are 64-bit
scalars that depend on m. The overall product can then can be computed using a
small table of 8 precomputed points and 64 doublings and additions. This is
considerably fewer operations than the number of operations required by the 
algorithm above, at the cost of a more complicated implementation.</t>

<t>We describe each phase of the computation separately: the computation of the
endomorphisms, the scalar decomposition and recoding, the creation of the table
of precomputed points and, lastly, the computation of the final results. Each
section refers to constants listed in an appendix in order of appearance.</t>

<section anchor="endomorphisms" title="Endomorphisms">

<t>The two endomorphisms phi and psi used to accelerate multiplication are computed
as phi(Q) = tau_dual(upsilon(tau(Q)) and psi(Q) = tau_dual(chi(tau(Q))).  Below,
we present procedures for tau, tau_dual, upsilon and chi, adapted from
<xref target="FourQlib"/>. Tau_dual produces an R1 point, while the other procedures produce
R4 points.</t>

<t>Note: Tau produces points on a different curve, while upsilon and chi are
endomorphisms of that different curve. Tau and tau_dual are the isogenies
mentioned in the mathematical background above.  As a result the intermediate
results do not satisfy the equations of the curve E.  Implementers who wish to
check the correctness of these intermediate results are referred to <xref target="Curve4Q"/>.</t>

<figure><artwork><![CDATA[
tau(X1, Y1, Z1):
   A = X1^2
   B = Y1^2
   C = A + B
   D = A - B
   X2 = ctau * X1 * Y1 * D
   Y2 = -(2 * Z1^2 + D) * C
   Z2 = C * D
return(X2, Y2, Z2)
]]></artwork></figure>

<figure><artwork><![CDATA[
tau_dual(X1, Y1, Z1):
  A = X1^2
  B = Y1^2
  C = A + B
  Ta2 = B - A
  D = 2 * Z1^2 - Ta2
  Tb2 = ctaudual * X1 * Y1
  X2 = C * Tb2
  Y2 = D * Ta2
  Z2 = C * D
return(X2, Y2, Z2, Ta2, Tb2)
]]></artwork></figure>

<figure><artwork><![CDATA[
upsilon(X1, Y1, Z1):
   A = cphi0 * X1 * Y1
   B = Y1 * Z1
   C = Y1^2
   D = Z1^2
   F = D^2
   G = B^2
   H = C^2
   I = cphi1 * B
   J = C + cphi2 * D
   K = cphi8 * G + H + cphi9 * F
   X2 = conj(A * K * (I + J) * (I - J))
   L = C + cphi4 * D
   M = cphi3 * B
   N = (L + M) * (L - M)
   Y2 = conj(cphi5 * D * N * (H + cphi6 * G + cphi7 * F))
   Z2 = conj(B * K * N)
return(X2, Y2, Z2)
]]></artwork></figure>

<figure><artwork><![CDATA[
chi(X1, Y1, Z1):
   A = conj(X1)
   B = conj(Y1)
   C = conj(Z1)^2
   D = A^2
   F = B^2
   G = B * (D + cpsi2 * C)
   H = -(D + cpsi4 * C)
   X2 = cpsi1 * A * C * H
   Y2 = G * (D + cpsi3 * C)
   Z2 = G * H
return(X2, Y2, Z2)
]]></artwork></figure>

</section>
<section anchor="scalar-decomposition-and-recoding" title="Scalar Decomposition and Recoding">

<t>This stage has two parts. The first one consists in decomposing the scalar into
four 64-bit integers, and the second one consists in recoding these integers
into a form that can be used to efficiently and securely compute the scalar
multiplication.</t>

<t>The decomposition step uses four fixed vectors called b1, b2, b3, b4, with four
64 bit entries each.  In addition, we have integer constants L1, L2, L3, L4,
which are used to implement rounding.  All these values are listed in
<xref target="constants"/>.  In addition, we use two constant vectors derived from these
inputs:</t>

<t><list style="symbols">
  <t>c  = 5 * b2 - 3 * b3 + 2 * b4</t>
  <t>c’ = 5 * b2 - 3 * b3 + 3 * b4 = c + b4</t>
</list></t>

<t>Given m, first compute t[i] = floor(L[i] * m / 2^256) for i between 1 and 4.
Then compute the vector sum a = (m, 0, 0, 0) - t1 b1 - t2 b2 - t3 b3 - t4 b4.
Precisely one of a + c and a + c’ has an odd first coordinate: this is the
vector v that is fed into the scalar recoding step. Note that the entries of
this vector are 64 bits, so intermediate values in the calculation above can be
truncated to this width.</t>

<t>The recoding step takes the vector v=(v1, v2, v3, v4) from the previous step and
outputs two arrays m[0]..m[64] and d[0]..d[64]. Each entry of d is between 0 and
7, and each entry in m is -1 or 0. The recoding algorithm is detailed below.
bit(x, n) denotes the nth bit of x, counting from least significant to most,
starting with 0.</t>

<figure><artwork><![CDATA[
m[64] = -1
for i = 0 to 63 do:
    b1 = bit(v1, i+1)
    d[i] = 0
    m[i] = b1

    for j = 2 to 4 do:
        bj = bit(vj, 0)
        d[i] = d[i] + bj * 2^(j-2)
        c = (b1 or bj) xor b1
        vj = vj / 2 + c
d[64] = v2 + 2 * v3 + 4 * v4
]]></artwork></figure>

</section>
<section anchor="final-computation" title="Final Computation">

<t>We now describe the last step in the endomorphism based algorithm for computing
scalar multiplication. On inputs m and P, the algorithm first precomputes a
table of images of P under the endomorphisms, then recodes m, then uses these
intermediate artifacts to compute the scalar product.</t>

<t>First, compute a table T of 8 points in representation R2 as shown below.
Computations Q = psi(P), R = phi(P) and S = psi(phi(P)) are carried out using
formulas from <xref target="endomorphisms"/>.</t>

<figure><artwork><![CDATA[
Q is phi(P) in R3
R is psi(P) in R3
S is psi(Q) in R2
T[0] is P in R2
T[1] is ADD_core(Q, T[0])  # (P + Q)
Convert T[1] to R2
T[2] is ADD_Core(R, T[0])  # (P + R)
Convert T[2] to R2
T[3] is ADD_Core(R, T[1])  # (P + Q + R)
Convert T[3] to R2
T[4] is ADD_Core(S, T[0])  # (P + S)
Convert T[4] to R2
T[5] is ADD_Core(S, T[1])  # (P + Q + S)
Convert T[5] to R2
T[6] is ADD_Core(S, T[2])  # (P + R + S)
Convert T[6] to R2
T[7] is ADD_Core(S, T[3])  # (P + Q + R + S)
Convert T[7] to R2
]]></artwork></figure>

<t>Second, apply the scalar decomposition and recoding algorithm from
<xref target="scalar-decomposition-and-recoding"/> to m, to produce the two arrays
m[0]..m[64] and d[0]..d[64].</t>

<t>Define s[i] to be 1 if m[i] is 1 and -1 if m[i] is 0. Then the multiplication
is completed as follows:</t>

<figure><artwork><![CDATA[
Q = s[64] * T[d[64]]
Convert Q to R4
for i=63 to 0 do:
    Q = DBL(Q)
    Q = ADD(Q, s[i] * T[di])
return Q = (X/Z, Y/Z)
]]></artwork></figure>

<t>Multiplication by s[i] is simply a conditional negation. To negate an R2 point
(N, D, E, F) one computes (D, N, E , -F). It is important to do this (as well as
the table lookup) in constant time, i.e., the execution of branches and memory
accesses MUST NOT depend on secret values (see ``Security Considerations’’ for
more details).</t>

<t>The optimized multiplication algorithm above only works properly for N-torsion
points. Implementations MUST NOT use this algorithm on anything that is not
known to be an N-torsion point. Otherwise, it will produce the wrong answer,
with extremely negative consequences for security.</t>

</section>
</section>
</section>
<section anchor="diffie-hellman-key-agreement" title="Diffie-Hellman Key Agreement">

<t>The above scalar multiplication algorithms can be used to implement
Diffie-Hellman with cofactor.</t>

<figure><artwork><![CDATA[
DH(m, P):
      Ensure P on curve and if not return FAILURE

      P1 = DBL(P)                 # [2]P
      P2 = ADD(P1, P)             # [3]P
      P3 = DBL(DBL(DBL(DBL(P2)))) # [48]P
      Q = ADD(P3, P)              # [49]P
      Q = DBL(DBL(DBL(Q))         # [392]P

      Compute [m]*Q

      If Q is the neutral point, return FAILURE
Return [m]\*Q in affine coordinates
]]></artwork></figure>

<t>The role of the multiplication by 392 is to ensure that Q is an N-torsion point
so that the scalar multiplication [m]*P in the DH function above may be used
safely to produce correct results. In other words, as the cofactor is greater
than one, Diffie-Hellman computations using Curve4Q MUST always clear the cofactor
(i.e., multiply by 392, as explained above).</t>

<t>The base point G for Diffie-Hellman operations has the following affine
coordinates:</t>

<figure><artwork><![CDATA[
Gx = 0x1A3472237C2FB305286592AD7B3833AA +
     0x1E1F553F2878AA9C96869FB360AC77F6\*i
Gy = 0x0E3FEE9BA120785AB924A2462BCBB287 +
     0x6E1C4AF8630E024249A7C344844C8B5C\*i
G = (X, Y)
]]></artwork></figure>

<t>The tables used in multiplications of this generator (small multiples of G for
the multiplication without endomorphisms, or endomorphism images for the optimized
multiplication with endomorphisms) can be pre-generated to speed up the first,
fixed-point DH computation.</t>

<t>Two users, Alice and Bob, can carry out the following steps to derive a shared
key: each picks a random string of 32 bytes, mA and mB, respectively. Alice
computes the public key A = Compress([mA]*G), and Bob computes the public key
B = Compress([mB]*G). They exchange A and B, and then Alice computes KAB =
DH(mA, Expand(B)) while Bob computes KBA = DH(mB, Expand(A)), which produces the
shared point K = KAB = KBA. The y coordinate of K, represented as a 32 byte
string as detailed in <xref target="representation-of-curve-points"/> is the shared
secret.</t>

<t>Before decompressing A and B using the function Expand(), each user SHOULD verify
that the 128th bit of the received public key is zero (i.e., the non-imaginary
part of the corresponding y-coordinate should be &lt; 2^127).</t>

<t>If the received strings are not valid points, the DH function has failed to
compute an answer. Implementations SHOULD return a random 32 byte string as well
as return an error, to prevent bugs when applications ignore return codes. They
MUST signal an error when decompression fails.</t>

<t>Implementations MAY use any method to carry out these calculations, provided
that it agrees with the above function on all inputs and failure cases, and does
not leak information about secret keys. For example, refer to the constant-time
fixed-base scalar multiplication algorithm implemented in <xref target="FourQlib"/> to
accelerate the computation of multiplications by the generator G.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>[RFC Editor: please remove this section prior to publication]
This document has no IANA actions.</t>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>The best known algorithms for the computation of discrete logarithms on Curve4Q
are parallel versions of the Pollard rho algorithm in <xref target="Distinguished"></xref>. On
Curve4Q these attacks take on the order of 2^123 group operations to compute a
single discrete logarithm. The additional endomorphisms have large order, and so
cannot be used to accelerate generic attacks. Quadratic fields are not affected
by any of the index calculus attacks used over larger extension fields.</t>

<t>Implementations MUST check that input points properly decompress to points on
the curve. Removing such checks may result in extremely effective attacks. The
curve is not twist-secure: implementations using single coordinate ladders MUST
validate points before operating on them. In the case of protocols that require
contributory behavior, when the identity is the output of the DH primitive it
MUST be rejected and failure signaled to higher levels. Notoriously <xref target="RFC5246"/>
without <xref target="RFC7627"/> is such a protocol.</t>

<t>Implementations MUST ensure that execution of branches and memory addresses
accessed do not depend on secret data.  The time variability introduced by
secret-dependent operations have been exploited in the past via timing and cache
attacks to break implementations.  Side-channel analysis is a constantly moving
field, and implementers must be extremely careful to ensure that operations do
not leak any secret information. Using ephemeral private scalars for each
operation (ideally, limiting the use of each private scalar to one single
operation) can reduce the impact of side-channel attacks.  However, this might
not be possible for many applications of Diffie-Hellman key agreement.</t>

<t>In the future quantum computers may render the discrete logarithm problem easy
on all abelian groups through Shor’s algorithm. Data intended to remain
confidential for significantly extended periods of time SHOULD NOT be protected
with any primitive based on the hardness of factoring or the discrete log
problem (elliptic curve or finite field).</t>

</section>


  </middle>

  <back>


    <references title='Informative References'>

<reference anchor="Curve4Q" target="https://eprint.iacr.org/2015/565.pdf">
  <front>
    <title>FourQ: four-dimensional decompositions on a Q-curve over the Mersenne prime</title>
    <author initials="C." surname="Costello">
      <organization></organization>
    </author>
    <author initials="P." surname="Longa">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="Qcurve" target="http://eprint.iacr.org/2014/727.pdf">
  <front>
    <title>The Q-curve Construction for Endomorphism-Accelerated Elliptic Curves</title>
    <author initials="B." surname="Smith">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="GLV4" target="http://eprint.iacr.org/2013/311.pdf">
  <front>
    <title>Four-dimensional GLV via the Weil restriction</title>
    <author initials="A." surname="Guillevic">
      <organization></organization>
    </author>
    <author initials="S." surname="Ionica">
      <organization></organization>
    </author>
    <date year="2013"/>
  </front>
</reference>
<reference anchor="Distinguished" target="http://people.scs.carleton.ca/~paulv/papers/JoC97.pdf">
  <front>
    <title>Parallel Collision Search with Cryptanalytic Applications</title>
    <author initials="P.C." surname="van Oorschot">
      <organization></organization>
    </author>
    <author initials="M.J." surname="Wiener">
      <organization></organization>
    </author>
    <date year="1996"/>
  </front>
</reference>
<reference anchor="Exceptional" target="https://www.iacr.org/archive/pkc2003/25670224/25670224.pdf">
  <front>
    <title>Exceptional procedure attack on elliptic curve cryptosystems</title>
    <author initials="T." surname="Izu">
      <organization></organization>
    </author>
    <author initials="T." surname="Takagi">
      <organization></organization>
    </author>
    <date year="2003"/>
  </front>
</reference>
<reference anchor="Invsqr" target="http://eprint.iacr.org/2012/309.pdf">
  <front>
    <title>Fast and compact elliptic-curve cryptography</title>
    <author initials="M." surname="Hamburg">
      <organization></organization>
    </author>
    <date year="2012"/>
  </front>
</reference>
<reference anchor="FourQlib" target="https://www.microsoft.com/en-us/research/project/fourqlib/">
  <front>
    <title>FourQlib</title>
    <author initials="C." surname="Costello">
      <organization></organization>
    </author>
    <author initials="P." surname="Longa">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="GLV" target="https://www.iacr.org/archive/crypto2001/21390189.pdf">
  <front>
    <title>Faster Point Multiplication on Elliptic Curves with Efficient Endomorphisms</title>
    <author initials="R.P." surname="Gallant">
      <organization></organization>
    </author>
    <author initials="R.J." surname="Lambert">
      <organization></organization>
    </author>
    <author initials="S.A." surname="Vanstone">
      <organization></organization>
    </author>
    <date year="2001"/>
  </front>
</reference>
<reference anchor="GLS" target="https://www.iacr.org/archive/eurocrypt2009/54790519/54790519.pdf">
  <front>
    <title>Endomorphisms for Faster Elliptic Curve Cryptography on a Large Class of Curves</title>
    <author initials="S.D." surname="Galbraith">
      <organization></organization>
    </author>
    <author initials="X." surname="Lin">
      <organization></organization>
    </author>
    <author initials="M." surname="Scott">
      <organization></organization>
    </author>
    <date year="2009"/>
  </front>
</reference>
<reference anchor="SchnorrQ" target="https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/SchnorrQ.pdf">
  <front>
    <title>SchnorrQ: Schnorr Signatures on FourQ</title>
    <author initials="C." surname="Costello">
      <organization></organization>
    </author>
    <author initials="P." surname="Longa">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
</reference>
<reference anchor="TwistedRevisited" target="http://iacr.org/archive/asiacrypt2008/53500329/53500329.pdf">
  <front>
    <title>Twisted Edwards Curves Revisited</title>
    <author initials="H." surname="Hisil">
      <organization></organization>
    </author>
    <author initials="K-H." surname="Wong">
      <organization></organization>
    </author>
    <author initials="G." surname="Carter">
      <organization></organization>
    </author>
    <author initials="E." surname="Dawson">
      <organization></organization>
    </author>
    <date year="2008"/>
  </front>
</reference>
<reference anchor="Twisted" target="http://eprint.iacr.org/2008/013.pdf">
  <front>
    <title>Twisted Edwards Curves</title>
    <author initials="D.J." surname="Bernstein">
      <organization></organization>
    </author>
    <author initials="P." surname="Birkner">
      <organization></organization>
    </author>
    <author initials="M." surname="Joye">
      <organization></organization>
    </author>
    <author initials="T." surname="Lange">
      <organization></organization>
    </author>
    <author initials="C." surname="Peters">
      <organization></organization>
    </author>
    <date year="2008"/>
  </front>
</reference>




<reference  anchor="RFC5246" target='http://www.rfc-editor.org/info/rfc5246'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
<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>
<seriesInfo name='RFC' value='5246'/>
<seriesInfo name='DOI' value='10.17487/RFC5246'/>
</reference>



<reference  anchor="RFC7627" target='http://www.rfc-editor.org/info/rfc7627'>
<front>
<title>Transport Layer Security (TLS) Session Hash and Extended Master Secret Extension</title>
<author initials='K.' surname='Bhargavan' fullname='K. Bhargavan' role='editor'><organization /></author>
<author initials='A.' surname='Delignat-Lavaud' fullname='A. Delignat-Lavaud'><organization /></author>
<author initials='A.' surname='Pironti' fullname='A. Pironti'><organization /></author>
<author initials='A.' surname='Langley' fullname='A. Langley'><organization /></author>
<author initials='M.' surname='Ray' fullname='M. Ray'><organization /></author>
<date year='2015' month='September' />
<abstract><t>The Transport Layer Security (TLS) master secret is not cryptographically bound to important session parameters such as the server certificate.  Consequently, it is possible for an active attacker to set up two sessions, one with a client and another with a server, such that the master secrets on the two sessions are the same.  Thereafter, any mechanism that relies on the master secret for authentication, including session resumption, becomes vulnerable to a man-in-the-middle attack, where the attacker can simply forward messages back and forth between the client and server.  This specification defines a TLS extension that contextually binds the master secret to a log of the full handshake that computes it, thus preventing such attacks.</t></abstract>
</front>
<seriesInfo name='RFC' value='7627'/>
<seriesInfo name='DOI' value='10.17487/RFC7627'/>
</reference>




    </references>


<section anchor="constants" title="Constants">

<figure><artwork><![CDATA[
ctau = 0x1964de2c3afad20c74dcd57cebce74c3 +
       0x000000000000000c0000000000000012 * i

ctaudual = 0x4aa740eb230586529ecaa6d9decdf034 +
           0x7ffffffffffffff40000000000000011 * i
]]></artwork></figure>

<figure><artwork><![CDATA[
cphi0 = 0x0000000000000005fffffffffffffff7 +
        0x2553a0759182c3294f65536cef66f81a * i
cphi1 = 0x00000000000000050000000000000007 +
        0x62c8caa0c50c62cf334d90e9e28296f9 * i
cphi2 = 0x000000000000000f0000000000000015 +
        0x78df262b6c9b5c982c2cb7154f1df391 * i
cphi3 = 0x00000000000000020000000000000003 +
        0x5084c6491d76342a92440457a7962ea4 * i
cphi4 = 0x00000000000000030000000000000003 +
        0x12440457a7962ea4a1098c923aec6855 * i
cphi5 = 0x000000000000000a000000000000000f +
        0x459195418a18c59e669b21d3c5052df3 * i
cphi6 = 0x00000000000000120000000000000018 +
        0x0b232a8314318b3ccd3643a78a0a5be7 * i
cphi7 = 0x00000000000000180000000000000023 +
        0x3963bc1c99e2ea1a66c183035f48781a * i
cphi8 = 0x00000000000000aa00000000000000f0 +
        0x1f529f860316cbe544e251582b5d0ef0 * i
cphi9 = 0x00000000000008700000000000000bef +
        0x0fd52e9cfe00375b014d3e48976e2505 * i
]]></artwork></figure>

<figure><artwork><![CDATA[
cpsi1 = 0x2af99e9a83d54a02edf07f4767e346ef +
        0x00000000000000de000000000000013a * i
cpsi2 = 0x00000000000000e40000000000000143 +
        0x21b8d07b99a81f034c7deb770e03f372 * i
cpsi3 = 0x00000000000000060000000000000009 +
        0x4cb26f161d7d69063a6e6abe75e73a61 * i
cpsi4 = 0x7ffffffffffffff9fffffffffffffff6 +
        0x334d90e9e28296f9c59195418a18c59e * i
]]></artwork></figure>

<figure><artwork><![CDATA[
L1 = 0x7fc5bb5c5ea2be5dff75682ace6a6bd66259686e09d1a7d4f
L2 = 0x38fd4b04caa6c0f8a2bd235580f468d8dd1ba1d84dd627afb
L3 = 0x0d038bf8d0bffbaf6c42bd6c965dca9029b291a33678c203c
L4 = 0x31b073877a22d841081cbdc3714983d8212e5666b77e7fdc0
]]></artwork></figure>

<figure><artwork><![CDATA[
b1 = [ 0x0906ff27e0a0a196, -0x1363e862c22a2da0,
       0x07426031ecc8030f, -0x084f739986b9e651]
b2 = [ 0x1d495bea84fcc2d4, -0x0000000000000001,
       0x0000000000000001,  0x25dbc5bc8dd167d0]
b3 = [ 0x17abad1d231f0302,  0x02c4211ae388da51,
      -0x2e4d21c98927c49f,  0x0a9e6f44c02ecd97]
b4 = [ 0x136e340a9108c83f,  0x3122df2dc3e0ff32,
      -0x068a49f02aa8a9b5, -0x18d5087896de0aea]
]]></artwork></figure>

</section>
<section anchor="point-decompression" title="Point Decompression">

<t>The following algorithm is an adaptation of the decompression algorithm
from <xref target="SchnorrQ"/>. It decodes a 32-byte string B which is formatted as
detailed in <xref target="representation-of-curve-points"/>. The result is a valid
point P = (x, y) that satisfies the curve equation, or a message of FAILED
if the decoding had a failure.</t>

<figure><artwork><![CDATA[
Sign(x0 + x1*i):
    s0 = X[0] >> 126
    s1 = X[1] >> 126
    if X[0] != 0:
        return s0
    else:
        return s1

Compress(X, Y):
    B = Y encoded following {{representation-of-curve-points}}
    Set the top bit to Sign(X)
    return B

Expand(B = [y, s]):
    Parse out the encoded values y = y0 + y1 * i and s
    if y0 or y1 >= p:
        return FAILED

    u = y^2 - 1             # Set u = u0 + u1 * i
    v = d*y^2 + 1           # Set v = v0 + v1 * i

    t0 = u0*v0 + u1*v1;
    t1 = u1*v0 - u0*v1;
    t2 = v0^2 + v1^2
    t3 = (t0^2 + t1^2)^(2^125)

    t = 2*(t0 + t3)
    if t = 0:
        t = 2*(t0 - t3)

    a = (t * t2^3)^(2^125-1)
    b = (a * t2) * t
    x0 = b/2
    x1 = (a * t2) * t1
    if t2 * b^2 != t:
        Swap x0 and x1

    x = x0 + x1 * i
    if Sign(x) != s:
      x = -x

    if -x^2+y^2 != 1+d*x^2*y^2:  # Check curve equation with x
        x = conj(x)
    if -x^2+y^2 != 1+d*x^2*y^2:  # ... or its conjugate
        return FAILED
    return P = (x,y)
]]></artwork></figure>

</section>


  </back>

<!-- ##markdown-source:
H4sIADkn2VgAA8V92XrjNtbgPZ8Ck1zEciSZmzb3VE97qyWpVFzl6j+1pNI/
SII2UxKpkJRtZenXmvt5sjkLAC6Sq5Lpi/GXikUKOAAOzn4O4NFo5NRZvVTH
4mxT3qrwpSOjqFS3x05SxLlcwRdJKdN6FMkyV9UoTsvrUfjLaClrVdVODL+u
i3J7LKo6cZxsXR6LutxUte+6C9d3ZKnksbhS8abM6q1zV5Qfr8tisz52Pqot
PCXH4lleKwBdj85xHMepapkn/5LLIoext6py1tmxeF8X8VBURVmXKq3g03aF
Hz44jtzUN0V57IiRI/gny6tj8cNYPJdJYt7xSn6QdVXknS+K8lrm2a+yzor8
WPzzTJyq8qNaqq1poFYyWx6LO+oaLaHrP67x1TguVv1BL2HQIr+W3VEvZV1m
8cfuV91xv8visqiKtBavVKVkGd/0hl8vsfM/VqbdvtFfjcUpbVJ3+FdZfCPL
pPddb/zi12y5lL1By2X0j2x9O67uYWfztChX0PxWHTvUTtPLse5Uy/Ja1cfi
i5u6XlfHR0dqXWZ5Pc5kXI5htCPf9SZHk+lkvE7SL0wnJr0vHheb8uWxSOHX
KMlWKq9gWnIpEgXrXBdVhtOsBOydFC9HMY4siltVivpGie9UWak8VwIGXCkD
OgHKPBYw6FS/sIRifkbNxwaJZ2NxVlS1Wi6Lz7S0m01fvqRJ7UXGflyERzN/
tg8Xr2FJZo1nsGpgpxiXD9gpxUWeFKuiXN9k1Wp0EsdAqSUsNBEXy2W2rrOY
t6X6D7FwOhZXq6y+4bU9ef5f4V9YWXAUeN5Du9zZXgAsbjNJu/iDypaiBJkC
vILL3VlB8JdWcDIWTzZA0+o2iz/T9GosnhV5FuudPM+qOsuvN1l1oxI7TH/d
a1Wsl2pcxdU4luVS1UUOH47+vZab5e3RWq6BKI++Kc4WnT22qLiUpYTJLWGH
YeMQHSAkke/FHaBdnJXbNYhBudzilp6s10uYHvGAhcR48RYLs7O7iOkvV5Mt
kPitzMX3RVnFN0X9mfbfjb8Zix8ylauS8XNxH6t1TRu4HzvI/Hd3dw1N4LpA
bhytP8agFoIjfzKdub4f2g97UdQaBzi7iFWyKZWQdS1BlgK+lKF4ZpUYUVZU
W+DdVR9LOOqfxhIv+zUQxa+bP9HqtfworzNGzbP8tvqlBftPMIt/FLiLzvob
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

-->

</rfc>

