From a157093f4bbc3066fea2f77078b99489c76e62f8 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Tue, 19 Nov 2019 00:19:38 +0000 Subject: [PATCH] *.c: Use Python's facilities for defining class and static methods. These weren't available when this library was first written, but the workaround is rather ugly and no longer necessary. --- algorithms.c | 48 +++++++++++-------- bytestring.c | 14 ++++-- catacomb/__init__.py | 13 ----- ec.c | 55 +++++++++------------ field.c | 13 ++--- group.c | 133 ++++++++++++++++++++++++++------------------------- key.c | 35 +++++--------- mp.c | 103 +++++++++++++++++++-------------------- pgen.c | 12 ++--- pubkey.c | 15 +++--- pyke/pyke.h | 20 ++++---- rand.c | 20 +++----- 12 files changed, 221 insertions(+), 260 deletions(-) diff --git a/algorithms.c b/algorithms.c index 651ee52..ad9fe9c 100644 --- a/algorithms.c +++ b/algorithms.c @@ -223,10 +223,10 @@ static const PyMemberDef keysz_pymembers[] = { }; #define KSZCONVOP(op) \ - static PyObject *meth__KeySZ_##op(PyObject *me, PyObject *arg) \ + static PyObject *kszmeth_##op(PyObject *me, PyObject *arg) \ { \ double x, y; \ - if (!PyArg_ParseTuple(arg, "Od:" #op, &me, &x)) return (0); \ + if (!PyArg_ParseTuple(arg, "d:" #op, &x)) return (0); \ y = keysz_##op(x); \ return (PyFloat_FromDouble(y)); \ } @@ -240,6 +240,30 @@ KSZCONVOP(toif) KSZCONVOP(toec) #undef KSZCONVOP +static const PyMethodDef keysz_pymethods[] = { +#define METHNAME(name) kszmeth_##name + SMTH (fromdl, "fromdl(N) -> M: " + "convert integer discrete log field size to work factor") + SMTH (fromschnorr, "fromschnorr(N) -> M: " + "convert Schnorr group order to work factor") + SMTH (fromif, "fromif(N) -> M: " + "convert integer factorization problem size to work factor") + SMTH (fromec, "fromec(N) -> M: " + "convert elliptic curve group order to work factor") + SMTH (todl, "todl(N) -> M: " + "convert work factor to integer discrete log field size") + SMTH (toschnorr, "toschnorr(N) -> M: " + "convert work factor to Schnorr group order") + SMTH (toif, "toif(N) -> M: " + "convert work factor to integer factorization problem size") + SMTH (toec, "toec(N) -> M: " + "convert work factor to elliptic curve group order") + SMTH (toec, "toec(N) -> M: " + "convert work factor to elliptic curve group order") +#undef METHNAME + { 0 } +}; + static const PyGetSetDef keyszany_pygetset[] = { #define GETSETNAME(op, name) ka##op##_##name GET (min, "KSZ.min -> smallest allowed key size") @@ -306,7 +330,7 @@ static PyTypeObject keysz_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - 0, /* @tp_methods@ */ + PYMETHODS(keysz), /* @tp_methods@ */ PYMEMBERS(keysz), /* @tp_members@ */ 0, /* @tp_getset@ */ 0, /* @tp_base@ */ @@ -3582,24 +3606,6 @@ static PyTypeObject gprp_pytype_skel = { static const PyMethodDef methods[] = { #define METHNAME(func) meth_##func - METH (_KeySZ_fromdl, "fromdl(N) -> M: " - "convert integer discrete log field size to work factor") - METH (_KeySZ_fromschnorr, "fromschnorr(N) -> M: " - "convert Schnorr group order to work factor") - METH (_KeySZ_fromif, "fromif(N) -> M: " - "convert integer factorization problem size to work factor") - METH (_KeySZ_fromec, "fromec(N) -> M: " - "convert elliptic curve group order to work factor") - METH (_KeySZ_todl, "todl(N) -> M: " - "convert work factor to integer discrete log field size") - METH (_KeySZ_toschnorr, "toschnorr(N) -> M: " - "convert work factor to Schnorr group order") - METH (_KeySZ_toif, "toif(N) -> M: " - "convert work factor to integer factorization problem size") - METH (_KeySZ_toec, "toec(N) -> M: " - "convert work factor to elliptic curve group order") - METH (_KeySZ_toec, "toec(N) -> M: " - "convert work factor to elliptic curve group order") #define METH_HDANCE(hdance, HDance) METH(hdance##_prf, \ "" #hdance "_prf(K, N) -> H: calculate " HDance " hash of N with K") METH_HDANCE(hsalsa20, "HSalsa20") diff --git a/bytestring.c b/bytestring.c index 2468ea2..95da629 100644 --- a/bytestring.c +++ b/bytestring.c @@ -96,11 +96,11 @@ end: return (0); } -static PyObject *meth__ByteString_zero(PyObject *me, PyObject *arg) +static PyObject *bymeth_zero(PyObject *me, PyObject *arg) { size_t sz; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "OO&:zero", &me, convszt, &sz)) goto end; + if (!PyArg_ParseTuple(arg, "O&:zero", convszt, &sz)) goto end; rc = bytestring_pywrap(0, sz); memset(PyString_AS_STRING(rc), 0, sz); end: @@ -265,6 +265,13 @@ BINOP(xor, ^) } UNOP(not, ~) +static const PyMethodDef bytestring_pymethods[] = { +#define METHNAME(name) bymeth_##name + SMTH (zero, "zero(N) -> 0000...00") +#undef METHNAME + { 0 } +}; + static const PyNumberMethods bytestring_pynumber = { 0, /* @nb_add@ */ 0, /* @nb_subtract@ */ @@ -344,7 +351,7 @@ static PyTypeObject bytestring_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - 0, /* @tp_methods@ */ + PYMETHODS(bytestring), /* @tp_methods@ */ 0, /* @tp_members@ */ 0, /* @tp_getset@ */ 0, /* @tp_base@ */ @@ -364,7 +371,6 @@ static PyTypeObject bytestring_pytype_skel = { static const PyMethodDef methods[] = { #define METHNAME(func) meth_##func METH (ctstreq, "ctstreq(S, T) -> BOOL") - METH (_ByteString_zero, "zero(N) -> 0000...00") #undef METHNAME { 0 } }; diff --git a/catacomb/__init__.py b/catacomb/__init__.py index 65695bb..0996c5c 100644 --- a/catacomb/__init__.py +++ b/catacomb/__init__.py @@ -99,19 +99,6 @@ def _init(): for i in b: if i[0] != '_': d[i] = b[i]; - for i in ['ByteString', - 'MP', 'GF', 'Field', - 'ECPt', 'ECPtCurve', 'ECCurve', 'ECInfo', - 'DHInfo', 'BinDHInfo', 'RSAPriv', 'BBSPriv', - 'PrimeFilter', 'RabinMiller', - 'Group', 'GE', - 'KeySZ', 'KeyData']: - c = d[i] - pre = '_' + i + '_' - plen = len(pre) - for j in b: - if j[:plen] == pre: - setattr(c, j[plen:], classmethod(b[j])) for i in [gcciphers, gcaeads, gchashes, gcmacs, gcprps]: for c in i.itervalues(): d[_fixname(c.name)] = c diff --git a/ec.c b/ec.c index 5dda00b..bcf5531 100644 --- a/ec.c +++ b/ec.c @@ -315,7 +315,7 @@ end: 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 +323,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 +332,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 +347,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 +356,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 +367,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 +376,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); @@ -644,6 +642,8 @@ static const PyGetSetDef ecptnc_pygetset[] = { static const PyMethodDef ecptnc_pymethods[] = { #define METHNAME(func) epmeth_##func METH (tobuf, "X.tobuf() -> BIN") + CMTH (frombuf, "frombuf(STR) -> (P, REST)") + CMTH (parse, "parse(STR) -> (P, REST)") #undef METHNAME { 0 } }; @@ -761,6 +761,8 @@ static const PyMethodDef ecpt_pymethods[] = { KWMETH(ec2osp, "X.ec2osp([flags = EC_EXPLY]) -> BIN") METH (dbl, "X.dbl() -> X + X") METH (oncurvep, "X.oncurvep() -> BOOL") + CMTH (fromraw, "fromraw(STR) -> (P, REST)") + KWCMTH(os2ecp, "os2ecp(STR, [flags = ...]) -> (P, REST)") #undef METHNAME { 0 } }; @@ -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,6 +1064,7 @@ 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 } }; @@ -1396,14 +1399,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,13 +1414,13 @@ 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); @@ -1484,6 +1487,8 @@ 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)") + SMTH (_curven, "_curven(N) -> I") #undef METHNAME { 0 } }; @@ -1538,19 +1543,6 @@ 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 - { 0 } -}; - void ec_pyinit(void) { INITTYPE(ecpt, root); @@ -1561,7 +1553,6 @@ void ec_pyinit(void) INITTYPE(ecbincurve, eccurve); INITTYPE(ecbinprojcurve, ecbincurve); INITTYPE(ecinfo, root); - addmethods(methods); } static PyObject *namedcurves(void) diff --git a/field.c b/field.c index 7fc1f9d..51864d0 100644 --- a/field.c +++ b/field.c @@ -472,14 +472,14 @@ static PyObject *fmeth__adopt(PyObject *me, PyObject *arg) return (fe_pywrap(me, xx)); } -static PyObject *meth__Field_parse(PyObject *me, PyObject *arg) +static PyObject *fmeth_parse(PyObject *me, PyObject *arg) { field *f; char *p; PyObject *rc = 0; qd_parse qd; - 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 ((f = field_parse(&qd)) == 0) VALERR(qd.e); rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p); @@ -531,6 +531,7 @@ static const PyMethodDef field_pymethods[] = { #define METHNAME(name) fmeth_##name METH (_adopt, "F._adopt(X) -> FE") KWMETH(rand, "F.rand([rng = rand]) -> FE, uniformly distributed") + SMTH (parse, "parse(STR) -> F, REST") #undef METHNAME { 0 } }; @@ -939,13 +940,6 @@ static PyTypeObject binnormfield_pytype_skel = { /*----- Setup -------------------------------------------------------------*/ -static const PyMethodDef methods[] = { -#define METHNAME(func) meth_##func - METH (_Field_parse, "parse(STR) -> F, REST") -#undef METHNAME - { 0 } -}; - void field_pyinit(void) { INITTYPE(fe, root); @@ -955,7 +949,6 @@ void field_pyinit(void) INITTYPE(binfield, field); INITTYPE(binpolyfield, binfield); INITTYPE(binnormfield, binfield); - addmethods(methods); } void field_pyinsert(PyObject *mod) diff --git a/group.c b/group.c index 727e0b0..254f8ce 100644 --- a/group.c +++ b/group.c @@ -94,8 +94,7 @@ static void fginfo_pydealloc(PyObject *me) FREEOBJ(me); } -static PyObject *meth__DHInfo_generate(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *dimeth_generate(PyObject *me, PyObject *arg, PyObject *kw) { dh_param dp; unsigned ql = 0, pl; @@ -104,12 +103,12 @@ static PyObject *meth__DHInfo_generate(PyObject *me, struct excinfo exc = EXCINFO_INIT; pypgev evt = { { 0 } }; static const char *const kwlist[] = - { "class", "pbits", "qbits", "event", "rng", "nsteps", 0 }; + { "pbits", "qbits", "event", "rng", "nsteps", 0 }; PyObject *rc = 0; evt.exc = &exc; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&|O&O&O&O&:generate", KWLIST, - &me, convuint, &pl, convuint, &ql, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&O&O&O&:generate", KWLIST, + convuint, &pl, convuint, &ql, convpgev, &evt, convgrand, &r, convuint, &steps)) goto end; @@ -121,8 +120,7 @@ end: return (rc); } -static PyObject *meth__DHInfo_genlimlee(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *dimeth_genlimlee(PyObject *me, PyObject *arg, PyObject *kw) { dh_param dp; unsigned ql, pl; @@ -133,7 +131,7 @@ static PyObject *meth__DHInfo_genlimlee(PyObject *me, int subgroupp = 1; unsigned f = 0; static const char *const kwlist[] = { - "class", "pbits", "qbits", "event", "ievent", + "pbits", "qbits", "event", "ievent", "rng", "nsteps", "subgroupp", 0 }; size_t i, nf; @@ -142,8 +140,8 @@ static PyObject *meth__DHInfo_genlimlee(PyObject *me, oe.exc = ie.exc = &exc; if (!PyArg_ParseTupleAndKeywords(arg, kw, - "OO&O&|O&O&O&O&O&:genlimlee", KWLIST, - &me, convuint, &pl, convuint, &ql, + "O&O&|O&O&O&O&O&:genlimlee", KWLIST, + convuint, &pl, convuint, &ql, convpgev, &oe, convpgev, &ie, convgrand, &r, convuint, &steps, convbool, &subgroupp)) @@ -162,8 +160,7 @@ end: return (rc); } -static PyObject *meth__DHInfo_genkcdsa(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *dimeth_genkcdsa(PyObject *me, PyObject *arg, PyObject *kw) { dh_param dp; unsigned ql, pl; @@ -172,13 +169,13 @@ static PyObject *meth__DHInfo_genkcdsa(PyObject *me, struct excinfo exc = EXCINFO_INIT; pypgev evt = { { 0 } }; static const char *const kwlist[] = - { "class", "pbits", "qbits", "event", "rng", "nsteps", 0 }; + { "pbits", "qbits", "event", "rng", "nsteps", 0 }; mp *v = MP_NEW; PyObject *rc = 0; evt.exc = &exc; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&|O&O&O&:genkcdsa", KWLIST, - &me, convuint, &pl, convuint, &ql, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&O&:genkcdsa", KWLIST, + convuint, &pl, convuint, &ql, convpgev, &evt, convgrand, &r, convuint, &steps)) goto end; @@ -193,8 +190,7 @@ end: return (rc); } -static PyObject *meth__DHInfo_gendsa(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *dimeth_gendsa(PyObject *me, PyObject *arg, PyObject *kw) { dsa_param dp; unsigned ql, pl; @@ -205,12 +201,12 @@ static PyObject *meth__DHInfo_gendsa(PyObject *me, struct excinfo exc = EXCINFO_INIT; pypgev evt = { { 0 } }; static const char *const kwlist[] = - { "class", "pbits", "qbits", "seed", "event", "nsteps", 0 }; + { "pbits", "qbits", "seed", "event", "nsteps", 0 }; PyObject *rc = 0; evt.exc = &exc; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&s#|O&O&:gendsa", KWLIST, - &me, convuint, &pl, convuint, &ql, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&s#|O&O&:gendsa", KWLIST, + convuint, &pl, convuint, &ql, &k, &ksz, convpgev, &evt, convuint, &steps)) goto end; @@ -258,7 +254,7 @@ static PyObject *meth__groupn(PyObject *me, PyObject *arg, gprime_param gp; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Oi:_groupn", &me, &i)) goto end; + if (!PyArg_ParseTuple(arg, "i:_groupn", &i)) goto end; if (i < 0 || i >= ne) VALERR("group index out of range"); dh_infofromdata(&gp, pp[i].data); rc = fginfo_pywrap(&gp, ty); @@ -266,10 +262,10 @@ end: return (rc); } -static PyObject *meth__DHInfo__groupn(PyObject *me, PyObject *arg) +static PyObject *dimeth__groupn(PyObject *me, PyObject *arg) { return (meth__groupn(me, arg, dhinfo_pytype, ptab, npgroups)); } -static PyObject *meth__BinDHInfo__groupn(PyObject *me, PyObject *arg) +static PyObject *bimeth__groupn(PyObject *me, PyObject *arg) { return (meth__groupn(me, arg, bindhinfo_pytype, bintab, nbingroups)); } static PyObject *meth__parse(PyObject *me, PyObject *arg, PyTypeObject *ty, @@ -280,7 +276,7 @@ static PyObject *meth__parse(PyObject *me, PyObject *arg, PyTypeObject *ty, gprime_param gp; 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 (parse(&qd, &gp)) VALERR(qd.e); rc = fginfo_pywrap(&gp, ty); @@ -288,10 +284,10 @@ end: return (rc); } -static PyObject *meth__DHInfo_parse(PyObject *me, PyObject *arg) +static PyObject *dimeth_parse(PyObject *me, PyObject *arg) { return (meth__parse(me, arg, dhinfo_pytype, dh_parse)); } -static PyObject *meth__BinDHInfo_parse(PyObject *me, PyObject *arg) +static PyObject *bimeth_parse(PyObject *me, PyObject *arg) { return (meth__parse(me, arg, bindhinfo_pytype, dhbin_parse)); } static const PyGetSetDef fginfo_pygetset[] = { @@ -309,6 +305,29 @@ static const PyGetSetDef dhinfo_pygetset[] = { { 0 } }; +static const PyMethodDef dhinfo_pymethods[] = { +#define METHNAME(name) dimeth_##name + SMTH (parse, "parse(STR) -> D, REST") + SMTH (_groupn, 0) + KWSMTH(generate, + "generate(PBITS, [qbits = 0], [event = pgen_nullev],\n" + " [rng = rand], [nsteps = 0]) -> D") + KWSMTH(genlimlee, + "genlimlee(PBITS, QBITS, [event = pgen_nullev], " + "[ievent = pgen_nullev],\n" + " [rng = rand], [nsteps = 0], [subgroupp = True]) " + "-> (D, [Q, ...])") + KWSMTH(gendsa, + "gendsa(PBITS, QBITS, SEED, [event = pgen_nullev], [nsteps = 0])\n" + " -> (D, SEED, COUNT)") + KWSMTH(genkcdsa, + "gendsa(PBITS, QBITS, [event = pgen_nullev], " + "[rng = rand], [nsteps = 0])\n" + " -> (D, V)") +#undef METHNAME + { 0 } +}; + static const PyGetSetDef bindhinfo_pygetset[] = { #define GETSETNAME(op, name) bi##op##_##name GET (p, "I.p -> irreducible polynomial") @@ -318,6 +337,14 @@ static const PyGetSetDef bindhinfo_pygetset[] = { { 0 } }; +static const PyMethodDef bindhinfo_pymethods[] = { +#define METHNAME(name) bimeth_##name + SMTH (parse, "parse(STR) -> D, REST") + SMTH (_groupn, 0) +#undef METHNAME + { 0 } +}; + static PyTypeObject fginfo_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ "FGInfo", /* @tp_name@ */ @@ -399,7 +426,7 @@ static PyTypeObject dhinfo_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - 0, /* @tp_methods@ */ + PYMETHODS(dhinfo), /* @tp_methods@ */ 0, /* @tp_members@ */ PYGETSET(dhinfo), /* @tp_getset@ */ 0, /* @tp_base@ */ @@ -447,7 +474,7 @@ static PyTypeObject bindhinfo_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - 0, /* @tp_methods@ */ + PYMETHODS(bindhinfo), /* @tp_methods@ */ 0, /* @tp_members@ */ PYGETSET(bindhinfo), /* @tp_getset@ */ 0, /* @tp_base@ */ @@ -845,7 +872,7 @@ end: return (0); } -static PyObject *meth__GE_frombuf(PyObject *me, PyObject *arg) +static PyObject *gemeth_frombuf(PyObject *me, PyObject *arg) { buf b; char *p; @@ -853,7 +880,7 @@ static PyObject *meth__GE_frombuf(PyObject *me, PyObject *arg) group *g; ge *x = 0; - if (!PyArg_ParseTuple(arg, "Os#:frombuf", &me, &p, &n)) return (0); + if (!PyArg_ParseTuple(arg, "s#:frombuf", &p, &n)) return (0); g = GROUP_G(me); buf_init(&b, p, n); x = G_CREATE(g); @@ -864,7 +891,7 @@ end: return (0); } -static PyObject *meth__GE_fromraw(PyObject *me, PyObject *arg) +static PyObject *gemeth_fromraw(PyObject *me, PyObject *arg) { buf b; char *p; @@ -872,7 +899,7 @@ static PyObject *meth__GE_fromraw(PyObject *me, PyObject *arg) group *g; ge *x = 0; - if (!PyArg_ParseTuple(arg, "Os#:fromraw", &me, &p, &n)) return (0); + if (!PyArg_ParseTuple(arg, "s#:fromraw", &p, &n)) return (0); g = GROUP_G(me); buf_init(&b, p, n); x = G_CREATE(g); @@ -883,7 +910,7 @@ end: return (0); } -static PyObject *meth__GE_fromstring(PyObject *me, PyObject *arg) +static PyObject *gemeth_fromstring(PyObject *me, PyObject *arg) { mptext_stringctx sc; char *p; @@ -891,7 +918,7 @@ static PyObject *meth__GE_fromstring(PyObject *me, PyObject *arg) group *g; ge *x = 0; - if (!PyArg_ParseTuple(arg, "Os#:fromstring", &me, &p, &n)) return (0); + if (!PyArg_ParseTuple(arg, "s#:fromstring", &p, &n)) return (0); sc.buf = p; sc.lim = sc.buf + n; g = GROUP_G(me); @@ -905,13 +932,13 @@ end: return (0); } -static PyObject *meth__Group_parse(PyObject *me, PyObject *arg) +static PyObject *gmeth_parse(PyObject *me, PyObject *arg) { char *p; qd_parse qd; group *g; - 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 ((g = group_parse(&qd)) == 0) VALERR(qd.e); return (group_pywrap(g)); @@ -977,6 +1004,9 @@ static const PyMethodDef ge_pymethods[] = { "X converted to elliptic curve point") METH (tobuf, "X.tobuf() -> X in buffer representation") METH (toraw, "X.toraw() -> X in raw representation") + CMTH (frombuf, "frombuf(BUF) -> X, REST") + CMTH (fromraw, "fromraw(BUF) -> X, REST") + CMTH (fromstring, "fromstring(STR) -> X, REST") #undef METHNAME { 0 } }; @@ -1089,6 +1119,7 @@ static const PyMethodDef group_pymethods[] = { #define METHNAME(name) gmeth_##name METH (mexp, "G.mexp([(X0, N0), (X1, N1), ...]) -> X0^N0 X1^N1 ...") KWMETH(checkgroup, "G.checkgroup([rng = rand]): check group is good") + SMTH (parse, "parse(STR) -> G, REST") #undef METHNAME { 0 } }; @@ -1375,35 +1406,6 @@ static PyTypeObject ecgroup_pytype_skel = { /*----- Global stuff ------------------------------------------------------*/ -static const PyMethodDef methods[] = { -#define METHNAME(name) meth_##name - METH (_GE_frombuf, "frombuf(BUF) -> X, REST") - METH (_GE_fromraw, "fromraw(BUF) -> X, REST") - METH (_GE_fromstring, "fromstring(STR) -> X, REST") - METH (_Group_parse, "parse(STR) -> G, REST") - METH (_DHInfo_parse, "parse(STR) -> D, REST") - METH (_BinDHInfo_parse, "parse(STR) -> D, REST") - METH (_DHInfo__groupn, 0) - METH (_BinDHInfo__groupn, 0) - KWMETH(_DHInfo_generate, - "generate(PBITS, [qbits = 0, event = pgen_nullev,\n" - " rng = rand, nsteps = 0]) -> D") - KWMETH(_DHInfo_genlimlee, - "genlimlee(PBITS, QBITS, [event = pgen_nullev], " - "[ievent = pgen_nullev],\n" - " [rng = rand], [nsteps = 0], [subgroupp = True]) " - "-> (D, [Q, ...])") - KWMETH(_DHInfo_gendsa, - "gendsa(PBITS, QBITS, SEED, [event = pgen_nullev], [nsteps = 0])\n" - " -> (D, SEED, COUNT)") - KWMETH(_DHInfo_genkcdsa, - "gendsa(PBITS, QBITS, [event = pgen_nullev], " - "[rng = rand], [nsteps = 0])\n" - " -> (D, V)") -#undef METHNAME - { 0 } -}; - void group_pyinit(void) { INITTYPE(fginfo, root); @@ -1414,7 +1416,6 @@ void group_pyinit(void) INITTYPE(primegroup, group); INITTYPE(bingroup, group); INITTYPE(ecgroup, group); - addmethods(methods); } void group_pyinsert(PyObject *mod) diff --git a/key.c b/key.c index a2ffb0a..5f097f0 100644 --- a/key.c +++ b/key.c @@ -275,7 +275,7 @@ end: return (rc); } -static PyObject *meth__KeyData_readflags(PyObject *me, PyObject *arg) +static PyObject *kdmeth_readflags(PyObject *me, PyObject *arg) { const char *p; char *end; @@ -283,21 +283,20 @@ static PyObject *meth__KeyData_readflags(PyObject *me, PyObject *arg) PyObject *rc = 0; int err; - if (!PyArg_ParseTuple(arg, "Os:key_readflags", &me, &p)) goto end; + if (!PyArg_ParseTuple(arg, "s:readflags", &p)) goto end; if ((err = key_readflags(p, &end, &f, &m)) != 0) KEYERR(err); rc = Py_BuildValue("(NNs)", getulong(f), getulong(m), end); end: return (rc); } -static PyObject *meth__KeyData_writeflags(PyObject *me, PyObject *arg) +static PyObject *kdmeth_writeflags(PyObject *me, PyObject *arg) { dstr d = DSTR_INIT; PyObject *rc; unsigned f; - if (!PyArg_ParseTuple(arg, "OO&:key_writeflags", &me, convuint, &f)) - return (0); + if (!PyArg_ParseTuple(arg, "O&:key_writeflags", convuint, &f)) return (0); key_writeflags(f, &d); rc = PyString_FromStringAndSize(d.buf, d.len); dstr_destroy(&d); @@ -426,28 +425,28 @@ end: return (rc); } -static PyObject *meth__KeyData_read(PyObject *me, PyObject *arg) +static PyObject *kdmeth_read(PyObject *me, PyObject *arg) { const char *p; char *end; key_data *kd; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Os:read", &me, &p)) goto end; + if (!PyArg_ParseTuple(arg, "s:read", &p)) goto end; if ((kd = key_read(p, &end)) == 0) KEYERR(KERR_MALFORMED); rc = Py_BuildValue("(Ns)", keydata_pywrap(kd), end); end: return (rc); } -static PyObject *meth__KeyData_decode(PyObject *me, PyObject *arg) +static PyObject *kdmeth_decode(PyObject *me, PyObject *arg) { const char *p; Py_ssize_t n; key_data *kd; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "Os#:decode", &me, &p, &n)) goto end; + if (!PyArg_ParseTuple(arg, "s#:decode", &p, &n)) goto end; if ((kd = key_decode(p, n)) == 0) KEYERR(KERR_MALFORMED); rc = keydata_pywrap(kd); end: @@ -466,6 +465,10 @@ static const PyMethodDef keydata_pymethods[] = { KWMETH(copy, "KD.copy([filter = ]) -> KD") METH (plock, "KD.plock(TAG) -> ENCRYPTED-KD") METH (lock, "KD.lock(KEY) -> ENCRYPTED-KD") + SMTH (readflags, "readflags(STRING) -> (FLAGS, MASK, REST)") + SMTH (writeflags, "writeflags(FLAGS) -> STRING") + SMTH (read, "read(STRING) -> (KD, REST)") + SMTH (decode, "decode(BYTES) -> KD") #undef METHNAME { 0 } }; @@ -2064,19 +2067,6 @@ static PyTypeObject keyfile_pytype_skel = { 0 /* @tp_is_gc@ */ }; -/*----- Global stuff ------------------------------------------------------*/ - -static PyMethodDef methods[] = { -#define METHNAME(func) meth_##func - METH (_KeyData_readflags, "KeyData.readflags(STRING) " - "-> (FLAGS, MASK, REST)") - METH (_KeyData_writeflags, "KeyData.writeflags(FLAGS) -> STRING") - METH (_KeyData_read, "KeyData.read(STRING) -> (KD, REST)") - METH (_KeyData_decode, "KeyData.decode(BYTES) -> KD") -#undef METHNAME - { 0 } -}; - /*----- Initialization ----------------------------------------------------*/ void key_pyinit(void) @@ -2094,7 +2084,6 @@ void key_pyinit(void) INITTYPE(subkeyiter, root); INITTYPE(keyattrs, root); INITTYPE(keyattriter, root); - addmethods(methods); } void key_pyinsert(PyObject *mod) diff --git a/mp.c b/mp.c index b4e65cb..29e8881 100644 --- a/mp.c +++ b/mp.c @@ -724,8 +724,8 @@ STOREOP(storel2c, 2c) STOREOP(storeb2c, 2c) #undef STOREOP -#define BUFOP(ty, pyty) \ - static PyObject *meth__##pyty##_frombuf(PyObject *me, PyObject *arg) \ +#define BUFOP(ty) \ + static PyObject *ty##meth_frombuf(PyObject *me, PyObject *arg) \ { \ buf b; \ char *p; \ @@ -733,7 +733,7 @@ STOREOP(storeb2c, 2c) PyObject *rc = 0; \ mp *x; \ \ - 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 ((x = buf_getmp(&b)) == 0) VALERR("malformed data"); \ rc = Py_BuildValue("(NN)", ty##_pywrap(x), \ @@ -741,8 +741,8 @@ STOREOP(storeb2c, 2c) end: \ return (rc); \ } -BUFOP(mp, MP) -BUFOP(gf, GF) +BUFOP(mp) +BUFOP(gf) #undef BUFOP static PyObject *mpmeth_tobuf(PyObject *me, PyObject *arg) @@ -776,8 +776,8 @@ end: return (rc); } -static PyObject *meth__MP_fromstring(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *mpmeth_fromstring(PyObject *me, + PyObject *arg, PyObject *kw) { int r = 0; char *p; @@ -785,10 +785,10 @@ static PyObject *meth__MP_fromstring(PyObject *me, PyObject *z = 0; mp *zz; mptext_stringctx sc; - static const char *const kwlist[] = { "class", "x", "radix", 0 }; + static const char *const kwlist[] = { "x", "radix", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|i:fromstring", - KWLIST, &me, &p, &len, &r)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|i:fromstring", KWLIST, + &p, &len, &r)) goto end; if (!good_radix_p(r, 1)) VALERR("bad radix"); sc.buf = p; sc.lim = p + len; @@ -800,38 +800,38 @@ end: return (z); } -static PyObject *meth__MP_factorial(PyObject *me, PyObject *arg) +static PyObject *mpmeth_factorial(PyObject *me, PyObject *arg) { unsigned long i; mp *x; - if (!PyArg_ParseTuple(arg, "OO&:factorial", &me, convulong, &i)) return (0); + if (!PyArg_ParseTuple(arg, "O&:factorial", convulong, &i)) return (0); x = mp_factorial(i); return mp_pywrap(x); } -static PyObject *meth__MP_fibonacci(PyObject *me, PyObject *arg) +static PyObject *mpmeth_fibonacci(PyObject *me, PyObject *arg) { long i; mp *x; - if (!PyArg_ParseTuple(arg, "Ol:fibonacci", &me, &i)) return (0); + if (!PyArg_ParseTuple(arg, "l:fibonacci", &i)) return (0); x = mp_fibonacci(i); return mp_pywrap(x); } -#define LOADOP(pre, py, name) \ - static PyObject *meth__##py##_##name(PyObject *me, PyObject *arg) \ +#define LOADOP(pre, name) \ + static PyObject *pre##meth_##name(PyObject *me, PyObject *arg) \ { \ char *p; \ Py_ssize_t len; \ - if (!PyArg_ParseTuple(arg, "Os#:" #name, &me, &p, &len)) return (0); \ + if (!PyArg_ParseTuple(arg, "s#:" #name, &p, &len)) return (0); \ return (pre##_pywrap(mp_##name(MP_NEW, p, len))); \ } -LOADOP(mp, MP, loadl) -LOADOP(mp, MP, loadb) -LOADOP(mp, MP, loadl2c) -LOADOP(mp, MP, loadb2c) -LOADOP(gf, GF, loadl) -LOADOP(gf, GF, loadb) +LOADOP(mp, loadl) +LOADOP(mp, loadb) +LOADOP(mp, loadl2c) +LOADOP(mp, loadb2c) +LOADOP(gf, loadl) +LOADOP(gf, loadb) #undef LOADOP static PyObject *mpget_nbits(PyObject *me, void *hunoz) @@ -877,6 +877,19 @@ static const PyMethodDef mp_pymethods[] = { KWMETH(storeb2c, "X.storeb2c([len = -1]) -> " "big-endian bytes, two's complement") METH (tobuf, "X.tobuf() -> buffer format") + KWSMTH(fromstring, "fromstring(STR, [radix = 0]) -> (X, REST)\n" + " Parse STR as a large integer, according to RADIX. If RADIX is\n" + " zero, read a prefix from STR to decide radix: allow `0b' for binary,\n" + " `0' or `0o' for octal, `0x' for hex, or `R_' for other radix R.") + SMTH (factorial, "factorial(I) -> I!: compute factorial") + SMTH (fibonacci, "fibonacci(I) -> F(I): compute Fibonacci number") + SMTH (loadl, "loadl(STR) -> X: read little-endian bytes") + SMTH (loadb, "loadb(STR) -> X: read big-endian bytes") + SMTH (loadl2c, "loadl2c(STR) -> X: " + "read little-endian bytes, two's complement") + SMTH (loadb2c, "loadb2c(STR) -> X: " + "read big-endian bytes, two's complement") + SMTH (frombuf, "frombuf(STR) -> (X, REST): read buffer format") #undef METHNAME { 0 } }; @@ -1983,8 +1996,8 @@ end: return (z); } -static PyObject *meth__GF_fromstring(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *gfmeth_fromstring(PyObject *me, + PyObject *arg, PyObject *kw) { int r = 0; char *p; @@ -1992,10 +2005,10 @@ static PyObject *meth__GF_fromstring(PyObject *me, PyObject *z = 0; mp *zz; mptext_stringctx sc; - static const char *const kwlist[] = { "class", "x", "radix", 0 }; + static const char *const kwlist[] = { "x", "radix", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|i:fromstring", - KWLIST, &me, &p, &len, &r)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|i:fromstring", KWLIST, + &p, &len, &r)) goto end; if (!good_radix_p(r, 1)) VALERR("bad radix"); sc.buf = p; sc.lim = p + len; @@ -2040,6 +2053,13 @@ static const PyMethodDef gf_pymethods[] = { METH (gcdx, "X.gcdx(Y) -> (gcd(X, Y), U, V) with X U + Y V = gcd(X, Y)") METH (modinv, "X.modinv(Y) -> multiplicative inverse of Y mod X") METH (irreduciblep, "X.irreduciblep() -> true/false") + KWSMTH(fromstring, "fromstring(STR, [radix = 0]) -> (X, REST)\n" + " Parse STR as a binary polynomial, according to RADIX. If RADIX is\n" + " zero, read a prefix from STR to decide radix: allow `0b' for binary,\n" + " `0' or `0o' for octal, `0x' for hex, or `R_' for other radix R.") + SMTH (loadl, "loadl(STR) -> X: read little-endian bytes") + SMTH (loadb, "loadb(STR) -> X: read big-endian bytes") + SMTH (frombuf, "frombuf(STR) -> (X, REST): read buffer format") #undef METHNAME #define METHNAME(func) mpmeth_##func KWMETH(tostring, "X.tostring([radix = 10]) -> STR") @@ -2485,32 +2505,6 @@ static PyTypeObject gfn_pytype_skel = { /*----- Glue --------------------------------------------------------------*/ -static const PyMethodDef methods[] = { -#define METHNAME(func) meth_##func - KWMETH(_MP_fromstring, "fromstring(STR, [radix = 0]) -> (X, REST)\n" - " Parse STR as a large integer, according to RADIX. If RADIX is\n" - " zero, read a prefix from STR to decide radix: allow `0b' for binary,\n" - " `0' or `0o' for octal, `0x' for hex, or `R_' for other radix R.") - KWMETH(_GF_fromstring, "fromstring(STR, [radix = 0]) -> (X, REST)\n" - " Parse STR as a binary polynomial, according to RADIX. If RADIX is\n" - " zero, read a prefix from STR to decide radix: allow `0b' for binary,\n" - " `0' or `0o' for octal, `0x' for hex, or `R_' for other radix R.") - METH (_MP_factorial, "factorial(I) -> I!: compute factorial") - METH (_MP_fibonacci, "fibonacci(I) -> F(I): compute Fibonacci number") - METH (_MP_loadl, "loadl(STR) -> X: read little-endian bytes") - METH (_MP_loadb, "loadb(STR) -> X: read big-endian bytes") - METH (_MP_loadl2c, "loadl2c(STR) -> X: " - "read little-endian bytes, two's complement") - METH (_MP_loadb2c, "loadb2c(STR) -> X: " - "read big-endian bytes, two's complement") - METH (_MP_frombuf, "frombuf(STR) -> (X, REST): read buffer format") - METH (_GF_loadl, "loadl(STR) -> X: read little-endian bytes") - METH (_GF_loadb, "loadb(STR) -> X: read big-endian bytes") - METH (_GF_frombuf, "frombuf(STR) -> (X, REST): read buffer format") -#undef METHNAME - { 0 } -}; - void mp_pyinit(void) { INITTYPE(mp, root); @@ -2522,7 +2516,6 @@ void mp_pyinit(void) INITTYPE(mpcrt, root); INITTYPE(gfreduce, root); INITTYPE(gfn, root); - addmethods(methods); } void mp_pyinsert(PyObject *mod) diff --git a/pgen.c b/pgen.c index dd2d827..6e9584c 100644 --- a/pgen.c +++ b/pgen.c @@ -100,12 +100,12 @@ static PyObject *pfmeth_jump(PyObject *me, PyObject *arg) RETURN_ME; } -static PyObject *meth__PrimeFilter_smallfactor(PyObject *me, PyObject *arg) +static PyObject *pfmeth_smallfactor(PyObject *me, PyObject *arg) { mp *x = 0; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "OO&:smallfactor", &me, convmp, &x)) goto end; + if (!PyArg_ParseTuple(arg, "O&:smallfactor", convmp, &x)) goto end; rc = PyInt_FromLong(pfilt_smallfactor(x)); end: mp_drop(x); @@ -147,6 +147,7 @@ static const PyMethodDef pfilt_pymethods[] = { METH (step, "F.step(N)") METH (muladd, "F.muladd(M, A)") METH (jump, "F.jump(FF)") + SMTH (smallfactor, "smallfactor(X) -> PGST") #undef METHNAME { 0 } }; @@ -303,11 +304,11 @@ static PyObject *rget_niters(PyObject *me, void *hunoz) static PyObject *rget_x(PyObject *me, void *hunoz) { return (mp_pywrap(MP_COPY(RABIN_R(me)->mm.m))); } -static PyObject *meth__RabinMiller_iters(PyObject *me, PyObject *arg) +static PyObject *rmeth_iters(PyObject *me, PyObject *arg) { unsigned n; - if (!PyArg_ParseTuple(arg, "OO&:iters", &me, convuint, &n)) return (0); + if (!PyArg_ParseTuple(arg, "O&:iters", convuint, &n)) return (0); return (PyInt_FromLong(rabin_iters(n))); } @@ -323,6 +324,7 @@ static const PyMethodDef rabin_pymethods[] = { #define METHNAME(name) rmeth_##name METH (test, "R.test(W) -> PGST") METH (rtest, "R.rtest(W) -> PGST") + SMTH (iters, "iters(NBITS) -> NITERS") #undef METHNAME { 0 } }; @@ -1051,8 +1053,6 @@ end: static const PyMethodDef methods[] = { #define METHNAME(name) meth_##name - METH (_PrimeFilter_smallfactor, "smallfactor(X) -> PGRC") - METH (_RabinMiller_iters, "iters(NBITS) -> NITERS") KWMETH(pgen, "pgen(START, [name = 'p'], [stepper = PrimeGenStepper(2)],\n" " [tester = PrimeGenTester()], [event = pgen_nullev],\n" diff --git a/pubkey.c b/pubkey.c index a557ddb..6084c3d 100644 --- a/pubkey.c +++ b/pubkey.c @@ -726,8 +726,7 @@ end: return (rc); } -static PyObject *meth__RSAPriv_generate(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *rsameth_generate(PyObject *me, PyObject *arg, PyObject *kw) { grand *r = &rand_global; unsigned nbits; @@ -737,12 +736,12 @@ static PyObject *meth__RSAPriv_generate(PyObject *me, struct excinfo exc = EXCINFO_INIT; pypgev evt = { { 0 } }; static const char *const kwlist[] = - { "class", "nbits", "event", "rng", "nsteps", "e", 0 }; + { "nbits", "event", "rng", "nsteps", "e", 0 }; PyObject *rc = 0; evt.exc = &exc; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&|O&O&O&O&:generate", KWLIST, - &me, convuint, &nbits, convpgev, &evt, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&O&O&O&:generate", KWLIST, + convuint, &nbits, convpgev, &evt, convgrand, &r, convuint, &n, convmp, &e)) goto end; @@ -787,7 +786,9 @@ static const PyGetSetDef rsapriv_pygetset[] = { static const PyMethodDef rsapriv_pymethods[] = { #define METHNAME(name) rsameth_##name - KWMETH(privop, "R.privop(X, [rng = None]) -> X^D (mod N)") + KWMETH(privop, "R.privop(X, [rng = None]) -> X^D (mod N)") + KWSMTH(generate, "generate(NBITS, [event = pgen_nullev], [rng = rand], " + "[nsteps = 0]) -> R") #undef METHNAME { 0 } }; @@ -1271,8 +1272,6 @@ static const PyMethodDef methods[] = { KWMETH(_oaep_decode, 0) KWMETH(_pss_encode, 0) KWMETH(_pss_decode, 0) - KWMETH(_RSAPriv_generate, "generate(NBITS, [event = pgen_nullev], " - "[rng = rand], [nsteps = 0]) -> R") #define DEFMETH(X, x) \ METH (x, "" #x "(KEY, PUBLIC) -> SHARED") XDHS(DEFMETH) diff --git a/pyke/pyke.h b/pyke/pyke.h index e200c09..66438a4 100644 --- a/pyke/pyke.h +++ b/pyke/pyke.h @@ -229,12 +229,12 @@ extern PyTypeObject *inittype(PyTypeObject */*skel*/, /* Macros for filling in `PyMethodDef' tables, ensuring that functions have * the expected signatures. */ -#define STD_METHOD(decor, func, doc) \ - { #func, decor(func), METH_VARARGS, doc }, -#define KEYWORD_METHOD(decor, func, doc) \ +#define STD_METHOD(decor, func, flags, doc) \ + { #func, decor(func), METH_VARARGS | flags, doc }, +#define KEYWORD_METHOD(decor, func, flags, doc) \ { #func, \ CONVERT_CAREFULLY(PyCFunction, PyCFunctionWithKeywords, decor(func)), \ - METH_VARARGS | METH_KEYWORDS, \ + METH_VARARGS | METH_KEYWORDS | flags, \ doc }, /* Convenience wrappers for filling in `PyMethodDef' tables, following @@ -244,8 +244,12 @@ extern PyTypeObject *inittype(PyTypeObject */*skel*/, * * around the method table. */ -#define METH(func, doc) STD_METHOD(METHNAME, func, doc) -#define KWMETH(func, doc) KEYWORD_METHOD(METHNAME, func, doc) +#define METH(func, doc) STD_METHOD(METHNAME, func, 0, doc) +#define KWMETH(func, doc) KEYWORD_METHOD(METHNAME, func, 0, doc) +#define CMTH(func, doc) STD_METHOD(METHNAME, func, METH_CLASS, doc) +#define KWCMTH(func, doc) KEYWORD_METHOD(METHNAME, func, METH_CLASS, doc) +#define SMTH(func, doc) STD_METHOD(METHNAME, func, METH_STATIC, doc) +#define KWSMTH(func, doc) KEYWORD_METHOD(METHNAME, func, METH_STATIC, doc) /* Convenience wrappers for filling in `PyGetSetDef' tables, following Pyke * naming convention. Define `GETSETNAME' locally as @@ -359,8 +363,8 @@ extern PyMethodDef *donemethods(void); /* Mapping methods. */ #define GMAP_METMNAME(func) gmapmeth_##func -#define GMAP_METH(func, doc) STD_METHOD(GMAP_METMNAME, func, doc) -#define GMAP_KWMETH(func, doc) KEYWORD_METHOD(GMAP_METMNAME, func, doc) +#define GMAP_METH(func, doc) STD_METHOD(GMAP_METMNAME, func, 0, doc) +#define GMAP_KWMETH(func, doc) KEYWORD_METHOD(GMAP_METMNAME, func, 0, doc) #define GMAP_METHDECL(func, doc) \ extern PyObject *gmapmeth_##func(PyObject *, PyObject *); #define GMAP_KWMETHDECL(func, doc) \ diff --git a/rand.c b/rand.c index 9e7539c..9312c4c 100644 --- a/rand.c +++ b/rand.c @@ -1381,8 +1381,7 @@ end: return ((PyObject *)rc); } -static PyObject *meth__BBSPriv_generate(PyObject *me, - PyObject *arg, PyObject *kw) +static PyObject *bpmeth_generate(PyObject *me, PyObject *arg, PyObject *kw) { bbs_priv bp = { 0 }; mp *x = MP_TWO; @@ -1391,12 +1390,12 @@ static PyObject *meth__BBSPriv_generate(PyObject *me, unsigned nbits, n = 0; grand *r = &rand_global; static const char *const kwlist[] = - { "class", "nbits", "event", "rng", "nsteps", "seed", 0 }; + { "nbits", "event", "rng", "nsteps", "seed", 0 }; bbspriv_pyobj *rc = 0; evt.exc = &exc; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&|O&O&O&O&:generate", KWLIST, - &me, convuint, &nbits, convpgev, &evt, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&O&O&O&:generate", KWLIST, + convuint, &nbits, convpgev, &evt, convgrand, &r, convuint, &n, convmp, &x)) goto end; if (bbs_gen(&bp, nbits, r, n, evt.ev.proc, evt.ev.ctx)) @@ -1448,6 +1447,8 @@ static const PyMethodDef bbspriv_pymethods[] = { #define METHNAME(name) bpmeth_##name METH (ff, "R.ff(N): fast-forward N places") METH (rew, "R.rew(N): rewind N places") + KWSMTH(generate, "generate(NBITS, [event = pgen_nullev], " + "[rng = rand], [nsteps = 0], [seed = 2]) -> R") #undef METHNAME { 0 } }; @@ -1512,14 +1513,6 @@ static PyTypeObject bbspriv_pytype_skel = { /*----- Global stuff ------------------------------------------------------*/ -static const PyMethodDef methods[] = { -#define METHNAME(name) meth_##name - KWMETH(_BBSPriv_generate, "generate(NBITS, [event = pgen_nullev], " - "[rng = rand], [nsteps = 0], [seed = 2]) -> R") -#undef METHNAME - { 0 } -}; - void rand_pyinit(void) { INITTYPE(grand, root); @@ -1537,7 +1530,6 @@ void rand_pyinit(void) INITTYPE(gclatinrand, gcrand); rand_noisesrc(RAND_GLOBAL, &noise_source); rand_seed(RAND_GLOBAL, 160); - addmethods(methods); } #define gccrand gccrand_info -- 2.11.0