1 /*
2
3 mp_tma.c
4
5 Author: Pekka Riikonen <priikone@silcnet.org>
6
7 Copyright (C) 2005 - 2007 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 "mp_tma.h"
23
silc_mp_init(SilcMPInt * mp)24 void silc_mp_init(SilcMPInt *mp)
25 {
26 (void)tma_mp_init(mp);
27 }
28
silc_mp_sinit(SilcStack stack,SilcMPInt * mp)29 SilcBool silc_mp_sinit(SilcStack stack, SilcMPInt *mp)
30 {
31 /* XXX TODO */
32 tma_mp_init(mp);
33 return TRUE;
34 }
35
silc_mp_uninit(SilcMPInt * mp)36 void silc_mp_uninit(SilcMPInt *mp)
37 {
38 if (mp)
39 tma_mp_clear(mp);
40 }
41
silc_mp_size(SilcMPInt * mp)42 size_t silc_mp_size(SilcMPInt *mp)
43 {
44 return tma_mp_unsigned_bin_size(mp);
45 }
46
silc_mp_sizeinbase(SilcMPInt * mp,int base)47 size_t silc_mp_sizeinbase(SilcMPInt *mp, int base)
48 {
49 int size = 0;
50 tma_mp_radix_size(mp, base, &size);
51 if (size > 1)
52 size--;
53 return size;
54 }
55
silc_mp_set(SilcMPInt * dst,SilcMPInt * src)56 void silc_mp_set(SilcMPInt *dst, SilcMPInt *src)
57 {
58 (void)tma_mp_copy(src, dst);
59 }
60
silc_mp_set_ui(SilcMPInt * dst,SilcUInt32 ui)61 void silc_mp_set_ui(SilcMPInt *dst, SilcUInt32 ui)
62 {
63 (void)tma_mp_set_int(dst, ui);
64 }
65
silc_mp_set_si(SilcMPInt * dst,SilcInt32 si)66 void silc_mp_set_si(SilcMPInt *dst, SilcInt32 si)
67 {
68 (void)tma_mp_set_int(dst, si);
69 }
70
silc_mp_set_str(SilcMPInt * dst,const char * str,int base)71 void silc_mp_set_str(SilcMPInt *dst, const char *str, int base)
72 {
73 (void)tma_mp_read_radix(dst, str, base);
74 }
75
silc_mp_get_ui(SilcMPInt * mp)76 SilcUInt32 silc_mp_get_ui(SilcMPInt *mp)
77 {
78 return (SilcUInt32)tma_mp_get_int(mp);
79 }
80
silc_mp_get_str(char * str,SilcMPInt * mp,int base)81 char *silc_mp_get_str(char *str, SilcMPInt *mp, int base)
82 {
83 if (tma_mp_toradix(mp, str, base) != MP_OKAY)
84 return NULL;
85 return str;
86 }
87
silc_mp_add(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)88 void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
89 {
90 (void)tma_mp_add(mp1, mp2, dst);
91 }
92
silc_mp_add_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)93 void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
94 {
95 tma_mp_add_d(mp1, (tma_mp_digit)ui, dst);
96 }
97
silc_mp_sub(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)98 void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
99 {
100 (void)tma_mp_sub(mp1, mp2, dst);
101 }
102
silc_mp_sub_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)103 void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
104 {
105 (void)tma_mp_sub_d(mp1, (tma_mp_digit)ui, dst);
106 }
107
silc_mp_mul(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)108 void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
109 {
110 (void)tma_mp_mul(mp1, mp2, dst);
111 }
112
silc_mp_mul_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)113 void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
114 {
115 (void)tma_mp_mul_d(mp1, (tma_mp_digit)ui, dst);
116 }
117
silc_mp_mul_2exp(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp)118 void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
119 {
120 (void)tma_mp_mul_2d(mp1, exp, dst);
121 }
122
silc_mp_sqrt(SilcMPInt * dst,SilcMPInt * src)123 void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src)
124 {
125 (void)tma_mp_sqrt(src, dst);
126 }
127
silc_mp_div(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)128 void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
129 {
130 (void)tma_mp_div(mp1, mp2, dst, NULL);
131 }
132
silc_mp_div_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)133 void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
134 {
135 (void)tma_mp_div_d(mp1, (tma_mp_digit)ui, dst, NULL);
136 }
137
silc_mp_div_qr(SilcMPInt * q,SilcMPInt * r,SilcMPInt * mp1,SilcMPInt * mp2)138 void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
139 SilcMPInt *mp2)
140 {
141 (void)tma_mp_div(mp1, mp2, q, r);
142 }
143
silc_mp_div_2exp(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp)144 void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
145 {
146 (void)tma_mp_div_2d(mp1, exp, dst, NULL);
147 }
148
silc_mp_div_2exp_qr(SilcMPInt * q,SilcMPInt * r,SilcMPInt * mp1,SilcUInt32 exp)149 void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1,
150 SilcUInt32 exp)
151 {
152 (void)tma_mp_div_2d(mp1, exp, q, r);
153 }
154
silc_mp_mod(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)155 void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
156 {
157 (void)tma_mp_mod(mp1, mp2, dst);
158 }
159
silc_mp_mod_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)160 void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
161 {
162 tma_mp_digit d;
163 (void)tma_mp_mod_d(mp1, ui, &d);
164 silc_mp_set_ui(dst, d);
165 }
166
silc_mp_mod_2exp(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 ui)167 void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 ui)
168 {
169 (void)tma_mp_mod_2d(mp1, ui, dst);
170 }
171
silc_mp_pow(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * exp)172 void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp)
173 {
174 SILC_NOT_IMPLEMENTED("silc_mp_pow");
175 assert(FALSE);
176 }
177
silc_mp_pow_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp)178 void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp)
179 {
180 (void)tma_mp_expt_d(mp1, (tma_mp_digit)exp, dst);
181 }
182
silc_mp_pow_mod(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * exp,SilcMPInt * mod)183 void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp,
184 SilcMPInt *mod)
185 {
186 (void)tma_mp_exptmod(mp1, exp, mod, dst);
187 }
188
silc_mp_pow_mod_ui(SilcMPInt * dst,SilcMPInt * mp1,SilcUInt32 exp,SilcMPInt * mod)189 void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, SilcUInt32 exp,
190 SilcMPInt *mod)
191 {
192 SilcMPInt tmp;
193 silc_mp_init(&tmp);
194 silc_mp_set_ui(&tmp, exp);
195 silc_mp_pow_mod(dst, mp1, &tmp, mod);
196 silc_mp_uninit(&tmp);
197 }
198
silc_mp_gcd(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)199 void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
200 {
201 (void)tma_mp_gcd(mp1, mp2, dst);
202 }
203
silc_mp_gcdext(SilcMPInt * g,SilcMPInt * s,SilcMPInt * t,SilcMPInt * mp1,SilcMPInt * mp2)204 void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1,
205 SilcMPInt *mp2)
206 {
207 (void)tma_mp_exteuclid(mp1, mp2, s, t, g);
208 }
209
silc_mp_cmp(SilcMPInt * mp1,SilcMPInt * mp2)210 int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2)
211 {
212 return tma_mp_cmp(mp1, mp2);
213 }
214
silc_mp_cmp_si(SilcMPInt * mp1,SilcInt32 si)215 int silc_mp_cmp_si(SilcMPInt *mp1, SilcInt32 si)
216 {
217 return tma_mp_cmp_d(mp1, si);
218 }
219
silc_mp_cmp_ui(SilcMPInt * mp1,SilcUInt32 ui)220 int silc_mp_cmp_ui(SilcMPInt *mp1, SilcUInt32 ui)
221 {
222 return tma_mp_cmp_d(mp1, ui);
223 }
224
silc_mp_abs(SilcMPInt * dst,SilcMPInt * src)225 void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src)
226 {
227 (void)tma_mp_abs(src, dst);
228 }
229
silc_mp_neg(SilcMPInt * dst,SilcMPInt * src)230 void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src)
231 {
232 (void)tma_mp_neg(src, dst);
233 }
234
silc_mp_and(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)235 void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
236 {
237 (void)tma_mp_and(mp1, mp2, dst);
238 }
239
silc_mp_or(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)240 void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
241 {
242 (void)tma_mp_or(mp1, mp2, dst);
243 }
244
silc_mp_xor(SilcMPInt * dst,SilcMPInt * mp1,SilcMPInt * mp2)245 void silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2)
246 {
247 (void)tma_mp_xor(mp1, mp2, dst);
248 }
249