7 # (c) 2001 Straylight/Edgeware
10 #----- Licensing notice -----------------------------------------------------
12 # This file is part of the Perl interface to Catacomb.
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.
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.
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.
28 MODULE = Catacomb PACKAGE = Catacomb::EC::Point PREFIX = ec_
31 new(x = 0, y = 0, z = 0)
36 RETVAL = CREATE(EC_Point);
39 RETVAL->x = MP_COPY(x);
40 RETVAL->y = MP_COPY(y);
42 RETVAL->z = MP_COPY(z);
59 RETVAL = p->x ? MP_COPY(p->x) : 0;
67 RETVAL = p->y ? MP_COPY(p->y) : 0;
75 RETVAL = p->z ? MP_COPY(p->z) : 0;
87 MODULE = Catacomb PACKAGE = Catacomb::EC::Curve PREFIX = ec_
99 ec_primeproj(me, f, a, b)
117 ec_binproj(me, f, a, b)
129 RETVAL = (char *)EC_NAME(c);
143 RETVAL = CREATE(EC_Point);
144 if (!ec_find(c, RETVAL, x)) {
152 rand(c, r = &rand_global)
156 RETVAL = CREATE(EC_Point);
157 ec_rand(c, RETVAL, r);
166 RETVAL = CREATE(EC_Point);
168 ec_neg(c, RETVAL, p);
178 RETVAL = CREATE(EC_Point);
180 ec_add(c, RETVAL, p, q);
190 RETVAL = CREATE(EC_Point);
192 ec_sub(c, RETVAL, p, q);
201 RETVAL = CREATE(EC_Point);
203 ec_dbl(c, RETVAL, p);
218 RETVAL = CREATE(EC_Point);
220 ec_mul(c, RETVAL, p, x);
231 if (items < 3 || !(items & 1)) {
232 croak("Usage: Catacomb::EC::Curve::mmul"
233 "(c, p_0, x_0, p_1, x_1, ...");
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);
241 RETVAL = CREATE(RETVAL);
243 ec_mmul(c, RETVAL, v, n);
253 RETVAL = CREATE(EC_Point);
264 RETVAL = CREATE(EC_Point);
266 EC_OUT(c, RETVAL, p);
275 RETVAL = CREATE(EC_Point);
277 EC_FIX(c, RETVAL, p);
286 RETVAL = CREATE(EC_Point);
287 if (!EC_FIND(c, RETVAL, x)) {
299 RETVAL = CREATE(EC_Point);
301 EC_NEG(c, RETVAL, p);
311 RETVAL = CREATE(EC_Point);
313 EC_ADD(c, RETVAL, p, q);
323 RETVAL = CREATE(EC_Point);
325 EC_SUB(c, RETVAL, p, q);
334 RETVAL = CREATE(EC_Point);
336 EC_DBL(c, RETVAL, p);
345 RETVAL = EC_CHECK(c, p);
355 RETVAL = CREATE(EC_Point);
357 ec_imul(c, RETVAL, p, x);
368 if (items < 3 || !(items & 1)) {
369 croak("Usage: Catacomb::EC::Curve::immul"
370 "(c, p_0, x_0, p_1, x_1, ...");
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);
378 RETVAL = CREATE(RETVAL);
380 ec_mmul(c, RETVAL, v, n);
393 if ((e = ec_getinfo(&i, p)) != 0)
394 croak("bad curve spec: %s", e);
395 pt = CREATE(EC_Point);
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"));