X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/62f9f6c4f3408ba29d555a7ed27658bbeae270c0..adee5628513e3567742418bf317b34e1a8c76f71:/ec.c diff --git a/ec.c b/ec.c index 184dc9e..03e9d16 100644 --- a/ec.c +++ b/ec.c @@ -48,13 +48,13 @@ ec_curve *eccurve_copy(ec_curve *c) return (0); a = F_OUT(f, MP_NEW, c->a); b = F_OUT(f, MP_NEW, c->b); - if (strcmp(EC_NAME(c), "prime") == 0) + if (STRCMP(EC_NAME(c), ==, "prime")) c = ec_prime(f, a, b); - else if (strcmp(EC_NAME(c), "primeproj") == 0) + else if (STRCMP(EC_NAME(c), ==, "primeproj")) c = ec_primeproj(f, a, b); - else if (strcmp(EC_NAME(c), "bin") == 0) + else if (STRCMP(EC_NAME(c), ==, "bin")) c = ec_bin(f, a, b); - else if (strcmp(EC_NAME(c), "binproj") == 0) + else if (STRCMP(EC_NAME(c), ==, "binproj")) c = ec_binproj(f, a, b); else c = 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); @@ -315,6 +311,81 @@ end: static PyObject *epget_curve(PyObject *me, void *hunoz) { RETURN_OBJ(ECPT_COBJ(me)); } +static PyObject *epmeth_frombuf(PyObject *me, PyObject *arg) +{ + buf b; + char *p; + Py_ssize_t sz; + PyObject *rc = 0; + ec pp = EC_INIT; + + 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), + bytestring_pywrapbuf(&b)); +end: + return (rc); +} + +static PyObject *epmeth_parse(PyObject *me, PyObject *arg) +{ + char *p; + qd_parse qd; + PyObject *rc = 0; + ec pp = EC_INIT; + + 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); +end: + return (rc); +} + +static PyObject *epmeth_fromraw(PyObject *me, PyObject *arg) +{ + char *p; + Py_ssize_t len; + buf b; + PyObject *rc = 0; + ec_curve *cc; + ec pp = EC_INIT; + + 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)) + VALERR("bad point"); + EC_IN(cc, &pp, &pp); + rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b)); +end: + return (rc); +} + +static PyObject *epmeth_os2ecp(PyObject *me, PyObject *arg, PyObject *kw) +{ + char *p; + Py_ssize_t len; + buf b; + PyObject *rc = 0; + ec_curve *cc; + unsigned f = EC_XONLY | EC_LSB | EC_SORT | EC_EXPLY; + ec pp = EC_INIT; + static const char *const kwlist[] = { "buf", "flags", 0 }; + + if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:os2ecp", KWLIST, + &p, &len, convuint, &f)) + return (0); + buf_init(&b, p, len); + cc = ECCURVE_C(me); + if (ec_os2ecp(cc, f, &b, &pp)) VALERR("bad point"); + EC_IN(cc, &pp, &pp); + rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b)); +end: + return (rc); +} + static PyObject *epncget_ix(PyObject *me, void *hunoz) { ec p = EC_INIT; @@ -555,7 +626,7 @@ end: return (0); } -static PyGetSetDef ecptnc_pygetset[] = { +static const PyGetSetDef ecptnc_pygetset[] = { #define GETSETNAME(op, name) epnc##op##_##name GET (ix, "P.ix -> integer x coordinate of P") GET (iy, "P.iy -> integer y coordinate of P") @@ -564,14 +635,16 @@ static PyGetSetDef ecptnc_pygetset[] = { { 0 } }; -static PyMethodDef ecptnc_pymethods[] = { +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 } }; -static PyNumberMethods ecpt_pynumber = { +static const PyNumberMethods ecpt_pynumber = { 0, /* @nb_add@ */ 0, /* @nb_subtract@ */ 0, /* @nb_multiply@ */ @@ -626,7 +699,7 @@ static PyTypeObject ecpt_pytype_skel = { 0, /* @tp_setattr@ */ 0, /* @tp_compare@ */ 0, /* @tp_repr@ */ - &ecpt_pynumber, /* @tp_as_number@ */ + PYNUMBER(ecpt), /* @tp_as_number@ */ 0, /* @tp_as_sequence@ */ 0, /* @tp_as_mapping@ */ ecpt_pyhash, /* @tp_hash@ */ @@ -640,9 +713,9 @@ static PyTypeObject ecpt_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"ECPt([X, [Y]]): elliptic curve points, not associated with any curve.\n\ - X alone may be None, an existing point, a string 'X, Y', an\n\ - x-coordinate, or a pair (X, Y); X and Y should be a coordinate pair.", + "ECPt([X, [Y]]): elliptic curve points, not associated with any curve.\n" + " X alone may be None, an existing point, a string 'X, Y', an\n" + " x-coordinate, or a pair (X, Y); X and Y should be a coordinate pair.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -650,9 +723,9 @@ static PyTypeObject ecpt_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - ecptnc_pymethods, /* @tp_methods@ */ + PYMETHODS(ecptnc), /* @tp_methods@ */ 0, /* @tp_members@ */ - ecptnc_pygetset, /* @tp_getset@ */ + PYGETSET(ecptnc), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -665,7 +738,7 @@ static PyTypeObject ecpt_pytype_skel = { 0 /* @tp_is_gc@ */ }; -static PyGetSetDef ecpt_pygetset[] = { +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") @@ -678,17 +751,19 @@ static PyGetSetDef ecpt_pygetset[] = { { 0 } }; -static PyMethodDef ecpt_pymethods[] = { +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 } }; -static PyNumberMethods ecptcurve_pynumber = { +static const PyNumberMethods ecptcurve_pynumber = { ecpt_pyadd, /* @nb_add@ */ ecpt_pysub, /* @nb_subtract@ */ ecpt_pymul, /* @nb_multiply@ */ @@ -743,7 +818,7 @@ static PyTypeObject ecptcurve_pytype_skel = { 0, /* @tp_setattr@ */ 0, /* @tp_compare@ */ 0, /* @tp_repr@ */ - &ecptcurve_pynumber, /* @tp_as_number@ */ + PYNUMBER(ecptcurve), /* @tp_as_number@ */ 0, /* @tp_as_sequence@ */ 0, /* @tp_as_mapping@ */ 0, /* @tp_hash@ */ @@ -757,7 +832,7 @@ static PyTypeObject ecptcurve_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"Elliptic curve points; abstract base class for points on given curves.", + "Elliptic curve points; abstract base class for points on given curves.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -765,9 +840,9 @@ static PyTypeObject ecptcurve_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - ecpt_pymethods, /* @tp_methods@ */ + PYMETHODS(ecpt), /* @tp_methods@ */ 0, /* @tp_members@ */ - ecpt_pygetset, /* @tp_getset@ */ + PYGETSET(ecpt), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -833,84 +908,6 @@ static PyObject *ecmeth_mmul(PyObject *me, PyObject *arg) ecmmul_id, ecmmul_fill, ecmmul_exp, ecmmul_drop)); } -static PyObject *meth__ECPtCurve_fromraw(PyObject *me, PyObject *arg) -{ - char *p; - Py_ssize_t len; - buf b; - PyObject *rc = 0; - ec_curve *cc; - ec pp = EC_INIT; - - if (!PyArg_ParseTuple(arg, "Os#:fromraw", &me, &p, &len)) - return (0); - buf_init(&b, p, len); - cc = ECCURVE_C(me); - if (ec_getraw(cc, &b, &pp)) - VALERR("bad point"); - EC_IN(cc, &pp, &pp); - rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b)); -end: - return (rc); -} - -static PyObject *meth__ECPtCurve_os2ecp(PyObject *me, - PyObject *arg, PyObject *kw) -{ - char *p; - Py_ssize_t len; - buf b; - PyObject *rc = 0; - 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 }; - - if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|O&:os2ecp", KWLIST, - &me, &p, &len, convuint, &f)) - return (0); - buf_init(&b, p, len); - cc = ECCURVE_C(me); - if (ec_os2ecp(cc, f, &b, &pp)) VALERR("bad point"); - EC_IN(cc, &pp, &pp); - rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b)); -end: - return (rc); -} - -static PyObject *meth__ECPt_frombuf(PyObject *me, PyObject *arg) -{ - buf b; - char *p; - Py_ssize_t sz; - PyObject *rc = 0; - ec pp = EC_INIT; - - if (!PyArg_ParseTuple(arg, "Os#:frombuf", &me, &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), - bytestring_pywrapbuf(&b)); -end: - return (rc); -} - -static PyObject *meth__ECPt_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; - qd.p = p; - qd.e = 0; - if (!ec_ptparse(&qd, &pp)) VALERR(qd.e); - rc = Py_BuildValue("(Ns)", ecpt_pywrapout(me, &pp), qd.p); -end: - return (rc); -} - static void eccurve_pydealloc(PyObject *me) { ec_destroycurve(ECCURVE_C(me)); @@ -954,6 +951,21 @@ static PyObject *ecmeth_rand(PyObject *me, PyObject *arg, PyObject *kw) return (ecpt_pywrap(me, &p)); } +static PyObject *ecmeth_parse(PyObject *me, PyObject *arg) +{ + char *p; + qd_parse qd; + ec_curve *c; + PyObject *rc = 0; + + 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); +end: + return (rc); +} + static PyObject *eccurve_dopywrap(PyTypeObject *ty, PyObject *fobj, ec_curve *c) { @@ -983,13 +995,13 @@ PyObject *eccurve_pywrap(PyObject *fobj, ec_curve *c) else Py_INCREF(fobj); assert(FIELD_F(fobj) == c->f); - if (strcmp(EC_NAME(c), "prime") == 0) + if (STRCMP(EC_NAME(c), ==, "prime")) ty = ecprimecurve_pytype; - else if (strcmp(EC_NAME(c), "primeproj") == 0) + else if (STRCMP(EC_NAME(c), ==, "primeproj")) ty = ecprimeprojcurve_pytype; - else if (strcmp(EC_NAME(c), "bin") == 0) + else if (STRCMP(EC_NAME(c), ==, "bin")) ty = ecbincurve_pytype; - else if (strcmp(EC_NAME(c), "binproj") == 0) + else if (STRCMP(EC_NAME(c), ==, "binproj")) ty = ecbinprojcurve_pytype; else abort(); @@ -1017,24 +1029,6 @@ end: return (cobj); } -static PyObject *meth__ECCurve_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; - qd.p = p; - qd.e = 0; - if ((c = ec_curveparse(&qd)) == 0) - VALERR(qd.e); - rc = eccurve_pywrap(0, c); -end: - return (rc); -} - static PyObject *ecget_name(PyObject *me, void *hunoz) { return (PyString_FromString(EC_NAME(ECCURVE_C(me)))); } @@ -1050,7 +1044,7 @@ static PyObject *ecget_field(PyObject *me, void *hunoz) static PyObject *ecget_inf(PyObject *me, void *hunoz) { ec inf = EC_INIT; return (ecpt_pywrap(me, &inf)); } -static PyGetSetDef eccurve_pygetset[] = { +static const PyGetSetDef eccurve_pygetset[] = { #define GETSETNAME(op, name) ec##op##_##name GET (name, "E.name -> name of this kind of curve") GET (a, "E.a -> first parameter of curve") @@ -1061,12 +1055,12 @@ static PyGetSetDef eccurve_pygetset[] = { { 0 } }; -static PyMethodDef eccurve_pymethods[] = { +static const PyMethodDef eccurve_pymethods[] = { #define METHNAME(name) ecmeth_##name - METH (mmul, "\ -E.mmul([(P0, N0), (P1, N1), ...]) = N0 P0 + N1 P1 + ...") + 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 } }; @@ -1096,7 +1090,7 @@ static PyTypeObject eccurve_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"An elliptic curve. Abstract class.", + "An elliptic curve. Abstract class.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -1104,9 +1098,9 @@ static PyTypeObject eccurve_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - eccurve_pymethods, /* @tp_methods@ */ + PYMETHODS(eccurve), /* @tp_methods@ */ 0, /* @tp_members@ */ - eccurve_pygetset, /* @tp_getset@ */ + PYGETSET(eccurve), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -1150,8 +1144,8 @@ static PyTypeObject ecprimecurve_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"ECPrimeCurve(FIELD, A, B): an elliptic curve over a prime field.\n\ - Use ECPrimeProjCurve instead.", + "ECPrimeCurve(FIELD, A, B): an elliptic curve over a prime field.\n" + " Use ECPrimeProjCurve instead.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -1205,8 +1199,8 @@ static PyTypeObject ecprimeprojcurve_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"ECPrimeProjCurve(FIELD, A, B): an elliptic curve over a prime field\n\ - using projective coordinates.", + "ECPrimeProjCurve(FIELD, A, B): an elliptic curve over a prime field\n" + " using projective coordinates.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -1260,8 +1254,8 @@ static PyTypeObject ecbincurve_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"ECBinCurve(FIELD, A, B): an elliptic curve over a binary field.\n\ - Use ECBinProjCurve instead.", + "ECBinCurve(FIELD, A, B): an elliptic curve over a binary field.\n" + " Use ECBinProjCurve instead.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -1315,8 +1309,8 @@ static PyTypeObject ecbinprojcurve_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"ECBinProjCurve(FIELD, A, B): an elliptic curve over a binary field,\n\ - using projective coordinates.", + "ECBinProjCurve(FIELD, A, B): an elliptic curve over a binary field,\n" + " using projective coordinates.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -1401,31 +1395,28 @@ 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; - qd.p = p; - qd.e = 0; - if (ec_infoparse(&qd, &ei)) - VALERR(qd.e); + 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); end: return (rc); } -static PyObject *meth__ECInfo__curven(PyObject *me, PyObject *arg) +static PyObject *eimeth__curven(PyObject *me, PyObject *arg) { int i; ec_info ei; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Oi:_curven", &me, &i)) goto end; + if (!PyArg_ParseTuple(arg, "i:_curven", &i)) goto end; if (i < 0 || i >= ncurves) VALERR("curve index out of range"); ec_infofromdata(&ei, ectab[i].data); rc = ecinfo_pywrap(&ei); @@ -1479,7 +1470,7 @@ static PyObject *eiget_r(PyObject *me, void *hunoz) static PyObject *eiget_h(PyObject *me, void *hunoz) { return (mp_pywrap(MP_COPY(ECINFO_EI(me)->h))); } -static PyGetSetDef ecinfo_pygetset[] = { +static const PyGetSetDef ecinfo_pygetset[] = { #define GETSETNAME(op, name) ei##op##_##name GET (curve, "I.curve -> the elliptic curve") GET (G, "I.G -> generator point for the group") @@ -1489,9 +1480,11 @@ static PyGetSetDef ecinfo_pygetset[] = { { 0 } }; -static PyMethodDef ecinfo_pymethods[] = { +static const PyMethodDef ecinfo_pymethods[] = { #define METHNAME(name) eimeth_##name KWMETH(check, "I.check([rng = rand]) -> None") + SMTH (parse, "parse(STR) -> (I, REST)") + SMTH (_curven, "_curven(N) -> I") #undef METHNAME { 0 } }; @@ -1521,7 +1514,7 @@ static PyTypeObject ecinfo_pytype_skel = { Py_TPFLAGS_BASETYPE, /* @tp_doc@ */ -"ECInfo(CURVE, G, R, H): elliptic curve domain parameters.", + "ECInfo(CURVE, G, R, H): elliptic curve domain parameters.", 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ @@ -1529,9 +1522,9 @@ static PyTypeObject ecinfo_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - ecinfo_pymethods, /* @tp_methods@ */ + PYMETHODS(ecinfo), /* @tp_methods@ */ 0, /* @tp_members@ */ - ecinfo_pygetset, /* @tp_getset@ */ + PYGETSET(ecinfo), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -1546,19 +1539,6 @@ static PyTypeObject ecinfo_pytype_skel = { /*----- Setup -------------------------------------------------------------*/ -static 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 - { 0 } -}; - void ec_pyinit(void) { INITTYPE(ecpt, root); @@ -1569,7 +1549,6 @@ void ec_pyinit(void) INITTYPE(ecbincurve, eccurve); INITTYPE(ecbinprojcurve, ecbincurve); INITTYPE(ecinfo, root); - addmethods(methods); } static PyObject *namedcurves(void)