X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/blobdiff_plain/b2687a0a4b3c5e45cad7c5815a6d3805bfc8d4f1..2b1672ca4d5d93f1cbad3acbd728d3fa32986cdb:/algorithms.c diff --git a/algorithms.c b/algorithms.c index ea52434..3a618d0 100644 --- a/algorithms.c +++ b/algorithms.c @@ -1,6 +1,4 @@ /* -*-c-*- - * - * $Id$ * * Symmetric cryptography * @@ -37,21 +35,31 @@ PyTypeObject *keysz_pytype; PyTypeObject *keyszany_pytype, *keyszrange_pytype, *keyszset_pytype; PyObject *sha_pyobj, *has160_pyobj; +#ifndef KSZ_OPMASK +# define KSZ_OPMASK 0x1f +#endif + +#ifndef KSZ_16BIT +# define KSZ_16BIT 0x20 +#endif + PyObject *keysz_pywrap(const octet *k) { - switch (k[0]) { + unsigned op = *k++; +#define ARG(i) (op&KSZ_16BIT ? LOAD16(k + 2*(i)) : k[i]) + switch (op&KSZ_OPMASK) { case KSZ_ANY: { keysz_pyobj *o = PyObject_New(keysz_pyobj, keyszany_pytype); - o->dfl = k[1]; + o->dfl = ARG(0); return ((PyObject *)o); } break; case KSZ_RANGE: { keyszrange_pyobj *o = PyObject_New(keyszrange_pyobj, keyszrange_pytype); - o->dfl = k[1]; - o->min = k[2]; - o->max = k[3]; - o->mod = k[4]; + o->dfl = ARG(0); + o->min = ARG(1); + o->max = ARG(2); + o->mod = ARG(3); if (!o->mod) o->mod = 1; return ((PyObject *)o); } break; @@ -59,16 +67,17 @@ PyObject *keysz_pywrap(const octet *k) keyszset_pyobj *o = PyObject_New(keyszset_pyobj, keyszset_pytype); int i, n; - o->dfl = k[1]; - for (i = 0; k[i + 1]; i++) ; + o->dfl = ARG(0); + for (i = 0; ARG(i); i++) ; n = i; o->set = PyTuple_New(n); for (i = 0; i < n; i++) - PyTuple_SET_ITEM(o->set, i, PyInt_FromLong(k[i + 1])); + PyTuple_SET_ITEM(o->set, i, PyInt_FromLong(ARG(i))); return ((PyObject *)o); } break; default: abort(); } +#undef ARG } static PyObject *keyszany_pynew(PyTypeObject *ty, @@ -232,7 +241,7 @@ static PyMemberDef keyszset_pymembers[] = { static PyTypeObject keysz_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZ", /* @tp_name@ */ + "KeySZ", /* @tp_name@ */ sizeof(keysz_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -280,7 +289,7 @@ static PyTypeObject keysz_pytype_skel = { static PyTypeObject keyszany_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZAny", /* @tp_name@ */ + "KeySZAny", /* @tp_name@ */ sizeof(keysz_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -328,7 +337,7 @@ static PyTypeObject keyszany_pytype_skel = { static PyTypeObject keyszrange_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZRange", /* @tp_name@ */ + "KeySZRange", /* @tp_name@ */ sizeof(keyszrange_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -377,7 +386,7 @@ sizes, and requires the key length to be a multiple of some value.", static PyTypeObject keyszset_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.KeySZSet", /* @tp_name@ */ + "KeySZSet", /* @tp_name@ */ sizeof(keyszset_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -424,6 +433,24 @@ few listed sizes.", 0 /* @tp_is_gc@ */ }; +#define KSZCONVOP(op) \ + static PyObject *meth__KeySZ_##op(PyObject *me, PyObject *arg) \ + { \ + double x, y; \ + if (!PyArg_ParseTuple(arg, "Od:" #op, &me, &x)) return (0); \ + y = keysz_##op(x); \ + return (PyFloat_FromDouble(y)); \ + } +KSZCONVOP(fromdl) +KSZCONVOP(fromschnorr) +KSZCONVOP(fromif) +KSZCONVOP(fromec) +KSZCONVOP(todl) +KSZCONVOP(toschnorr) +KSZCONVOP(toif) +KSZCONVOP(toec) +#undef KSZCONVOP + /*----- Symmetric encryption ----------------------------------------------*/ PyTypeObject *gccipher_pytype, *gcipher_pytype; @@ -471,7 +498,7 @@ PyObject *gccipher_pywrap(gccipher *cc) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gcipher_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -591,7 +618,7 @@ static PyMethodDef gcipher_pymethods[] = { static PyTypeObject gccipher_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCCipher", /* @tp_name@ */ + "GCCipher", /* @tp_name@ */ sizeof(gccipher_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -639,7 +666,7 @@ static PyTypeObject gccipher_pytype_skel = { static PyTypeObject gcipher_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCipher", /* @tp_name@ */ + "GCipher", /* @tp_name@ */ sizeof(gcipher_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -715,7 +742,7 @@ PyObject *gchash_pywrap(gchash *ch) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = ghash_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -826,7 +853,7 @@ static PyMethodDef ghash_pymethods[] = { static PyTypeObject gchash_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCHash", /* @tp_name@ */ + "GCHash", /* @tp_name@ */ sizeof(gchash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -874,7 +901,7 @@ static PyTypeObject gchash_pytype_skel = { static PyTypeObject ghash_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GHash", /* @tp_name@ */ + "GHash", /* @tp_name@ */ sizeof(ghash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -970,7 +997,7 @@ PyObject *gcmac_pywrap(gcmac *cm) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gmac_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -990,7 +1017,7 @@ PyObject *gmac_pywrap(PyObject *cobj, gmac *m, unsigned f) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gmhash_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); g->m = m; g->f = f; return ((PyObject *)g); @@ -1024,7 +1051,7 @@ static PyGetSetDef gcmac_pygetset[] = { static PyTypeObject gcmac_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCMAC", /* @tp_name@ */ + "GCMAC", /* @tp_name@ */ sizeof(gchash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1072,7 +1099,7 @@ static PyTypeObject gcmac_pytype_skel = { static PyTypeObject gmac_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GMAC", /* @tp_name@ */ + "GMAC", /* @tp_name@ */ sizeof(gmac_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1120,7 +1147,7 @@ static PyTypeObject gmac_pytype_skel = { static PyTypeObject gmhash_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GMACHash", /* @tp_name@ */ + "GMACHash", /* @tp_name@ */ sizeof(ghash_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1259,7 +1286,7 @@ static PyObject *gcprp_pywrap(const prpinfo *prp) g->ty.ht_type.tp_alloc = PyType_GenericAlloc; g->ty.ht_type.tp_free = 0; g->ty.ht_type.tp_new = gprp_pynew; - PyType_Ready(&g->ty.ht_type); + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -1317,7 +1344,7 @@ static PyMethodDef gprp_pymethods[] = { static PyTypeObject gcprp_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GCPRP", /* @tp_name@ */ + "GCPRP", /* @tp_name@ */ sizeof(gcprp_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1365,7 +1392,7 @@ static PyTypeObject gcprp_pytype_skel = { static PyTypeObject gprp_pytype_skel = { PyObject_HEAD_INIT(0) 0, /* Header */ - "catacomb.GPRP", /* @tp_name@ */ + "GPRP", /* @tp_name@ */ sizeof(gprp_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -1413,6 +1440,28 @@ static PyTypeObject gprp_pytype_skel = { /*----- Main code ---------------------------------------------------------*/ +static PyMethodDef methods[] = { +#define METHNAME(func) meth_##func + METH (_KeySZ_fromdl, "\ +fromdl(N) -> M: convert integer discrete log field size to work factor") + METH (_KeySZ_fromschnorr, "\ +fromschnorr(N) -> M: convert Schnorr group order to work factor") + METH (_KeySZ_fromif, "\ +fromif(N) -> M: convert integer factorization problem size to work factor") + METH (_KeySZ_fromec, "\ +fromec(N) -> M: convert elliptic curve group order to work factor") + METH (_KeySZ_todl, "\ +todl(N) -> M: convert work factor to integer discrete log field size") + METH (_KeySZ_toschnorr, "\ +toschnorr(N) -> M: convert work factor to Schnorr group order") + METH (_KeySZ_toif, "\ +toif(N) -> M: convert work factor to integer factorization problem size") + METH (_KeySZ_toec, "\ +toec(N) -> M: convert work factor to elliptic curve group order") +#undef METHNAME + { 0 } +}; + void algorithms_pyinit(void) { INITTYPE(keysz, root); @@ -1428,6 +1477,7 @@ void algorithms_pyinit(void) INITTYPE(gmhash, ghash); INITTYPE(gcprp, type); INITTYPE(gprp, root); + addmethods(methods); } GEN(gcciphers, cipher)