Fix use of AVX instruction in SHA1/SSSE3 assembly
[libgcrypt.git] / src / mpi.h
1 /* mpi.h  -  Multi Precision Integers
2  * Copyright (C) 1994, 1996, 1998,
3  *               2001, 2002, 2003, 2005 Free Software Foundation, Inc.
4  *
5  * This file is part of Libgcrypt.
6  *
7  * Libgcrypt is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser general Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * Libgcrypt is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  *
21  * Note: This code is heavily based on the GNU MP Library.
22  *       Actually it's the same code with only minor changes in the
23  *       way the data is stored; this is to support the abstraction
24  *       of an optional secure memory allocation which may be used
25  *       to avoid revealing of sensitive data due to paging etc.
26  */
27
28 #ifndef G10_MPI_H
29 #define G10_MPI_H
30
31 #include <config.h>
32 #include <stdio.h>
33 #include <string.h>
34
35 #include "types.h"
36 #include "../mpi/mpi-asm-defs.h"
37
38 #include "g10lib.h"
39
40 #ifndef _GCRYPT_IN_LIBGCRYPT
41 #error this file should only be used inside libgcrypt
42 #endif
43
44 #ifndef BITS_PER_MPI_LIMB
45 #if BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_INT
46   typedef unsigned int mpi_limb_t;
47   typedef   signed int mpi_limb_signed_t;
48 #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG
49   typedef unsigned long int mpi_limb_t;
50   typedef   signed long int mpi_limb_signed_t;
51 #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG_LONG
52   typedef unsigned long long int mpi_limb_t;
53   typedef   signed long long int mpi_limb_signed_t;
54 #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_SHORT
55   typedef unsigned short int mpi_limb_t;
56   typedef   signed short int mpi_limb_signed_t;
57 #else
58 #error BYTES_PER_MPI_LIMB does not match any C type
59 #endif
60 #define BITS_PER_MPI_LIMB    (8*BYTES_PER_MPI_LIMB)
61 #endif /*BITS_PER_MPI_LIMB*/
62
63 #define DBG_MPI     _gcry_get_debug_flag( 2 );
64
65 struct gcry_mpi
66 {
67   int alloced;         /* Array size (# of allocated limbs). */
68   int nlimbs;          /* Number of valid limbs. */
69   int sign;            /* Indicates a negative number and is also used
70                           for opaque MPIs to store the length.  */
71   unsigned int flags; /* Bit 0: Array to be allocated in secure memory space.*/
72                       /* Bit 2: The limb is a pointer to some m_alloced data.*/
73                       /* Bit 4: Immutable MPI - the MPI may not be modified.  */
74                       /* Bit 5: Constant MPI - the MPI will not be freed.  */
75   mpi_limb_t *d;      /* Array with the limbs */
76 };
77
78 #define MPI_NULL NULL
79
80 #define mpi_get_nlimbs(a)     ((a)->nlimbs)
81 #define mpi_has_sign(a)       ((a)->sign)
82
83 /*-- mpiutil.c --*/
84
85 #ifdef M_DEBUG
86 # define mpi_alloc(n)   _gcry_mpi_debug_alloc((n), M_DBGINFO( __LINE__ ) )
87 # define mpi_alloc_secure(n)  _gcry_mpi_debug_alloc_secure((n), M_DBGINFO( __LINE__ ) )
88 # define mpi_free(a)    _gcry_mpi_debug_free((a), M_DBGINFO(__LINE__) )
89 # define mpi_resize(a,b) _gcry_mpi_debug_resize((a),(b), M_DBGINFO(__LINE__) )
90 # define mpi_copy(a)      _gcry_mpi_debug_copy((a), M_DBGINFO(__LINE__) )
91   gcry_mpi_t _gcry_mpi_debug_alloc( unsigned nlimbs, const char *info );
92   gcry_mpi_t _gcry_mpi_debug_alloc_secure( unsigned nlimbs, const char *info );
93   void _gcry_mpi_debug_free( gcry_mpi_t a, const char *info );
94   void _gcry_mpi_debug_resize( gcry_mpi_t a, unsigned nlimbs, const char *info );
95   gcry_mpi_t  _gcry_mpi_debug_copy( gcry_mpi_t a, const char *info      );
96 #else
97 # define mpi_alloc(n)          _gcry_mpi_alloc((n) )
98 # define mpi_alloc_secure(n)  _gcry_mpi_alloc_secure((n) )
99 # define mpi_free(a)           _gcry_mpi_free((a) )
100 # define mpi_resize(a,b)      _gcry_mpi_resize((a),(b))
101 # define mpi_copy(a)           _gcry_mpi_copy((a))
102   gcry_mpi_t  _gcry_mpi_alloc( unsigned nlimbs );
103   gcry_mpi_t  _gcry_mpi_alloc_secure( unsigned nlimbs );
104   void _gcry_mpi_free( gcry_mpi_t a );
105   void _gcry_mpi_resize( gcry_mpi_t a, unsigned nlimbs );
106   gcry_mpi_t  _gcry_mpi_copy( gcry_mpi_t a );
107 #endif
108
109 void _gcry_mpi_immutable_failed (void);
110 #define mpi_immutable_failed() _gcry_mpi_immutable_failed ()
111
112 #define mpi_is_const(a)       ((a)->flags&32)
113 #define mpi_is_immutable(a)   ((a)->flags&16)
114 #define mpi_is_opaque(a)      ((a) && ((a)->flags&4))
115 #define mpi_is_secure(a)      ((a) && ((a)->flags&1))
116 #define mpi_clear(a)          _gcry_mpi_clear ((a))
117 #define mpi_alloc_like(a)     _gcry_mpi_alloc_like((a))
118
119 #define mpi_alloc_set_ui(a)   _gcry_mpi_alloc_set_ui ((a))
120 #define mpi_m_check(a)        _gcry_mpi_m_check ((a))
121 #define mpi_const(n)          _gcry_mpi_const ((n))
122 #define mpi_swap_cond(a,b,sw)  _gcry_mpi_swap_cond ((a),(b),(sw))
123 #define mpi_set_cond(w,u,set)  _gcry_mpi_set_cond ((w),(u),(set))
124
125 void _gcry_mpi_clear( gcry_mpi_t a );
126 gcry_mpi_t _gcry_mpi_set_cond (gcry_mpi_t w, const gcry_mpi_t u,
127                                unsigned long swap);
128 gcry_mpi_t  _gcry_mpi_alloc_like( gcry_mpi_t a );
129 gcry_mpi_t  _gcry_mpi_alloc_set_ui( unsigned long u);
130 void _gcry_mpi_m_check( gcry_mpi_t a );
131 void _gcry_mpi_swap( gcry_mpi_t a, gcry_mpi_t b);
132 void _gcry_mpi_swap_cond (gcry_mpi_t a, gcry_mpi_t b, unsigned long swap);
133 gcry_mpi_t _gcry_mpi_new (unsigned int nbits);
134 gcry_mpi_t _gcry_mpi_snew (unsigned int nbits);
135 gcry_mpi_t _gcry_mpi_set_opaque_copy (gcry_mpi_t a,
136                                       const void *p, unsigned int nbits);
137 void *_gcry_mpi_get_opaque_copy (gcry_mpi_t a, unsigned int *nbits);
138 int _gcry_mpi_is_neg (gcry_mpi_t a);
139 void _gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u);
140 void _gcry_mpi_abs (gcry_mpi_t w);
141
142 /* Constants used to return constant MPIs.  See _gcry_mpi_init if you
143    want to add more constants. */
144 #define MPI_NUMBER_OF_CONSTANTS 6
145 enum gcry_mpi_constants
146   {
147     MPI_C_ZERO,
148     MPI_C_ONE,
149     MPI_C_TWO,
150     MPI_C_THREE,
151     MPI_C_FOUR,
152     MPI_C_EIGHT
153   };
154
155
156 gcry_mpi_t _gcry_mpi_const (enum gcry_mpi_constants no);
157
158
159 /*-- mpicoder.c --*/
160 void  _gcry_log_mpidump( const char *text, gcry_mpi_t a );
161 u32   _gcry_mpi_get_keyid( gcry_mpi_t a, u32 *keyid );
162 byte *_gcry_mpi_get_buffer (gcry_mpi_t a, unsigned int fill_le,
163                             unsigned int *r_nbytes, int *sign);
164 byte *_gcry_mpi_get_buffer_extra (gcry_mpi_t a, unsigned int fill_le,
165                                   int extraalloc,
166                                   unsigned int *r_nbytes, int *sign);
167 byte *_gcry_mpi_get_secure_buffer (gcry_mpi_t a, unsigned int fill_le,
168                                    unsigned *r_nbytes, int *sign);
169 void  _gcry_mpi_set_buffer ( gcry_mpi_t a, const void *buffer,
170                              unsigned int nbytes, int sign );
171 gpg_err_code_t _gcry_mpi_to_octet_string (unsigned char **r_frame,
172                                           void *space,
173                                           gcry_mpi_t value, size_t nbytes);
174
175 /*-- mpi-div.c --*/
176 #define mpi_fdiv_r_ui(a,b,c)   _gcry_mpi_fdiv_r_ui((a),(b),(c))
177 #define mpi_fdiv_r(a,b,c)      _gcry_mpi_fdiv_r((a),(b),(c))
178 #define mpi_fdiv_q(a,b,c)      _gcry_mpi_fdiv_q((a),(b),(c))
179 #define mpi_fdiv_qr(a,b,c,d)   _gcry_mpi_fdiv_qr((a),(b),(c),(d))
180 #define mpi_tdiv_r(a,b,c)      _gcry_mpi_tdiv_r((a),(b),(c))
181 #define mpi_tdiv_qr(a,b,c,d)   _gcry_mpi_tdiv_qr((a),(b),(c),(d))
182 #define mpi_tdiv_q_2exp(a,b,c) _gcry_mpi_tdiv_q_2exp((a),(b),(c))
183 #define mpi_divisible_ui(a,b)  _gcry_mpi_divisible_ui((a),(b))
184
185 ulong _gcry_mpi_fdiv_r_ui( gcry_mpi_t rem, gcry_mpi_t dividend, ulong divisor );
186 void  _gcry_mpi_fdiv_r( gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor );
187 void  _gcry_mpi_fdiv_q( gcry_mpi_t quot, gcry_mpi_t dividend, gcry_mpi_t divisor );
188 void  _gcry_mpi_fdiv_qr( gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor );
189 void  _gcry_mpi_tdiv_r( gcry_mpi_t rem, gcry_mpi_t num, gcry_mpi_t den);
190 void  _gcry_mpi_tdiv_qr( gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t num, gcry_mpi_t den);
191 void  _gcry_mpi_tdiv_q_2exp( gcry_mpi_t w, gcry_mpi_t u, unsigned count );
192 int   _gcry_mpi_divisible_ui(gcry_mpi_t dividend, ulong divisor );
193
194
195 /*-- mpi-mod.c --*/
196 #define mpi_barrett_init(m,f)     _gcry_mpi_barrett_init ((m),(f))
197 #define mpi_barrett_free(c)       _gcry_mpi_barrett_free ((c))
198 #define mpi_mod_barrett(r,a,c)    _gcry_mpi_mod_barrett ((r), (a), (c))
199 #define mpi_mul_barrett(r,u,v,c)  _gcry_mpi_mul_barrett ((r), (u), (v), (c))
200
201 /* Context used with Barrett reduction.  */
202 struct barrett_ctx_s;
203 typedef struct barrett_ctx_s *mpi_barrett_t;
204
205 mpi_barrett_t _gcry_mpi_barrett_init (gcry_mpi_t m, int copy);
206 void _gcry_mpi_barrett_free (mpi_barrett_t ctx);
207 void _gcry_mpi_mod_barrett (gcry_mpi_t r, gcry_mpi_t x, mpi_barrett_t ctx);
208 void _gcry_mpi_mul_barrett (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v,
209                             mpi_barrett_t ctx);
210
211
212 /*-- mpi-mpow.c --*/
213 #define mpi_mulpowm(a,b,c,d) _gcry_mpi_mulpowm ((a),(b),(c),(d))
214 void _gcry_mpi_mulpowm( gcry_mpi_t res, gcry_mpi_t *basearray, gcry_mpi_t *exparray, gcry_mpi_t mod);
215
216 /*-- mpi-scan.c --*/
217 #define mpi_trailing_zeros(a) _gcry_mpi_trailing_zeros ((a))
218 int      _gcry_mpi_getbyte( gcry_mpi_t a, unsigned idx );
219 void     _gcry_mpi_putbyte( gcry_mpi_t a, unsigned idx, int value );
220 unsigned _gcry_mpi_trailing_zeros( gcry_mpi_t a );
221
222 /*-- mpi-bit.c --*/
223 #define mpi_normalize(a)       _gcry_mpi_normalize ((a))
224
225 void _gcry_mpi_normalize( gcry_mpi_t a );
226
227 /*-- ec.c --*/
228
229 /* Object to represent a point in projective coordinates. */
230 struct gcry_mpi_point
231 {
232   gcry_mpi_t x;
233   gcry_mpi_t y;
234   gcry_mpi_t z;
235 };
236 typedef struct gcry_mpi_point mpi_point_struct;
237 typedef struct gcry_mpi_point *mpi_point_t;
238
239 void _gcry_mpi_point_init (mpi_point_t p);
240 void _gcry_mpi_point_free_parts (mpi_point_t p);
241 void _gcry_mpi_get_point (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t z,
242                           mpi_point_t point);
243 void _gcry_mpi_snatch_point (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t z,
244                              mpi_point_t point);
245
246
247 /* Models describing an elliptic curve.  */
248 enum gcry_mpi_ec_models
249   {
250     /* The Short Weierstrass equation is
251           y^2 = x^3 + ax + b
252      */
253     MPI_EC_WEIERSTRASS = 0,
254     /* The Montgomery equation is
255           by^2 = x^3 + ax^2 + x
256      */
257     MPI_EC_MONTGOMERY,
258     /* The Twisted Edwards equation is
259           ax^2 + y^2 = 1 + bx^2y^2
260        Note that we use 'b' instead of the commonly used 'd'.  */
261     MPI_EC_EDWARDS
262   };
263
264 /* Dialects used with elliptic curves.  It is easier to keep the
265    definition here than in ecc-common.h. */
266 enum ecc_dialects
267   {
268     ECC_DIALECT_STANDARD = 0,
269     ECC_DIALECT_ED25519
270   };
271
272
273 void _gcry_mpi_point_log (const char *name, mpi_point_t point, mpi_ec_t ctx);
274 #define log_printpnt(a,p,c) _gcry_mpi_point_log ((a), (p), (c))
275
276 mpi_ec_t _gcry_mpi_ec_p_internal_new (enum gcry_mpi_ec_models model,
277                                       enum ecc_dialects dialect,
278                                       int flags,
279                                       gcry_mpi_t p, gcry_mpi_t a, gcry_mpi_t b);
280 gpg_err_code_t _gcry_mpi_ec_p_new (gcry_ctx_t *r_ctx,
281                                    enum gcry_mpi_ec_models model,
282                                    enum ecc_dialects dialect,
283                                    int flags,
284                                    gcry_mpi_t p, gcry_mpi_t a, gcry_mpi_t b);
285 void _gcry_mpi_ec_free (mpi_ec_t ctx);
286
287 void _gcry_mpi_ec_dup_point (mpi_point_t result,
288                              mpi_point_t point, mpi_ec_t ctx);
289 void _gcry_mpi_ec_add_points (mpi_point_t result,
290                               mpi_point_t p1, mpi_point_t p2,
291                               mpi_ec_t ctx);
292 void _gcry_mpi_ec_sub_points (mpi_point_t result,
293                               mpi_point_t p1, mpi_point_t p2,
294                               mpi_ec_t ctx);
295 void _gcry_mpi_ec_mul_point (mpi_point_t result,
296                              gcry_mpi_t scalar, mpi_point_t point,
297                              mpi_ec_t ctx);
298 int  _gcry_mpi_ec_curve_point (gcry_mpi_point_t point, mpi_ec_t ctx);
299 int _gcry_mpi_ec_bad_point (gcry_mpi_point_t point, mpi_ec_t ctx);
300
301 gcry_mpi_t _gcry_mpi_ec_ec2os (gcry_mpi_point_t point, mpi_ec_t ectx);
302
303 gcry_mpi_t _gcry_mpi_ec_get_mpi (const char *name, gcry_ctx_t ctx, int copy);
304 gcry_mpi_point_t _gcry_mpi_ec_get_point (const char *name,
305                                          gcry_ctx_t ctx, int copy);
306 gpg_err_code_t _gcry_mpi_ec_set_mpi (const char *name, gcry_mpi_t newvalue,
307                                      gcry_ctx_t ctx);
308 gpg_err_code_t _gcry_mpi_ec_set_point (const char *name,
309                                        gcry_mpi_point_t newvalue,
310                                        gcry_ctx_t ctx);
311 gpg_err_code_t _gcry_mpi_ec_decode_point (mpi_point_t result,
312                                           gcry_mpi_t value, mpi_ec_t ec);
313
314 /*-- ecc-curves.c --*/
315 gpg_err_code_t _gcry_mpi_ec_new (gcry_ctx_t *r_ctx,
316                                  gcry_sexp_t keyparam, const char *curvename);
317
318
319
320 #endif /*G10_MPI_H*/