From: Mark Wooding Date: Fri, 6 Feb 2015 11:06:14 +0000 (+0000) Subject: pubkey.c: Catch invalid arguments to `RSAPub' and `RSAPriv'. X-Git-Tag: 1.1.0~23 X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/commitdiff_plain/61cc9665df69b0641bfd40da285acbea20c48654 pubkey.c: Catch invalid arguments to `RSAPub' and `RSAPriv'. If a modulus is even, `mpmont_create' will silently fail inside `rsa_{pub,priv}create' and a later modexp will likely segfault. --- diff --git a/pubkey.c b/pubkey.c index c47f1b5..8790e40 100644 --- a/pubkey.c +++ b/pubkey.c @@ -553,6 +553,7 @@ static PyObject *rsapub_pynew(PyTypeObject *ty, if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&:new", kwlist, convmp, &rp.n, convmp, &rp.e)) goto end; + if (!MP_ODDP(rp.n)) VALERR("RSA modulus must be even"); o = (rsapub_pyobj *)ty->tp_alloc(ty, 0); o->pub = rp; rsa_pubcreate(&o->pubctx, &o->pub); @@ -625,6 +626,10 @@ static PyObject *rsapriv_pynew(PyTypeObject *ty, convmp, &rp.q_inv, &rng)) goto end; + if ((rp.n && !MP_ODDP(rp.n)) || + (rp.p && !MP_ODDP(rp.p)) || + (rp.p && !MP_ODDP(rp.q))) + VALERR("RSA modulus and factors must be odd"); if (rsa_recover(&rp)) VALERR("couldn't construct private key"); if (rng != Py_None && !GRAND_PYCHECK(rng)) TYERR("not a random number source");