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;
92 MODULE = Catacomb PACKAGE = Catacomb::EC::Curve PREFIX = ec_
104 ec_primeproj(me, f, a, b)
122 ec_binproj(me, f, a, b)
134 RETVAL = (char *)EC_NAME(c);
148 RETVAL = CREATE(EC_Point);
149 if (!ec_find(c, RETVAL, x)) {
157 rand(c, r = &rand_global)
161 RETVAL = CREATE(EC_Point);
162 ec_rand(c, RETVAL, r);
171 RETVAL = CREATE(EC_Point);
173 ec_neg(c, RETVAL, p);
183 RETVAL = CREATE(EC_Point);
185 ec_add(c, RETVAL, p, q);
195 RETVAL = CREATE(EC_Point);
197 ec_sub(c, RETVAL, p, q);
206 RETVAL = CREATE(EC_Point);
208 ec_dbl(c, RETVAL, p);
223 RETVAL = CREATE(EC_Point);
225 ec_mul(c, RETVAL, p, x);
236 if (items < 3 || !(items & 1)) {
237 croak("Usage: Catacomb::EC::Curve::mmul"
238 "(c, p_0, x_0, p_1, x_1, ...");
241 v = xmalloc(n * sizeof(mp_expfactor));
242 for (i = 1, j = 0; i < items; i += 2, j++) {
243 v[j].base = *(ec *)ptrfromsv(ST(i), "Catacomb::EC::Point", "p_i");
244 v[j].exp = mp_fromsv(ST(i + 1), "x_i", "Catacomb::MP", 0, 0);
246 RETVAL = CREATE(RETVAL);
248 ec_mmul(c, RETVAL, v, n);
258 RETVAL = CREATE(EC_Point);
269 RETVAL = CREATE(EC_Point);
271 EC_OUT(c, RETVAL, p);
280 RETVAL = CREATE(EC_Point);
282 EC_FIX(c, RETVAL, p);
291 RETVAL = CREATE(EC_Point);
292 if (!EC_FIND(c, RETVAL, x)) {
304 RETVAL = CREATE(EC_Point);
306 EC_NEG(c, RETVAL, p);
316 RETVAL = CREATE(EC_Point);
318 EC_ADD(c, RETVAL, p, q);
328 RETVAL = CREATE(EC_Point);
330 EC_SUB(c, RETVAL, p, q);
339 RETVAL = CREATE(EC_Point);
341 EC_DBL(c, RETVAL, p);
350 RETVAL = EC_CHECK(c, p);
360 RETVAL = CREATE(EC_Point);
362 ec_imul(c, RETVAL, p, x);
373 if (items < 3 || !(items & 1)) {
374 croak("Usage: Catacomb::EC::Curve::immul"
375 "(c, p_0, x_0, p_1, x_1, ...");
378 v = xmalloc(n * sizeof(mp_expfactor));
379 for (i = 1, j = 0; i < items; i += 2, j++) {
380 v[j].base = *(ec *)ptrfromsv(ST(i), "Catacomb::EC::Point", "p_i");
381 v[j].exp = mp_fromsv(ST(i + 1), "x_i", "Catacomb::MP", 0, 0);
383 RETVAL = CREATE(RETVAL);
385 ec_mmul(c, RETVAL, v, n);
398 if ((e = ec_getinfo(&i, p)) != 0)
399 croak("bad curve spec: %s", e);
400 pt = CREATE(EC_Point);
402 XPUSHs(RET(i.c, "Catacomb::EC::Curve"));
403 XPUSHs(RET(pt, "Catacomb::EC::Point"));
404 XPUSHs(RET(i.r, "Catacomb::MP"));
405 XPUSHs(RET(i.h, "Catacomb::MP"));