Fix typemap for older Perls.
[catacomb-perl] / ec.xs
1 # ---?---
2 #
3 # $Id$
4 #
5 # Elliptic curves
6 #
7 # (c) 2001 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 MODULE = Catacomb PACKAGE = Catacomb::EC::Point PREFIX = ec_
29
30 EC_Point *
31 new(x = 0, y = 0, z = 0)
32 mp *x
33 mp *y
34 mp *z
35 CODE:
36 RETVAL = CREATE(EC_Point);
37 EC_CREATE(RETVAL);
38 if (x && y) {
39 RETVAL->x = MP_COPY(x);
40 RETVAL->y = MP_COPY(y);
41 if (z)
42 RETVAL->z = MP_COPY(z);
43 }
44 OUTPUT:
45 RETVAL
46
47 bool
48 atinfp(p)
49 EC_Point *p
50 CODE:
51 RETVAL = EC_ATINF(p);
52 OUTPUT:
53 RETVAL
54
55 mp *
56 x(p)
57 EC_Point *p
58 CODE:
59 RETVAL = p->x ? MP_COPY(p->x) : 0;
60 OUTPUT:
61 RETVAL
62
63 mp *
64 y(p)
65 EC_Point *p
66 CODE:
67 RETVAL = p->y ? MP_COPY(p->y) : 0;
68 OUTPUT:
69 RETVAL
70
71 mp *
72 z(p)
73 EC_Point *p
74 CODE:
75 RETVAL = p->z ? MP_COPY(p->z) : 0;
76 OUTPUT:
77 RETVAL
78
79 SV *
80 DESTROY(p)
81 EC_Point *p
82 CODE:
83 EC_DESTROY(p);
84 DESTROY(p);
85 XSRETURN_YES;
86
87 MODULE = Catacomb PACKAGE = Catacomb::EC::Curve PREFIX = ec_
88
89 EC_Curve *
90 ec_prime(me, f, a, b)
91 SV *me
92 Field *f
93 mp *a
94 mp *b
95 C_ARGS:
96 f, a, b
97
98 EC_Curve *
99 ec_primeproj(me, f, a, b)
100 SV *me
101 Field *f
102 mp *a
103 mp *b
104 C_ARGS:
105 f, a, b
106
107 EC_Curve *
108 ec_bin(me, f, a, b)
109 SV *me
110 Field *f
111 gf *a
112 gf *b
113 C_ARGS:
114 f, a, b
115
116 EC_Curve *
117 ec_binproj(me, f, a, b)
118 SV *me
119 Field *f
120 gf *a
121 gf *b
122 C_ARGS:
123 f, a, b
124
125 char *
126 name(c)
127 EC_Curve *c
128 CODE:
129 RETVAL = (char *)EC_NAME(c);
130 OUTPUT:
131 RETVAL
132
133 bool
134 ec_samep(me, c)
135 EC_Curve *me
136 EC_Curve *c
137
138 EC_Point *
139 find(c, x)
140 EC_Curve *c
141 mp *x
142 CODE:
143 RETVAL = CREATE(EC_Point);
144 if (!ec_find(c, RETVAL, x)) {
145 DESTROY(RETVAL);
146 RETVAL = 0;
147 }
148 OUTPUT:
149 RETVAL
150
151 EC_Point *
152 rand(c, r = &rand_global)
153 EC_Curve *c
154 grand *r
155 CODE:
156 RETVAL = CREATE(EC_Point);
157 ec_rand(c, RETVAL, r);
158 OUTPUT:
159 RETVAL
160
161 EC_Point *
162 neg(c, p)
163 EC_Curve *c
164 EC_Point *p
165 CODE:
166 RETVAL = CREATE(EC_Point);
167 EC_CREATE(RETVAL);
168 ec_neg(c, RETVAL, p);
169 OUTPUT:
170 RETVAL
171
172 EC_Point *
173 add(c, p, q)
174 EC_Curve *c
175 EC_Point *p
176 EC_Point *q
177 CODE:
178 RETVAL = CREATE(EC_Point);
179 EC_CREATE(RETVAL);
180 ec_add(c, RETVAL, p, q);
181 OUTPUT:
182 RETVAL
183
184 EC_Point *
185 sub(c, p, q)
186 EC_Curve *c
187 EC_Point *p
188 EC_Point *q
189 CODE:
190 RETVAL = CREATE(EC_Point);
191 EC_CREATE(RETVAL);
192 ec_sub(c, RETVAL, p, q);
193 OUTPUT:
194 RETVAL
195
196 EC_Point *
197 dbl(c, p)
198 EC_Curve *c
199 EC_Point *p
200 CODE:
201 RETVAL = CREATE(EC_Point);
202 EC_CREATE(RETVAL);
203 ec_dbl(c, RETVAL, p);
204 OUTPUT:
205 RETVAL
206
207 bool
208 ec_check(c, p)
209 EC_Curve *c
210 EC_Point *p
211
212 EC_Point *
213 mul(c, p, x)
214 EC_Curve *c
215 EC_Point *p
216 mp *x
217 CODE:
218 RETVAL = CREATE(EC_Point);
219 EC_CREATE(RETVAL);
220 ec_mul(c, RETVAL, p, x);
221 OUTPUT:
222 RETVAL
223
224 EC_Point *
225 mmul(c, ...)
226 EC_Curve *c
227 PREINIT:
228 ec_mulfactor *v;
229 size_t i, j, n;
230 CODE:
231 if (items < 3 || !(items & 1)) {
232 croak("Usage: Catacomb::EC::Curve::mmul"
233 "(c, p_0, x_0, p_1, x_1, ...");
234 }
235 n = (items - 1)/2;
236 v = xmalloc(n * sizeof(mp_expfactor));
237 for (i = 1, j = 0; i < items; i += 2, j++) {
238 v[j].base = *(ec *)ptrfromsv(ST(i), "Catacomb::EC::Point", "p_i");
239 v[j].exp = mp_fromsv(ST(i + 1), "x_i", "Catacomb::MP", 0, 0);
240 }
241 RETVAL = CREATE(RETVAL);
242 EC_CREATE(RETVAL);
243 ec_mmul(c, RETVAL, v, n);
244 xfree(v);
245 OUTPUT:
246 RETVAL
247
248 EC_Point *
249 in(c, p)
250 EC_Curve *c
251 EC_Point *p
252 CODE:
253 RETVAL = CREATE(EC_Point);
254 EC_CREATE(RETVAL);
255 EC_IN(c, RETVAL, p);
256 OUTPUT:
257 RETVAL
258
259 EC_Point *
260 out(c, p)
261 EC_Curve *c
262 EC_Point *p
263 CODE:
264 RETVAL = CREATE(EC_Point);
265 EC_CREATE(RETVAL);
266 EC_OUT(c, RETVAL, p);
267 OUTPUT:
268 RETVAL
269
270 EC_Point *
271 fix(c, p)
272 EC_Curve *c
273 EC_Point *p
274 CODE:
275 RETVAL = CREATE(EC_Point);
276 EC_CREATE(RETVAL);
277 EC_FIX(c, RETVAL, p);
278 OUTPUT:
279 RETVAL
280
281 EC_Point *
282 ifind(c, x)
283 EC_Curve *c
284 mp *x
285 CODE:
286 RETVAL = CREATE(EC_Point);
287 if (!EC_FIND(c, RETVAL, x)) {
288 DESTROY(RETVAL);
289 RETVAL = 0;
290 }
291 OUTPUT:
292 RETVAL
293
294 EC_Point *
295 ineg(c, p)
296 EC_Curve *c
297 EC_Point *p
298 CODE:
299 RETVAL = CREATE(EC_Point);
300 EC_CREATE(RETVAL);
301 EC_NEG(c, RETVAL, p);
302 OUTPUT:
303 RETVAL
304
305 EC_Point *
306 iadd(c, p, q)
307 EC_Curve *c
308 EC_Point *p
309 EC_Point *q
310 CODE:
311 RETVAL = CREATE(EC_Point);
312 EC_CREATE(RETVAL);
313 EC_ADD(c, RETVAL, p, q);
314 OUTPUT:
315 RETVAL
316
317 EC_Point *
318 isub(c, p, q)
319 EC_Curve *c
320 EC_Point *p
321 EC_Point *q
322 CODE:
323 RETVAL = CREATE(EC_Point);
324 EC_CREATE(RETVAL);
325 EC_SUB(c, RETVAL, p, q);
326 OUTPUT:
327 RETVAL
328
329 EC_Point *
330 idbl(c, p)
331 EC_Curve *c
332 EC_Point *p
333 CODE:
334 RETVAL = CREATE(EC_Point);
335 EC_CREATE(RETVAL);
336 EC_DBL(c, RETVAL, p);
337 OUTPUT:
338 RETVAL
339
340 bool
341 icheck(c, p)
342 EC_Curve *c
343 EC_Point *p
344 CODE:
345 RETVAL = EC_CHECK(c, p);
346 OUTPUT:
347 RETVAL
348
349 EC_Point *
350 imul(c, p, x)
351 EC_Curve *c
352 EC_Point *p
353 mp *x
354 CODE:
355 RETVAL = CREATE(EC_Point);
356 EC_CREATE(RETVAL);
357 ec_imul(c, RETVAL, p, x);
358 OUTPUT:
359 RETVAL
360
361 EC_Point *
362 immul(c, ...)
363 EC_Curve *c
364 PREINIT:
365 ec_mulfactor *v;
366 size_t i, j, n;
367 CODE:
368 if (items < 3 || !(items & 1)) {
369 croak("Usage: Catacomb::EC::Curve::immul"
370 "(c, p_0, x_0, p_1, x_1, ...");
371 }
372 n = (items - 1)/2;
373 v = xmalloc(n * sizeof(mp_expfactor));
374 for (i = 1, j = 0; i < items; i += 2, j++) {
375 v[j].base = *(ec *)ptrfromsv(ST(i), "Catacomb::EC::Point", "p_i");
376 v[j].exp = mp_fromsv(ST(i + 1), "x_i", "Catacomb::MP", 0, 0);
377 }
378 RETVAL = CREATE(RETVAL);
379 EC_CREATE(RETVAL);
380 ec_mmul(c, RETVAL, v, n);
381 xfree(v);
382 OUTPUT:
383 RETVAL
384
385 void
386 getinfo(me, p)
387 char *p
388 PREINIT:
389 ec_info i;
390 const char *e;
391 EC_Point *pt;
392 PPCODE:
393 if ((e = ec_getinfo(&i, p)) != 0)
394 croak("bad curve spec: %s", e);
395 pt = CREATE(EC_Point);
396 *pt = i.g;
397 XPUSHs(RET(i.c, "Catacomb::EC::Curve"));
398 XPUSHs(RET(pt, "Catacomb::EC::Point"));
399 XPUSHs(RET(i.r, "Catacomb::MP"));
400 XPUSHs(RET(i.h, "Catacomb::MP"));
401