g->rng = rng; Py_INCREF(rng); g->hash = hash; Py_INCREF(hash);
return ((PyObject *)g);
end:
- if (p) Py_DECREF(p);
- FREEOBJ(g);
+ Py_XDECREF(p); FREEOBJ(g);
return (0);
}
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)
{
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);
}
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);
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);
return (rc);
}
-static PyMethodDef dsapub_pymethods[] = {
+static const PyMethodDef dsapub_pymethods[] = {
#define METHNAME(name) dsameth_##name
- METH (beginhash, "D.beginhash() -> hash object")
- METH (endhash, "D.endhash(H) -> BYTES")
- METH (verify, "D.verify(MSG, (R, S)) -> true/false")
+ NAMETH(beginhash, "D.beginhash() -> hash object")
+ METH (endhash, "D.endhash(H) -> BYTES")
+ METH (verify, "D.verify(MSG, (R, S)) -> true/false")
#undef METHNAME
{ 0 }
};
-static PyMethodDef dsapriv_pymethods[] = {
+static const PyMethodDef dsapriv_pymethods[] = {
#define METHNAME(name) dsameth_##name
- KWMETH(sign, "D.sign(MSG, [k = K]) -> R, S")
+ KWMETH(sign, "D.sign(MSG, [k = K]) -> R, S")
#undef METHNAME
{ 0 }
};
-static PyMemberDef dsapub_pymembers[] = {
+static const PyMemberDef dsapub_pymembers[] = {
#define MEMBERSTRUCT dsa_pyobj
MEMBER(G, T_OBJECT, READONLY, "D.G -> group to work in")
MEMBER(p, T_OBJECT, READONLY, "D.p -> public key (group element")
{ 0 }
};
-static PyMemberDef dsapriv_pymembers[] = {
+static const PyMemberDef dsapriv_pymembers[] = {
#define MEMBERSTRUCT dsa_pyobj
MEMBER(u, T_OBJECT, READONLY, "D.u -> private key (exponent)")
#undef MEMBERSTRUCT
{ 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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"DSAPub(GROUP, P, [hash = sha], [rng = rand]): DSA public key.",
+ "DSAPub(GROUP, P, [hash = sha], [rng = rand]): DSA public key.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- dsapub_pymethods, /* @tp_methods@ */
- dsapub_pymembers, /* @tp_members@ */
+ PYMETHODS(dsapub), /* @tp_methods@ */
+ PYMEMBERS(dsapub), /* @tp_members@ */
0, /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"DSAPriv(GROUP, U, [p = u G], [hash = sha], [rng = rand]): DSA private key.",
+ "DSAPriv(GROUP, U, [p = u G], [hash = sha], [rng = rand]): "
+ "DSA private key.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- dsapriv_pymethods, /* @tp_methods@ */
- dsapriv_pymembers, /* @tp_members@ */
+ PYMETHODS(dsapriv), /* @tp_methods@ */
+ PYMEMBERS(dsapriv), /* @tp_members@ */
0, /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
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)
{
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);
}
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);
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);
}
-static PyMethodDef kcdsapub_pymethods[] = {
+static const PyMethodDef kcdsapub_pymethods[] = {
#define METHNAME(name) kcdsameth_##name
- METH (beginhash, "D.beginhash() -> hash object")
- METH (endhash, "D.endhash(H) -> BYTES")
- METH (verify, "D.verify(MSG, (R, S)) -> true/false")
+ NAMETH(beginhash, "D.beginhash() -> hash object")
+ METH (endhash, "D.endhash(H) -> BYTES")
+ METH (verify, "D.verify(MSG, (R, S)) -> true/false")
#undef METHNAME
{ 0 }
};
-static PyMethodDef kcdsapriv_pymethods[] = {
+static const PyMethodDef kcdsapriv_pymethods[] = {
#define METHNAME(name) kcdsameth_##name
- KWMETH(sign, "D.sign(MSG, [k = K]) -> R, S")
+ KWMETH(sign, "D.sign(MSG, [k = K]) -> R, S")
#undef METHNAME
{ 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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"KCDSAPub(GROUP, P, [hash = sha], [rng = rand]): KCDSA public key.",
+ "KCDSAPub(GROUP, P, [hash = sha], [rng = rand]): KCDSA public key.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- kcdsapub_pymethods, /* @tp_methods@ */
- dsapub_pymembers, /* @tp_members@ */
+ PYMETHODS(kcdsapub), /* @tp_methods@ */
+ PYMEMBERS(dsapub), /* @tp_members@ */
0, /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"KCDSAPriv(GROUP, U, [p = u G], [hash = sha], [rng = rand]): KCDSA private key.",
+ "KCDSAPriv(GROUP, U, [p = u G], [hash = sha], [rng = rand]): "
+ "KCDSA private key.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- kcdsapriv_pymethods, /* @tp_methods@ */
- dsapriv_pymembers, /* @tp_members@ */
+ PYMETHODS(kcdsapriv), /* @tp_methods@ */
+ PYMEMBERS(dsapriv), /* @tp_members@ */
0, /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
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;
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;
return (rc);
}
-static PyGetSetDef rsapub_pygetset[] = {
+static const PyGetSetDef rsapub_pygetset[] = {
#define GETSETNAME(op, name) rsa##op##_##name
- GET (n, "R.n -> N")
- GET (e, "R.e -> E")
+ GET (n, "R.n -> N")
+ GET (e, "R.e -> E")
#undef GETSETNAME
{ 0 }
};
-static PyMethodDef rsapub_pymethods[] = {
+static const PyMethodDef rsapub_pymethods[] = {
#define METHNAME(name) rsameth_##name
- METH (pubop, "R.pubop(X) -> X^E (mod N)")
+ METH (pubop, "R.pubop(X) -> X^E (mod N)")
#undef METHNAME
{ 0 }
};
-static PyGetSetDef rsapriv_pygetset[] = {
+static const PyGetSetDef rsapriv_pygetset[] = {
#define GETSETNAME(op, name) rsa##op##_##name
- GET (d, "R.d -> D")
- GET (p, "R.p -> P")
- GET (q, "R.q -> Q")
- GET (dp, "R.dp -> D mod (P - 1)")
- GET (dq, "R.dq -> D mod (Q - 1)")
- GET (q_inv, "R.q_inv -> Q^{-1} mod P")
- GETSET(rng, "R.rng -> random number source for blinding")
+ GET (d, "R.d -> D")
+ GET (p, "R.p -> P")
+ GET (q, "R.q -> Q")
+ GET (dp, "R.dp -> D mod (P - 1)")
+ GET (dq, "R.dq -> D mod (Q - 1)")
+ GET (q_inv, "R.q_inv -> Q^{-1} mod P")
+ GETSET(rng, "R.rng -> random number source for blinding")
#undef GETSETNAME
{ 0 }
};
-static PyMethodDef rsapriv_pymethods[] = {
+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 }
};
-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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"RSAPub(N, E): RSA public key.",
+ "RSAPub(N, E): RSA public key.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- rsapub_pymethods, /* @tp_methods@ */
+ PYMETHODS(rsapub), /* @tp_methods@ */
0, /* @tp_members@ */
- rsapub_pygetset, /* @tp_getset@ */
+ PYGETSET(rsapub), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"RSAPriv(..., [rng = rand]): RSA private key.\n\
- Keywords: n, e, d, p, q, dp, dq, q_inv; must provide enough",
+ "RSAPriv(..., [rng = rand]): RSA private key.\n"
+ " Keywords: n, e, d, p, q, dp, dq, q_inv; must provide enough",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- rsapriv_pymethods, /* @tp_methods@ */
+ PYMETHODS(rsapriv), /* @tp_methods@ */
0, /* @tp_members@ */
- rsapriv_pygetset, /* @tp_getset@ */
+ PYGETSET(rsapriv), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
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;
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);
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;
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");
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;
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);
PyObject *arg, PyObject *kw)
{
pkcs1 p1;
- char *ep;
- Py_ssize_t epsz;
+ struct bin ep = { 0, 0 };
unsigned long nbits;
int n;
PyObject *hukairz;
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");
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;
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);
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;
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)
PyObject *arg, PyObject *kw)
{
pss p;
- char *m;
- Py_ssize_t msz;
+ struct bin m;
unsigned long nbits;
PyObject *rc = 0;
octet *b = 0;
{ "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,
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);
PyObject *arg, PyObject *kw)
{
pss p;
- char *m;
- Py_ssize_t msz;
+ struct bin m;
unsigned long nbits;
PyObject *rc = 0;
octet *b = 0;
{ "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,
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:
#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); \
\
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); \
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); \
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); \
/*----- Global stuff ------------------------------------------------------*/
-static PyMethodDef methods[] = {
+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)
- KWMETH(_p1crypt_decode, 0)
- KWMETH(_p1sig_encode, 0)
- KWMETH(_p1sig_decode, 0)
- KWMETH(_oaep_encode, 0)
- 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")
+ KWMETH(_p1crypt_encode, 0)
+ KWMETH(_p1crypt_decode, 0)
+ KWMETH(_p1sig_encode, 0)
+ KWMETH(_p1sig_decode, 0)
+ KWMETH(_oaep_encode, 0)
+ KWMETH(_oaep_decode, 0)
+ KWMETH(_pss_encode, 0)
+ KWMETH(_pss_decode, 0)
#define DEFMETH(X, x) \
- METH (x, "\
-" #x "(KEY, PUBLIC) -> SHARED")
+ METH (x, "" #x "(KEY, PUBLIC) -> SHARED")
XDHS(DEFMETH)
#undef DEFMETH
#define DEFMETH(ED, ed, phdflt, sigver) \
- METH (ed##_pubkey, "\
-" #ed "_pubkey(KEY) -> PUBLIC") \
- KWMETH(ed##_sign, "\
-" #ed "_sign(KEY, MSG, [pub = PUBLIC], " \
- "[perso = STRING], [phflag = BOOL]) -> SIG") \
- KWMETH(ed##_verify, "\
-" #ed "_verify(PUBLIC, MSG, SIG, " \
- "[perso = STRING], [phflag = BOOL]) -> BOOL")
+ METH (ed##_pubkey, "" #ed "_pubkey(KEY) -> PUBLIC") \
+ KWMETH(ed##_sign, "" #ed "_sign(KEY, MSG, [pub = PUBLIC], " \
+ "[perso = STRING], [phflag = BOOL]) -> SIG") \
+ KWMETH(ed##_verify, "" #ed "_verify(PUBLIC, MSG, SIG, " \
+ "[perso = STRING], [phflag = BOOL]) -> BOOL")
EDDSAS(DEFMETH)
#undef DEFMETH
#undef METHNAME
INSERT("KCDSAPriv", kcdsapriv_pytype);
INSERT("RSAPub", rsapub_pytype);
INSERT("RSAPriv", rsapriv_pytype);
+ setconstants(mod, consts);
}
/*----- That's all, folks -------------------------------------------------*/