1 /*
2
3 mp_gmp.c
4
5 Author: Pekka Riikonen <priikone@silcnet.org>
6
7 Copyright (C) 2001 - 2005 Pekka Riikonen
8
9 The contents of this file are subject to one of the Licenses specified
10 in the COPYING file; You may not use this file except in compliance
11 with the License.
12
13 The software distributed under the License is distributed on an "AS IS"
14 basis, in the hope that it will be useful, but WITHOUT WARRANTY OF ANY
15 KIND, either expressed or implied. See the COPYING file for more
16 information.
17
18 */
19 /* $Id$ */
20
21 #include "silc.h"
22 #include <gmp.h>
23
silc_mp_init(SilcMPInt * mp)24 void silc_mp_init(SilcMPInt *mp)
25 {
26 mpz_init(mp);
27 }
28
silc_mp_uninit(SilcMPInt * mp)29 void silc_mp_uninit(SilcMPInt *mp)
30 {
31 if (mp)
32 mpz_clear(mp);
33 }
34
silc_mp_size(SilcMPInt * mp)35 size_t silc_mp_size(SilcMPInt *mp)
36 {
37 return mpz_size(mp);
38 }
39
silc_mp_sizeinbase(SilcMPInt * mp,int base)40 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
41 {
42 return mpz_sizeinbase(mp, base);
43 }
44
silc_mp_set(SilcMPInt * dst,SilcMPInt * src)45 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
46 {
47 mpz_set(dst, src);
48 }
49
silc_mp_set_ui(SilcMPInt * dst,SilcUInt32 ui)50 void silc_mp_set_ui(SilcMPInt *dst, SilcUInt32 ui)
51 {
52 mpz_set_ui(dst, ui);
53 }
54
silc_mp_set_si(SilcMPInt * dst,SilcInt32 si)55 void silc_mp_set_si(SilcMPInt *dst, SilcInt32 si)
56 {
57 mpz_set_si(dst, si);
58 }
59
silc_mp_set_str(SilcMPInt * dst,const char * str,int base)60 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
61 {
62 mpz_set_str(dst, str, base);
63 }
64
silc_mp_get_ui(SilcMPInt * mp)65 SilcUInt32 silc_mp_get_ui(SilcMPInt *mp)
66 {
67 return (SilcUInt32)mpz_get_ui(mp);
68 }
69
silc_mp_get_str(char * str,SilcMPInt * mp,int base)70 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
71 {
72 return mpz_get_str(str, base, mp);
73 }
74
silc_mp_add(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)75 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
76 {
77 mpz_add(dst, mp1, mp2);
78 }
79
silc_mp_add_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)80 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
81 {
82 mpz_add_ui(dst, mp1, ui);
83 }
84
silc_mp_sub(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)85 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
86 {
87 mpz_sub(dst, mp1, mp2);
88 }
89
silc_mp_sub_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)90 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
91 {
92 mpz_sub_ui(dst, mp1, ui);
93 }
94
silc_mp_mul(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)95 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
96 {
97 mpz_mul(dst, mp1, mp2);
98 }
99
silc_mp_mul_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)100 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
101 {
102 mpz_mul_ui(dst, mp1, ui);
103 }
104
silc_mp_mul_2exp(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp)105 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
106 {
107 mpz_mul_2exp(dst, mp1, exp);
108 }
109
silc_mp_sqrt(SilcMPInt * dst,SilcMPInt * src)110 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
111 {
112 mpz_sqrt(dst, src);
113 }
114
silc_mp_div(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)115 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
116 {
117 mpz_div(dst, mp1, mp2);
118 }
119
silc_mp_div_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)120 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
121 {
122 mpz_div_ui(dst, mp1, ui);
123 }
124
silc_mp_div_qr(SilcMPInt * q,SilcMPInt * r,SilcMPInt * mp1,SilcMPInt * mp2)125 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
126 SilcMPInt *mp2)
127 {
128 if (q && r)
129 mpz_fdiv_qr(q, r, mp1, mp2);
130 if (q && !r)
131 mpz_div(q, mp1, mp2);
132 if (!q && r)
133 mpz_mod(r, mp1, mp2);
134 }
135
silc_mp_div_2exp(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp)136 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
137 {
138 mpz_fdiv_q_2exp(dst, mp1, exp);
139 }
140
silc_mp_div_2exp_qr(SilcMPInt * q,SilcMPInt * r,SilcMPInt * mp1,SilcUInt32 exp)141 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
142 SilcUInt32 exp)
143 {
144 if (q)
145 mpz_fdiv_q_2exp(q, mp1, exp);
146 if (r)
147 mpz_fdiv_r_2exp(r, mp1, exp);
148 }
149
silc_mp_mod(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)150 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
151 {
152 mpz_mod(dst, mp1, mp2);
153 }
154
silc_mp_mod_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)155 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
156 {
157 mpz_mod_ui(dst, mp1, ui);
158 }
159
silc_mp_mod_2exp(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)160 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
161 {
162 mpz_mod_2exp(dst, mp1, ui);
163 }
164
silc_mp_pow(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * exp)165 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
166 {
167 SilcUInt32 uiexp = mpz_get_ui(exp);
168 mpz_pow_ui(dst, mp1, uiexp);
169 }
170
silc_mp_pow_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp)171 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
172 {
173 mpz_pow_ui(dst, mp1, exp);
174 }
175
silc_mp_pow_mod(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * exp,SilcMPInt * mod)176 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
177 SilcMPInt *mod)
178 {
179 mpz_powm(dst, mp1, exp, mod);
180 }
181
silc_mp_pow_mod_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp,SilcMPInt * mod)182 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp,
183 SilcMPInt *mod)
184 {
185 mpz_powm_ui(dst, mp1, exp, mod);
186 }
187
silc_mp_gcd(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)188 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
189 {
190 mpz_gcd(dst, mp1, mp2);
191 }
192
silc_mp_gcdext(SilcMPInt * g,SilcMPInt * s,SilcMPInt * t,SilcMPInt * mp1,SilcMPInt * mp2)193 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
194 SilcMPInt *mp2)
195 {
196 mpz_gcdext(g, s, t, mp1, mp2);
197 }
198
silc_mp_cmp(SilcMPInt * mp1,SilcMPInt * mp2)199 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
200 {
201 return mpz_cmp(mp1, mp2);
202 }
203
silc_mp_cmp_si(SilcMPInt * mp1,SilcInt32 si)204 int silc_mp_cmp_si(SilcMPInt *mp1, SilcInt32 si)
205 {
206 return mpz_cmp_si(mp1, si);
207 }
208
silc_mp_cmp_ui(SilcMPInt * mp1,SilcUInt32 ui)209 int silc_mp_cmp_ui(SilcMPInt *mp1, SilcUInt32 ui)
210 {
211 return mpz_cmp_ui(mp1, ui);
212 }
213
silc_mp_abs(SilcMPInt * dst,SilcMPInt * src)214 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
215 {
216 mpz_abs(dst, src);
217 }
218
silc_mp_neg(SilcMPInt * dst,SilcMPInt * src)219 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
220 {
221 mpz_neg(dst, src);
222 }
223
silc_mp_and(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)224 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
225 {
226 mpz_and(dst, mp1, mp2);
227 }
228
silc_mp_or(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)229 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
230 {
231 mpz_ior(dst, mp1, mp2);
232 }
233
silc_mp_xor(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)234 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
235 {
236 mpz_xor(dst, mp1, mp2);
237 }
238