pubkey: Move sexp parsing of remaining fucntions to the modules.
[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
24 /* Definition of a curve.  */
25 typedef struct
26 {
27   enum gcry_mpi_ec_models model;/* The model descrinbing this curve.  */
28   enum ecc_dialects dialect;    /* The dialect used with the curve.   */
29   gcry_mpi_t p;         /* Prime specifying the field GF(p).  */
30   gcry_mpi_t a;         /* First coefficient of the Weierstrass equation.  */
31   gcry_mpi_t b;         /* Second coefficient of the Weierstrass equation.
32                            or d as used by Twisted Edwards curves.  */
33   mpi_point_struct G;   /* Base point (generator).  */
34   gcry_mpi_t n;         /* Order of G.  */
35   const char *name;     /* Name of the curve or NULL.  */
36 } elliptic_curve_t;
37
38
39 typedef struct
40 {
41   elliptic_curve_t E;
42   mpi_point_struct Q; /* Q = [d]G  */
43 } ECC_public_key;
44
45
46 typedef struct
47 {
48   elliptic_curve_t E;
49   mpi_point_struct Q;
50   gcry_mpi_t d;
51 } ECC_secret_key;
52
53
54
55 /* Set the value from S into D.  */
56 static inline void
57 point_set (mpi_point_t d, mpi_point_t s)
58 {
59   mpi_set (d->x, s->x);
60   mpi_set (d->y, s->y);
61   mpi_set (d->z, s->z);
62 }
63
64
65 /*-- ecc-curves.c --*/
66 gpg_err_code_t _gcry_ecc_fill_in_curve (unsigned int nbits,
67                                         const char *name,
68                                         elliptic_curve_t *curve,
69                                         unsigned int *r_nbits);
70
71 const char *_gcry_ecc_get_curve (gcry_sexp_t keyparms,
72                                  int iterator,
73                                  unsigned int *r_nbits);
74 gcry_err_code_t _gcry_ecc_get_param (const char *name, gcry_mpi_t *pkey);
75 gcry_sexp_t     _gcry_ecc_get_param_sexp (const char *name);
76
77 /*-- ecc-misc.c --*/
78 void _gcry_ecc_curve_free (elliptic_curve_t *E);
79 elliptic_curve_t _gcry_ecc_curve_copy (elliptic_curve_t E);
80 const char *_gcry_ecc_model2str (enum gcry_mpi_ec_models model);
81 const char *_gcry_ecc_dialect2str (enum ecc_dialects dialect);
82 gcry_mpi_t   _gcry_ecc_ec2os (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t p);
83 gcry_error_t _gcry_ecc_os2ec (mpi_point_t result, gcry_mpi_t value);
84
85 mpi_point_t  _gcry_ecc_compute_public (mpi_point_t Q, mpi_ec_t ec);
86
87 /*-- ecc.c --*/
88 gpg_err_code_t _gcry_ecc_eddsa_encodepoint (mpi_point_t point, mpi_ec_t ctx,
89                                             gcry_mpi_t x, gcry_mpi_t y,
90                                             unsigned char **r_buffer,
91                                             unsigned int *r_buflen);
92 gpg_err_code_t _gcry_ecc_eddsa_decodepoint (gcry_mpi_t pk, mpi_ec_t ctx,
93                                             mpi_point_t result,
94                                             unsigned char **r_encpk,
95                                             unsigned int *r_encpklen);
96
97
98 #endif /*GCRY_ECC_COMMON_H*/