The first libgcrypt only release.
[libgcrypt.git] / src / mpi.h
1 /* mpi.h  -  Multi Precision Integers
2  *      Copyright (C) 1994, 1996, 1998, 2001 Free Software Foundation, Inc.
3  *
4  * This file is part of GNUPG.
5  *
6  * GNUPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GNUPG 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 General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  *
20  * Note: This code is heavily based on the GNU MP Library.
21  *       Actually it's the same code with only minor changes in the
22  *       way the data is stored; this is to support the abstraction
23  *       of an optional secure memory allocation which may be used
24  *       to avoid revealing of sensitive data due to paging etc.
25  *       The GNU MP Library itself is published under the LGPL;
26  *       however I decided to publish this code under the plain GPL.
27  */
28
29 #ifndef G10_MPI_H
30 #define G10_MPI_H
31
32 #include <config.h>
33 #include <stdio.h>
34 #include "types.h"
35 #include "memory.h"
36 #include "../mpi/mpi-asm-defs.h"
37
38 #ifndef _GCRYPT_IN_LIBGCRYPT
39  #error this file should only be used inside libgcrypt
40 #endif
41
42 #ifndef BITS_PER_MPI_LIMB
43 #if BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_INT
44   typedef unsigned int mpi_limb_t;
45   typedef   signed int mpi_limb_signed_t;
46 #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG
47   typedef unsigned long int mpi_limb_t;
48   typedef   signed long int mpi_limb_signed_t;
49 #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG_LONG
50   typedef unsigned long long int mpi_limb_t;
51   typedef   signed long long int mpi_limb_signed_t;
52 #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_SHORT
53   typedef unsigned short int mpi_limb_t;
54   typedef   signed short int mpi_limb_signed_t;
55 #else
56   #error BYTES_PER_MPI_LIMB does not match any C type
57 #endif
58 #define BITS_PER_MPI_LIMB    (8*BYTES_PER_MPI_LIMB)
59 #endif /*BITS_PER_MPI_LIMB*/
60
61 #define DBG_MPI     _gcry_get_debug_flag( 2 );
62
63 struct gcry_mpi {
64     int alloced;    /* array size (# of allocated limbs) */
65     int nlimbs;     /* number of valid limbs */
66     int sign;       /* indicates a negative number and is used for opaque
67                      * MPIs to store the length */
68     unsigned flags; /* bit 0: array must be allocated in secure memory space */
69                     /* bit 2: the limb is a pointer to some m_alloced data */
70     mpi_limb_t *d;  /* array with the limbs */
71 };
72
73 #ifndef DID_MPI_TYPEDEF
74   typedef struct gcry_mpi *MPI;
75   #define DID_MPI_TYPEDEF
76 #endif
77
78 #define MPI_NULL NULL
79
80 #define mpi_get_nlimbs(a)     ((a)->nlimbs)
81 #define mpi_is_neg(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   MPI _gcry_mpi_debug_alloc( unsigned nlimbs, const char *info );
92   MPI _gcry_mpi_debug_alloc_secure( unsigned nlimbs, const char *info );
93   void _gcry_mpi_debug_free( MPI a, const char *info );
94   void _gcry_mpi_debug_resize( MPI a, unsigned nlimbs, const char *info );
95   MPI  _gcry_mpi_debug_copy( MPI 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   MPI  _gcry_mpi_alloc( unsigned nlimbs );
103   MPI  _gcry_mpi_alloc_secure( unsigned nlimbs );
104   void _gcry_mpi_free( MPI a );
105   void _gcry_mpi_resize( MPI a, unsigned nlimbs );
106   MPI  _gcry_mpi_copy( MPI a );
107 #endif
108 #define mpi_is_opaque(a) ((a) && ((a)->flags&4))
109 #define mpi_is_secure(a) ((a) && ((a)->flags&1))
110 #define mpi_clear(a)          _gcry_mpi_clear ((a))
111 #define mpi_alloc_like(a)     _gcry_mpi_alloc_like((a))  
112 #define mpi_set(a,b)          _gcry_mpi_set ((a),(b))        
113 #define mpi_set_ui(a,b)       _gcry_mpi_set_ui ((a),(b))      
114 #define mpi_alloc_set_ui(a)   _gcry_mpi_alloc_set_ui ((a))
115 #define mpi_m_check(a)        _gcry_mpi_m_check ((a))     
116 #define mpi_swap(a,b)         _gcry_mpi_swap ((a),(b))       
117
118 void _gcry_mpi_clear( MPI a );
119 MPI  _gcry_mpi_alloc_like( MPI a );
120 void _gcry_mpi_set( MPI w, MPI u);
121 void _gcry_mpi_set_ui( MPI w, ulong u);
122 MPI  _gcry_mpi_alloc_set_ui( unsigned long u);
123 void _gcry_mpi_m_check( MPI a );
124 void _gcry_mpi_swap( MPI a, MPI b);
125
126 /*-- mpicoder.c --*/
127 void  _gcry_log_mpidump( const char *text, MPI a );
128 u32   _gcry_mpi_get_keyid( MPI a, u32 *keyid );
129 byte *_gcry_mpi_get_buffer( MPI a, unsigned *nbytes, int *sign );
130 byte *_gcry_mpi_get_secure_buffer( MPI a, unsigned *nbytes, int *sign );
131 void  _gcry_mpi_set_buffer( MPI a, const byte *buffer, unsigned nbytes, int sign );
132
133 #define log_mpidump _gcry_log_mpidump
134
135 /*-- mpi-add.c --*/
136 #define mpi_add_ui(w,u,v) gcry_mpi_add_ui((w),(u),(v))
137 #define mpi_add(w,u,v)    gcry_mpi_add ((w),(u),(v))
138 #define mpi_addm(w,u,v,m) gcry_mpi_addm ((w),(u),(v),(m))
139 #define mpi_sub_ui(w,u,v) gcry_mpi_sub_ui ((w),(u),(v))
140 #define mpi_sub(w,u,v)    gcry_mpi_sub ((w),(u),(v))
141 #define mpi_subm(w,u,v,m) gcry_mpi_subm ((w),(u),(v),(m))
142
143
144 /*-- mpi-mul.c --*/
145 #define mpi_mul_ui(w,u,v)   gcry_mpi_mul_ui ((w),(u),(v))
146 #define mpi_mul_2exp(w,u,v) gcry_mpi_mul_2exp ((w),(u),(v))
147 #define mpi_mul(w,u,v)      gcry_mpi_mul ((w),(u),(v))
148 #define mpi_mulm(w,u,v,m)   gcry_mpi_mulm ((w),(u),(v),(m))
149
150
151 /*-- mpi-div.c --*/
152 #define mpi_fdiv_r_ui(a,b,c)   _gcry_mpi_fdiv_r_ui((a),(b),(c))
153 #define mpi_fdiv_r(a,b,c)      _gcry_mpi_fdiv_r((a),(b),(c))
154 #define mpi_fdiv_q(a,b,c)      _gcry_mpi_fdiv_q((a),(b),(c))
155 #define mpi_fdiv_qr(a,b,c,d)   _gcry_mpi_fdiv_qr((a),(b),(c),(d))
156 #define mpi_tdiv_r(a,b,c)      _gcry_mpi_tdiv_r((a),(b),(c))
157 #define mpi_tdiv_qr(a,b,c,d)   _gcry_mpi_tdiv_qr((a),(b),(c),(d))
158 #define mpi_tdiv_q_2exp(a,b,c) _gcry_mpi_tdiv_q_2exp((a),(b),(c))
159 #define mpi_divisible_ui(a,b)  _gcry_mpi_divisible_ui((a),(b))
160 ulong _gcry_mpi_fdiv_r_ui( MPI rem, MPI dividend, ulong divisor );
161 void  _gcry_mpi_fdiv_r( MPI rem, MPI dividend, MPI divisor );
162 void  _gcry_mpi_fdiv_q( MPI quot, MPI dividend, MPI divisor );
163 void  _gcry_mpi_fdiv_qr( MPI quot, MPI rem, MPI dividend, MPI divisor );
164 void  _gcry_mpi_tdiv_r( MPI rem, MPI num, MPI den);
165 void  _gcry_mpi_tdiv_qr( MPI quot, MPI rem, MPI num, MPI den);
166 void  _gcry_mpi_tdiv_q_2exp( MPI w, MPI u, unsigned count );
167 int   _gcry_mpi_divisible_ui(MPI dividend, ulong divisor );
168
169 /*-- mpi-gcd.c --*/
170
171 /*-- mpi-mpow.c --*/
172 #define mpi_mulpowm(a,b,c,d) _gcry_mpi_mulpowm ((a),(b),(c),(d))
173 void _gcry_mpi_mulpowm( MPI res, MPI *basearray, MPI *exparray, MPI mod);
174
175 /*-- mpi-cmp.c --*/
176 #define mpi_cmp_ui(a,b) gcry_mpi_cmp_ui ((a),(b))
177 #define mpi_cmp(a,b)    gcry_mpi_cmp ((a),(b))
178 int gcry_mpi_cmp_ui( MPI u, ulong v );
179 int gcry_mpi_cmp( MPI u, MPI v );
180
181 /*-- mpi-scan.c --*/
182 #define mpi_trailing_zeros(a) _gcry_mpi_trailing_zeros ((a))
183 int      _gcry_mpi_getbyte( MPI a, unsigned idx );
184 void     _gcry_mpi_putbyte( MPI a, unsigned idx, int value );
185 unsigned _gcry_mpi_trailing_zeros( MPI a );
186
187 /*-- mpi-bit.c --*/
188 #define mpi_normalize(a)       _gcry_mpi_normalize ((a))
189 #define mpi_get_nbits(a)       gcry_mpi_get_nbits ((a))
190 #define mpi_test_bit(a,b)      gcry_mpi_test_bit ((a),(b))
191 #define mpi_set_bit(a,b)       gcry_mpi_set_bit ((a),(b))
192 #define mpi_set_highbit(a,b)   gcry_mpi_set_highbit ((a),(b))
193 #define mpi_clear_bit(a,b)     gcry_mpi_clear_bit ((a),(b))
194 #define mpi_clear_highbit(a,b) gcry_mpi_clear_highbit ((a),(b))
195 #define mpi_rshift(a,b,c)      gcry_mpi_rshift ((a),(b),(c))
196
197 void _gcry_mpi_normalize( MPI a );
198
199 /*-- mpi-inv.c --*/
200 #define mpi_invm(a,b,c) _gcry_mpi_invm ((a),(b),(c))
201 void _gcry_mpi_invm( MPI x, MPI u, MPI v );
202
203
204 #endif /*G10_MPI_H*/