X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/f281293ca70de172b275ecb3224ea36839f2f830..2a448f86048c26a24288d310b3bb70e8ae7e7528:/ec.c diff --git a/ec.c b/ec.c index 5dda00b..0644ea5 100644 --- a/ec.c +++ b/ec.c @@ -106,7 +106,7 @@ int getecpt(ec_curve *c, ec *d, PyObject *p) { if (toecpt(c, d, p)) { PyErr_Format(PyExc_TypeError, "can't convert %.100s to ecpt", - p->ob_type->tp_name); + Py_TYPE(p)->tp_name); return (-1); } return (0); @@ -225,29 +225,26 @@ end: return (rc); } -static PyObject *epmeth_oncurvep(PyObject *me, PyObject *arg) +static PyObject *epmeth_oncurvep(PyObject *me) { - if (!PyArg_ParseTuple(arg, ":oncurvep")) return (0); return (getbool(EC_ATINF(ECPT_P(me)) || !EC_CHECK(ECPT_C(me), ECPT_P(me)))); } -static PyObject *epmeth_dbl(PyObject *me, PyObject *arg) +static PyObject *epmeth_dbl(PyObject *me) { ec p = EC_INIT; - if (!PyArg_ParseTuple(arg, ":dbl")) return (0); EC_DBL(ECPT_C(me), &p, ECPT_P(me)); return (ecpt_pywrap(ECPT_COBJ(me), &p)); } -static PyObject *epmeth_tobuf(PyObject *me, PyObject *arg) +static PyObject *epmeth_tobuf(PyObject *me) { buf b; ec p = EC_INIT; PyObject *rc; size_t n; - if (!PyArg_ParseTuple(arg, ":tobuf")) return (0); getecptout(&p, me); if (EC_ATINF(&p)) n = 2; @@ -262,7 +259,7 @@ static PyObject *epmeth_tobuf(PyObject *me, PyObject *arg) return (rc); } -static PyObject *epmeth_toraw(PyObject *me, PyObject *arg) +static PyObject *epmeth_toraw(PyObject *me) { buf b; PyObject *rc; @@ -271,7 +268,6 @@ static PyObject *epmeth_toraw(PyObject *me, PyObject *arg) ec pp = EC_INIT; int len; - if (!PyArg_ParseTuple(arg, ":toraw")) return (0); len = c->f->noctets * 2 + 1; rc = bytestring_pywrap(0, len); p = PyString_AS_STRING(rc); @@ -312,10 +308,7 @@ end: return (rc); } -static PyObject *epget_curve(PyObject *me, void *hunoz) - { RETURN_OBJ(ECPT_COBJ(me)); } - -static PyObject *meth__ECPt_frombuf(PyObject *me, PyObject *arg) +static PyObject *epmeth_frombuf(PyObject *me, PyObject *arg) { buf b; char *p; @@ -323,7 +316,7 @@ static PyObject *meth__ECPt_frombuf(PyObject *me, PyObject *arg) PyObject *rc = 0; ec pp = EC_INIT; - if (!PyArg_ParseTuple(arg, "Os#:frombuf", &me, &p, &sz)) goto end; + if (!PyArg_ParseTuple(arg, "s#:frombuf", &p, &sz)) goto end; buf_init(&b, p, sz); if (buf_getec(&b, &pp)) VALERR("malformed data"); rc = Py_BuildValue("(NN)", ecpt_pywrapout(me, &pp), @@ -332,14 +325,14 @@ end: return (rc); } -static PyObject *meth__ECPt_parse(PyObject *me, PyObject *arg) +static PyObject *epmeth_parse(PyObject *me, PyObject *arg) { char *p; qd_parse qd; PyObject *rc = 0; ec pp = EC_INIT; - if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p)) goto end; + if (!PyArg_ParseTuple(arg, "s:parse", &p)) goto end; qd.p = p; qd.e = 0; if (!ec_ptparse(&qd, &pp)) VALERR(qd.e); rc = Py_BuildValue("(Ns)", ecpt_pywrapout(me, &pp), qd.p); @@ -347,7 +340,7 @@ end: return (rc); } -static PyObject *meth__ECPtCurve_fromraw(PyObject *me, PyObject *arg) +static PyObject *epmeth_fromraw(PyObject *me, PyObject *arg) { char *p; Py_ssize_t len; @@ -356,8 +349,7 @@ static PyObject *meth__ECPtCurve_fromraw(PyObject *me, PyObject *arg) ec_curve *cc; ec pp = EC_INIT; - if (!PyArg_ParseTuple(arg, "Os#:fromraw", &me, &p, &len)) - return (0); + if (!PyArg_ParseTuple(arg, "s#:fromraw", &me, &p, &len)) return (0); buf_init(&b, p, len); cc = ECCURVE_C(me); if (ec_getraw(cc, &b, &pp)) @@ -368,8 +360,7 @@ end: return (rc); } -static PyObject *meth__ECPtCurve_os2ecp(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *epmeth_os2ecp(PyObject *me, PyObject *arg, PyObject *kw) { char *p; Py_ssize_t len; @@ -378,10 +369,10 @@ static PyObject *meth__ECPtCurve_os2ecp(PyObject *me, ec_curve *cc; unsigned f = EC_XONLY | EC_LSB | EC_SORT | EC_EXPLY; ec pp = EC_INIT; - static const char *const kwlist[] = { "class", "buf", "flags", 0 }; + static const char *const kwlist[] = { "buf", "flags", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|O&:os2ecp", KWLIST, - &me, &p, &len, convuint, &f)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:os2ecp", KWLIST, + &p, &len, convuint, &f)) return (0); buf_init(&b, p, len); cc = ECCURVE_C(me); @@ -643,7 +634,9 @@ static const PyGetSetDef ecptnc_pygetset[] = { static const PyMethodDef ecptnc_pymethods[] = { #define METHNAME(func) epmeth_##func - METH (tobuf, "X.tobuf() -> BIN") + NAMETH(tobuf, "X.tobuf() -> BIN") + CMTH (frombuf, "frombuf(STR) -> (P, REST)") + CMTH (parse, "parse(STR) -> (P, REST)") #undef METHNAME { 0 } }; @@ -691,7 +684,7 @@ static const PyNumberMethods ecpt_pynumber = { 0, /* @nb_inplace_true_divide@ */ }; -static PyTypeObject ecpt_pytype_skel = { +static const PyTypeObject ecpt_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECPt", /* @tp_name@ */ sizeof(ecpt_pyobj), /* @tp_basicsize@ */ @@ -742,9 +735,16 @@ static PyTypeObject ecpt_pytype_skel = { 0 /* @tp_is_gc@ */ }; +static const PyMemberDef ecpt_pymembers[] = { +#define MEMBERSTRUCT ecpt_pyobj + MEMRNM(curve, T_OBJECT, ob_type, READONLY, + "P.curve -> elliptic curve containing P") +#undef MEMBERSTRUCT + { 0 } +}; + static const PyGetSetDef ecpt_pygetset[] = { #define GETSETNAME(op, name) ep##op##_##name - GET (curve, "P.curve -> elliptic curve containing P") GET (point, "P.point -> standalone curve point") GET (x, "P.x -> Cartesian x coordinate of P") GET (y, "P.y -> Cartesian y coordinate of P") @@ -757,10 +757,12 @@ static const PyGetSetDef ecpt_pygetset[] = { static const PyMethodDef ecpt_pymethods[] = { #define METHNAME(func) epmeth_##func - METH (toraw, "X.toraw() -> BIN") + NAMETH(toraw, "X.toraw() -> BIN") KWMETH(ec2osp, "X.ec2osp([flags = EC_EXPLY]) -> BIN") - METH (dbl, "X.dbl() -> X + X") - METH (oncurvep, "X.oncurvep() -> BOOL") + NAMETH(dbl, "X.dbl() -> X + X") + NAMETH(oncurvep, "X.oncurvep() -> BOOL") + CMTH (fromraw, "fromraw(STR) -> (P, REST)") + KWCMTH(os2ecp, "os2ecp(STR, [flags = ...]) -> (P, REST)") #undef METHNAME { 0 } }; @@ -808,7 +810,7 @@ static const PyNumberMethods ecptcurve_pynumber = { 0, /* @nb_inplace_true_divide@ */ }; -static PyTypeObject ecptcurve_pytype_skel = { +static const PyTypeObject ecptcurve_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECPtCurve", /* @tp_name@ */ sizeof(ecpt_pyobj), /* @tp_basicsize@ */ @@ -843,7 +845,7 @@ static PyTypeObject ecptcurve_pytype_skel = { 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ PYMETHODS(ecpt), /* @tp_methods@ */ - 0, /* @tp_members@ */ + PYMEMBERS(ecpt), /* @tp_members@ */ PYGETSET(ecpt), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ @@ -953,14 +955,14 @@ static PyObject *ecmeth_rand(PyObject *me, PyObject *arg, PyObject *kw) return (ecpt_pywrap(me, &p)); } -static PyObject *meth__ECCurve_parse(PyObject *me, PyObject *arg) +static PyObject *ecmeth_parse(PyObject *me, PyObject *arg) { char *p; qd_parse qd; ec_curve *c; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p)) goto end; + if (!PyArg_ParseTuple(arg, "s:parse", &p)) goto end; qd.p = p; qd.e = 0; if ((c = ec_curveparse(&qd)) == 0) VALERR(qd.e); rc = eccurve_pywrap(0, c); @@ -1062,11 +1064,12 @@ static const PyMethodDef eccurve_pymethods[] = { METH (mmul, "E.mmul([(P0, N0), (P1, N1), ...]) = N0 P0 + N1 P1 + ...") METH (find, "E.find(X) -> P") KWMETH(rand, "E.rand([rng = rand]) -> P") + SMTH (parse, "parse(STR) -> (E, REST)") #undef METHNAME { 0 } }; -static PyTypeObject eccurve_pytype_skel = { +static const PyTypeObject eccurve_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ @@ -1120,7 +1123,7 @@ static PyObject *ecprimecurve_pynew(PyTypeObject *ty, return (eccurve_pynew(ty, ec_prime, arg, kw)); } -static PyTypeObject ecprimecurve_pytype_skel = { +static const PyTypeObject ecprimecurve_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECPrimeCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ @@ -1175,7 +1178,7 @@ static PyObject *ecprimeprojcurve_pynew(PyTypeObject *ty, return (eccurve_pynew(ty, ec_primeproj, arg, kw)); } -static PyTypeObject ecprimeprojcurve_pytype_skel = { +static const PyTypeObject ecprimeprojcurve_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECPrimeProjCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ @@ -1230,7 +1233,7 @@ static PyObject *ecbincurve_pynew(PyTypeObject *ty, return (eccurve_pynew(ty, ec_bin, arg, kw)); } -static PyTypeObject ecbincurve_pytype_skel = { +static const PyTypeObject ecbincurve_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECBinCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ @@ -1285,7 +1288,7 @@ static PyObject *ecbinprojcurve_pynew(PyTypeObject *ty, return (eccurve_pynew(ty, ec_binproj, arg, kw)); } -static PyTypeObject ecbinprojcurve_pytype_skel = { +static const PyTypeObject ecbinprojcurve_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECBinProjCurve", /* @tp_name@ */ sizeof(eccurve_pyobj), /* @tp_basicsize@ */ @@ -1336,8 +1339,6 @@ static PyTypeObject ecbinprojcurve_pytype_skel = { /*----- Curve info --------------------------------------------------------*/ -static int ncurves = -1; - void ecinfo_copy(ec_info *eic, const ec_info *ei) { eic->c = eccurve_copy(ei->c); @@ -1396,14 +1397,14 @@ end: return (0); } -static PyObject *meth__ECInfo_parse(PyObject *me, PyObject *arg) +static PyObject *eimeth_parse(PyObject *me, PyObject *arg) { char *p; qd_parse qd; ec_info ei; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p)) goto end; + if (!PyArg_ParseTuple(arg, "s:parse", &p)) goto end; qd.p = p; qd.e = 0; if (ec_infoparse(&qd, &ei)) VALERR(qd.e); rc = Py_BuildValue("(Ns)", ecinfo_pywrap(&ei), qd.p); @@ -1411,20 +1412,6 @@ end: return (rc); } -static PyObject *meth__ECInfo__curven(PyObject *me, PyObject *arg) -{ - int i; - ec_info ei; - PyObject *rc = 0; - - if (!PyArg_ParseTuple(arg, "Oi:_curven", &me, &i)) goto end; - if (i < 0 || i >= ncurves) VALERR("curve index out of range"); - ec_infofromdata(&ei, ectab[i].data); - rc = ecinfo_pywrap(&ei); -end: - return (rc); -} - static PyObject *ecinfo_pyrichcompare(PyObject *x, PyObject *y, int op) { int b = ec_sameinfop(ECINFO_EI(x), ECINFO_EI(y)); @@ -1484,11 +1471,12 @@ static const PyGetSetDef ecinfo_pygetset[] = { static const PyMethodDef ecinfo_pymethods[] = { #define METHNAME(name) eimeth_##name KWMETH(check, "I.check([rng = rand]) -> None") + SMTH (parse, "parse(STR) -> (I, REST)") #undef METHNAME { 0 } }; -static PyTypeObject ecinfo_pytype_skel = { +static const PyTypeObject ecinfo_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "ECInfo", /* @tp_name@ */ sizeof(ecinfo_pyobj), /* @tp_basicsize@ */ @@ -1538,16 +1526,9 @@ static PyTypeObject ecinfo_pytype_skel = { /*----- Setup -------------------------------------------------------------*/ -static const PyMethodDef methods[] = { -#define METHNAME(func) meth_##func - METH (_ECPt_frombuf, "frombuf(E, STR) -> (P, REST)") - METH (_ECPtCurve_fromraw, "fromraw(E, STR) -> (P, REST)") - KWMETH(_ECPtCurve_os2ecp, "os2ecp(E, STR, [flags = ...]) -> (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 +static const struct nameval consts[] = { + CONST(EC_XONLY), CONST(EC_YBIT), CONST(EC_LSB), + CONST(EC_CMPR), CONST(EC_EXPLY), CONST(EC_SORT), { 0 } }; @@ -1561,32 +1542,27 @@ void ec_pyinit(void) INITTYPE(ecbincurve, eccurve); INITTYPE(ecbinprojcurve, ecbincurve); INITTYPE(ecinfo, root); - addmethods(methods); } -static PyObject *namedcurves(void) +static const char *ec_namefn(const void *p) + { const ecentry *ec = p; return (ec->name); } + +static int ec_ixfn(const void *p) { - int i, j; - const char *p; - PyObject *d, *c; - - d = PyDict_New(); - for (i = 0; ectab[i].name; i++) { - p = ectab[i].name; - for (j = 0; j < i; j++) { - if (ectab[i].data == ectab[j].data) { - c = PyDict_GetItemString(d, (/*unconst*/ char *)ectab[j].name); - Py_INCREF(c); - goto found; - } - } - c = PyInt_FromLong(i); - found: - PyDict_SetItemString(d, (/*unconst*/ char *)p, c); - Py_DECREF(c); - } - ncurves = i; - return (d); + const ecentry *ec = p; + int i; + + for (i = 0; ectab[i].name; i++) + if (ectab[i].data == ec->data) return (i); + return (-1); +} + +static PyObject *ec_valfn(int i) +{ + ec_info ei; + + ec_infofromdata(&ei, ectab[i].data); + return (ecinfo_pywrap(&ei)); } void ec_pyinsert(PyObject *mod) @@ -1599,7 +1575,9 @@ void ec_pyinsert(PyObject *mod) INSERT("ECBinCurve", ecbincurve_pytype); INSERT("ECBinProjCurve", ecbinprojcurve_pytype); INSERT("ECInfo", ecinfo_pytype); - INSERT("_eccurves", namedcurves()); + INSERT("eccurves", make_grouptab(ectab, sizeof(*ectab), + ec_namefn, ec_ixfn, ec_valfn)); + setconstants(mod, consts); } /*----- That's all, folks -------------------------------------------------*/