5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2001 Pekka Riikonen
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.
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.
21 #include "silcincludes.h"
25 void silc_mp_init(SilcMPInt *mp)
30 void silc_mp_uninit(SilcMPInt *mp)
35 size_t silc_mp_size(SilcMPInt *mp)
37 return mp_raw_size(mp);
40 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
42 size_t sib = mp_radix_size(mp, base);
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. */
52 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
54 (void)mp_copy(src, dst);
57 void silc_mp_set_ui(SilcMPInt *dst, uint32 ui)
62 void silc_mp_set_si(SilcMPInt *dst, int32 si)
64 (void)mp_set_int(dst, si);
67 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
69 (void)mp_read_variable_radix(dst, str, base);
72 uint32 silc_mp_get_ui(SilcMPInt *mp)
74 return (uint32)MP_DIGIT(mp, 0);
77 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
79 if (mp_toradix(mp, str, base) != MP_OKAY)
84 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
86 (void)mp_add(mp1, mp2, dst);
89 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
91 mp_add_d(mp1, ui, dst);
94 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
96 (void)mp_sub(mp1, mp2, dst);
99 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
101 (void)mp_sub_d(mp1, (mp_digit)ui, dst);
104 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
106 (void)mp_mul(mp1, mp2, dst);
109 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
111 (void)mp_mul_d(mp1, (mp_digit)ui, dst);
114 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
118 (void)mp_2expt(&tmp, (mp_digit)exp);
119 (void)mp_mul(mp1, &tmp, dst);
120 silc_mp_uninit(&tmp);
123 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
125 (void)mp_sqrt(src, dst);
128 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
130 (void)mp_div(mp1, mp2, dst, NULL);
133 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
135 (void)mp_div_d(mp1, (mp_digit)ui, dst, NULL);
138 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
141 (void)mp_div(mp1, mp2, q, r);
144 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
148 (void)mp_2expt(&tmp, (mp_digit)exp);
149 (void)mp_div(mp1, &tmp, dst, NULL);
150 silc_mp_uninit(&tmp);
153 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
157 (void)mp_2expt(q, (mp_digit)exp);
158 (void)mp_div(mp1, q, q, r);
162 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
164 (void)mp_mod(mp1, mp2, dst);
167 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
170 (void)mp_mod_d(mp1, (mp_digit)ui, &uidst);
174 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
178 (void)mp_2expt(&tmp, (mp_digit)ui);
179 (void)mp_mod(mp1, &tmp, dst);
180 silc_mp_uninit(&tmp);
183 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
185 (void)mp_expt(mp1, exp, dst);
188 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
190 (void)mp_expt_d(mp1, (mp_digit)exp, dst);
193 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
196 (void)mp_exptmod(mp1, exp, mod, dst);
199 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp,
202 (void)mp_exptmod_d(mp1, (mp_digit)exp, mod, dst);
205 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
207 (void)mp_gcd(mp1, mp2, dst);
210 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
213 (void)mp_xgcd(mp1, mp2, g, s, t);
216 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
218 return mp_cmp(mp1, mp2);
221 int silc_mp_cmp_si(SilcMPInt *mp1, int32 si)
223 return mp_cmp_int(mp1, (long)si);
226 int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui)
228 return mp_cmp_d(mp1, ui);
231 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
236 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
241 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
243 mpl_and(mp1, mp2, dst);
246 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
248 mpl_or(mp1, mp2, dst);
251 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
253 mpl_xor(mp1, mp2, dst);