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(me, x = 0, y = 0, z = 0)
40 RETVAL->x = MP_COPY(x);
41 RETVAL->y = MP_COPY(y);
43 RETVAL->z = MP_COPY(z);
60 RETVAL = p->x ? MP_COPY(p->x) : 0;
68 RETVAL = p->y ? MP_COPY(p->y) : 0;
76 RETVAL = p->z ? MP_COPY(p->z) : 0;
98 size_t n = EC_ATINF(p) ? 2 : 4 + mp_octets(p->x) + mp_octets(p->y);
100 RETVAL = NEWSV(0, n);
101 buf_init(&b, SvPVX(RETVAL), n);
102 if (buf_putec(&b, p))
103 croak("unexpected failure in Catacomb::EC::Point::put");
104 SvCUR_set(RETVAL, BLEN(&b));
121 if (buf_getec(&b, p))
124 XPUSHs(RET(p, "Catacomb::EC::Point"));
125 if (GIMME_V == G_ARRAY)
126 XPUSHs(sv_2mortal(newSVpvn((char *)BCUR(&b), BLEFT(&b))));
129 MODULE = Catacomb PACKAGE = Catacomb::EC::Curve PREFIX = ec_
138 RETVAL = ec_prime(f, a, b);
143 primeproj(me, f, a, b)
149 RETVAL = ec_primeproj(f, a, b);
160 RETVAL = ec_bin(f, a, b);
171 RETVAL = ec_binproj(f, a, b);
179 RETVAL = (char *)EC_NAME(c);
187 RETVAL = F_OUT(c->f, MP_NEW, c->a);
195 RETVAL = F_OUT(c->f, MP_NEW, c->a);
203 RETVAL = copy_field(c->f);
211 RETVAL = info_curve(c);
226 size_t n = c->f->noctets * 2 + 1;
228 RETVAL = NEWSV(0, n);
229 buf_init(&b, SvPVX(RETVAL), n);
230 if (ec_putraw(c, &b, p))
231 croak("unexpected failure in Catacomb::EC::Curve::putraw");
232 SvCUR_set(RETVAL, BLEN(&b));
250 if (ec_getraw(c, &b, &p))
253 XPUSHs(RET(p, "Catacomb::EC::Point"));
254 if (GIMME_V == G_ARRAY)
255 XPUSHs(sv_2mortal(newSVpvn((char *)BCUR(&b), BLEFT(&b))));
265 if (!ec_find(c, RETVAL, x)) {
273 _rand(c, r = &rand_global)
279 ec_rand(c, RETVAL, r);
290 ec_neg(c, RETVAL, p);
302 ec_add(c, RETVAL, p, q);
314 ec_sub(c, RETVAL, p, q);
325 ec_dbl(c, RETVAL, p);
346 ec_mul(c, RETVAL, p, x);
368 EC_OUT(c, RETVAL, p);
379 EC_FIX(c, RETVAL, p);
389 if (!EC_FIND(c, RETVAL, x)) {
403 EC_NEG(c, RETVAL, p);
415 EC_ADD(c, RETVAL, p, q);
427 EC_SUB(c, RETVAL, p, q);
438 EC_DBL(c, RETVAL, p);
447 RETVAL = EC_CHECK(c, p);
459 ec_imul(c, RETVAL, p, x);
470 if (items < 3 || !(items & 1)) {
471 croak("Usage: Catacomb::EC::Curve::immul"
472 "(c, p_0, x_0, p_1, x_1, ...");
475 v = xmalloc(n * sizeof(mp_expfactor));
476 for (i = 1, j = 0; i < items; i += 2, j++) {
477 v[j].base = *ecpt(ST(i), "p_i");
478 v[j].exp = mp_fromsv(ST(i + 1), "x_i", 0, 0);
480 RETVAL = CREATE(RETVAL);
482 ec_mmul(c, RETVAL, v, n);
496 if ((e = ec_getinfo(&i, p)) != 0)
497 croak("bad curve spec: %s", e);
500 XPUSHs(RET(i.c, "Catacomb::EC::Curve"));
501 XPUSHs(RET(pt, "Catacomb::EC::Point"));
502 XPUSHs(RET(i.r, "Catacomb::MP"));
503 XPUSHs(RET(i.h, "Catacomb::MP"));
506 checkinfo(c, g, r, h, rng = &rand_global)
519 RETVAL = ec_checkinfo(&ei, rng);