Created SILC Crypto Toolkit git repository.
[crypto.git] / lib / silcmath / mp_tfm.c
1 /*
2
3   mp_tfm.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2005 - 2006 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 "mp_tfm.h"
22
23 void silc_mp_init(SilcMPInt *mp)
24 {
25   fp_init(mp);
26 }
27
28 void silc_mp_uninit(SilcMPInt *mp)
29 {
30   fp_zero(mp);
31 }
32
33 size_t silc_mp_size(SilcMPInt *mp)
34 {
35   return fp_unsigned_bin_size(mp);
36 }
37
38 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
39 {
40   int size = 0;
41   fp_radix_size(mp, base, &size);
42   if (size > 1)
43     size--;
44   return size;
45 }
46
47 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
48 {
49   fp_copy(src, dst);
50 }
51
52 void silc_mp_set_ui(SilcMPInt *dst, SilcUInt32 ui)
53 {
54   fp_set(dst, ui);
55 }
56
57 void silc_mp_set_si(SilcMPInt *dst, SilcInt32 si)
58 {
59   fp_set(dst, si);
60 }
61
62 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
63 {
64   fp_read_radix(dst, str, base);
65 }
66
67 SilcUInt32 silc_mp_get_ui(SilcMPInt *mp)
68 {
69   fp_int *tmp = mp;
70   return tmp->used > 0 ? tmp->dp[0] : 0;
71 }
72
73 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
74 {
75   if (fp_toradix(mp, str, base) != MP_OKAY)
76     return NULL;
77   return str;
78 }
79
80 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
81 {
82   fp_add(mp1, mp2, dst);
83 }
84
85 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
86 {
87   mp_add_d(mp1, (mp_digit)ui, dst);
88 }
89
90 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
91 {
92   fp_sub(mp1, mp2, dst);
93 }
94
95 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
96 {
97   fp_sub_d(mp1, (mp_digit)ui, dst);
98 }
99
100 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
101 {
102   fp_mul(mp1, mp2, dst);
103 }
104
105 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
106 {
107   fp_mul_d(mp1, (mp_digit)ui, dst);
108 }
109
110 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
111 {
112   fp_mul_2d(mp1, exp, dst);
113 }
114
115 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
116 {
117   fp_sqrt(src, dst);
118 }
119
120 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
121 {
122   fp_div(mp1, mp2, dst, NULL);
123 }
124
125 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
126 {
127   fp_div_d(mp1, (mp_digit)ui, dst, NULL);
128 }
129
130 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
131                     SilcMPInt *mp2)
132 {
133   fp_div(mp1, mp2, q, r);
134 }
135
136 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
137 {
138   fp_div_2d(mp1, exp, dst, NULL);
139 }
140
141 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
142                          SilcUInt32 exp)
143 {
144   fp_div_2d(mp1, exp, q, r);
145 }
146
147 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
148 {
149   fp_mod(mp1, mp2, dst);
150 }
151
152 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
153 {
154   fp_digit d;
155   fp_mod_d(mp1, ui, &d);
156   silc_mp_set_ui(dst, d);
157 }
158
159 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
160 {
161   fp_mod_2d(mp1, ui, dst);
162 }
163
164 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
165 {
166   SILC_NOT_IMPLEMENTED("silc_mp_pow");
167   assert(FALSE);
168 }
169
170 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
171 {
172   SILC_NOT_IMPLEMENTED("silc_mp_pow_ui");
173   assert(FALSE);
174 }
175
176 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
177                      SilcMPInt *mod)
178 {
179   fp_exptmod(mp1, exp, mod, dst);
180 }
181
182 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp,
183                         SilcMPInt *mod)
184 {
185   SilcMPInt tmp;
186   silc_mp_init(&tmp);
187   silc_mp_set_ui(&tmp, exp);
188   silc_mp_pow_mod(dst, mp1, &tmp, mod);
189   silc_mp_uninit(&tmp);
190 }
191
192 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
193 {
194   fp_gcd(mp1, mp2, dst);
195 }
196
197 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
198                     SilcMPInt *mp2)
199 {
200   SILC_NOT_IMPLEMENTED("silc_mp_gcdext");
201   assert(FALSE);
202 }
203
204 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
205 {
206   return fp_cmp(mp1, mp2);
207 }
208
209 int silc_mp_cmp_si(SilcMPInt *mp1, SilcInt32 si)
210 {
211   return fp_cmp_d(mp1, si);
212 }
213
214 int silc_mp_cmp_ui(SilcMPInt *mp1, SilcUInt32 ui)
215 {
216   return fp_cmp_d(mp1, ui);
217 }
218
219 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
220 {
221   fp_abs(src, dst);
222 }
223
224 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
225 {
226   fp_neg(src, dst);
227 }
228
229 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
230 {
231   SILC_NOT_IMPLEMENTED("silc_mp_and");
232   assert(FALSE);
233 }
234
235 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
236 {
237   SILC_NOT_IMPLEMENTED("silc_mp_or");
238   assert(FALSE);
239 }
240
241 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
242 {
243   SILC_NOT_IMPLEMENTED("silc_mp_xor");
244   assert(FALSE);
245 }