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