X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/b2687a0a4b3c5e45cad7c5815a6d3805bfc8d4f1..5ec4e0d8db70dd19d6c294092c71e608d2888bb5:/rand.c diff --git a/rand.c b/rand.c index fee2a9b..6e1d05e 100644 --- a/rand.c +++ b/rand.c @@ -1,7 +1,5 @@ /* -*-c-*- * - * $Id$ - * * Random-number generators * * (c) 2004 Straylight/Edgeware @@ -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@ */ @@ -531,7 +529,7 @@ static PyGetSetDef truerand_pygetset[] = { 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 }; @@ -641,6 +644,25 @@ end: 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) { gccrand_pyobj *g = newtype(gccrand_pytype, 0, info->name); @@ -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@ */ @@ -1290,7 +1311,7 @@ static PyGetSetDef bbspriv_pygetset[] = { 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@ */