X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/3aa33042dc760937bb9da54c09f7c668f00eb241..61cc9665df69b0641bfd40da285acbea20c48654:/ec.c diff --git a/ec.c b/ec.c index 59384bc..21aa352 100644 --- a/ec.c +++ b/ec.c @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id$ - * * Elliptic curves * * (c) 2004 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the Python interface to Catacomb. * @@ -15,12 +13,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * Catacomb/Python is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with Catacomb/Python; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -233,7 +231,8 @@ end: static PyObject *epmeth_oncurvep(PyObject *me, PyObject *arg) { if (!PyArg_ParseTuple(arg, ":oncurvep")) return (0); - return (getbool(!ec_check(ECPT_C(me), ECPT_P(me)))); + return (getbool(EC_ATINF(ECPT_P(me)) || + !EC_CHECK(ECPT_C(me), ECPT_P(me)))); } static PyObject *epmeth_dbl(PyObject *me, PyObject *arg) @@ -507,7 +506,7 @@ static PyObject *ecpt_pylong(PyObject *me) PyObject *rc = 0; if (EC_ATINF(ECPT_P(me))) VALERR("point at infinity"); getecptout(&p, me); - rc = (PyObject *)mp_topylong(p.x); + rc = mp_topylong(p.x); end: EC_DESTROY(&p); return (rc); @@ -589,7 +588,7 @@ static PyNumberMethods ecpt_pynumber = { }; static PyTypeObject ecpt_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECPt", /* @tp_name@ */ sizeof(ecpt_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -621,7 +620,7 @@ static PyTypeObject ecpt_pytype_skel = { ecpt_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ ecptnc_pymethods, /* @tp_methods@ */ 0, /* @tp_members@ */ ecptnc_pygetset, /* @tp_getset@ */ @@ -703,7 +702,7 @@ static PyNumberMethods ecptcurve_pynumber = { }; static PyTypeObject ecptcurve_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECPtCurve", /* @tp_name@ */ sizeof(ecpt_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -735,7 +734,7 @@ static PyTypeObject ecptcurve_pytype_skel = { 0, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ ecpt_pymethods, /* @tp_methods@ */ 0, /* @tp_members@ */ ecpt_pygetset, /* @tp_getset@ */ @@ -773,10 +772,10 @@ static int ecmmul_fill(void *pp, PyObject *me, PyObject *x, PyObject *m) { ec_mulfactor *f = pp; + EC_CREATE(&f->base); if (getecpt(ECCURVE_C(me), &f->base, x) || (f->exp = getmp(m)) == 0) return (-1); - f->base = *ECPT_P(x); return (0); } @@ -900,21 +899,20 @@ static PyObject *ecmeth_rand(PyObject *me, PyObject *arg, PyObject *kw) static PyObject *eccurve_dopywrap(PyTypeObject *ty, PyObject *fobj, ec_curve *c) { - eccurve_pyobj *cobj = newtype(ty, 0); + eccurve_pyobj *cobj = newtype(ty, 0, c->ops->name); cobj->c = c; cobj->fobj = fobj; - cobj->ty.tp_name = (/*unconst*/ char *)c->ops->name; - cobj->ty.tp_basicsize = sizeof(ecpt_pyobj); - cobj->ty.tp_base = ecptcurve_pytype; + cobj->ty.ht_type.tp_basicsize = sizeof(ecpt_pyobj); + cobj->ty.ht_type.tp_base = ecptcurve_pytype; Py_INCREF(ecptcurve_pytype); - cobj->ty.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_HEAPTYPE); - cobj->ty.tp_alloc = PyType_GenericAlloc; - cobj->ty.tp_free = 0; - cobj->ty.tp_new = ecpt_pynew; - PyType_Ready(&cobj->ty); + cobj->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_CHECKTYPES | + Py_TPFLAGS_HEAPTYPE); + cobj->ty.ht_type.tp_alloc = PyType_GenericAlloc; + cobj->ty.ht_type.tp_free = 0; + cobj->ty.ht_type.tp_new = ecpt_pynew; + PyType_Ready(&cobj->ty.ht_type); return ((PyObject *)cobj); } @@ -949,7 +947,7 @@ static PyObject *eccurve_pynew(PyTypeObject *ty, char *kwlist[] = { "field", "a", "b", 0 }; mp *aa = 0, *bb = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!OO", kwlist, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O&O&", kwlist, field_pytype, &fobj, convmp, &aa, convmp, &bb)) goto end; @@ -968,7 +966,7 @@ static PyObject *meth__ECCurve_parse(PyObject *me, PyObject *arg) ec_curve *c; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Os", &me, &p)) + if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p)) goto end; qd.p = p; qd.e = 0; @@ -985,7 +983,7 @@ static PyObject *ecget_name(PyObject *me, void *hunoz) static PyObject *ecget_a(PyObject *me, void *hunoz) { return (fe_pywrap(ECCURVE_FOBJ(me), MP_COPY(ECCURVE_C(me)->a))); } -static PyObject *ecget_b(PyObject *me, void *hunoz) +static PyObject *ecget_b(PyObject *me, void *hunoz) { return (fe_pywrap(ECCURVE_FOBJ(me), MP_COPY(ECCURVE_C(me)->b))); } static PyObject *ecget_field(PyObject *me, void *hunoz) @@ -1003,7 +1001,7 @@ static PyGetSetDef eccurve_pygetset[] = { GET (inf, "E.inf -> point at infinity of this curve") #undef GETSETNAME { 0 } -}; +}; static PyMethodDef eccurve_pymethods[] = { #define METHNAME(name) ecmeth_##name @@ -1016,7 +1014,7 @@ E.mmul([(P0, N0), (P1, N1), ...]) = N0 P0 + N1 P1 + ...") }; static PyTypeObject eccurve_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1047,7 +1045,7 @@ static PyTypeObject eccurve_pytype_skel = { eccurve_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ eccurve_pymethods, /* @tp_methods@ */ 0, /* @tp_members@ */ eccurve_pygetset, /* @tp_getset@ */ @@ -1070,7 +1068,7 @@ static PyObject *ecprimecurve_pynew(PyTypeObject *ty, } static PyTypeObject ecprimecurve_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECPrimeCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1101,7 +1099,7 @@ static PyTypeObject ecprimecurve_pytype_skel = { eccurve_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -1124,7 +1122,7 @@ static PyObject *ecprimeprojcurve_pynew(PyTypeObject *ty, } static PyTypeObject ecprimeprojcurve_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECPrimeProjCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1155,7 +1153,7 @@ static PyTypeObject ecprimeprojcurve_pytype_skel = { eccurve_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -1178,7 +1176,7 @@ static PyObject *ecbincurve_pynew(PyTypeObject *ty, } static PyTypeObject ecbincurve_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECBinCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1209,7 +1207,7 @@ static PyTypeObject ecbincurve_pytype_skel = { eccurve_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -1232,7 +1230,7 @@ static PyObject *ecbinprojcurve_pynew(PyTypeObject *ty, } static PyTypeObject ecbinprojcurve_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECBinProjCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1263,7 +1261,7 @@ static PyTypeObject ecbinprojcurve_pytype_skel = { eccurve_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ 0, /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ @@ -1328,7 +1326,7 @@ static PyObject *ecinfo_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) TYERR("point not from this curve"); ei.c = ECCURVE_C(e); EC_CREATE(&ei.g); - EC_COPY(&ei.g, ECPT_P(g)); + EC_OUT(ei.c, &ei.g, ECPT_P(g)); rc = (ecinfo_pyobj *)ty->tp_alloc(ty, 0); rc->ei = ei; rc->cobj = e; @@ -1437,7 +1435,7 @@ static PyMethodDef ecinfo_pymethods[] = { }; static PyTypeObject ecinfo_pytype_skel = { - PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */ + PyObject_HEAD_INIT(0) 0, /* Header */ "catacomb.ECInfo", /* @tp_name@ */ sizeof(ecinfo_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1468,7 +1466,7 @@ static PyTypeObject ecinfo_pytype_skel = { ecinfo_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ - 0, /* @tp_iternexr@ */ + 0, /* @tp_iternext@ */ ecinfo_pymethods, /* @tp_methods@ */ 0, /* @tp_members@ */ ecinfo_pygetset, /* @tp_getset@ */ @@ -1488,12 +1486,12 @@ static PyTypeObject ecinfo_pytype_skel = { static PyMethodDef methods[] = { #define METHNAME(func) meth_##func - METH (_ECPt_frombuf, "frombuf(E, STR) -> (P, REST)") - METH (_ECPtCurve_fromraw, "fromraw(E, STR) -> (P, REST)") - METH (_ECPt_parse, "parse(E, STR) -> (P, REST)") - METH (_ECCurve_parse, "parse(STR) -> (E, REST)") - METH (_ECInfo_parse, "parse(STR) -> (I, REST)") - METH (_ECInfo__curven, "_curven(N) -> I") + METH (_ECPt_frombuf, "frombuf(E, STR) -> (P, REST)") + METH (_ECPtCurve_fromraw, "fromraw(E, STR) -> (P, REST)") + METH (_ECPt_parse, "parse(E, STR) -> (P, REST)") + METH (_ECCurve_parse, "parse(STR) -> (E, REST)") + METH (_ECInfo_parse, "parse(STR) -> (I, REST)") + METH (_ECInfo__curven, "_curven(N) -> I") #undef METHNAME { 0 } }; @@ -1529,7 +1527,7 @@ static PyObject *namedcurves(void) } c = PyInt_FromLong(i); found: - PyDict_SetItemString(d, (/*unconst*/ char *)ectab[i].name, c); + PyDict_SetItemString(d, (/*unconst*/ char *)p, c); Py_DECREF(c); } ncurves = i;