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