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 wrong but it looks like
44 the MPI always returns the correct
45 value plus one as opposed what the
46 GMP does, it returns always one less,
47 and SILC code expects that. Bad thing
48 is that the condition "returns always
49 correct value" cannot be trusted! */
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);