chiark / gitweb /
Key mangling, and elliptic curves.
[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