X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/11cb3d97caae1888a6d6ae63ff6e2dea9f7cce01..dc0757504af5097a4bb323d64e429a99f86d1076:/algorithms.c diff --git a/algorithms.c b/algorithms.c index be953b0..4753cf0 100644 --- a/algorithms.c +++ b/algorithms.c @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id$ - * * Symmetric cryptography * * (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. @@ -47,7 +45,7 @@ PyObject *keysz_pywrap(const octet *k) } break; case KSZ_RANGE: { keyszrange_pyobj *o = - PyObject_New(keyszrange_pyobj, keyszrange_pytype); + PyObject_New(keyszrange_pyobj, keyszrange_pytype); o->dfl = k[1]; o->min = k[2]; o->max = k[3]; @@ -57,7 +55,7 @@ PyObject *keysz_pywrap(const octet *k) } break; case KSZ_SET: { keyszset_pyobj *o = - PyObject_New(keyszset_pyobj, keyszset_pytype); + PyObject_New(keyszset_pyobj, keyszset_pytype); int i, n; o->dfl = k[1]; for (i = 0; k[i + 1]; i++) ; @@ -145,7 +143,7 @@ static PyObject *keyszset_pynew(PyTypeObject *ty, if (xx < 0) VALERR("key size cannot be negative"); PyList_Append(l, x); Py_DECREF(x); - x = 0; + x = 0; } Py_DECREF(set); if ((set = PySequence_Tuple(l)) == 0) goto end; @@ -232,7 +230,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 +278,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 +326,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 +375,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 +422,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; @@ -439,7 +455,7 @@ PyObject *gcipher_pywrap(PyObject *cobj, gcipher *c, unsigned f) g = PyObject_NEW(gcipher_pyobj, (PyTypeObject *)cobj); g->c = c; g->f = f; - return ((PyObject *)g); + return ((PyObject *)g); } static PyObject *gcipher_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) @@ -455,23 +471,23 @@ static PyObject *gcipher_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) GC_INIT(GCCIPHER_CC(ty), k, sz), f_freeme)); end: - return (0); + return (0); } PyObject *gccipher_pywrap(gccipher *cc) { gccipher_pyobj *g = newtype(gccipher_pytype, 0, cc->name); g->cc = cc; - g->ty.type.tp_basicsize = sizeof(gcipher_pyobj); - g->ty.type.tp_base = gcipher_pytype; + g->ty.ht_type.tp_basicsize = sizeof(gcipher_pyobj); + g->ty.ht_type.tp_base = gcipher_pytype; Py_INCREF(gcipher_pytype); - g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.type.tp_alloc = PyType_GenericAlloc; - g->ty.type.tp_free = 0; - g->ty.type.tp_new = gcipher_pynew; - PyType_Ready(&g->ty.type); + g->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.ht_type.tp_alloc = PyType_GenericAlloc; + g->ty.ht_type.tp_free = 0; + g->ty.ht_type.tp_new = gcipher_pynew; + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -591,7 +607,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 +655,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@ */ @@ -699,23 +715,23 @@ static PyObject *ghash_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) goto end; return (ghash_pywrap((PyObject *)ty, GH_INIT(GCHASH_CH(ty)), f_freeme)); end: - return (0); + return (0); } PyObject *gchash_pywrap(gchash *ch) { gchash_pyobj *g = newtype(gchash_pytype, 0, ch->name); g->ch = ch; - g->ty.type.tp_basicsize = sizeof(ghash_pyobj); - g->ty.type.tp_base = ghash_pytype; + g->ty.ht_type.tp_basicsize = sizeof(ghash_pyobj); + g->ty.ht_type.tp_base = ghash_pytype; Py_INCREF(ghash_pytype); - g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.type.tp_alloc = PyType_GenericAlloc; - g->ty.type.tp_free = 0; - g->ty.type.tp_new = ghash_pynew; - PyType_Ready(&g->ty.type); + g->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.ht_type.tp_alloc = PyType_GenericAlloc; + g->ty.ht_type.tp_free = 0; + g->ty.ht_type.tp_new = ghash_pynew; + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -727,7 +743,7 @@ PyObject *ghash_pywrap(PyObject *cobj, ghash *h, unsigned f) g = PyObject_NEW(ghash_pyobj, (PyTypeObject *)cobj); g->h = h; g->f = f; - return ((PyObject *)g); + return ((PyObject *)g); } static void ghash_pydealloc(PyObject *me) @@ -826,7 +842,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 +890,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@ */ @@ -941,7 +957,7 @@ static PyObject *gmac_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) GM_KEY(GCMAC_CM(ty), k, sz), f_freeme)); end: - return (0); + return (0); } static PyObject *gmhash_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) @@ -961,16 +977,16 @@ PyObject *gcmac_pywrap(gcmac *cm) { gcmac_pyobj *g = newtype(gcmac_pytype, 0, cm->name); g->cm = cm; - g->ty.type.tp_basicsize = sizeof(gmac_pyobj); - g->ty.type.tp_base = gmac_pytype; + g->ty.ht_type.tp_basicsize = sizeof(gmac_pyobj); + g->ty.ht_type.tp_base = gmac_pytype; Py_INCREF(gmac_pytype); - g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.type.tp_alloc = PyType_GenericAlloc; - g->ty.type.tp_free = 0; - g->ty.type.tp_new = gmac_pynew; - PyType_Ready(&g->ty.type); + g->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.ht_type.tp_alloc = PyType_GenericAlloc; + g->ty.ht_type.tp_free = 0; + g->ty.ht_type.tp_new = gmac_pynew; + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -980,20 +996,20 @@ PyObject *gmac_pywrap(PyObject *cobj, gmac *m, unsigned f) if (!cobj) cobj = gcmac_pywrap((/*unconst*/ gcmac *)GM_CLASS(m)); else Py_INCREF(cobj); g = newtype((PyTypeObject *)cobj, 0, 0); - g->ty.name = PyString_FromFormat("%s(keyed)", m->ops->c->name); - g->ty.type.tp_name = PyString_AS_STRING(g->ty.name); - g->ty.type.tp_base = gmhash_pytype; + g->ty.ht_name = PyString_FromFormat("%s(keyed)", m->ops->c->name); + g->ty.ht_type.tp_name = PyString_AS_STRING(g->ty.ht_name); + g->ty.ht_type.tp_base = gmhash_pytype; Py_INCREF(gmac_pytype); - g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.type.tp_alloc = PyType_GenericAlloc; - g->ty.type.tp_free = 0; - g->ty.type.tp_new = gmhash_pynew; - PyType_Ready(&g->ty.type); + g->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.ht_type.tp_alloc = PyType_GenericAlloc; + g->ty.ht_type.tp_free = 0; + g->ty.ht_type.tp_new = gmhash_pynew; + typeready(&g->ty.ht_type); g->m = m; g->f = f; - return ((PyObject *)g); + return ((PyObject *)g); } static void gmac_pydealloc(PyObject *me) @@ -1024,7 +1040,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 +1088,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 +1136,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@ */ @@ -1203,7 +1219,7 @@ static const struct prpinfo *const gprptab[] = { #define PRP_ENTRY(PRE, pre) &pre##_prpinfo, PRPS(PRP_ENTRY) 0 -}; +}; typedef struct gcprp_pyobj { PyHeapTypeObject ty; @@ -1240,7 +1256,7 @@ static PyObject *gprp_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) Py_INCREF(me); return (me); end: - return (0); + return (0); } static void gprp_pydealloc(PyObject *me) @@ -1250,16 +1266,16 @@ static PyObject *gcprp_pywrap(const prpinfo *prp) { gcprp_pyobj *g = newtype(gcprp_pytype, 0, prp->name); g->prp = prp; - g->ty.type.tp_basicsize = sizeof(gprp_pyobj) + prp->ctxsz; - g->ty.type.tp_base = gprp_pytype; + g->ty.ht_type.tp_basicsize = sizeof(gprp_pyobj) + prp->ctxsz; + g->ty.ht_type.tp_base = gprp_pytype; Py_INCREF(gprp_pytype); - g->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT | - Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HEAPTYPE); - g->ty.type.tp_alloc = PyType_GenericAlloc; - g->ty.type.tp_free = 0; - g->ty.type.tp_new = gprp_pynew; - PyType_Ready(&g->ty.type); + g->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HEAPTYPE); + g->ty.ht_type.tp_alloc = PyType_GenericAlloc; + g->ty.ht_type.tp_free = 0; + g->ty.ht_type.tp_new = gprp_pynew; + typeready(&g->ty.ht_type); return ((PyObject *)g); } @@ -1317,7 +1333,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 +1381,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 +1429,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 +1466,7 @@ void algorithms_pyinit(void) INITTYPE(gmhash, ghash); INITTYPE(gcprp, type); INITTYPE(gprp, root); + addmethods(methods); } GEN(gcciphers, cipher)