Added new math library based on TFM.
[crypto.git] / lib / silcmath / mp_gmp.c
1 /*
2
3   mp_gmp.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2001 - 2008 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 #include "silccrypto.h"
21 #include <gmp.h>
22
23 SilcBool silc_mp_init(SilcMPInt *mp)
24 {
25   mpz_init(mp);
26   return TRUE;
27 }
28
29 SilcBool silc_mp_sinit(SilcStack stack, SilcMPInt *mp)
30 {
31   mpz_init(mp);
32   return TRUE;
33 }
34
35 void silc_mp_uninit(SilcMPInt *mp)
36 {
37   mpz_clear(mp);
38 }
39
40 size_t silc_mp_size(SilcMPInt *mp)
41 {
42   return mpz_size(mp);
43 }
44
45 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
46 {
47   return mpz_sizeinbase(mp, base);
48 }
49
50 SilcBool silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
51 {
52   mpz_set(dst, src);
53   return TRUE;
54 }
55
56 SilcBool silc_mp_set_ui(SilcMPInt *dst, SilcUInt32 ui)
57 {
58   mpz_set_ui(dst, ui);
59   return TRUE;
60 }
61
62 SilcBool silc_mp_set_si(SilcMPInt *dst, SilcInt32 si)
63 {
64   mpz_set_si(dst, si);
65   return TRUE;
66 }
67
68 SilcBool silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
69 {
70   mpz_set_str(dst, str, base);
71   return TRUE;
72 }
73
74 SilcUInt32 silc_mp_get_ui(SilcMPInt *mp)
75 {
76   return (SilcUInt32)mpz_get_ui(mp);
77 }
78
79 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
80 {
81   return mpz_get_str(str, base, mp);
82 }
83
84 SilcBool silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
85 {
86   mpz_add(dst, mp1, mp2);
87   return TRUE;
88 }
89
90 SilcBool silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
91 {
92   mpz_add_ui(dst, mp1, ui);
93   return TRUE;
94 }
95
96 SilcBool silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
97 {
98   mpz_sub(dst, mp1, mp2);
99   return TRUE;
100 }
101
102 SilcBool silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
103 {
104   mpz_sub_ui(dst, mp1, ui);
105   return TRUE;
106 }
107
108 SilcBool silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
109 {
110   mpz_mul(dst, mp1, mp2);
111   return TRUE;
112 }
113
114 SilcBool silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
115 {
116   mpz_mul_ui(dst, mp1, ui);
117   return TRUE;
118 }
119
120 SilcBool silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
121 {
122   mpz_mul_2exp(dst, mp1, exp);
123   return TRUE;
124 }
125
126 SilcBool silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
127 {
128   mpz_sqrt(dst, src);
129   return TRUE;
130 }
131
132 SilcBool silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
133 {
134   mpz_div(dst, mp1, mp2);
135   return TRUE;
136 }
137
138 SilcBool silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
139 {
140   mpz_div_ui(dst, mp1, ui);
141   return TRUE;
142 }
143
144 SilcBool silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
145                     SilcMPInt *mp2)
146 {
147   if (q && r)
148     mpz_fdiv_qr(q, r, mp1, mp2);
149   if (q && !r)
150     mpz_div(q, mp1, mp2);
151   if (!q && r)
152     mpz_mod(r, mp1, mp2);
153   return TRUE;
154 }
155
156 SilcBool silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
157 {
158   mpz_fdiv_q_2exp(dst, mp1, exp);
159   return TRUE;
160 }
161
162 SilcBool silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
163                          SilcUInt32 exp)
164 {
165   if (q)
166     mpz_fdiv_q_2exp(q, mp1, exp);
167   if (r)
168     mpz_fdiv_r_2exp(r, mp1, exp);
169   return TRUE;
170 }
171
172 SilcBool silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
173 {
174   mpz_mod(dst, mp1, mp2);
175   return TRUE;
176 }
177
178 SilcBool silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
179 {
180   mpz_mod_ui(dst, mp1, ui);
181   return TRUE;
182 }
183
184 SilcBool silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
185 {
186   mpz_mod_2exp(dst, mp1, ui);
187   return TRUE;
188 }
189
190 SilcBool silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
191 {
192   mpz_pow_ui(dst, mp1, exp);
193   return TRUE;
194 }
195
196 SilcBool silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
197                      SilcMPInt *mod)
198 {
199   mpz_powm(dst, mp1, exp, mod);
200   return TRUE;
201 }
202
203 SilcBool silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp,
204                         SilcMPInt *mod)
205 {
206   mpz_powm_ui(dst, mp1, exp, mod);
207   return TRUE;
208 }
209
210 SilcBool silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
211 {
212   mpz_gcd(dst, mp1, mp2);
213   return TRUE;
214 }
215
216 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
217 {
218   return mpz_cmp(mp1, mp2);
219 }
220
221 int silc_mp_cmp_si(SilcMPInt *mp1, SilcInt32 si)
222 {
223   return mpz_cmp_si(mp1, si);
224 }
225
226 int silc_mp_cmp_ui(SilcMPInt *mp1, SilcUInt32 ui)
227 {
228   return mpz_cmp_ui(mp1, ui);
229 }
230
231 SilcBool silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
232 {
233   mpz_abs(dst, src);
234   return TRUE;
235 }
236
237 SilcBool silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
238 {
239   mpz_neg(dst, src);
240   return TRUE;
241 }
242
243 SilcBool silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
244 {
245   mpz_and(dst, mp1, mp2);
246   return TRUE;
247 }
248
249 SilcBool silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
250 {
251   mpz_ior(dst, mp1, mp2);
252   return TRUE;
253 }
254
255 SilcBool silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
256 {
257   mpz_xor(dst, mp1, mp2);
258   return TRUE;
259 }