X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/24b3d57bcf320d9d7a90a40d5f6176b1f087ab3e..5ec4e0d8db70dd19d6c294092c71e608d2888bb5:/rand.c diff --git a/rand.c b/rand.c index 7a3ad53..6e1d05e 100644 --- a/rand.c +++ b/rand.c @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id$ - * * Random-number generators * * (c) 2004 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the Python interface to Catacomb. * @@ -15,12 +13,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * Catacomb/Python is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with Catacomb/Python; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -258,7 +256,7 @@ static PyMethodDef grand_pymethods[] = { METH (byte, "R.byte() -> BYTE") METH (word, "R.word() -> WORD") METH (block, "R.block(N) -> STRING") - KWMETH(mp, "R.mp(bits, or = 0) -> MP") + KWMETH(mp, "R.mp(bits, [or = 0]) -> MP") METH (range, "R.range(MAX) -> INT") METH (mask, "R.mask(STR) -> STR") METH (seedint, "R.seedint(I)") @@ -272,7 +270,7 @@ static PyMethodDef grand_pymethods[] = { static PyTypeObject grand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GRand", /* @tp_name@ */ + "GRand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -329,7 +327,7 @@ static PyObject *lcrand_pynew(PyTypeObject *me, PyObject *arg, PyObject *kw) static PyTypeObject lcrand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.LCRand", /* @tp_name@ */ + "LCRand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -386,7 +384,7 @@ static PyObject *fibrand_pynew(PyTypeObject *me, PyObject *arg, PyObject *kw) static PyTypeObject fibrand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.FibRand", /* @tp_name@ */ + "FibRand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -524,14 +522,14 @@ static PyObject *trget_goodbits(PyObject *me, void *hunoz) static PyGetSetDef truerand_pygetset[] = { #define GETSETNAME(op, name) tr##op##_##name - GET (goodbits, "R.goodbits -> good bits of entropy remaining") + GET (goodbits, "R.goodbits -> good bits of entropy remaining") #undef GETSETNAME { 0 } }; static PyTypeObject truerand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.TrueRand", /* @tp_name@ */ + "TrueRand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -583,26 +581,31 @@ static PyTypeObject *gccrand_pytype, *gcrand_pytype; typedef grand *gcrand_func(const void *, size_t sz); typedef grand *gcirand_func(const void *, size_t sz, uint32); +typedef grand *gcnrand_func(const void *, size_t sz, const void *); typedef struct gccrand_info { const char *name; const octet *keysz; unsigned f; + size_t noncesz; gcrand_func *func; } gccrand_info; +#define RNGF_INT 1u +#define RNGF_NONCE 2u + typedef struct gccrand_pyobj { PyHeapTypeObject ty; const gccrand_info *info; } gccrand_pyobj; #define GCCRAND_INFO(o) (((gccrand_pyobj *)(o))->info) -#define GCCRAND_DEF(name, ksz, func, f) \ +#define GCCRAND_DEF(name, ksz, func, f, nsz) \ static const gccrand_info func##_info = \ - { name, ksz, f, (gcrand_func *)func }; + { name, ksz, f, nsz, (gcrand_func *)func }; RNGS(GCCRAND_DEF) static const gccrand_info *const gcrandtab[] = { -#define GCCRAND_ENTRY(name, ksz, func, f) &func##_info, +#define GCCRAND_ENTRY(name, ksz, func, f, nsz) &func##_info, RNGS(GCCRAND_ENTRY) 0 }; @@ -619,7 +622,7 @@ static PyObject *gcrand_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) if (keysz(n, info->keysz) != n) VALERR("bad key length"); return (grand_dopywrap(ty, info->func(k, n), f_freeme)); end: - return (0); + return (0); } static PyObject *gcirand_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) @@ -638,7 +641,26 @@ static PyObject *gcirand_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) ((gcirand_func *)info->func)(k, n, i), f_freeme)); end: - return (0); + return (0); +} + +static PyObject *gcnrand_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) +{ + const gccrand_info *info = GCCRAND_INFO(ty); + static char *kwlist[] = { "key", "nonce", 0 }; + char *k, *n; + int ksz, nsz; + + if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#s#:new", kwlist, + &k, &ksz, &n, &nsz)) + goto end; + if (keysz(ksz, info->keysz) != ksz) VALERR("bad key length"); + if (nsz != info->noncesz) VALERR("bad nonce length"); + return (grand_dopywrap(ty, + ((gcnrand_func *)info->func)(k, ksz, n), + f_freeme)); +end: + return (0); } static PyObject *gccrand_pywrap(const gccrand_info *info) @@ -653,11 +675,10 @@ static PyObject *gccrand_pywrap(const gccrand_info *info) Py_TPFLAGS_HEAPTYPE); g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; - if (info->f & RNGF_INT) - g->ty.ht_type.tp_new = gcirand_pynew; - else - g->ty.ht_type.tp_new = gcrand_pynew; - PyType_Ready(&g->ty.ht_type); + if (info->f & RNGF_INT) g->ty.ht_type.tp_new = gcirand_pynew; + else if (info->f & RNGF_NONCE) g->ty.ht_type.tp_new = gcnrand_pynew; + else g->ty.ht_type.tp_new = gcrand_pynew; + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -676,7 +697,7 @@ static PyGetSetDef gccrand_pygetset[] = { static PyTypeObject gccrand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCCRand", /* @tp_name@ */ + "GCCRand", /* @tp_name@ */ sizeof(gccrand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -724,7 +745,7 @@ static PyTypeObject gccrand_pytype_skel = { static PyTypeObject gcrand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCRand", /* @tp_name@ */ + "GCRand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -825,7 +846,7 @@ end: static PyTypeObject sslprf_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.SSLRand", /* @tp_name@ */ + "SSLRand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -873,7 +894,7 @@ static PyTypeObject sslprf_pytype_skel = { static PyTypeObject tlsdx_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.TLSDataExpansion", /* @tp_name@ */ + "TLSDataExpansion", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -921,7 +942,7 @@ static PyTypeObject tlsdx_pytype_skel = { static PyTypeObject tlsprf_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.TLSPRF", /* @tp_name@ */ + "TLSPRF", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -980,7 +1001,7 @@ static PyObject *dsarand_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) goto end; rc = grand_dopywrap(ty, dsarand_create(p, sz), f_freeme); end: - return (0); + return (rc); } static PyObject *drget_seed(PyObject *me, void *hunoz) @@ -1001,7 +1022,7 @@ static PyGetSetDef dsarand_pygetset[] = { static PyTypeObject dsarand_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.DSARand", /* @tp_name@ */ + "DSARand", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1132,7 +1153,7 @@ static PyGetSetDef bbs_pygetset[] = { static PyTypeObject bbs_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.BlumBlumShub", /* @tp_name@ */ + "BlumBlumShub", /* @tp_name@ */ sizeof(grand_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1236,7 +1257,7 @@ static PyObject *meth__BBSPriv_generate(PyObject *me, rc->bp.n = MP_COPY(bp.n); end: mp_drop(bp.p); mp_drop(bp.q); mp_drop(bp.n); mp_drop(x); - return ((PyObject *)rc); + return ((PyObject *)rc); } static void bbspriv_pydealloc(PyObject *me) @@ -1281,16 +1302,16 @@ static PyMethodDef bbspriv_pymethods[] = { static PyGetSetDef bbspriv_pygetset[] = { #define GETSETNAME(op, name) bp##op##_##name - GET (n, "R.n -> Blum modulus") - GET (p, "R.p -> one of the factors of the modulus") - GET (q, "R.q -> one of the factors of the modulus") + GET (n, "R.n -> Blum modulus") + GET (p, "R.p -> one of the factors of the modulus") + GET (q, "R.q -> one of the factors of the modulus") #undef GETSETNAME { 0 } }; static PyTypeObject bbspriv_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.BBSPriv", /* @tp_name@ */ + "BBSPriv", /* @tp_name@ */ sizeof(bbspriv_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */