5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
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; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
22 #include "silcincludes.h"
26 void silc_mp_init(SilcMPInt *mp)
31 void silc_mp_uninit(SilcMPInt *mp)
36 size_t silc_mp_size(SilcMPInt *mp)
38 return mp_raw_size(mp);
41 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
43 return mp_radix_size(mp, base) - 2; /* XXX This is actually wrong since
44 this might produce wrong balue.
45 But, it looks like MPI always returns
46 correct value plus one, whereas
47 GMP returns always the right value. */
50 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
52 (void)mp_copy(src, dst);
55 void silc_mp_set_ui(SilcMPInt *dst, uint32 ui)
60 void silc_mp_set_si(SilcMPInt *dst, int32 si)
62 (void)mp_set_int(dst, si);
65 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
67 (void)mp_read_variable_radix(dst, str, base);
70 uint32 silc_mp_get_ui(SilcMPInt *mp)
72 return (uint32)MP_DIGIT(mp, 0);
75 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
77 if (mp_toradix(mp, str, base) != MP_OKAY)
82 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
84 (void)mp_add(mp1, mp2, dst);
87 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
89 mp_add_d(mp1, ui, dst);
92 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
94 (void)mp_sub(mp1, mp2, dst);
97 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
99 (void)mp_sub_d(mp1, (mp_digit)ui, dst);
102 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
104 (void)mp_mul(mp1, mp2, dst);
107 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
109 (void)mp_mul_d(mp1, (mp_digit)ui, dst);
112 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
116 (void)mp_2expt(&tmp, (mp_digit)exp);
117 (void)mp_mul(mp1, &tmp, dst);
118 silc_mp_uninit(&tmp);
121 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
123 (void)mp_sqrt(src, dst);
126 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
128 (void)mp_div(mp1, mp2, dst, NULL);
131 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
133 (void)mp_div_d(mp1, (mp_digit)ui, dst, NULL);
136 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
139 (void)mp_div(mp1, mp2, q, r);
142 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
146 (void)mp_2expt(&tmp, (mp_digit)exp);
147 (void)mp_div(mp1, &tmp, dst, NULL);
148 silc_mp_uninit(&tmp);
151 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
155 (void)mp_2expt(q, (mp_digit)exp);
156 (void)mp_div(mp1, q, q, r);
160 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
162 (void)mp_mod(mp1, mp2, dst);
165 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
168 (void)mp_mod_d(mp1, (mp_digit)ui, &uidst);
172 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
176 (void)mp_2expt(&tmp, (mp_digit)ui);
177 (void)mp_mod(mp1, &tmp, dst);
178 silc_mp_uninit(&tmp);
181 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
183 (void)mp_expt(mp1, exp, dst);
186 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
188 (void)mp_expt_d(mp1, (mp_digit)exp, dst);
191 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
194 (void)mp_exptmod(mp1, exp, mod, dst);
197 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp,
200 (void)mp_exptmod_d(mp1, (mp_digit)exp, mod, dst);
203 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
205 (void)mp_gcd(mp1, mp2, dst);
208 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
211 (void)mp_xgcd(mp1, mp2, g, s, t);
214 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
216 return mp_cmp(mp1, mp2);
219 int silc_mp_cmp_si(SilcMPInt *mp1, int32 si)
221 return mp_cmp_int(mp1, (long)si);
224 int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui)
226 return mp_cmp_d(mp1, ui);
229 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
234 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
239 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
241 mpl_and(mp1, mp2, dst);
244 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
246 mpl_or(mp1, mp2, dst);
249 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
251 mpl_xor(mp1, mp2, dst);