X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/637b91402d2497db1318debd3cb3868a5abb8f01..7085a96cd490664c51c3046a499a7f38de00c9ac:/pubkey.c diff --git a/pubkey.c b/pubkey.c index a557ddb..9ec115a 100644 --- a/pubkey.c +++ b/pubkey.c @@ -108,11 +108,8 @@ end: return (rc); } -static PyObject *dsameth_beginhash(PyObject *me, PyObject *arg) -{ - if (!PyArg_ParseTuple(arg, ":beginhash")) return (0); - return (ghash_pywrap(DSA_HASH(me), gdsa_beginhash(DSA_D(me)))); -} +static PyObject *dsameth_beginhash(PyObject *me) + { return (ghash_pywrap(DSA_HASH(me), gdsa_beginhash(DSA_D(me)))); } static PyObject *dsameth_endhash(PyObject *me, PyObject *arg) { @@ -122,7 +119,7 @@ static PyObject *dsameth_endhash(PyObject *me, PyObject *arg) gdsa_endhash(DSA_D(me), h); h = GH_COPY(h); rc = bytestring_pywrap(0, GH_CLASS(h)->hashsz); - GH_DONE(h, PyString_AS_STRING(rc)); + GH_DONE(h, BIN_PTR(rc)); GH_DESTROY(h); return (rc); } @@ -130,18 +127,17 @@ static PyObject *dsameth_endhash(PyObject *me, PyObject *arg) static PyObject *dsameth_sign(PyObject *me, PyObject *arg, PyObject *kw) { gdsa_sig s = GDSA_SIG_INIT; - char *p; - Py_ssize_t n; + struct bin h; mp *k = 0; PyObject *rc = 0; static const char *const kwlist[] = { "msg", "k", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:sign", KWLIST, - &p, &n, convmp, &k)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&:sign", KWLIST, + convbin, &h, convmp, &k)) goto end; - if (n != DSA_D(me)->h->hashsz) + if (h.sz != DSA_D(me)->h->hashsz) VALERR("bad message length (doesn't match hash size)"); - gdsa_sign(DSA_D(me), &s, p, k); + gdsa_sign(DSA_D(me), &s, h.p, k); rc = Py_BuildValue("(NN)", mp_pywrap(s.r), mp_pywrap(s.s)); end: mp_drop(k); @@ -150,17 +146,16 @@ end: static PyObject *dsameth_verify(PyObject *me, PyObject *arg) { - char *p; - Py_ssize_t n; + struct bin h; gdsa_sig s = GDSA_SIG_INIT; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "s#(O&O&):verify", - &p, &n, convmp, &s.r, convmp, &s.s)) + if (!PyArg_ParseTuple(arg, "O&(O&O&):verify", + convbin, &h, convmp, &s.r, convmp, &s.s)) goto end; - if (n != DSA_D(me)->h->hashsz) + if (h.sz != DSA_D(me)->h->hashsz) VALERR("bad message length (doesn't match hash size)"); - rc = getbool(!gdsa_verify(DSA_D(me), &s, p)); + rc = getbool(!gdsa_verify(DSA_D(me), &s, h.p)); end: mp_drop(s.r); mp_drop(s.s); @@ -190,7 +185,7 @@ end: static const PyMethodDef dsapub_pymethods[] = { #define METHNAME(name) dsameth_##name - METH (beginhash, "D.beginhash() -> hash object") + NAMETH(beginhash, "D.beginhash() -> hash object") METH (endhash, "D.endhash(H) -> BYTES") METH (verify, "D.verify(MSG, (R, S)) -> true/false") #undef METHNAME @@ -221,8 +216,8 @@ static const PyMemberDef dsapriv_pymembers[] = { { 0 } }; -static PyTypeObject dsapub_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject dsapub_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "DSAPub", /* @tp_name@ */ sizeof(dsa_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -269,8 +264,8 @@ static PyTypeObject dsapub_pytype_skel = { 0 /* @tp_is_gc@ */ }; -static PyTypeObject dsapriv_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject dsapriv_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "DSAPriv", /* @tp_name@ */ sizeof(dsa_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -363,11 +358,8 @@ end: return (rc); } -static PyObject *kcdsameth_beginhash(PyObject *me, PyObject *arg) -{ - if (!PyArg_ParseTuple(arg, ":beginhash")) return (0); - return (ghash_pywrap(DSA_HASH(me), gkcdsa_beginhash(DSA_D(me)))); -} +static PyObject *kcdsameth_beginhash(PyObject *me) + { return (ghash_pywrap(DSA_HASH(me), gkcdsa_beginhash(DSA_D(me)))); } static PyObject *kcdsameth_endhash(PyObject *me, PyObject *arg) { @@ -377,7 +369,7 @@ static PyObject *kcdsameth_endhash(PyObject *me, PyObject *arg) gkcdsa_endhash(DSA_D(me), h); h = GH_COPY(h); rc = bytestring_pywrap(0, GH_CLASS(h)->hashsz); - GH_DONE(h, PyString_AS_STRING(rc)); + GH_DONE(h, BIN_PTR(rc)); GH_DESTROY(h); return (rc); } @@ -385,20 +377,19 @@ static PyObject *kcdsameth_endhash(PyObject *me, PyObject *arg) static PyObject *kcdsameth_sign(PyObject *me, PyObject *arg, PyObject *kw) { gkcdsa_sig s = GKCDSA_SIG_INIT; - char *p; - Py_ssize_t n; + struct bin h; mp *k = 0; PyObject *r = 0, *rc = 0; static const char *const kwlist[] = { "msg", "k", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:sign", KWLIST, - &p, &n, convmp, &k)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&:sign", KWLIST, + convbin, &h, convmp, &k)) goto end; - if (n != DSA_D(me)->h->hashsz) + if (h.sz != DSA_D(me)->h->hashsz) VALERR("bad message length (doesn't match hash size)"); r = bytestring_pywrap(0, DSA_D(me)->h->hashsz); - s.r = (octet *)PyString_AS_STRING(r); - gkcdsa_sign(DSA_D(me), &s, p, k); + s.r = (octet *)BIN_PTR(r); + gkcdsa_sign(DSA_D(me), &s, h.p, k); rc = Py_BuildValue("(ON)", r, mp_pywrap(s.s)); end: Py_XDECREF(r); @@ -408,19 +399,19 @@ end: static PyObject *kcdsameth_verify(PyObject *me, PyObject *arg) { - char *p; - Py_ssize_t n, rn; + struct bin h, sr; gkcdsa_sig s = GKCDSA_SIG_INIT; PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "s#(s#O&):verify", - &p, &n, &s.r, &rn, convmp, &s.s)) + if (!PyArg_ParseTuple(arg, "O&(O&O&):verify", + convbin, &h, convbin, &sr, convmp, &s.s)) goto end; - if (n != DSA_D(me)->h->hashsz) + if (h.sz != DSA_D(me)->h->hashsz) VALERR("bad message length (doesn't match hash size)"); - if (rn != DSA_D(me)->h->hashsz) + if (sr.sz != DSA_D(me)->h->hashsz) VALERR("bad signature `r' length (doesn't match hash size)"); - rc = getbool(!gkcdsa_verify(DSA_D(me), &s, p)); + s.r = (/*unconst*/ octet *)sr.p; + rc = getbool(!gkcdsa_verify(DSA_D(me), &s, h.p)); end: mp_drop(s.s); return (rc); @@ -428,7 +419,7 @@ end: static const PyMethodDef kcdsapub_pymethods[] = { #define METHNAME(name) kcdsameth_##name - METH (beginhash, "D.beginhash() -> hash object") + NAMETH(beginhash, "D.beginhash() -> hash object") METH (endhash, "D.endhash(H) -> BYTES") METH (verify, "D.verify(MSG, (R, S)) -> true/false") #undef METHNAME @@ -442,8 +433,8 @@ static const PyMethodDef kcdsapriv_pymethods[] = { { 0 } }; -static PyTypeObject kcdsapub_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject kcdsapub_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "KCDSAPub", /* @tp_name@ */ sizeof(dsa_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -490,8 +481,8 @@ static PyTypeObject kcdsapub_pytype_skel = { 0 /* @tp_is_gc@ */ }; -static PyTypeObject kcdsapriv_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject kcdsapriv_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "KCDSAPriv", /* @tp_name@ */ sizeof(dsa_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -726,8 +717,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 +727,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; @@ -788,12 +778,14 @@ 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)") + KWSMTH(generate, "generate(NBITS, [event = pgen_nullev], [rng = rand], " + "[nsteps = 0]) -> R") #undef METHNAME { 0 } }; -static PyTypeObject rsapub_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject rsapub_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "RSAPub", /* @tp_name@ */ sizeof(rsapub_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -840,8 +832,8 @@ static PyTypeObject rsapub_pytype_skel = { 0 /* @tp_is_gc@ */ }; -static PyTypeObject rsapriv_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject rsapriv_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "RSAPriv", /* @tp_name@ */ sizeof(rsapriv_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -895,8 +887,7 @@ static PyObject *meth__p1crypt_encode(PyObject *me, PyObject *arg, PyObject *kw) { pkcs1 p1; - char *m, *ep; - Py_ssize_t msz, epsz; + struct bin m, ep = { 0, 0 }; unsigned long nbits; PyObject *rc = 0; octet *b = 0; @@ -904,16 +895,16 @@ static PyObject *meth__p1crypt_encode(PyObject *me, mp *x; static const char *const kwlist[] = { "msg", "nbits", "ep", "rng", 0 }; - p1.r = &rand_global; ep = 0; epsz = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#O&|s#O&:encode", KWLIST, - &m, &msz, convulong, &nbits, - &ep, &epsz, convgrand, &p1.r)) + p1.r = &rand_global; + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&:encode", KWLIST, + convbin, &m, convulong, &nbits, + convbin, &ep, convgrand, &p1.r)) goto end; sz = (nbits + 7)/8; - p1.ep = ep; p1.epsz = epsz; - if (epsz + msz + 11 > sz) VALERR("buffer underflow"); + p1.ep = ep.p; p1.epsz = ep.sz; + if (ep.sz + m.sz + 11 > sz) VALERR("buffer underflow"); b = xmalloc(sz); - x = pkcs1_cryptencode(MP_NEW, m, msz, b, sz, nbits, &p1); + x = pkcs1_cryptencode(MP_NEW, m.p, m.sz, b, sz, nbits, &p1); rc = mp_pywrap(x); end: xfree(b); @@ -924,8 +915,7 @@ static PyObject *meth__p1crypt_decode(PyObject *me, PyObject *arg, PyObject *kw) { pkcs1 p1; - char *ep; - Py_ssize_t epsz; + struct bin ep = { 0, 0 }; unsigned long nbits; int n; PyObject *rc = 0; @@ -934,14 +924,14 @@ static PyObject *meth__p1crypt_decode(PyObject *me, mp *x = 0; static const char *const kwlist[] = { "ct", "nbits", "ep", "rng", 0 }; - p1.r = &rand_global; ep = 0; epsz = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|s#O&:decode", KWLIST, + p1.r = &rand_global; + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&:decode", KWLIST, convmp, &x, convulong, &nbits, - &ep, &epsz, convgrand, &p1.r)) + convbin, &ep, convgrand, &p1.r)) goto end; sz = (nbits + 7)/8; - p1.ep = ep; p1.epsz = epsz; - if (epsz + 11 > sz) VALERR("buffer underflow"); + p1.ep = ep.p; p1.epsz = ep.sz; + if (ep.sz + 11 > sz) VALERR("buffer underflow"); b = xmalloc(sz); if ((n = pkcs1_cryptdecode(x, b, sz, nbits, &p1)) < 0) VALERR("decryption failed"); @@ -956,8 +946,7 @@ static PyObject *meth__p1sig_encode(PyObject *me, PyObject *arg, PyObject *kw) { pkcs1 p1; - char *m, *ep; - Py_ssize_t msz, epsz; + struct bin m, ep = { 0, 0 }; unsigned long nbits; PyObject *rc = 0; octet *b = 0; @@ -965,16 +954,16 @@ static PyObject *meth__p1sig_encode(PyObject *me, mp *x; static const char *const kwlist[] = { "msg", "nbits", "ep", "rng", 0 }; - p1.r = &rand_global; ep = 0; epsz = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#O&|s#O&:encode", KWLIST, - &m, &msz, convulong, &nbits, - &ep, &epsz, convgrand, &p1.r)) + p1.r = &rand_global; + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&:encode", KWLIST, + convbin, &m, convulong, &nbits, + convbin, &ep, convgrand, &p1.r)) goto end; sz = (nbits + 7)/8; - p1.ep = ep; p1.epsz = epsz; - if (epsz + msz + 11 > sz) VALERR("buffer underflow"); + p1.ep = ep.p; p1.epsz = ep.sz; + if (ep.sz + m.sz + 11 > sz) VALERR("buffer underflow"); b = xmalloc(sz); - x = pkcs1_sigencode(MP_NEW, m, msz, b, sz, nbits, &p1); + x = pkcs1_sigencode(MP_NEW, m.p, m.sz, b, sz, nbits, &p1); rc = mp_pywrap(x); end: xfree(b); @@ -985,8 +974,7 @@ static PyObject *meth__p1sig_decode(PyObject *me, PyObject *arg, PyObject *kw) { pkcs1 p1; - char *ep; - Py_ssize_t epsz; + struct bin ep = { 0, 0 }; unsigned long nbits; int n; PyObject *hukairz; @@ -997,14 +985,14 @@ static PyObject *meth__p1sig_decode(PyObject *me, static const char *const kwlist[] = { "msg", "sig", "nbits", "ep", "rng", 0 }; - p1.r = &rand_global; ep = 0; epsz = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&|s#O&:decode", KWLIST, + p1.r = &rand_global; + if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&|O&O&:decode", KWLIST, &hukairz, convmp, &x, convulong, &nbits, - &ep, &epsz, convgrand, &p1.r)) + convbin, &ep, convgrand, &p1.r)) goto end; sz = (nbits + 7)/8; - p1.ep = ep; p1.epsz = epsz; - if (epsz + 10 > sz) VALERR("buffer underflow"); + p1.ep = ep.p; p1.epsz = ep.sz; + if (ep.sz + 10 > sz) VALERR("buffer underflow"); b = xmalloc(sz); if ((n = pkcs1_sigdecode(x, 0, 0, b, sz, nbits, &p1)) < 0) VALERR("verification failed"); @@ -1019,8 +1007,7 @@ static PyObject *meth__oaep_encode(PyObject *me, PyObject *arg, PyObject *kw) { oaep o; - char *m, *ep; - Py_ssize_t msz, epsz; + struct bin m, ep = { 0, 0 }; unsigned long nbits; PyObject *rc = 0; octet *b = 0; @@ -1029,19 +1016,20 @@ static PyObject *meth__oaep_encode(PyObject *me, static const char *const kwlist[] = { "msg", "nbits", "mgf", "hash", "ep", "rng", 0 }; - o.r = &rand_global; o.cc = &sha_mgf; o.ch = &sha; ep = 0; epsz = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#O&|O&O&s#O&:encode", KWLIST, - &m, &msz, convulong, &nbits, + o.r = &rand_global; o.cc = &sha_mgf; o.ch = &sha; + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&O&O&:encode", + KWLIST, + convbin, &m, convulong, &nbits, convgccipher, &o.cc, convgchash, &o.ch, - &ep, &epsz, + convbin, &ep, convgrand, &o.r)) goto end; sz = (nbits + 7)/8; - o.ep = ep; o.epsz = epsz; - if (2 * o.ch->hashsz + 2 + msz > sz) VALERR("buffer underflow"); + o.ep = ep.p; o.epsz = ep.sz; + if (2 * o.ch->hashsz + 2 + m.sz > sz) VALERR("buffer underflow"); b = xmalloc(sz); - x = oaep_encode(MP_NEW, m, msz, b, sz, nbits, &o); + x = oaep_encode(MP_NEW, m.p, m.sz, b, sz, nbits, &o); rc = mp_pywrap(x); end: xfree(b); @@ -1052,8 +1040,7 @@ static PyObject *meth__oaep_decode(PyObject *me, PyObject *arg, PyObject *kw) { oaep o; - char *ep; - Py_ssize_t epsz; + struct bin ep = { 0, 0 }; unsigned long nbits; int n; PyObject *rc = 0; @@ -1063,16 +1050,16 @@ static PyObject *meth__oaep_decode(PyObject *me, static const char *const kwlist[] = { "ct", "nbits", "mgf", "hash", "ep", "rng", 0 }; - o.r = &rand_global; o.cc = &sha_mgf; o.ch = &sha; ep = 0; epsz = 0; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&s#O&:decode", KWLIST, + o.r = &rand_global; o.cc = &sha_mgf; o.ch = &sha; + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&O&O&:decode", KWLIST, convmp, &x, convulong, &nbits, convgccipher, &o.cc, convgchash, &o.ch, - &ep, &epsz, + convbin, &ep, convgrand, &o.r)) goto end; sz = (nbits + 7)/8; - o.ep = ep; o.epsz = epsz; + o.ep = ep.p; o.epsz = ep.sz; if (2 * o.ch->hashsz > sz) VALERR("buffer underflow"); b = xmalloc(sz); if ((n = oaep_decode(x, b, sz, nbits, &o)) < 0) @@ -1088,8 +1075,7 @@ static PyObject *meth__pss_encode(PyObject *me, PyObject *arg, PyObject *kw) { pss p; - char *m; - Py_ssize_t msz; + struct bin m; unsigned long nbits; PyObject *rc = 0; octet *b = 0; @@ -1099,8 +1085,8 @@ static PyObject *meth__pss_encode(PyObject *me, { "msg", "nbits", "mgf", "hash", "saltsz", "rng", 0 }; p.cc = &sha_mgf; p.ch = &sha; p.r = &rand_global; p.ssz = (size_t)-1; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#O&|O&O&O&O&:encode", KWLIST, - &m, &msz, convulong, &nbits, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&|O&O&O&O&:encode", KWLIST, + convbin, &m, convulong, &nbits, convgccipher, &p.cc, convgchash, &p.ch, convszt, &p.ssz, @@ -1110,7 +1096,7 @@ static PyObject *meth__pss_encode(PyObject *me, if (p.ssz == (size_t)-1) p.ssz = p.ch->hashsz; if (p.ch->hashsz + p.ssz + 2 > sz) VALERR("buffer underflow"); b = xmalloc(sz); - x = pss_encode(MP_NEW, m, msz, b, sz, nbits, &p); + x = pss_encode(MP_NEW, m.p, m.sz, b, sz, nbits, &p); rc = mp_pywrap(x); end: xfree(b); @@ -1121,8 +1107,7 @@ static PyObject *meth__pss_decode(PyObject *me, PyObject *arg, PyObject *kw) { pss p; - char *m; - Py_ssize_t msz; + struct bin m; unsigned long nbits; PyObject *rc = 0; octet *b = 0; @@ -1133,8 +1118,10 @@ static PyObject *meth__pss_decode(PyObject *me, { "msg", "sig", "nbits", "mgf", "hash", "saltsz", "rng", 0 }; p.cc = &sha_mgf; p.ch = &sha; p.r = &rand_global; p.ssz = (size_t)-1; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#O&O&|O&O&O&O&:decode", KWLIST, - &m, &msz, convmp, &x, convulong, &nbits, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&O&|O&O&O&O&:decode", + KWLIST, + convbin, &m, convmp, &x, + convulong, &nbits, convgccipher, &p.cc, convgchash, &p.ch, convszt, &p.ssz, @@ -1144,7 +1131,7 @@ static PyObject *meth__pss_decode(PyObject *me, if (p.ssz == (size_t)-1) p.ssz = p.ch->hashsz; if (p.ch->hashsz + p.ssz + 2 > sz) VALERR("buffer underflow"); b = xmalloc(sz); - if ((n = pss_decode(x, m, msz, b, sz, nbits, &p)) < 0) + if ((n = pss_decode(x, m.p, m.sz, b, sz, nbits, &p)) < 0) VALERR("verification failed"); rc = Py_None; Py_INCREF(rc); end: @@ -1162,16 +1149,14 @@ end: #define DEFXDH(X, x) \ static PyObject *meth_##x(PyObject *me, PyObject *arg) \ { \ - const char *k, *p; \ - Py_ssize_t ksz, psz; \ + struct bin k, p; \ PyObject *rc = 0; \ - if (!PyArg_ParseTuple(arg, "s#s#:" #x, &k, &ksz, &p, &psz)) \ + if (!PyArg_ParseTuple(arg, "O&O&:" #x, convbin, &k, convbin, &p)) \ goto end; \ - if (ksz != X##_KEYSZ) VALERR("bad key length"); \ - if (psz != X##_PUBSZ) VALERR("bad public length"); \ + if (k.sz != X##_KEYSZ) VALERR("bad key length"); \ + if (p.sz != X##_PUBSZ) VALERR("bad public length"); \ rc = bytestring_pywrap(0, X##_OUTSZ); \ - x((octet *)PyString_AS_STRING(rc), \ - (const octet *)k, (const octet *)p); \ + x((octet *)BIN_PTR(rc), k.p, p.p); \ return (rc); \ end: \ return (0); \ @@ -1189,13 +1174,12 @@ XDHS(DEFXDH) \ static PyObject *meth_##ed##_pubkey(PyObject *me, PyObject *arg) \ { \ - const char *k; \ - Py_ssize_t ksz; \ + struct bin k; \ PyObject *rc = 0; \ - if (!PyArg_ParseTuple(arg, "s#:" #ed "_pubkey", &k, &ksz)) \ + if (!PyArg_ParseTuple(arg, "O&:" #ed "_pubkey", convbin, &k)) \ goto end; \ rc = bytestring_pywrap(0, ED##_PUBSZ); \ - ed##_pubkey((octet *)PyString_AS_STRING(rc), k, ksz); \ + ed##_pubkey((octet *)BIN_PTR(rc), k.p, k.sz); \ return (rc); \ end: \ return (0); \ @@ -1204,27 +1188,27 @@ XDHS(DEFXDH) static PyObject *meth_##ed##_sign(PyObject *me, PyObject *arg, \ PyObject *kw) \ { \ - const char *k, *p = 0, *c = 0, *m; \ - Py_ssize_t ksz, psz, csz = 0, msz; \ + struct bin k, p = { 0, 0}, c = { 0, 0 }, m; \ int ph = phdflt; \ PyObject *rc = 0; \ octet pp[ED##_PUBSZ]; \ static const char *const kwlist[] = \ { "key", "msg", "pub", "perso", "phflag", 0 }; \ if (!PyArg_ParseTupleAndKeywords(arg, kw, \ - "s#s#|s#s#O&:" #ed "_sign", \ + "O&O&|O&O&O&:" #ed "_sign", \ KWLIST, \ - &k, &ksz, &m, &msz, &p, &psz, \ - &c, &csz, convbool, &ph)) \ + convbin, &k, convbin, &m, \ + convbin, &p, convbin, &c, \ + convbool, &ph)) \ goto end; \ - if (p && psz != ED##_PUBSZ) VALERR("bad public length"); \ - if (c && csz > ED##_MAXPERSOSZ) \ + if (p.p && p.sz != ED##_PUBSZ) VALERR("bad public length"); \ + if (c.p && c.sz > ED##_MAXPERSOSZ) \ VALERR("personalization string too long"); \ - if (c && ph == -1) ph = 0; \ - if (!p) { p = (const char *)pp; ed##_pubkey(pp, k, ksz); } \ + if (c.p && ph == -1) ph = 0; \ + if (!p.p) { p.p = pp; ed##_pubkey(pp, k.p, k.sz); } \ rc = bytestring_pywrap(0, ED##_SIGSZ); \ - ed##sigver##_sign((octet *)PyString_AS_STRING(rc), k, ksz, \ - (const octet *)p, ph, c, csz, m, msz); \ + ed##sigver##_sign((octet *)BIN_PTR(rc), k.p, k.sz, \ + p.p, ph, c.p, c.sz, m.p, m.sz); \ return (rc); \ end: \ return (0); \ @@ -1233,25 +1217,25 @@ XDHS(DEFXDH) static PyObject *meth_##ed##_verify(PyObject *me, \ PyObject *arg, PyObject *kw) \ { \ - const char *p, *c = 0, *m, *s; \ - Py_ssize_t psz, csz = 0, msz, ssz; \ + struct bin p, c = { 0, 0 }, m, s; \ int ph = phdflt; \ PyObject *rc = 0; \ static const char *const kwlist[] = \ { "pub", "msg", "sig", "perso", "phflag", 0 }; \ if (!PyArg_ParseTupleAndKeywords(arg, kw, \ - "s#s#s#|s#O&:" #ed "_verify", \ + "O&O&O&|O&O&:" #ed "_verify", \ KWLIST, \ - &p, &psz, &m, &msz, &s, &ssz, \ - &c, &csz, convbool, &ph)) \ + convbin, &p, convbin, &m, \ + convbin, &s, \ + convbin, &c, convbool, &ph)) \ goto end; \ - if (psz != ED##_PUBSZ) VALERR("bad public length"); \ - if (ssz != ED##_SIGSZ) VALERR("bad signature length"); \ - if (c && csz > ED##_MAXPERSOSZ) \ + if (p.sz != ED##_PUBSZ) VALERR("bad public length"); \ + if (s.sz != ED##_SIGSZ) VALERR("bad signature length"); \ + if (c.p && c.sz > ED##_MAXPERSOSZ) \ VALERR("personalization string too long"); \ - if (c && ph == -1) ph = 0; \ - rc = getbool(!ed##sigver##_verify((const octet *)p, ph, c, csz, \ - m, msz, (const octet *)s)); \ + if (c.p && ph == -1) ph = 0; \ + rc = getbool(!ed##sigver##_verify(p.p, ph, c.p, c.sz, \ + m.p, m.sz, s.p)); \ return (rc); \ end: \ return (0); \ @@ -1261,6 +1245,16 @@ EDDSAS(DEFEDDSA) /*----- Global stuff ------------------------------------------------------*/ +static const struct nameval consts[] = { + CONST(X25519_KEYSZ), CONST(X25519_PUBSZ), CONST(X25519_OUTSZ), + CONST(X448_KEYSZ), CONST(X448_PUBSZ), CONST(X448_OUTSZ), + CONST(ED25519_KEYSZ), CONST(ED25519_PUBSZ), CONST(ED25519_SIGSZ), + CONST(ED25519_MAXPERSOSZ), + CONST(ED448_KEYSZ), CONST(ED448_PUBSZ), CONST(ED448_SIGSZ), + CONST(ED448_MAXPERSOSZ), + { 0 } +}; + static const PyMethodDef methods[] = { #define METHNAME(name) meth_##name KWMETH(_p1crypt_encode, 0) @@ -1271,8 +1265,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) @@ -1308,6 +1300,7 @@ void pubkey_pyinsert(PyObject *mod) INSERT("KCDSAPriv", kcdsapriv_pytype); INSERT("RSAPub", rsapub_pytype); INSERT("RSAPriv", rsapriv_pytype); + setconstants(mod, consts); } /*----- That's all, folks -------------------------------------------------*/