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