Key mangling, and elliptic curves.
[catacomb-perl] / gf.xs
CommitLineData
a1a90aaf 1# ---?---
2#
3# $Id$
4#
5# Multiprecision interface
6#
7# (c) 2000 Straylight/Edgeware
8#
9
10#----- Licensing notice -----------------------------------------------------
11#
12# This file is part of the Perl interface to Catacomb.
13#
14# Catacomb/Perl is free software; you can redistribute it and/or modify
15# it under the terms of the GNU General Public License as published by
16# the Free Software Foundation; either version 2 of the License, or
17# (at your option) any later version.
18#
19# Catacomb/Perl is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22# GNU General Public License for more details.
23#
24# You should have received a copy of the GNU General Public License
25# along with Catacomb/Perl; if not, write to the Free Software Foundation,
26# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27#
28
29MODULE = Catacomb PACKAGE = Catacomb::GF PREFIX = gf_
30
31gf *
32new(me, sv = 0, radix = 0)
33 SV *me
34 SV *sv
35 int radix
36 CODE:
37 RETVAL = sv ? mp_fromsv(sv, "sv", "Catacomb::GF", radix, 1) : MP_ZERO;
38 OUTPUT:
39 RETVAL
40
41gf *
42copy(x)
43 gf *x
44 CODE:
45 RETVAL = MP_COPY(x);
46 OUTPUT:
47 RETVAL
48
49gf *
50loadb(me, sv)
51 SV *me
52 SV *sv
53 PREINIT:
54 char *p;
55 STRLEN len;
56 CODE:
57 p = SvPV(sv, len);
58 RETVAL = mp_loadb(MP_NEW, p, len);
59 OUTPUT:
60 RETVAL
61
62gf *
63loadl(me, sv)
64 SV *me
65 SV *sv
66 PREINIT:
67 char *p;
68 STRLEN len;
69 CODE:
70 p = SvPV(sv, len);
71 RETVAL = mp_loadl(MP_NEW, p, len);
72 OUTPUT:
73 RETVAL
74
75int
76metrics(m)
77 gf *m
78 INTERFACE_MACRO:
79 XSINTERFACE_FUNC
80 XSINTERFACE_FUNC_SETMP
81 INTERFACE:
82 octets bits
83
84SV *
85storeb(m, i = -1)
86 gf *m
87 int i
88 PREINIT:
89 size_t sz;
90 CODE:
91 sz = (i < 0) ? mp_octets(m) : i;
92 RETVAL = NEWSV(0, sz ? sz : 1);
93 mp_storeb(m, SvPVX(RETVAL), sz);
94 SvCUR_set(RETVAL, sz);
95 SvPOK_on(RETVAL);
96 OUTPUT:
97 RETVAL
98
99SV *
100storel(m, i = -1)
101 gf *m
102 int i
103 PREINIT:
104 size_t sz;
105 CODE:
106 sz = (i < 0) ? mp_octets(m) : i;
107 RETVAL = NEWSV(0, sz ? sz : 1);
108 mp_storel(m, SvPVX(RETVAL), sz);
109 SvCUR_set(RETVAL, sz);
110 SvPOK_on(RETVAL);
111 OUTPUT:
112 RETVAL
113
114SV *
115tostring(m, radix = 16)
116 gf *m
117 int radix
118 CODE:
119 RETVAL = NEWSV(0, 0);
120 mp_writesv(m, RETVAL, radix);
121 OUTPUT:
122 RETVAL
123
124SV *
125toint(m)
126 gf *m
127 CODE:
128 RETVAL = newSViv(mp_toiv(m));
129 OUTPUT:
130 RETVAL
131
132SV *
133DESTROY(m)
134 gf *m
135 CODE:
136 mp_drop(m);
137 XSRETURN_UNDEF;
138
139mp *
140gf_sqr(a)
141 gf *a
142 C_ARGS:
143 MP_NEW, a
144 INTERFACE_MACRO:
145 XSINTERFACE_FUNC
146 XSINTERFACE_FUNC_SETGF
147 INTERFACE:
148 sqr
149
150mp *
151binop(a, b)
152 gf *a
153 gf *b
154 C_ARGS:
155 MP_NEW, a, b
156 INTERFACE_MACRO:
157 XSINTERFACE_FUNC
158 XSINTERFACE_FUNC_SETGF
159 INTERFACE:
160 add sub mul
161
162gf *
163shiftop(a, n)
164 mp *a
165 int n
166 C_ARGS:
167 MP_NEW, a, n
168 INTERFACE_MACRO:
169 XSINTERFACE_FUNC
170 XSINTERFACE_FUNC_SETMP
171 INTERFACE:
172 lsl lsr
173
174int
175gf_eq(a, b)
176 gf *a
177 gf *b
178 CODE:
179 RETVAL = mp_eq(a, b);
180 OUTPUT:
181 RETVAL
182
183int
184gf_irreduciblep(a)
185 gf *a
186
187void
188div(a, b)
189 mp *a
190 mp *b
191 PREINIT:
192 mp *q = MP_NEW, *r = MP_NEW;
193 PPCODE:
194 if (MP_EQ(b, MP_ZERO))
195 croak("Divide by zero in Catacomb::GF::div");
196 q = MP_NEW;
197 switch (GIMME_V) {
198 case G_ARRAY:
199 r = MP_NEW;
200 mp_div(&q, &r, a, b);
201 EXTEND(SP, 2);
202 PUSHs(RET_GF(q));
203 PUSHs(RET_GF(r));
204 break;
205 case G_VOID:
206 break;
207 default:
208 mp_div(&q, &r, a, b);
209 EXTEND(SP, 1);
210 PUSHs(RET_GF(q));
211 break;
212 }
213
214void
215gcd(a, b)
216 gf *a
217 gf *b
218 PREINIT:
219 gf *g = MP_NEW, *x = MP_NEW, *y = MP_NEW;
220 PPCODE:
221 switch (GIMME_V) {
222 case G_ARRAY:
223 gf_gcd(&g, &x, &y, a, b);
224 EXTEND(SP, 3);
225 PUSHs(RET_GF(g));
226 PUSHs(RET_GF(x));
227 PUSHs(RET_GF(y));
228 break;
229 case G_VOID:
230 break;
231 default:
232 gf_gcd(&g, 0, 0, a, b);
233 EXTEND(SP, 1);
234 PUSHs(RET_GF(g));
235 break;
236 }
237
238GF_Reduce *
239makereduce(x)
240 gf *x
241 CODE:
242 RETVAL = CREATE(GF_Reduce);
243 gfreduce_create(RETVAL, x);
244 OUTPUT:
245 RETVAL
246
247MODULE = Catacomb PACKAGE = Catacomb::GF::Reduce PREFIX = gfreduce_
248
249GF_Reduce *
250new(me, x)
251 gf *x
252 CODE:
253 RETVAL = CREATE(GF_Reduce);
254 gfreduce_create(RETVAL, x);
255 OUTPUT:
256 RETVAL
257
258SV *
259DESTROY(r)
260 GF_Reduce *r
261 CODE:
262 gfreduce_destroy(r);
263 DESTROY(r);
264 XSRETURN_UNDEF;
265
266gf *
267reduce(r, x)
268 GF_Reduce *r
269 gf *x
270 CODE:
271 RETVAL = gfreduce_do(r, MP_NEW, x);
272 OUTPUT:
273 RETVAL
274
275gf *
276sqrt(r, x)
277 GF_Reduce *r
278 gf *x
279 CODE:
280 if ((RETVAL = gfreduce_sqrt(r, MP_NEW, x)) == 0)
281 XSRETURN_UNDEF;
282 OUTPUT:
283 RETVAL
284
285int
286gfreduce_trace(r, x)
287 GF_Reduce *r
288 gf *x
289
290gf *
291gfreduce_halftrace(r, x)
292 GF_Reduce *r
293 gf *x
294 C_ARGS:
295 r, MP_NEW, x
296
297gf *
298quadsolve(r, x)
299 GF_Reduce *r
300 gf *x
301 CODE:
302 if ((RETVAL = gfreduce_quadsolve(r, MP_NEW, x)) == 0)
303 XSRETURN_UNDEF;
304 OUTPUT:
305 RETVAL
306
307gf *
308m(r)
309 GF_Reduce *r
310 CODE:
311 RETVAL = MP_COPY(r->p);
312 OUTPUT:
313 RETVAL
314
315gf *
316gfreduce_exp(r, x, y)
317 GF_Reduce *r
318 gf *x
319 gf *y
320 C_ARGS:
321 r, MP_NEW, x, y
322
323#----- That's all, folks ----------------------------------------------------