/* Copyright (c) 2015, Google Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */

/* A 64-bit implementation of the NIST P-224 elliptic curve point multiplication
 *
 * Inspired by Daniel J. Bernstein's public domain nistp224 implementation
 * and Adam Langley's public domain 64-bit C implementation of curve25519. */

#include <openssl/base.h>

#if defined(OPENSSL_64_BIT) && !defined(OPENSSL_WINDOWS) && \
    !defined(OPENSSL_SMALL)

#include <openssl/bn.h>
#include <openssl/ec.h>
#include <openssl/err.h>
#include <openssl/mem.h>
#include <openssl/obj.h>

#include <string.h>

#include "internal.h"
#include "../internal.h"


typedef uint8_t u8;
typedef uint64_t u64;
typedef int64_t s64;

/* Field elements are represented as a_0 + 2^56*a_1 + 2^112*a_2 + 2^168*a_3
 * using 64-bit coefficients called 'limbs', and sometimes (for multiplication
 * results) as b_0 + 2^56*b_1 + 2^112*b_2 + 2^168*b_3 + 2^224*b_4 + 2^280*b_5 +
 * 2^336*b_6 using 128-bit coefficients called 'widelimbs'. A 4-limb
 * representation is an 'felem'; a 7-widelimb representation is a 'widefelem'.
 * Even within felems, bits of adjacent limbs overlap, and we don't always
 * reduce the representations: we ensure that inputs to each felem
 * multiplication satisfy a_i < 2^60, so outputs satisfy b_i < 4*2^60*2^60, and
 * fit into a 128-bit word without overflow. The coefficients are then again
 * partially reduced to obtain an felem satisfying a_i < 2^57. We only reduce
 * to the unique minimal representation at the end of the computation. */

typedef uint64_t limb;
typedef uint128_t widelimb;

typedef limb felem[4];
typedef widelimb widefelem[7];

/* Field element represented as a byte arrary. 28*8 = 224 bits is also the
 * group order size for the elliptic curve, and we also use this type for
 * scalars for point multiplication. */
typedef u8 felem_bytearray[28];

/* Precomputed multiples of the standard generator
 * Points are given in coordinates (X, Y, Z) where Z normally is 1
 * (0 for the point at infinity).
 * For each field element, slice a_0 is word 0, etc.
 *
 * The table has 2 * 16 elements, starting with the following:
 * index | bits    | point
 * ------+---------+------------------------------
 *     0 | 0 0 0 0 | 0G
 *     1 | 0 0 0 1 | 1G
 *     2 | 0 0 1 0 | 2^56G
 *     3 | 0 0 1 1 | (2^56 + 1)G
 *     4 | 0 1 0 0 | 2^112G
 *     5 | 0 1 0 1 | (2^112 + 1)G
 *     6 | 0 1 1 0 | (2^112 + 2^56)G
 *     7 | 0 1 1 1 | (2^112 + 2^56 + 1)G
 *     8 | 1 0 0 0 | 2^168G
 *     9 | 1 0 0 1 | (2^168 + 1)G
 *    10 | 1 0 1 0 | (2^168 + 2^56)G
 *    11 | 1 0 1 1 | (2^168 + 2^56 + 1)G
 *    12 | 1 1 0 0 | (2^168 + 2^112)G
 *    13 | 1 1 0 1 | (2^168 + 2^112 + 1)G
 *    14 | 1 1 1 0 | (2^168 + 2^112 + 2^56)G
 *    15 | 1 1 1 1 | (2^168 + 2^112 + 2^56 + 1)G
 * followed by a copy of this with each element multiplied by 2^28.
 *
 * The reason for this is so that we can clock bits into four different
 * locations when doing simple scalar multiplies against the base point,
 * and then another four locations using the second 16 elements. */
static const felem g_pre_comp[2][16][3] = {
    {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
     {{0x3280d6115c1d21, 0xc1d356c2112234, 0x7f321390b94a03, 0xb70e0cbd6bb4bf},
      {0xd5819985007e34, 0x75a05a07476444, 0xfb4c22dfe6cd43, 0xbd376388b5f723},
      {1, 0, 0, 0}},
     {{0xfd9675666ebbe9, 0xbca7664d40ce5e, 0x2242df8d8a2a43, 0x1f49bbb0f99bc5},
      {0x29e0b892dc9c43, 0xece8608436e662, 0xdc858f185310d0, 0x9812dd4eb8d321},
      {1, 0, 0, 0}},
     {{0x6d3e678d5d8eb8, 0x559eed1cb362f1, 0x16e9a3bbce8a3f, 0xeedcccd8c2a748},
      {0xf19f90ed50266d, 0xabf2b4bf65f9df, 0x313865468fafec, 0x5cb379ba910a17},
      {1, 0, 0, 0}},
     {{0x0641966cab26e3, 0x91fb2991fab0a0, 0xefec27a4e13a0b, 0x0499aa8a5f8ebe},
      {0x7510407766af5d, 0x84d929610d5450, 0x81d77aae82f706, 0x6916f6d4338c5b},
      {1, 0, 0, 0}},
     {{0xea95ac3b1f15c6, 0x086000905e82d4, 0xdd323ae4d1c8b1, 0x932b56be7685a3},
      {0x9ef93dea25dbbf, 0x41665960f390f0, 0xfdec76dbe2a8a7, 0x523e80f019062a},
      {1, 0, 0, 0}},
     {{0x822fdd26732c73, 0xa01c83531b5d0f, 0x363f37347c1ba4, 0xc391b45c84725c},
      {0xbbd5e1b2d6ad24, 0xddfbcde19dfaec, 0xc393da7e222a7f, 0x1efb7890ede244},
      {1, 0, 0, 0}},
     {{0x4c9e90ca217da1, 0xd11beca79159bb, 0xff8d33c2c98b7c, 0x2610b39409f849},
      {0x44d1352ac64da0, 0xcdbb7b2c46b4fb, 0x966c079b753c89, 0xfe67e4e820b112},
      {1, 0, 0, 0}},
     {{0xe28cae2df5312d, 0xc71b61d16f5c6e, 0x79b7619a3e7c4c, 0x05c73240899b47},
      {0x9f7f6382c73e3a, 0x18615165c56bda, 0x641fab2116fd56, 0x72855882b08394},
      {1, 0, 0, 0}},
     {{0x0469182f161c09, 0x74a98ca8d00fb5, 0xb89da93489a3e0, 0x41c98768fb0c1d},
      {0xe5ea05fb32da81, 0x3dce9ffbca6855, 0x1cfe2d3fbf59e6, 0x0e5e03408738a7},
      {1, 0, 0, 0}},
     {{0xdab22b2333e87f, 0x4430137a5dd2f6, 0xe03ab9f738beb8, 0xcb0c5d0dc34f24},
      {0x764a7df0c8fda5, 0x185ba5c3fa2044, 0x9281d688bcbe50, 0xc40331df893881},
      {1, 0, 0, 0}},
     {{0xb89530796f0f60, 0xade92bd26909a3, 0x1a0c83fb4884da, 0x1765bf22a5a984},
      {0x772a9ee75db09e, 0x23bc6c67cec16f, 0x4c1edba8b14e2f, 0xe2a215d9611369},
      {1, 0, 0, 0}},
     {{0x571e509fb5efb3, 0xade88696410552, 0xc8ae85fada74fe, 0x6c7e4be83bbde3},
      {0xff9f51160f4652, 0xb47ce2495a6539, 0xa2946c53b582f4, 0x286d2db3ee9a60},
      {1, 0, 0, 0}},
     {{0x40bbd5081a44af, 0x0995183b13926c, 0xbcefba6f47f6d0, 0x215619e9cc0057},
      {0x8bc94d3b0df45e, 0xf11c54a3694f6f, 0x8631b93cdfe8b5, 0xe7e3f4b0982db9},
      {1, 0, 0, 0}},
     {{0xb17048ab3e1c7b, 0xac38f36ff8a1d8, 0x1c29819435d2c6, 0xc813132f4c07e9},
      {0x2891425503b11f, 0x08781030579fea, 0xf5426ba5cc9674, 0x1e28ebf18562bc},
      {1, 0, 0, 0}},
     {{0x9f31997cc864eb, 0x06cd91d28b5e4c, 0xff17036691a973, 0xf1aef351497c58},
      {0xdd1f2d600564ff, 0xdead073b1402db, 0x74a684435bd693, 0xeea7471f962558},
      {1, 0, 0, 0}}},
    {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
     {{0x9665266dddf554, 0x9613d78b60ef2d, 0xce27a34cdba417, 0xd35ab74d6afc31},
      {0x85ccdd22deb15e, 0x2137e5783a6aab, 0xa141cffd8c93c6, 0x355a1830e90f2d},
      {1, 0, 0, 0}},
     {{0x1a494eadaade65, 0xd6da4da77fe53c, 0xe7992996abec86, 0x65c3553c6090e3},
      {0xfa610b1fb09346, 0xf1c6540b8a4aaf, 0xc51a13ccd3cbab, 0x02995b1b18c28a},
      {1, 0, 0, 0}},
     {{0x7874568e7295ef, 0x86b419fbe38d04, 0xdc0690a7550d9a, 0xd3966a44beac33},
      {0x2b7280ec29132f, 0xbeaa3b6a032df3, 0xdc7dd88ae41200, 0xd25e2513e3a100},
      {1, 0, 0, 0}},
     {{0x924857eb2efafd, 0xac2bce41223190, 0x8edaa1445553fc, 0x825800fd3562d5},
      {0x8d79148ea96621, 0x23a01c3dd9ed8d, 0xaf8b219f9416b5, 0xd8db0cc277daea},
      {1, 0, 0, 0}},
     {{0x76a9c3b1a700f0, 0xe9acd29bc7e691, 0x69212d1a6b0327, 0x6322e97fe154be},
      {0x469fc5465d62aa, 0x8d41ed18883b05, 0x1f8eae66c52b88, 0xe4fcbe9325be51},
      {1, 0, 0, 0}},
     {{0x825fdf583cac16, 0x020b857c7b023a, 0x683c17744b0165, 0x14ffd0a2daf2f1},
      {0x323b36184218f9, 0x4944ec4e3b47d4, 0xc15b3080841acf, 0x0bced4b01a28bb},
      {1, 0, 0, 0}},
     {{0x92ac22230df5c4, 0x52f33b4063eda8, 0xcb3f19870c0c93, 0x40064f2ba65233},
      {0xfe16f0924f8992, 0x012da25af5b517, 0x1a57bb24f723a6, 0x06f8bc76760def},
      {1, 0, 0, 0}},
     {{0x4a7084f7817cb9, 0xbcab0738ee9a78, 0x3ec11e11d9c326, 0xdc0fe90e0f1aae},
      {0xcf639ea5f98390, 0x5c350aa22ffb74, 0x9afae98a4047b7, 0x956ec2d617fc45},
      {1, 0, 0, 0}},
     {{0x4306d648c1be6a, 0x9247cd8bc9a462, 0xf5595e377d2f2e, 0xbd1c3caff1a52e},
      {0x045e14472409d0, 0x29f3e17078f773, 0x745a602b2d4f7d, 0x191837685cdfbb},
      {1, 0, 0, 0}},
     {{0x5b6ee254a8cb79, 0x4953433f5e7026, 0xe21faeb1d1def4, 0xc4c225785c09de},
      {0x307ce7bba1e518, 0x31b125b1036db8, 0x47e91868839e8f, 0xc765866e33b9f3},
      {1, 0, 0, 0}},
     {{0x3bfece24f96906, 0x4794da641e5093, 0xde5df64f95db26, 0x297ecd89714b05},
      {0x701bd3ebb2c3aa, 0x7073b4f53cb1d5, 0x13c5665658af16, 0x9895089d66fe58},
      {1, 0, 0, 0}},
     {{0x0fef05f78c4790, 0x2d773633b05d2e, 0x94229c3a951c94, 0xbbbd70df4911bb},
      {0xb2c6963d2c1168, 0x105f47a72b0d73, 0x9fdf6111614080, 0x7b7e94b39e67b0},
      {1, 0, 0, 0}},
     {{0xad1a7d6efbe2b3, 0xf012482c0da69d, 0x6b3bdf12438345, 0x40d7558d7aa4d9},
      {0x8a09fffb5c6d3d, 0x9a356e5d9ffd38, 0x5973f15f4f9b1c, 0xdcd5f59f63c3ea},
      {1, 0, 0, 0}},
     {{0xacf39f4c5ca7ab, 0x4c8071cc5fd737, 0xc64e3602cd1184, 0x0acd4644c9abba},
      {0x6c011a36d8bf6e, 0xfecd87ba24e32a, 0x19f6f56574fad8, 0x050b204ced9405},
      {1, 0, 0, 0}},
     {{0xed4f1cae7d9a96, 0x5ceef7ad94c40a, 0x778e4a3bf3ef9b, 0x7405783dc3b55e},
      {0x32477c61b6e8c6, 0xb46a97570f018b, 0x91176d0a7e95d1, 0x3df90fbc4c7d0e},
      {1, 0, 0, 0}}}};

/* Helper functions to convert field elements to/from internal representation */
static void bin28_to_felem(felem out, const u8 in[28]) {
  out[0] = *((const uint64_t *)(in)) & 0x00ffffffffffffff;
  out[1] = (*((const uint64_t *)(in + 7))) & 0x00ffffffffffffff;
  out[2] = (*((const uint64_t *)(in + 14))) & 0x00ffffffffffffff;
  out[3] = (*((const uint64_t *)(in + 20))) >> 8;
}

static void felem_to_bin28(u8 out[28], const felem in) {
  unsigned i;
  for (i = 0; i < 7; ++i) {
    out[i] = in[0] >> (8 * i);
    out[i + 7] = in[1] >> (8 * i);
    out[i + 14] = in[2] >> (8 * i);
    out[i + 21] = in[3] >> (8 * i);
  }
}

/* To preserve endianness when using BN_bn2bin and BN_bin2bn */
static void flip_endian(u8 *out, const u8 *in, unsigned len) {
  unsigned i;
  for (i = 0; i < len; ++i) {
    out[i] = in[len - 1 - i];
  }
}

/* From OpenSSL BIGNUM to internal representation */
static int BN_to_felem(felem out, const BIGNUM *bn) {
  /* BN_bn2bin eats leading zeroes */
  felem_bytearray b_out;
  memset(b_out, 0, sizeof(b_out));
  unsigned num_bytes = BN_num_bytes(bn);
  if (num_bytes > sizeof(b_out) ||
      BN_is_negative(bn)) {
    OPENSSL_PUT_ERROR(EC, EC_R_BIGNUM_OUT_OF_RANGE);
    return 0;
  }

  felem_bytearray b_in;
  num_bytes = BN_bn2bin(bn, b_in);
  flip_endian(b_out, b_in, num_bytes);
  bin28_to_felem(out, b_out);
  return 1;
}

/* From internal representation to OpenSSL BIGNUM */
static BIGNUM *felem_to_BN(BIGNUM *out, const felem in) {
  felem_bytearray b_in, b_out;
  felem_to_bin28(b_in, in);
  flip_endian(b_out, b_in, sizeof(b_out));
  return BN_bin2bn(b_out, sizeof(b_out), out);
}

/* Field operations, using the internal representation of field elements.
 * NB! These operations are specific to our point multiplication and cannot be
 * expected to be correct in general - e.g., multiplication with a large scalar
 * will cause an overflow. */

static void felem_assign(felem out, const felem in) {
  out[0] = in[0];
  out[1] = in[1];
  out[2] = in[2];
  out[3] = in[3];
}

/* Sum two field elements: out += in */
static void felem_sum(felem out, const felem in) {
  out[0] += in[0];
  out[1] += in[1];
  out[2] += in[2];
  out[3] += in[3];
}

/* Get negative value: out = -in */
/* Assumes in[i] < 2^57 */
static void felem_neg(felem out, const felem in) {
  static const limb two58p2 = (((limb)1) << 58) + (((limb)1) << 2);
  static const limb two58m2 = (((limb)1) << 58) - (((limb)1) << 2);
  static const limb two58m42m2 =
      (((limb)1) << 58) - (((limb)1) << 42) - (((limb)1) << 2);

  /* Set to 0 mod 2^224-2^96+1 to ensure out > in */
  out[0] = two58p2 - in[0];
  out[1] = two58m42m2 - in[1];
  out[2] = two58m2 - in[2];
  out[3] = two58m2 - in[3];
}

/* Subtract field elements: out -= in */
/* Assumes in[i] < 2^57 */
static void felem_diff(felem out, const felem in) {
  static const limb two58p2 = (((limb)1) << 58) + (((limb)1) << 2);
  static const limb two58m2 = (((limb)1) << 58) - (((limb)1) << 2);
  static const limb two58m42m2 =
      (((limb)1) << 58) - (((limb)1) << 42) - (((limb)1) << 2);

  /* Add 0 mod 2^224-2^96+1 to ensure out > in */
  out[0] += two58p2;
  out[1] += two58m42m2;
  out[2] += two58m2;
  out[3] += two58m2;

  out[0] -= in[0];
  out[1] -= in[1];
  out[2] -= in[2];
  out[3] -= in[3];
}

/* Subtract in unreduced 128-bit mode: out -= in */
/* Assumes in[i] < 2^119 */
static void widefelem_diff(widefelem out, const widefelem in) {
  static const widelimb two120 = ((widelimb)1) << 120;
  static const widelimb two120m64 =
      (((widelimb)1) << 120) - (((widelimb)1) << 64);
  static const widelimb two120m104m64 =
      (((widelimb)1) << 120) - (((widelimb)1) << 104) - (((widelimb)1) << 64);

  /* Add 0 mod 2^224-2^96+1 to ensure out > in */
  out[0] += two120;
  out[1] += two120m64;
  out[2] += two120m64;
  out[3] += two120;
  out[4] += two120m104m64;
  out[5] += two120m64;
  out[6] += two120m64;

  out[0] -= in[0];
  out[1] -= in[1];
  out[2] -= in[2];
  out[3] -= in[3];
  out[4] -= in[4];
  out[5] -= in[5];
  out[6] -= in[6];
}

/* Subtract in mixed mode: out128 -= in64 */
/* in[i] < 2^63 */
static void felem_diff_128_64(widefelem out, const felem in) {
  static const widelimb two64p8 = (((widelimb)1) << 64) + (((widelimb)1) << 8);
  static const widelimb two64m8 = (((widelimb)1) << 64) - (((widelimb)1) << 8);
  static const widelimb two64m48m8 =
      (((widelimb)1) << 64) - (((widelimb)1) << 48) - (((widelimb)1) << 8);

  /* Add 0 mod 2^224-2^96+1 to ensure out > in */
  out[0] += two64p8;
  out[1] += two64m48m8;
  out[2] += two64m8;
  out[3] += two64m8;

  out[0] -= in[0];
  out[1] -= in[1];
  out[2] -= in[2];
  out[3] -= in[3];
}

/* Multiply a field element by a scalar: out = out * scalar
 * The scalars we actually use are small, so results fit without overflow */
static void felem_scalar(felem out, const limb scalar) {
  out[0] *= scalar;
  out[1] *= scalar;
  out[2] *= scalar;
  out[3] *= scalar;
}

/* Multiply an unreduced field element by a scalar: out = out * scalar
 * The scalars we actually use are small, so results fit without overflow */
static void widefelem_scalar(widefelem out, const widelimb scalar) {
  out[0] *= scalar;
  out[1] *= scalar;
  out[2] *= scalar;
  out[3] *= scalar;
  out[4] *= scalar;
  out[5] *= scalar;
  out[6] *= scalar;
}

/* Square a field element: out = in^2 */
static void felem_square(widefelem out, const felem in) {
  limb tmp0, tmp1, tmp2;
  tmp0 = 2 * in[0];
  tmp1 = 2 * in[1];
  tmp2 = 2 * in[2];
  out[0] = ((widelimb)in[0]) * in[0];
  out[1] = ((widelimb)in[0]) * tmp1;
  out[2] = ((widelimb)in[0]) * tmp2 + ((widelimb)in[1]) * in[1];
  out[3] = ((widelimb)in[3]) * tmp0 + ((widelimb)in[1]) * tmp2;
  out[4] = ((widelimb)in[3]) * tmp1 + ((widelimb)in[2]) * in[2];
  out[5] = ((widelimb)in[3]) * tmp2;
  out[6] = ((widelimb)in[3]) * in[3];
}

/* Multiply two field elements: out = in1 * in2 */
static void felem_mul(widefelem out, const felem in1, const felem in2) {
  out[0] = ((widelimb)in1[0]) * in2[0];
  out[1] = ((widelimb)in1[0]) * in2[1] + ((widelimb)in1[1]) * in2[0];
  out[2] = ((widelimb)in1[0]) * in2[2] + ((widelimb)in1[1]) * in2[1] +
           ((widelimb)in1[2]) * in2[0];
  out[3] = ((widelimb)in1[0]) * in2[3] + ((widelimb)in1[1]) * in2[2] +
           ((widelimb)in1[2]) * in2[1] + ((widelimb)in1[3]) * in2[0];
  out[4] = ((widelimb)in1[1]) * in2[3] + ((widelimb)in1[2]) * in2[2] +
           ((widelimb)in1[3]) * in2[1];
  out[5] = ((widelimb)in1[2]) * in2[3] + ((widelimb)in1[3]) * in2[2];
  out[6] = ((widelimb)in1[3]) * in2[3];
}

/* Reduce seven 128-bit coefficients to four 64-bit coefficients.
 * Requires in[i] < 2^126,
 * ensures out[0] < 2^56, out[1] < 2^56, out[2] < 2^56, out[3] <= 2^56 + 2^16 */
static void felem_reduce(felem out, const widefelem in) {
  static const widelimb two127p15 =
      (((widelimb)1) << 127) + (((widelimb)1) << 15);
  static const widelimb two127m71 =
      (((widelimb)1) << 127) - (((widelimb)1) << 71);
  static const widelimb two127m71m55 =
      (((widelimb)1) << 127) - (((widelimb)1) << 71) - (((widelimb)1) << 55);
  widelimb output[5];

  /* Add 0 mod 2^224-2^96+1 to ensure all differences are positive */
  output[0] = in[0] + two127p15;
  output[1] = in[1] + two127m71m55;
  output[2] = in[2] + two127m71;
  output[3] = in[3];
  output[4] = in[4];

  /* Eliminate in[4], in[5], in[6] */
  output[4] += in[6] >> 16;
  output[3] += (in[6] & 0xffff) << 40;
  output[2] -= in[6];

  output[3] += in[5] >> 16;
  output[2] += (in[5] & 0xffff) << 40;
  output[1] -= in[5];

  output[2] += output[4] >> 16;
  output[1] += (output[4] & 0xffff) << 40;
  output[0] -= output[4];

  /* Carry 2 -> 3 -> 4 */
  output[3] += output[2] >> 56;
  output[2] &= 0x00ffffffffffffff;

  output[4] = output[3] >> 56;
  output[3] &= 0x00ffffffffffffff;

  /* Now output[2] < 2^56, output[3] < 2^56, output[4] < 2^72 */

  /* Eliminate output[4] */
  output[2] += output[4] >> 16;
  /* output[2] < 2^56 + 2^56 = 2^57 */
  output[1] += (output[4] & 0xffff) << 40;
  output[0] -= output[4];

  /* Carry 0 -> 1 -> 2 -> 3 */
  output[1] += output[0] >> 56;
  out[0] = output[0] & 0x00ffffffffffffff;

  output[2] += output[1] >> 56;
  /* output[2] < 2^57 + 2^72 */
  out[1] = output[1] & 0x00ffffffffffffff;
  output[3] += output[2] >> 56;
  /* output[3] <= 2^56 + 2^16 */
  out[2] = output[2] & 0x00ffffffffffffff;

  /* out[0] < 2^56, out[1] < 2^56, out[2] < 2^56,
   * out[3] <= 2^56 + 2^16 (due to final carry),
   * so out < 2*p */
  out[3] = output[3];
}

/* Reduce to unique minimal representation.
 * Requires 0 <= in < 2*p (always call felem_reduce first) */
static void felem_contract(felem out, const felem in) {
  static const int64_t two56 = ((limb)1) << 56;
  /* 0 <= in < 2*p, p = 2^224 - 2^96 + 1 */
  /* if in > p , reduce in = in - 2^224 + 2^96 - 1 */
  int64_t tmp[4], a;
  tmp[0] = in[0];
  tmp[1] = in[1];
  tmp[2] = in[2];
  tmp[3] = in[3];
  /* Case 1: a = 1 iff in >= 2^224 */
  a = (in[3] >> 56);
  tmp[0] -= a;
  tmp[1] += a << 40;
  tmp[3] &= 0x00ffffffffffffff;
  /* Case 2: a = 0 iff p <= in < 2^224, i.e., the high 128 bits are all 1 and
   * the lower part is non-zero */
  a = ((in[3] & in[2] & (in[1] | 0x000000ffffffffff)) + 1) |
      (((int64_t)(in[0] + (in[1] & 0x000000ffffffffff)) - 1) >> 63);
  a &= 0x00ffffffffffffff;
  /* turn a into an all-one mask (if a = 0) or an all-zero mask */
  a = (a - 1) >> 63;
  /* subtract 2^224 - 2^96 + 1 if a is all-one */
  tmp[3] &= a ^ 0xffffffffffffffff;
  tmp[2] &= a ^ 0xffffffffffffffff;
  tmp[1] &= (a ^ 0xffffffffffffffff) | 0x000000ffffffffff;
  tmp[0] -= 1 & a;

  /* eliminate negative coefficients: if tmp[0] is negative, tmp[1] must
   * be non-zero, so we only need one step */
  a = tmp[0] >> 63;
  tmp[0] += two56 & a;
  tmp[1] -= 1 & a;

  /* carry 1 -> 2 -> 3 */
  tmp[2] += tmp[1] >> 56;
  tmp[1] &= 0x00ffffffffffffff;

  tmp[3] += tmp[2] >> 56;
  tmp[2] &= 0x00ffffffffffffff;

  /* Now 0 <= out < p */
  out[0] = tmp[0];
  out[1] = tmp[1];
  out[2] = tmp[2];
  out[3] = tmp[3];
}

/* Zero-check: returns 1 if input is 0, and 0 otherwise. We know that field
 * elements are reduced to in < 2^225, so we only need to check three cases: 0,
 * 2^224 - 2^96 + 1, and 2^225 - 2^97 + 2 */
static limb felem_is_zero(const felem in) {
  limb zero = in[0] | in[1] | in[2] | in[3];
  zero = (((int64_t)(zero)-1) >> 63) & 1;

  limb two224m96p1 = (in[0] ^ 1) | (in[1] ^ 0x00ffff0000000000) |
                     (in[2] ^ 0x00ffffffffffffff) |
                     (in[3] ^ 0x00ffffffffffffff);
  two224m96p1 = (((int64_t)(two224m96p1)-1) >> 63) & 1;
  limb two225m97p2 = (in[0] ^ 2) | (in[1] ^ 0x00fffe0000000000) |
                     (in[2] ^ 0x00ffffffffffffff) |
                     (in[3] ^ 0x01ffffffffffffff);
  two225m97p2 = (((int64_t)(two225m97p2)-1) >> 63) & 1;
  return (zero | two224m96p1 | two225m97p2);
}

/* Invert a field element */
/* Computation chain copied from djb's code */
static void felem_inv(felem out, const felem in) {
  felem ftmp, ftmp2, ftmp3, ftmp4;
  widefelem tmp;
  unsigned i;

  felem_square(tmp, in);
  felem_reduce(ftmp, tmp); /* 2 */
  felem_mul(tmp, in, ftmp);
  felem_reduce(ftmp, tmp); /* 2^2 - 1 */
  felem_square(tmp, ftmp);
  felem_reduce(ftmp, tmp); /* 2^3 - 2 */
  felem_mul(tmp, in, ftmp);
  felem_reduce(ftmp, tmp); /* 2^3 - 1 */
  felem_square(tmp, ftmp);
  felem_reduce(ftmp2, tmp); /* 2^4 - 2 */
  felem_square(tmp, ftmp2);
  felem_reduce(ftmp2, tmp); /* 2^5 - 4 */
  felem_square(tmp, ftmp2);
  felem_reduce(ftmp2, tmp); /* 2^6 - 8 */
  felem_mul(tmp, ftmp2, ftmp);
  felem_reduce(ftmp, tmp); /* 2^6 - 1 */
  felem_square(tmp, ftmp);
  felem_reduce(ftmp2, tmp); /* 2^7 - 2 */
  for (i = 0; i < 5; ++i) { /* 2^12 - 2^6 */
    felem_square(tmp, ftmp2);
    felem_reduce(ftmp2, tmp);
  }
  felem_mul(tmp, ftmp2, ftmp);
  felem_reduce(ftmp2, tmp); /* 2^12 - 1 */
  felem_square(tmp, ftmp2);
  felem_reduce(ftmp3, tmp); /* 2^13 - 2 */
  for (i = 0; i < 11; ++i) {/* 2^24 - 2^12 */
    felem_square(tmp, ftmp3);
    felem_reduce(ftmp3, tmp);
  }
  felem_mul(tmp, ftmp3, ftmp2);
  felem_reduce(ftmp2, tmp); /* 2^24 - 1 */
  felem_square(tmp, ftmp2);
  felem_reduce(ftmp3, tmp); /* 2^25 - 2 */
  for (i = 0; i < 23; ++i) {/* 2^48 - 2^24 */
    felem_square(tmp, ftmp3);
    felem_reduce(ftmp3, tmp);
  }
  felem_mul(tmp, ftmp3, ftmp2);
  felem_reduce(ftmp3, tmp); /* 2^48 - 1 */
  felem_square(tmp, ftmp3);
  felem_reduce(ftmp4, tmp); /* 2^49 - 2 */
  for (i = 0; i < 47; ++i) {/* 2^96 - 2^48 */
    felem_square(tmp, ftmp4);
    felem_reduce(ftmp4, tmp);
  }
  felem_mul(tmp, ftmp3, ftmp4);
  felem_reduce(ftmp3, tmp); /* 2^96 - 1 */
  felem_square(tmp, ftmp3);
  felem_reduce(ftmp4, tmp); /* 2^97 - 2 */
  for (i = 0; i < 23; ++i) {/* 2^120 - 2^24 */
    felem_square(tmp, ftmp4);
    felem_reduce(ftmp4, tmp);
  }
  felem_mul(tmp, ftmp2, ftmp4);
  felem_reduce(ftmp2, tmp); /* 2^120 - 1 */
  for (i = 0; i < 6; ++i) { /* 2^126 - 2^6 */
    felem_square(tmp, ftmp2);
    felem_reduce(ftmp2, tmp);
  }
  felem_mul(tmp, ftmp2, ftmp);
  felem_reduce(ftmp, tmp); /* 2^126 - 1 */
  felem_square(tmp, ftmp);
  felem_reduce(ftmp, tmp); /* 2^127 - 2 */
  felem_mul(tmp, ftmp, in);
  felem_reduce(ftmp, tmp); /* 2^127 - 1 */
  for (i = 0; i < 97; ++i) {/* 2^224 - 2^97 */
    felem_square(tmp, ftmp);
    felem_reduce(ftmp, tmp);
  }
  felem_mul(tmp, ftmp, ftmp3);
  felem_reduce(out, tmp); /* 2^224 - 2^96 - 1 */
}

/* Copy in constant time:
 * if icopy == 1, copy in to out,
 * if icopy == 0, copy out to itself. */
static void copy_conditional(felem out, const felem in, limb icopy) {
  unsigned i;
  /* icopy is a (64-bit) 0 or 1, so copy is either all-zero or all-one */
  const limb copy = -icopy;
  for (i = 0; i < 4; ++i) {
    const limb tmp = copy & (in[i] ^ out[i]);
    out[i] ^= tmp;
  }
}

/* ELLIPTIC CURVE POINT OPERATIONS
 *
 * Points are represented in Jacobian projective coordinates:
 * (X, Y, Z) corresponds to the affine point (X/Z^2, Y/Z^3),
 * or to the point at infinity if Z == 0. */

/* Double an elliptic curve point:
 * (X', Y', Z') = 2 * (X, Y, Z), where
 * X' = (3 * (X - Z^2) * (X + Z^2))^2 - 8 * X * Y^2
 * Y' = 3 * (X - Z^2) * (X + Z^2) * (4 * X * Y^2 - X') - 8 * Y^2
 * Z' = (Y + Z)^2 - Y^2 - Z^2 = 2 * Y * Z
 * Outputs can equal corresponding inputs, i.e., x_out == x_in is allowed,
 * while x_out == y_in is not (maybe this works, but it's not tested). */
static void point_double(felem x_out, felem y_out, felem z_out,
                         const felem x_in, const felem y_in, const felem z_in) {
  widefelem tmp, tmp2;
  felem delta, gamma, beta, alpha, ftmp, ftmp2;

  felem_assign(ftmp, x_in);
  felem_assign(ftmp2, x_in);

  /* delta = z^2 */
  felem_square(tmp, z_in);
  felem_reduce(delta, tmp);

  /* gamma = y^2 */
  felem_square(tmp, y_in);
  felem_reduce(gamma, tmp);

  /* beta = x*gamma */
  felem_mul(tmp, x_in, gamma);
  felem_reduce(beta, tmp);

  /* alpha = 3*(x-delta)*(x+delta) */
  felem_diff(ftmp, delta);
  /* ftmp[i] < 2^57 + 2^58 + 2 < 2^59 */
  felem_sum(ftmp2, delta);
  /* ftmp2[i] < 2^57 + 2^57 = 2^58 */
  felem_scalar(ftmp2, 3);
  /* ftmp2[i] < 3 * 2^58 < 2^60 */
  felem_mul(tmp, ftmp, ftmp2);
  /* tmp[i] < 2^60 * 2^59 * 4 = 2^121 */
  felem_reduce(alpha, tmp);

  /* x' = alpha^2 - 8*beta */
  felem_square(tmp, alpha);
  /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
  felem_assign(ftmp, beta);
  felem_scalar(ftmp, 8);
  /* ftmp[i] < 8 * 2^57 = 2^60 */
  felem_diff_128_64(tmp, ftmp);
  /* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
  felem_reduce(x_out, tmp);

  /* z' = (y + z)^2 - gamma - delta */
  felem_sum(delta, gamma);
  /* delta[i] < 2^57 + 2^57 = 2^58 */
  felem_assign(ftmp, y_in);
  felem_sum(ftmp, z_in);
  /* ftmp[i] < 2^57 + 2^57 = 2^58 */
  felem_square(tmp, ftmp);
  /* tmp[i] < 4 * 2^58 * 2^58 = 2^118 */
  felem_diff_128_64(tmp, delta);
  /* tmp[i] < 2^118 + 2^64 + 8 < 2^119 */
  felem_reduce(z_out, tmp);

  /* y' = alpha*(4*beta - x') - 8*gamma^2 */
  felem_scalar(beta, 4);
  /* beta[i] < 4 * 2^57 = 2^59 */
  felem_diff(beta, x_out);
  /* beta[i] < 2^59 + 2^58 + 2 < 2^60 */
  felem_mul(tmp, alpha, beta);
  /* tmp[i] < 4 * 2^57 * 2^60 = 2^119 */
  felem_square(tmp2, gamma);
  /* tmp2[i] < 4 * 2^57 * 2^57 = 2^116 */
  widefelem_scalar(tmp2, 8);
  /* tmp2[i] < 8 * 2^116 = 2^119 */
  widefelem_diff(tmp, tmp2);
  /* tmp[i] < 2^119 + 2^120 < 2^121 */
  felem_reduce(y_out, tmp);
}

/* Add two elliptic curve points:
 * (X_1, Y_1, Z_1) + (X_2, Y_2, Z_2) = (X_3, Y_3, Z_3), where
 * X_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1)^2 - (Z_1^2 * X_2 - Z_2^2 * X_1)^3 -
 * 2 * Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2
 * Y_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1) * (Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 *
 * X_1)^2 - X_3) -
 *        Z_2^3 * Y_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^3
 * Z_3 = (Z_1^2 * X_2 - Z_2^2 * X_1) * (Z_1 * Z_2)
 *
 * This runs faster if 'mixed' is set, which requires Z_2 = 1 or Z_2 = 0. */

/* This function is not entirely constant-time: it includes a branch for
 * checking whether the two input points are equal, (while not equal to the
 * point at infinity). This case never happens during single point
 * multiplication, so there is no timing leak for ECDH or ECDSA signing. */
static void point_add(felem x3, felem y3, felem z3, const felem x1,
                      const felem y1, const felem z1, const int mixed,
                      const felem x2, const felem y2, const felem z2) {
  felem ftmp, ftmp2, ftmp3, ftmp4, ftmp5, x_out, y_out, z_out;
  widefelem tmp, tmp2;
  limb z1_is_zero, z2_is_zero, x_equal, y_equal;

  if (!mixed) {
    /* ftmp2 = z2^2 */
    felem_square(tmp, z2);
    felem_reduce(ftmp2, tmp);

    /* ftmp4 = z2^3 */
    felem_mul(tmp, ftmp2, z2);
    felem_reduce(ftmp4, tmp);

    /* ftmp4 = z2^3*y1 */
    felem_mul(tmp2, ftmp4, y1);
    felem_reduce(ftmp4, tmp2);

    /* ftmp2 = z2^2*x1 */
    felem_mul(tmp2, ftmp2, x1);
    felem_reduce(ftmp2, tmp2);
  } else {
    /* We'll assume z2 = 1 (special case z2 = 0 is handled later) */

    /* ftmp4 = z2^3*y1 */
    felem_assign(ftmp4, y1);

    /* ftmp2 = z2^2*x1 */
    felem_assign(ftmp2, x1);
  }

  /* ftmp = z1^2 */
  felem_square(tmp, z1);
  felem_reduce(ftmp, tmp);

  /* ftmp3 = z1^3 */
  felem_mul(tmp, ftmp, z1);
  felem_reduce(ftmp3, tmp);

  /* tmp = z1^3*y2 */
  felem_mul(tmp, ftmp3, y2);
  /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */

  /* ftmp3 = z1^3*y2 - z2^3*y1 */
  felem_diff_128_64(tmp, ftmp4);
  /* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
  felem_reduce(ftmp3, tmp);

  /* tmp = z1^2*x2 */
  felem_mul(tmp, ftmp, x2);
  /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */

  /* ftmp = z1^2*x2 - z2^2*x1 */
  felem_diff_128_64(tmp, ftmp2);
  /* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
  felem_reduce(ftmp, tmp);

  /* the formulae are incorrect if the points are equal
   * so we check for this and do doubling if this happens */
  x_equal = felem_is_zero(ftmp);
  y_equal = felem_is_zero(ftmp3);
  z1_is_zero = felem_is_zero(z1);
  z2_is_zero = felem_is_zero(z2);
  /* In affine coordinates, (X_1, Y_1) == (X_2, Y_2) */
  if (x_equal && y_equal && !z1_is_zero && !z2_is_zero) {
    point_double(x3, y3, z3, x1, y1, z1);
    return;
  }

  /* ftmp5 = z1*z2 */
  if (!mixed) {
    felem_mul(tmp, z1, z2);
    felem_reduce(ftmp5, tmp);
  } else {
    /* special case z2 = 0 is handled later */
    felem_assign(ftmp5, z1);
  }

  /* z_out = (z1^2*x2 - z2^2*x1)*(z1*z2) */
  felem_mul(tmp, ftmp, ftmp5);
  felem_reduce(z_out, tmp);

  /* ftmp = (z1^2*x2 - z2^2*x1)^2 */
  felem_assign(ftmp5, ftmp);
  felem_square(tmp, ftmp);
  felem_reduce(ftmp, tmp);

  /* ftmp5 = (z1^2*x2 - z2^2*x1)^3 */
  felem_mul(tmp, ftmp, ftmp5);
  felem_reduce(ftmp5, tmp);

  /* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
  felem_mul(tmp, ftmp2, ftmp);
  felem_reduce(ftmp2, tmp);

  /* tmp = z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
  felem_mul(tmp, ftmp4, ftmp5);
  /* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */

  /* tmp2 = (z1^3*y2 - z2^3*y1)^2 */
  felem_square(tmp2, ftmp3);
  /* tmp2[i] < 4 * 2^57 * 2^57 < 2^116 */

  /* tmp2 = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 */
  felem_diff_128_64(tmp2, ftmp5);
  /* tmp2[i] < 2^116 + 2^64 + 8 < 2^117 */

  /* ftmp5 = 2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
  felem_assign(ftmp5, ftmp2);
  felem_scalar(ftmp5, 2);
  /* ftmp5[i] < 2 * 2^57 = 2^58 */

  /* x_out = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 -
     2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
  felem_diff_128_64(tmp2, ftmp5);
  /* tmp2[i] < 2^117 + 2^64 + 8 < 2^118 */
  felem_reduce(x_out, tmp2);

  /* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - x_out */
  felem_diff(ftmp2, x_out);
  /* ftmp2[i] < 2^57 + 2^58 + 2 < 2^59 */

  /* tmp2 = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - x_out) */
  felem_mul(tmp2, ftmp3, ftmp2);
  /* tmp2[i] < 4 * 2^57 * 2^59 = 2^118 */

  /* y_out = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - x_out) -
     z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
  widefelem_diff(tmp2, tmp);
  /* tmp2[i] < 2^118 + 2^120 < 2^121 */
  felem_reduce(y_out, tmp2);

  /* the result (x_out, y_out, z_out) is incorrect if one of the inputs is
   * the point at infinity, so we need to check for this separately */

  /* if point 1 is at infinity, copy point 2 to output, and vice versa */
  copy_conditional(x_out, x2, z1_is_zero);
  copy_conditional(x_out, x1, z2_is_zero);
  copy_conditional(y_out, y2, z1_is_zero);
  copy_conditional(y_out, y1, z2_is_zero);
  copy_conditional(z_out, z2, z1_is_zero);
  copy_conditional(z_out, z1, z2_is_zero);
  felem_assign(x3, x_out);
  felem_assign(y3, y_out);
  felem_assign(z3, z_out);
}

/* select_point selects the |idx|th point from a precomputation table and
 * copies it to out. */
static void select_point(const u64 idx, unsigned int size,
                         const felem pre_comp[/*size*/][3], felem out[3]) {
  unsigned i, j;
  limb *outlimbs = &out[0][0];
  memset(outlimbs, 0, 3 * sizeof(felem));

  for (i = 0; i < size; i++) {
    const limb *inlimbs = &pre_comp[i][0][0];
    u64 mask = i ^ idx;
    mask |= mask >> 4;
    mask |= mask >> 2;
    mask |= mask >> 1;
    mask &= 1;
    mask--;
    for (j = 0; j < 4 * 3; j++) {
      outlimbs[j] |= inlimbs[j] & mask;
    }
  }
}

/* get_bit returns the |i|th bit in |in| */
static char get_bit(const felem_bytearray in, unsigned i) {
  if (i >= 224) {
    return 0;
  }
  return (in[i >> 3] >> (i & 7)) & 1;
}

/* Interleaved point multiplication using precomputed point multiples:
 * The small point multiples 0*P, 1*P, ..., 16*P are in pre_comp[],
 * the scalars in scalars[]. If g_scalar is non-NULL, we also add this multiple
 * of the generator, using certain (large) precomputed multiples in g_pre_comp.
 * Output point (X, Y, Z) is stored in x_out, y_out, z_out */
static void batch_mul(felem x_out, felem y_out, felem z_out,
                      const felem_bytearray scalars[],
                      const unsigned num_points, const u8 *g_scalar,
                      const felem pre_comp[][17][3]) {
  int i, skip;
  unsigned num;
  unsigned gen_mul = (g_scalar != NULL);
  felem nq[3], tmp[4];
  u64 bits;
  u8 sign, digit;

  /* set nq to the point at infinity */
  memset(nq, 0, 3 * sizeof(felem));

  /* Loop over all scalars msb-to-lsb, interleaving additions
   * of multiples of the generator (two in each of the last 28 rounds)
   * and additions of other points multiples (every 5th round). */
  skip = 1; /* save two point operations in the first round */
  for (i = (num_points ? 220 : 27); i >= 0; --i) {
    /* double */
    if (!skip) {
      point_double(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2]);
    }

    /* add multiples of the generator */
    if (gen_mul && (i <= 27)) {
      /* first, look 28 bits upwards */
      bits = get_bit(g_scalar, i + 196) << 3;
      bits |= get_bit(g_scalar, i + 140) << 2;
      bits |= get_bit(g_scalar, i + 84) << 1;
      bits |= get_bit(g_scalar, i + 28);
      /* select the point to add, in constant time */
      select_point(bits, 16, g_pre_comp[1], tmp);

      if (!skip) {
        point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
                  tmp[0], tmp[1], tmp[2]);
      } else {
        memcpy(nq, tmp, 3 * sizeof(felem));
        skip = 0;
      }

      /* second, look at the current position */
      bits = get_bit(g_scalar, i + 168) << 3;
      bits |= get_bit(g_scalar, i + 112) << 2;
      bits |= get_bit(g_scalar, i + 56) << 1;
      bits |= get_bit(g_scalar, i);
      /* select the point to add, in constant time */
      select_point(bits, 16, g_pre_comp[0], tmp);
      point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */, tmp[0],
                tmp[1], tmp[2]);
    }

    /* do other additions every 5 doublings */
    if (num_points && (i % 5 == 0)) {
      /* loop over all scalars */
      for (num = 0; num < num_points; ++num) {
        bits = get_bit(scalars[num], i + 4) << 5;
        bits |= get_bit(scalars[num], i + 3) << 4;
        bits |= get_bit(scalars[num], i + 2) << 3;
        bits |= get_bit(scalars[num], i + 1) << 2;
        bits |= get_bit(scalars[num], i) << 1;
        bits |= get_bit(scalars[num], i - 1);
        ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);

        /* select the point to add or subtract */
        select_point(digit, 17, pre_comp[num], tmp);
        felem_neg(tmp[3], tmp[1]); /* (X, -Y, Z) is the negative point */
        copy_conditional(tmp[1], tmp[3], sign);

        if (!skip) {
          point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 0 /* mixed */,
                    tmp[0], tmp[1], tmp[2]);
        } else {
          memcpy(nq, tmp, 3 * sizeof(felem));
          skip = 0;
        }
      }
    }
  }
  felem_assign(x_out, nq[0]);
  felem_assign(y_out, nq[1]);
  felem_assign(z_out, nq[2]);
}

/* Takes the Jacobian coordinates (X, Y, Z) of a point and returns
 * (X', Y') = (X/Z^2, Y/Z^3) */
int ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group,
                                                 const EC_POINT *point,
                                                 BIGNUM *x, BIGNUM *y,
                                                 BN_CTX *ctx) {
  felem z1, z2, x_in, y_in, x_out, y_out;
  widefelem tmp;

  if (EC_POINT_is_at_infinity(group, point)) {
    OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
    return 0;
  }

  if (!BN_to_felem(x_in, &point->X) ||
      !BN_to_felem(y_in, &point->Y) ||
      !BN_to_felem(z1, &point->Z)) {
    return 0;
  }

  felem_inv(z2, z1);
  felem_square(tmp, z2);
  felem_reduce(z1, tmp);
  felem_mul(tmp, x_in, z1);
  felem_reduce(x_in, tmp);
  felem_contract(x_out, x_in);
  if (x != NULL && !felem_to_BN(x, x_out)) {
    OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
    return 0;
  }

  felem_mul(tmp, z1, z2);
  felem_reduce(z1, tmp);
  felem_mul(tmp, y_in, z1);
  felem_reduce(y_in, tmp);
  felem_contract(y_out, y_in);
  if (y != NULL && !felem_to_BN(y, y_out)) {
    OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
    return 0;
  }

  return 1;
}

int ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r,
                               const BIGNUM *g_scalar, const EC_POINT *p_,
                               const BIGNUM *p_scalar_, BN_CTX *ctx) {
  /* TODO: This function used to take |points| and |scalars| as arrays of
   * |num| elements. The code below should be simplified to work in terms of
   * |p_| and |p_scalar_|. */
  size_t num = p_ != NULL ? 1 : 0;
  const EC_POINT **points = p_ != NULL ? &p_ : NULL;
  BIGNUM const *const *scalars = p_ != NULL ? &p_scalar_ : NULL;

  int ret = 0;
  int j;
  unsigned i;
  BN_CTX *new_ctx = NULL;
  BIGNUM *x, *y, *z, *tmp_scalar;
  felem_bytearray g_secret;
  felem_bytearray *secrets = NULL;
  felem(*pre_comp)[17][3] = NULL;
  felem_bytearray tmp;
  unsigned num_bytes;
  size_t num_points = num;
  felem x_in, y_in, z_in, x_out, y_out, z_out;
  const EC_POINT *p = NULL;
  const BIGNUM *p_scalar = NULL;

  if (ctx == NULL) {
    ctx = BN_CTX_new();
    new_ctx = ctx;
    if (ctx == NULL) {
      return 0;
    }
  }

  BN_CTX_start(ctx);
  if ((x = BN_CTX_get(ctx)) == NULL ||
      (y = BN_CTX_get(ctx)) == NULL ||
      (z = BN_CTX_get(ctx)) == NULL ||
      (tmp_scalar = BN_CTX_get(ctx)) == NULL) {
    goto err;
  }

  if (num_points > 0) {
    secrets = OPENSSL_malloc(num_points * sizeof(felem_bytearray));
    pre_comp = OPENSSL_malloc(num_points * sizeof(felem[17][3]));
    if (secrets == NULL ||
        pre_comp == NULL) {
      OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
      goto err;
    }

    /* we treat NULL scalars as 0, and NULL points as points at infinity,
     * i.e., they contribute nothing to the linear combination */
    memset(secrets, 0, num_points * sizeof(felem_bytearray));
    memset(pre_comp, 0, num_points * 17 * 3 * sizeof(felem));
    for (i = 0; i < num_points; ++i) {
      if (i == num) {
        /* the generator */
        p = EC_GROUP_get0_generator(group);
        p_scalar = g_scalar;
      } else {
        /* the i^th point */
        p = points[i];
        p_scalar = scalars[i];
      }

      if (p_scalar != NULL && p != NULL) {
        /* reduce g_scalar to 0 <= g_scalar < 2^224 */
        if (BN_num_bits(p_scalar) > 224 || BN_is_negative(p_scalar)) {
          /* this is an unusual input, and we don't guarantee
           * constant-timeness */
          if (!BN_nnmod(tmp_scalar, p_scalar, &group->order, ctx)) {
            OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
            goto err;
          }
          num_bytes = BN_bn2bin(tmp_scalar, tmp);
        } else {
          num_bytes = BN_bn2bin(p_scalar, tmp);
        }

        flip_endian(secrets[i], tmp, num_bytes);
        /* precompute multiples */
        if (!BN_to_felem(x_out, &p->X) ||
            !BN_to_felem(y_out, &p->Y) ||
            !BN_to_felem(z_out, &p->Z)) {
          goto err;
        }

        felem_assign(pre_comp[i][1][0], x_out);
        felem_assign(pre_comp[i][1][1], y_out);
        felem_assign(pre_comp[i][1][2], z_out);

        for (j = 2; j <= 16; ++j) {
          if (j & 1) {
            point_add(pre_comp[i][j][0], pre_comp[i][j][1], pre_comp[i][j][2],
                      pre_comp[i][1][0], pre_comp[i][1][1], pre_comp[i][1][2],
                      0, pre_comp[i][j - 1][0], pre_comp[i][j - 1][1],
                      pre_comp[i][j - 1][2]);
          } else {
            point_double(pre_comp[i][j][0], pre_comp[i][j][1],
                         pre_comp[i][j][2], pre_comp[i][j / 2][0],
                         pre_comp[i][j / 2][1], pre_comp[i][j / 2][2]);
          }
        }
      }
    }
  }

  if (g_scalar != NULL) {
    memset(g_secret, 0, sizeof(g_secret));
    /* reduce g_scalar to 0 <= g_scalar < 2^224 */
    if (BN_num_bits(g_scalar) > 224 || BN_is_negative(g_scalar)) {
      /* this is an unusual input, and we don't guarantee constant-timeness */
      if (!BN_nnmod(tmp_scalar, g_scalar, &group->order, ctx)) {
        OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
        goto err;
      }
      num_bytes = BN_bn2bin(tmp_scalar, tmp);
    } else {
      num_bytes = BN_bn2bin(g_scalar, tmp);
    }

    flip_endian(g_secret, tmp, num_bytes);
  }
  batch_mul(x_out, y_out, z_out, (const felem_bytearray(*))secrets,
            num_points, g_scalar != NULL ? g_secret : NULL,
            (const felem(*)[17][3])pre_comp);

  /* reduce the output to its unique minimal representation */
  felem_contract(x_in, x_out);
  felem_contract(y_in, y_out);
  felem_contract(z_in, z_out);
  if (!felem_to_BN(x, x_in) ||
      !felem_to_BN(y, y_in) ||
      !felem_to_BN(z, z_in)) {
    OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
    goto err;
  }
  ret = ec_point_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx);

err:
  BN_CTX_end(ctx);
  BN_CTX_free(new_ctx);
  OPENSSL_free(secrets);
  OPENSSL_free(pre_comp);
  return ret;
}

const EC_METHOD *EC_GFp_nistp224_method(void) {
  static const EC_METHOD ret = {ec_GFp_simple_group_init,
                                ec_GFp_simple_group_finish,
                                ec_GFp_simple_group_copy,
                                ec_GFp_simple_group_set_curve,
                                ec_GFp_nistp224_point_get_affine_coordinates,
                                ec_GFp_nistp224_points_mul,
                                0 /* check_pub_key_order */,
                                ec_GFp_simple_field_mul,
                                ec_GFp_simple_field_sqr,
                                0 /* field_encode */,
                                0 /* field_decode */};

  return &ret;
}

#endif  /* 64_BIT && !WINDOWS && !SMALL */
