614baae098682d0417f2bf75d115b667f391ce86
[libgcrypt.git] / cipher / ecc-common.h
1 /* ecc-common.h - Declarations of common ECC code
2  * Copyright (C) 2013 g10 Code GmbH
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef GCRY_ECC_COMMON_H
21 #define GCRY_ECC_COMMON_H
22
23 /* Definition of a curve.  */
24 typedef struct
25 {
26   enum gcry_mpi_ec_models model;/* The model descrinbing this curve.  */
27   gcry_mpi_t p;         /* Prime specifying the field GF(p).  */
28   gcry_mpi_t a;         /* First coefficient of the Weierstrass equation.  */
29   gcry_mpi_t b;         /* Second coefficient of the Weierstrass equation.
30                            or d as used by Twisted Edwards curves.  */
31   mpi_point_struct G;   /* Base point (generator).  */
32   gcry_mpi_t n;         /* Order of G.  */
33   const char *name;     /* Name of the curve or NULL.  */
34 } elliptic_curve_t;
35
36
37 typedef struct
38 {
39   elliptic_curve_t E;
40   mpi_point_struct Q; /* Q = [d]G  */
41 } ECC_public_key;
42
43
44 typedef struct
45 {
46   elliptic_curve_t E;
47   mpi_point_struct Q;
48   gcry_mpi_t d;
49 } ECC_secret_key;
50
51
52
53 /* Set the value from S into D.  */
54 static inline void
55 point_set (mpi_point_t d, mpi_point_t s)
56 {
57   mpi_set (d->x, s->x);
58   mpi_set (d->y, s->y);
59   mpi_set (d->z, s->z);
60 }
61
62
63 /*-- ecc-curves.c --*/
64 gpg_err_code_t _gcry_ecc_fill_in_curve (unsigned int nbits,
65                                         const char *name,
66                                         elliptic_curve_t *curve,
67                                         unsigned int *r_nbits);
68
69 const char *_gcry_ecc_get_curve (gcry_mpi_t *pkey,
70                                  int iterator,
71                                  unsigned int *r_nbits);
72 gcry_err_code_t _gcry_ecc_get_param (const char *name, gcry_mpi_t *pkey);
73 gcry_sexp_t     _gcry_ecc_get_param_sexp (const char *name);
74
75 /*-- ecc-misc.c --*/
76 void _gcry_ecc_curve_free (elliptic_curve_t *E);
77 elliptic_curve_t _gcry_ecc_curve_copy (elliptic_curve_t E);
78 const char *_gcry_ecc_model2str (enum gcry_mpi_ec_models model);
79 gcry_mpi_t   _gcry_ecc_ec2os (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t p);
80 gcry_error_t _gcry_ecc_os2ec (mpi_point_t result, gcry_mpi_t value);
81
82
83 #endif /*GCRY_ECC_COMMON_H*/