updates.
[silc.git] / lib / silcmath / mp_mpi.c
1 /*
2
3   mp_mpi.c 
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2001 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 /* $Id$ */
20
21 #include "silcincludes.h"
22 #include "mpi.h"
23 #include "mplogic.h"
24
25 void silc_mp_init(SilcMPInt *mp)
26 {
27   (void)mp_init(mp);
28 }
29
30 void silc_mp_uninit(SilcMPInt *mp)
31 {
32   (void)mp_clear(mp);
33 }
34
35 size_t silc_mp_size(SilcMPInt *mp)
36 {
37   return mp_raw_size(mp);
38 }
39
40 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
41 {
42   return mp_radix_size(mp, base) - 2; /* XXX This is actually wrong since
43                                          this might produce wrong balue.
44                                          But, it looks like MPI always returns
45                                          correct value plus one, whereas
46                                          GMP returns always the right value. */
47 }
48
49 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
50 {
51   (void)mp_copy(src, dst);
52 }
53
54 void silc_mp_set_ui(SilcMPInt *dst, uint32 ui)
55 {
56   mp_set(dst, ui);
57 }
58
59 void silc_mp_set_si(SilcMPInt *dst, int32 si)
60 {
61   (void)mp_set_int(dst, si);
62 }
63
64 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
65 {
66   (void)mp_read_variable_radix(dst, str, base);
67 }
68
69 uint32 silc_mp_get_ui(SilcMPInt *mp)
70 {
71   return (uint32)MP_DIGIT(mp, 0);
72 }
73
74 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
75 {
76   if (mp_toradix(mp, str, base) != MP_OKAY)
77     return NULL;
78   return str;
79 }
80
81 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
82 {
83   (void)mp_add(mp1, mp2, dst);
84 }
85
86 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
87 {
88   mp_add_d(mp1, ui, dst);
89 }
90
91 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
92 {
93   (void)mp_sub(mp1, mp2, dst);
94 }
95
96 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
97 {
98   (void)mp_sub_d(mp1, (mp_digit)ui, dst);
99 }
100
101 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
102 {
103   (void)mp_mul(mp1, mp2, dst);
104 }
105
106 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
107 {
108   (void)mp_mul_d(mp1, (mp_digit)ui, dst);
109 }
110
111 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
112 {
113   SilcMPInt tmp;
114   silc_mp_init(&tmp);
115   (void)mp_2expt(&tmp, (mp_digit)exp);
116   (void)mp_mul(mp1, &tmp, dst);
117   silc_mp_uninit(&tmp);
118 }
119
120 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
121 {
122   (void)mp_sqrt(src, dst);
123 }
124
125 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
126 {
127   (void)mp_div(mp1, mp2, dst, NULL);
128 }
129
130 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
131 {
132   (void)mp_div_d(mp1, (mp_digit)ui, dst, NULL);
133 }
134
135 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, 
136                     SilcMPInt *mp2)
137 {
138   (void)mp_div(mp1, mp2, q, r);
139 }
140
141 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
142 {
143   SilcMPInt tmp;
144   silc_mp_init(&tmp);
145   (void)mp_2expt(&tmp, (mp_digit)exp);
146   (void)mp_div(mp1, &tmp, dst, NULL);
147   silc_mp_uninit(&tmp);
148 }
149
150 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, 
151                          uint32 exp)
152 {
153   if (q) {
154     (void)mp_2expt(q, (mp_digit)exp);
155     (void)mp_div(mp1, q, q, r);
156   }
157 }
158
159 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
160 {
161   (void)mp_mod(mp1, mp2, dst);
162 }
163
164 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
165 {
166   mp_digit uidst;
167   (void)mp_mod_d(mp1, (mp_digit)ui, &uidst);
168   mp_set(dst, uidst);
169 }
170
171 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
172 {
173   SilcMPInt tmp;
174   silc_mp_init(&tmp);
175   (void)mp_2expt(&tmp, (mp_digit)ui);
176   (void)mp_mod(mp1, &tmp, dst);
177   silc_mp_uninit(&tmp);
178 }
179
180 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
181 {
182   (void)mp_expt(mp1, exp, dst);
183 }
184
185 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
186 {
187   (void)mp_expt_d(mp1, (mp_digit)exp, dst);
188 }
189
190 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp, 
191                      SilcMPInt *mod)
192 {
193   (void)mp_exptmod(mp1, exp, mod, dst);
194 }
195
196 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp, 
197                         SilcMPInt *mod)
198 {
199   (void)mp_exptmod_d(mp1, (mp_digit)exp, mod, dst);
200 }
201
202 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
203 {
204   (void)mp_gcd(mp1, mp2, dst);
205 }
206
207 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
208                     SilcMPInt *mp2)
209 {
210   (void)mp_xgcd(mp1, mp2, g, s, t);
211 }
212
213 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
214 {
215   return mp_cmp(mp1, mp2);
216 }
217
218 int silc_mp_cmp_si(SilcMPInt *mp1, int32 si)
219 {
220   return mp_cmp_int(mp1, (long)si);
221 }
222
223 int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui)
224 {
225   return mp_cmp_d(mp1, ui);
226 }
227
228 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
229 {
230   mp_abs(src, dst);
231 }
232
233 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
234 {
235   mp_neg(src, dst);
236 }
237
238 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
239 {
240   mpl_and(mp1, mp2, dst);
241 }
242
243 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
244 {
245   mpl_or(mp1, mp2, dst);
246 }
247
248 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
249 {
250   mpl_xor(mp1, mp2, dst);
251 }