/* ec-context.h - Private definitions for CONTEXT_TYPE_EC.
 * Copyright (C) 2013  g10 Code GmbH
 *
 * This file is part of Libgcrypt.
 *
 * Libgcrypt is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser general Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * Libgcrypt is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GCRY_EC_CONTEXT_H
#define GCRY_EC_CONTEXT_H

/* This context is used with all our EC functions. */
struct mpi_ec_ctx_s
{
  enum gcry_mpi_ec_models model; /* The model describing this curve.  */

  enum ecc_dialects dialect;     /* The ECC dialect used with the curve.  */

  int flags;                     /* Public key flags (not always used).  */

  unsigned int nbits;            /* Number of bits.  */

  /* Domain parameters.  Note that they may not all be set and if set
     the MPIs may be flaged as constant. */
  gcry_mpi_t p;         /* Prime specifying the field GF(p).  */
  gcry_mpi_t a;         /* First coefficient of the Weierstrass equation.  */
  gcry_mpi_t b;         /* Second coefficient of the Weierstrass equation.  */
  gcry_mpi_point_t G;   /* Base point (generator).  */
  gcry_mpi_t n;         /* Order of G.  */

  /* The actual key.  May not be set.  */
  gcry_mpi_point_t Q;   /* Public key.   */
  gcry_mpi_t d;         /* Private key.  */


  /* This structure is private to mpi/ec.c! */
  struct {
    struct {
      unsigned int a_is_pminus3:1;
      unsigned int two_inv_p:1;
    } valid; /* Flags to help setting the helper vars below.  */

    int a_is_pminus3;  /* True if A = P - 3. */

    gcry_mpi_t two_inv_p;

    mpi_barrett_t p_barrett;

    /* Scratch variables.  */
    gcry_mpi_t scratch[11];

    /* Helper for fast reduction.  */
    /*   int nist_nbits; /\* If this is a NIST curve, the # of bits.  *\/ */
    /*   gcry_mpi_t s[10]; */
    /*   gcry_mpi_t c; */
  } t;
};


/*-- mpi/ec.c --*/
void _gcry_mpi_ec_get_reset (mpi_ec_t ec);


/*-- cipher/ecc-curves.c --*/
gcry_mpi_t       _gcry_ecc_get_mpi (const char *name, mpi_ec_t ec, int copy);
gcry_mpi_point_t _gcry_ecc_get_point (const char *name, mpi_ec_t ec);
gpg_err_code_t   _gcry_ecc_set_mpi (const char *name,
                                    gcry_mpi_t newvalue, mpi_ec_t ec);
gpg_err_code_t   _gcry_ecc_set_point (const char *name,
                                      gcry_mpi_point_t newvalue, mpi_ec_t ec);


#endif /*GCRY_EC_CONTEXT_H*/
