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 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. */
49 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
51 (void)mp_copy(src, dst);
54 void silc_mp_set_ui(SilcMPInt *dst, uint32 ui)
59 void silc_mp_set_si(SilcMPInt *dst, int32 si)
61 (void)mp_set_int(dst, si);
64 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
66 (void)mp_read_variable_radix(dst, str, base);
69 uint32 silc_mp_get_ui(SilcMPInt *mp)
71 return (uint32)MP_DIGIT(mp, 0);
74 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
76 if (mp_toradix(mp, str, base) != MP_OKAY)
81 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
83 (void)mp_add(mp1, mp2, dst);
86 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
88 mp_add_d(mp1, ui, dst);
91 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
93 (void)mp_sub(mp1, mp2, dst);
96 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
98 (void)mp_sub_d(mp1, (mp_digit)ui, dst);
101 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
103 (void)mp_mul(mp1, mp2, dst);
106 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
108 (void)mp_mul_d(mp1, (mp_digit)ui, dst);
111 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
115 (void)mp_2expt(&tmp, (mp_digit)exp);
116 (void)mp_mul(mp1, &tmp, dst);
117 silc_mp_uninit(&tmp);
120 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
122 (void)mp_sqrt(src, dst);
125 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
127 (void)mp_div(mp1, mp2, dst, NULL);
130 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
132 (void)mp_div_d(mp1, (mp_digit)ui, dst, NULL);
135 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
138 (void)mp_div(mp1, mp2, q, r);
141 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
145 (void)mp_2expt(&tmp, (mp_digit)exp);
146 (void)mp_div(mp1, &tmp, dst, NULL);
147 silc_mp_uninit(&tmp);
150 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
154 (void)mp_2expt(q, (mp_digit)exp);
155 (void)mp_div(mp1, q, q, r);
159 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
161 (void)mp_mod(mp1, mp2, dst);
164 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
167 (void)mp_mod_d(mp1, (mp_digit)ui, &uidst);
171 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui)
175 (void)mp_2expt(&tmp, (mp_digit)ui);
176 (void)mp_mod(mp1, &tmp, dst);
177 silc_mp_uninit(&tmp);
180 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
182 (void)mp_expt(mp1, exp, dst);
185 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp)
187 (void)mp_expt_d(mp1, (mp_digit)exp, dst);
190 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
193 (void)mp_exptmod(mp1, exp, mod, dst);
196 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp,
199 (void)mp_exptmod_d(mp1, (mp_digit)exp, mod, dst);
202 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
204 (void)mp_gcd(mp1, mp2, dst);
207 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
210 (void)mp_xgcd(mp1, mp2, g, s, t);
213 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
215 return mp_cmp(mp1, mp2);
218 int silc_mp_cmp_si(SilcMPInt *mp1, int32 si)
220 return mp_cmp_int(mp1, (long)si);
223 int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui)
225 return mp_cmp_d(mp1, ui);
228 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
233 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
238 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
240 mpl_and(mp1, mp2, dst);
243 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
245 mpl_or(mp1, mp2, dst);
248 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
250 mpl_xor(mp1, mp2, dst);