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@ */
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@ */
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@ */
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@ */
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;
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);
}
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@ */
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@ */
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);
}
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@ */
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@ */
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);
}
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);
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@ */
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@ */
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@ */
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);
}
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@ */
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@ */
/*----- 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);
INITTYPE(gmhash, ghash);
INITTYPE(gcprp, type);
INITTYPE(gprp, root);
+ addmethods(methods);
}
GEN(gcciphers, cipher)
streamciphers = '''
rc4 seal
'''.split()
+latindances = '''
+salsa20 salsa20/12 salsa20/8 xsalsa20 xsalsa20/12 xsalsa20/8
+chacha20 chacha12 chacha8 xchacha20 xchacha12 xchacha8
+'''.split()
+streamciphers += map(lambda s: s.translate(None, '/'), latindances)
hashes = '''
md2 md4 md5 tiger has160
sha sha224 sha256 sha384 sha512
print '#define PRPS(_) \\'
for i in prps:
- print ' _(%s, %s) \\' % (i.upper(), i)
-print ' /* end */'
-print
-
-print '#define RNGF_INT 1u'
+ print '\t_(%s, %s) \\' % (i.upper(), i)
+print '\t/* end */'
print
print '#define RNGS(_) \\'
for i in (cross(prps, ['ofb', 'counter'])):
- print (' _("%(prim)s-%(mode)s", %(prim)s_keysz, ' +
- '%(prim)s_%(mode)srand, 0) \\') % \
- {'prim': i[0], 'mode': i[1]}
+ print ('\t_("%(prim)s-%(mode)s", %(prim)s_keysz, ' +
+ '%(prim)s_%(mode)srand, 0, 0) \\') % \
+ {'prim': i[0], 'mode': i[1]}
for i in (cross(hashes, 'mgf')):
- print (' _("%(prim)s-%(mode)s", %(prim)s_%(mode)skeysz, ' +
- '%(prim)s_%(mode)srand, 0) \\') % \
- {'prim': i[0], 'mode': i[1]}
-print ' _("rc4", rc4_keysz, rc4_rand, 0) \\'
-print ' _("seal", seal_keysz, seal_rand, RNGF_INT) \\'
-print ' /* end */'
+ print ('\t_("%(prim)s-%(mode)s", %(prim)s_%(mode)skeysz, ' +
+ '%(prim)s_%(mode)srand, 0, 0) \\') % \
+ {'prim': i[0], 'mode': i[1]}
+print '\t_("rc4", rc4_keysz, rc4_rand, 0, 0) \\'
+print '\t_("seal", seal_keysz, seal_rand, RNGF_INT, 0) \\'
+for i in latindances:
+ for r in ['salsa20', 'xsalsa20', 'chacha', 'xchacha']:
+ if i.startswith(r):
+ root = r
+ break
+ else:
+ raise ValueError, 'failed to find root name for %s' % i
+ print ('\t_("%(name)s", %(root)s_keysz, %(id)s_rand, ' +
+ 'RNGF_NONCE, %(ROOT)s_NONCESZ) \\') % \
+ {'name': i, 'id': i.translate(None, '/'),
+ 'root': root, 'ROOT': root.upper()}
+print '\t/* end */'
print
static PyTypeObject rbuf_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ReadBuffer", /* @tp_name@ */
+ "ReadBuffer", /* @tp_name@ */
sizeof(buf_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject wbuf_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.WriteBuffer", /* @tp_name@ */
+ "WriteBuffer", /* @tp_name@ */
sizeof(buf_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject bytestring_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ByteString", /* @tp_name@ */
+ "ByteString", /* @tp_name@ */
0, /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
#include <mLib/dstr.h>
#include <mLib/macros.h>
#include <mLib/quis.h>
+#include <mLib/unihash.h>
#include <catacomb/buf.h>
#include <catacomb/mpmont.h>
#include <catacomb/mpbarrett.h>
#include <catacomb/mpreduce.h>
+#include <catacomb/mp-fibonacci.h>
#include <catacomb/pgen.h>
#include <catacomb/pfilt.h>
#define VALERR(str) EXCERR(PyExc_ValueError, str)
#define TYERR(str) EXCERR(PyExc_TypeError, str)
#define ZDIVERR(str) EXCERR(PyExc_ZeroDivisionError, str)
-#define SYNERR(str) EXCERR(PyExc_SyntaxError, str)
#define SYSERR(str) EXCERR(PyExc_SystemError, str)
#define NIERR(str) EXCERR(PyExc_NotImplementedError, str)
#define INDEXERR(idx) do { \
{ #name, ty, offsetof(MEMBERSTRUCT, name), f, doc },
#define MODULES(_) \
+ _(util) \
_(bytestring) _(buffer) \
_(rand) _(algorithms) _(pubkey) _(pgen) \
_(mp) _(field) _(ec) _(group) \
- _(passphrase) _(share) _(key) \
- _(util)
+ _(passphrase) _(share) _(key)
#define DOMODINIT(m) m##_pyinit();
#define DOMODINSERT(m) m##_pyinsert(mod);
#define INIT_MODULES do { MODULES(DOMODINIT) } while (0)
extern PyObject *getulong(unsigned long);
extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *);
-extern PyObject * mkexc(PyObject *, PyObject *, const char *, PyMethodDef *);
+extern PyObject *mkexc(PyObject *, PyObject *, const char *, PyMethodDef *);
+extern void typeready(PyTypeObject *);
extern PyTypeObject *inittype(PyTypeObject *);
extern void addmethods(const PyMethodDef *);
extern PyMethodDef *donemethods(void);
C(KF_CATMASK), C(KCAT_SYMM), C(KCAT_PRIV), C(KCAT_PUB), C(KCAT_SHARE),
C(KF_NONSECRET),
C(KF_BURN), C(KF_OPT),
+ C(EC_XONLY), C(EC_YBIT), C(EC_LSB), C(EC_CMPR), C(EC_EXPLY), C(EC_SORT),
#define ENTRY(tag, val, str) C(KERR_##tag),
KEY_ERRORS(ENTRY)
#undef ENTRY
{ 0 }
};
+static void init_random(void)
+{
+#if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 6)
+ char *seed;
+ uint32 r;
+
+ if (!Py_HashRandomizationFlag) return;
+ seed = getenv("PYTHONHASHSEED");
+ if (!seed || strcmp(seed, "random") == 0) r = GR_WORD(&rand_global);
+ else r = strtoul(seed, 0, 0);
+ if (!r) r = 0xe011f220; /* zero doesn't work well */
+ unihash_setkey(&unihash_global, r);
+#endif
+}
+
void init_base(void)
{
PyObject *mod;
addmethods(methods);
INIT_MODULES;
+ init_random();
mod = Py_InitModule("catacomb._base", donemethods());
INSERT_MODULES;
INSERT("smallprimes", smallprimes());
'DHInfo', 'BinDHInfo', 'RSAPriv', 'BBSPriv',
'PrimeFilter', 'RabinMiller',
'Group', 'GE',
- 'KeyData']:
+ 'KeySZ', 'KeyData']:
c = d[i]
pre = '_' + i + '_'
plen = len(pre)
setattr(c, j[plen:], classmethod(b[j]))
for i in [gcciphers, gchashes, gcmacs, gcprps]:
for c in i.itervalues():
- d[c.name.replace('-', '_')] = c
+ d[c.name.replace('-', '_').translate(None, '/')] = c
for c in gccrands.itervalues():
- d[c.name.replace('-', '_') + 'rand'] = c
+ d[c.name.replace('-', '_').translate(None, '/') + 'rand'] = c
_init()
## A handy function for our work: add the methods of a named class to an
###--------------------------------------------------------------------------
### Multiprecision integers and binary polynomials.
+def _split_rat(x):
+ if isinstance(x, BaseRat): return x._n, x._d
+ else: return x, 1
+class BaseRat (object):
+ """Base class implementing fields of fractions over Euclidean domains."""
+ def __new__(cls, a, b):
+ a, b = cls.RING(a), cls.RING(b)
+ q, r = divmod(a, b)
+ if r == 0: return q
+ g = b.gcd(r)
+ me = super(BaseRat, cls).__new__(cls)
+ me._n = a//g
+ me._d = b//g
+ return me
+ @property
+ def numer(me): return me._n
+ @property
+ def denom(me): return me._d
+ def __str__(me): return '%s/%s' % (me._n, me._d)
+ def __repr__(me): return '%s(%s, %s)' % (type(me).__name__, me._n, me._d)
+
+ def __add__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(me._n*d + n*me._d, d*me._d)
+ __radd__ = __add__
+ def __sub__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(me._n*d - n*me._d, d*me._d)
+ def __rsub__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(n*me._d - me._n*d, d*me._d)
+ def __mul__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(me._n*n, me._d*d)
+ def __div__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(me._n*d, me._d*n)
+ def __rdiv__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(me._d*n, me._n*d)
+ def __cmp__(me, you):
+ n, d = _split_rat(you)
+ return type(me)(me._n*d, n*me._d)
+ def __rcmp__(me, you):
+ n, d = _split_rat(you)
+ return cmp(n*me._d, me._n*d)
+
+class IntRat (BaseRat):
+ RING = MP
+
+class GFRat (BaseRat):
+ RING = GF
+
class _tmp:
def negp(x): return x < 0
def posp(x): return x > 0
def mont(x): return MPMont(x)
def barrett(x): return MPBarrett(x)
def reduce(x): return MPReduce(x)
- def factorial(x):
- 'factorial(X) -> X!'
- if x < 0: raise ValueError, 'factorial argument must be > 0'
- return MPMul.product(xrange(1, x + 1))
- factorial = staticmethod(factorial)
+ def __div__(me, you): return IntRat(me, you)
+ def __rdiv__(me, you): return IntRat(you, me)
_augment(MP, _tmp)
class _tmp:
def halftrace(x, y): return x.reduce().halftrace(y)
def modsqrt(x, y): return x.reduce().sqrt(y)
def quadsolve(x, y): return x.reduce().quadsolve(y)
+ def __div__(me, you): return GFRat(me, you)
+ def __rdiv__(me, you): return GFRat(you, me)
_augment(GF, _tmp)
class _tmp:
class _tmp:
def __repr__(me): return '%s(%sL)' % (type(me).__name__, me.p)
+ def __hash__(me): return 0x114401de ^ hash(me.p)
def ec(me, a, b): return ECPrimeProjCurve(me, a, b)
_augment(PrimeField, _tmp)
_augment(BinField, _tmp)
class _tmp:
+ def __hash__(me): return 0x23e4701c ^ hash(me.p)
+_augment(BinPolyField, _tmp)
+
+class _tmp:
+ def __hash__(me):
+ h = 0x9a7d6240
+ h ^= hash(me.p)
+ h ^= 2*hash(me.beta) & 0xffffffff
+ return h
+_augment(BinNormField, _tmp)
+
+class _tmp:
def __str__(me): return str(me.value)
def __repr__(me): return '%s(%s)' % (repr(me.field), repr(me.value))
_augment(FE, _tmp)
_augment(ECCurve, _tmp)
class _tmp:
+ def __hash__(me):
+ h = 0x6751d341
+ h ^= hash(me.field)
+ h ^= 2*hash(me.a) ^ 0xffffffff
+ h ^= 5*hash(me.b) ^ 0xffffffff
+ return h
+_augment(ECPrimeCurve, _tmp)
+
+class _tmp:
+ def __hash__(me):
+ h = 0x2ac203c5
+ h ^= hash(me.field)
+ h ^= 2*hash(me.a) ^ 0xffffffff
+ h ^= 5*hash(me.b) ^ 0xffffffff
+ return h
+_augment(ECBinCurve, _tmp)
+
+class _tmp:
def __repr__(me):
if not me: return 'ECPt()'
return 'ECPt(%s, %s)' % (me.ix, me.iy)
def __repr__(me):
return 'ECInfo(curve = %r, G = %r, r = %s, h = %s)' % \
(me.curve, me.G, me.r, me.h)
+ def __hash__(me):
+ h = 0x9bedb8de
+ h ^= hash(me.curve)
+ h ^= 2*hash(me.G) & 0xffffffff
+ return h
def group(me):
return ECGroup(me)
_augment(ECInfo, _tmp)
_augment(Group, _tmp)
class _tmp:
+ def __hash__(me):
+ info = me.info
+ h = 0xbce3cfe6
+ h ^= hash(info.p)
+ h ^= 2*hash(info.r) & 0xffffffff
+ h ^= 5*hash(info.g) & 0xffffffff
+ return h
+_augment(PrimeGroup, _tmp)
+
+class _tmp:
+ def __hash__(me):
+ info = me.info
+ h = 0x80695949
+ h ^= hash(info.p)
+ h ^= 2*hash(info.r) & 0xffffffff
+ h ^= 5*hash(info.g) & 0xffffffff
+ return h
+_augment(BinGroup, _tmp)
+
+class _tmp:
+ def __hash__(me): return 0x0ec23dab ^ hash(me.info)
+_augment(ECGroup, _tmp)
+
+class _tmp:
def __repr__(me):
return '%r(%r)' % (me.group, str(me))
_augment(GE, _tmp)
static long ecpt_pyhash(PyObject *me)
{
- long i;
+ uint32 h;
+ buf b;
ec p = EC_INIT;
+ size_t sz = 2*ECPT_C(me)->f->noctets + 1;
+ octet *q = xmalloc(sz);
+ h = 0xe0fdd039 + ECPT_C(me)->f->ops->ty;
+ buf_init(&b, q, sz);
EC_OUT(ECPT_C(me), &p, ECPT_P(me));
- i = 0xe0fdd039; /* random perturbance */
- if (p.x) i ^= mp_tolong(p.x);
- if (p.y) i ^= mp_tolong(p.y);
- if (i == -1) i = -2;
+ ec_putraw(ECPT_C(me), &b, &p);
EC_DESTROY(&p);
- return (i);
+ xfree(q);
+ h = unihash_hash(&unihash_global, h, BBASE(&b), BLEN(&b));
+ return (h % LONG_MAX);
}
static PyObject *ecpt_pyrichcompare(PyObject *x, PyObject *y, int op)
return (rc);
}
+static PyObject *epmeth_ec2osp(PyObject *me, PyObject *arg, PyObject *kw)
+{
+ buf b;
+ PyObject *rc;
+ char *p;
+ ec_curve *c = ECPT_C(me);
+ ec pp = EC_INIT;
+ int f = EC_EXPLY;
+ int len;
+ char *kwlist[] = { "flags", 0 };
+
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|i:ectosp", kwlist, &f))
+ return (0);
+ len = c->f->noctets * 2 + 1;
+ rc = bytestring_pywrap(0, len);
+ p = PyString_AS_STRING(rc);
+ buf_init(&b, p, len);
+ EC_OUT(c, &pp, ECPT_P(me));
+ if (ec_ec2osp(c, f, &b, &pp)) {
+ Py_DECREF(rc); rc = 0;
+ VALERR("invalid flags");
+ }
+ EC_DESTROY(&pp);
+ _PyString_Resize(&rc, BLEN(&b));
+end:
+ return (rc);
+}
+
static PyObject *epget_curve(PyObject *me, void *hunoz)
{ RETURN_OBJ(ECPT_COBJ(me)); }
qd.p = q;
qd.e = 0;
if (!ec_ptparse(&qd, p))
- SYNERR(qd.e);
+ VALERR(qd.e);
goto fix;
} else if (c && (xx = tomp(x)) != 0) {
xx = F_IN(c->f, xx, xx);
static PyTypeObject ecpt_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECPt", /* @tp_name@ */
+ "ECPt", /* @tp_name@ */
sizeof(ecpt_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyMethodDef ecpt_pymethods[] = {
#define METHNAME(func) epmeth_##func
METH (toraw, "X.toraw() -> BIN")
+ KWMETH(ec2osp, "X.ec2osp([flags = EC_EXPLY]) -> BIN")
METH (dbl, "X.dbl() -> X + X")
METH (oncurvep, "X.oncurvep() -> BOOL")
#undef METHNAME
static PyTypeObject ecptcurve_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECPtCurve", /* @tp_name@ */
+ "ECPtCurve", /* @tp_name@ */
sizeof(ecpt_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
buf_init(&b, p, len);
cc = ECCURVE_C(me);
if (ec_getraw(cc, &b, &pp))
- SYNERR("bad point");
+ VALERR("bad point");
+ EC_IN(cc, &pp, &pp);
+ rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b));
+end:
+ return (rc);
+}
+
+static PyObject *meth__ECPtCurve_os2ecp(PyObject *me,
+ PyObject *arg, PyObject *kw)
+{
+ char *p;
+ int len;
+ buf b;
+ PyObject *rc = 0;
+ ec_curve *cc;
+ int f = EC_XONLY | EC_LSB | EC_SORT | EC_EXPLY;
+ ec pp = EC_INIT;
+ char *kwlist[] = { "buf", "flags", 0 };
+
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|f:os2ecp", kwlist,
+ &me, &p, &len, &f))
+ return (0);
+ buf_init(&b, p, len);
+ cc = ECCURVE_C(me);
+ if (ec_os2ecp(cc, f, &b, &pp)) VALERR("bad point");
EC_IN(cc, &pp, &pp);
rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b));
end:
if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p)) goto end;
qd.p = p;
qd.e = 0;
- if (!ec_ptparse(&qd, &pp)) SYNERR(qd.e);
+ if (!ec_ptparse(&qd, &pp)) VALERR(qd.e);
rc = Py_BuildValue("(Ns)", ecpt_pywrapout(me, &pp), qd.p);
end:
return (rc);
cobj->ty.ht_type.tp_alloc = PyType_GenericAlloc;
cobj->ty.ht_type.tp_free = 0;
cobj->ty.ht_type.tp_new = ecpt_pynew;
- PyType_Ready(&cobj->ty.ht_type);
+ typeready(&cobj->ty.ht_type);
return ((PyObject *)cobj);
}
qd.p = p;
qd.e = 0;
if ((c = ec_curveparse(&qd)) == 0)
- SYNERR(qd.e);
+ VALERR(qd.e);
rc = eccurve_pywrap(0, c);
end:
return (rc);
static PyTypeObject eccurve_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECCurve", /* @tp_name@ */
+ "ECCurve", /* @tp_name@ */
sizeof(eccurve_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject ecprimecurve_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECPrimeCurve", /* @tp_name@ */
+ "ECPrimeCurve", /* @tp_name@ */
sizeof(eccurve_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject ecprimeprojcurve_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECPrimeProjCurve", /* @tp_name@ */
+ "ECPrimeProjCurve", /* @tp_name@ */
sizeof(eccurve_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject ecbincurve_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECBinCurve", /* @tp_name@ */
+ "ECBinCurve", /* @tp_name@ */
sizeof(eccurve_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject ecbinprojcurve_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECBinProjCurve", /* @tp_name@ */
+ "ECBinProjCurve", /* @tp_name@ */
sizeof(eccurve_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
qd.p = p;
qd.e = 0;
if (ec_infoparse(&qd, &ei))
- SYNERR(qd.e);
+ VALERR(qd.e);
rc = Py_BuildValue("(Ns)", ecinfo_pywrap(&ei), qd.p);
end:
return (rc);
static PyTypeObject ecinfo_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECInfo", /* @tp_name@ */
+ "ECInfo", /* @tp_name@ */
sizeof(ecinfo_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
#define METHNAME(func) meth_##func
METH (_ECPt_frombuf, "frombuf(E, STR) -> (P, REST)")
METH (_ECPtCurve_fromraw, "fromraw(E, STR) -> (P, REST)")
+ KWMETH(_ECPtCurve_os2ecp, "os2ecp(E, STR, [flags = ...]) -> (P, REST)")
METH (_ECPt_parse, "parse(E, STR) -> (P, REST)")
METH (_ECCurve_parse, "parse(STR) -> (E, REST)")
METH (_ECInfo_parse, "parse(STR) -> (I, REST)")
fobj->ty.ht_type.tp_alloc = PyType_GenericAlloc;
fobj->ty.ht_type.tp_free = 0;
fobj->ty.ht_type.tp_new = fe_pynew;
- PyType_Ready(&fobj->ty.ht_type);
+ typeready(&fobj->ty.ht_type);
return ((PyObject *)fobj);
}
static long fe_pyhash(PyObject *me)
{
- long i = mp_tolong(FE_X(me));
- i ^= 0xdcf62d6c; /* random perturbance */
- if (i == -1)
- i = -2;
- return (i);
+ size_t sz = FE_F(me)->noctets;
+ uint32 h = 0xe0c127ca + FE_F(me)->ops->ty;
+ octet *p = xmalloc(sz);
+ mp_storeb(FE_X(me), p, sz);
+ h = unihash_hash(&unihash_global, h, p, sz);
+ xfree(p);
+ return (h % LONG_MAX);
}
static int fe_pycoerce(PyObject **x, PyObject **y)
static PyTypeObject fe_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.FE", /* @tp_name@ */
+ "FE", /* @tp_name@ */
sizeof(fe_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject field_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.Field", /* @tp_name@ */
+ "Field", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject primefield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeField", /* @tp_name@ */
+ "PrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject niceprimefield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.NicePrimeField", /* @tp_name@ */
+ "NicePrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject binfield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinField", /* @tp_name@ */
+ "BinField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject binpolyfield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinPolyField", /* @tp_name@ */
+ "BinPolyField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject binnormfield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinNormField", /* @tp_name@ */
+ "BinNormField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
qd.p = p;
qd.e = 0;
if ((f = field_parse(&qd)) == 0)
- SYNERR(qd.e);
+ VALERR(qd.e);
rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p);
end:
return (rc);
if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p)) goto end;
qd.p = p;
qd.e = 0;
- if (parse(&qd, &gp)) SYNERR(qd.e);
+ if (parse(&qd, &gp)) VALERR(qd.e);
rc = fginfo_pywrap(&gp, ty);
end:
return (rc);
static PyTypeObject fginfo_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.FGInfo", /* @tp_name@ */
+ "FGInfo", /* @tp_name@ */
sizeof(fginfo_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject dhinfo_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.DHInfo", /* @tp_name@ */
+ "DHInfo", /* @tp_name@ */
sizeof(fginfo_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject bindhinfo_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinDHInfo", /* @tp_name@ */
+ "BinDHInfo", /* @tp_name@ */
sizeof(fginfo_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
sc.buf = PyString_AS_STRING(x);
sc.lim = sc.buf + PyString_GET_SIZE(x);
if (G_READ(g, xx, &mptext_stringops, &sc) || sc.buf < sc.lim)
- SYNERR("malformed group element string");
+ VALERR("malformed group element string");
} else
TYERR("can't convert to group element");
return (ge_pywrap((PyObject *)ty, xx));
gobj->ty.ht_type.tp_alloc = PyType_GenericAlloc;
gobj->ty.ht_type.tp_free = 0;
gobj->ty.ht_type.tp_new = ge_pynew;
- PyType_Ready(&gobj->ty.ht_type);
+ typeready(&gobj->ty.ht_type);
return ((PyObject *)gobj);
}
g = GROUP_G(me);
x = G_CREATE(g);
if (G_READ(g, x, &mptext_stringops, &sc))
- SYNERR("bad group element string");
+ VALERR("bad group element string");
return (Py_BuildValue("(Ns#)", ge_pywrap(me, x),
sc.buf, (int)(sc.lim - sc.buf)));
end:
qd.p = p;
qd.e = 0;
if ((g = group_parse(&qd)) == 0)
- SYNERR(qd.e);
+ VALERR(qd.e);
return (group_pywrap(g));
end:
return (0);
G_COPY(g, x, g->g); return (ge_pywrap(me, x));
}
+static long ge_pyhash(PyObject *me)
+{
+ buf b;
+ size_t sz = GE_G(me)->noctets + 4;
+ uint32 h = 0xf672c776 + GE_G(me)->ops->ty;
+ octet *p = xmalloc(sz);
+ buf_init(&b, p, sz);
+ G_TOBUF(GE_G(me), &b, GE_X(me));
+ assert(BOK(&b));
+ h = unihash_hash(&unihash_global, h, BBASE(&b), BLEN(&b));
+ xfree(p);
+ return (h % LONG_MAX);
+}
+
static PyObject *gget_r(PyObject *me, void *hunoz)
{ return (mp_pywrap(MP_COPY(GROUP_G(me)->r))); }
static PyTypeObject ge_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.GE", /* @tp_name@ */
+ "GE", /* @tp_name@ */
sizeof(ge_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
&ge_pynumber, /* @tp_as_number@ */
0, /* @tp_as_sequence@ */
0, /* @tp_as_mapping@ */
- 0, /* @tp_hash@ */
+ ge_pyhash, /* @tp_hash@ */
0, /* @tp_call@ */
ge_pystr, /* @tp_str@ */
0, /* @tp_getattro@ */
static PyTypeObject group_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.Group", /* @tp_name@ */
+ "Group", /* @tp_name@ */
sizeof(group_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject primegroup_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeGroup", /* @tp_name@ */
+ "PrimeGroup", /* @tp_name@ */
sizeof(group_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject bingroup_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinGroup", /* @tp_name@ */
+ "BinGroup", /* @tp_name@ */
sizeof(group_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject ecgroup_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.ECGroup", /* @tp_name@ */
+ "ECGroup", /* @tp_name@ */
sizeof(group_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydata_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyData", /* @tp_name@ */
+ "KeyData", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydatabin_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyDataBinary", /* @tp_name@ */
+ "KeyDataBinary", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydataenc_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyDataEncrypted", /* @tp_name@ */
+ "KeyDataEncrypted", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydatamp_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyDataMP", /* @tp_name@ */
+ "KeyDataMP", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydatastr_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyDataString", /* @tp_name@ */
+ "KeyDataString", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydataec_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyDataECPt", /* @tp_name@ */
+ "KeyDataECPt", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject subkeyiter_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.SubKeyIter", /* @tp_name@ */
+ "SubKeyIter", /* @tp_name@ */
sizeof(subkeyiter_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keydatastruct_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyDataStructured", /* @tp_name@ */
+ "KeyDataStructured", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keyattriter_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyAttributeIter", /* @tp_name@ */
+ "KeyAttributeIter", /* @tp_name@ */
sizeof(keyattriter_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keyattrs_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyAttributes", /* @tp_name@ */
+ "KeyAttributes", /* @tp_name@ */
sizeof(keyattrs_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject key_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.Key", /* @tp_name@ */
+ "Key", /* @tp_name@ */
sizeof(key_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keyiter_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyFileIter", /* @tp_name@ */
+ "KeyFileIter", /* @tp_name@ */
sizeof(keyiter_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject keyfile_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KeyFile", /* @tp_name@ */
+ "KeyFile", /* @tp_name@ */
sizeof(keyfile_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject mp_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.MP", /* @tp_name@ */
+ "MP", /* @tp_name@ */
sizeof(mp_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
if (!good_radix_p(r, 1)) VALERR("bad radix");
sc.buf = p; sc.lim = p + len;
if ((zz = mp_read(MP_NEW, r, &mptext_stringops, &sc)) == 0)
- SYNERR("bad integer");
+ VALERR("bad integer");
z = Py_BuildValue("(Ns#)", mp_pywrap(zz), sc.buf, (int)(sc.lim - sc.buf));
end:
return (z);
}
+static PyObject *meth__MP_factorial(PyObject *me, PyObject *arg)
+{
+ unsigned long i;
+ mp *x;
+ if (!PyArg_ParseTuple(arg, "OO&:factorial", &me, convulong, &i))
+ return (0);
+ x = mp_factorial(i);
+ return mp_pywrap(x);
+}
+
+static PyObject *meth__MP_fibonacci(PyObject *me, PyObject *arg)
+{
+ long i;
+ mp *x;
+ if (!PyArg_ParseTuple(arg, "Ol:fibonacci", &me, &i)) return (0);
+ x = mp_fibonacci(i);
+ return mp_pywrap(x);
+}
+
#define LOADOP(pre, py, name) \
static PyObject *meth__##py##_##name(PyObject *me, PyObject *arg) \
{ \
static PyTypeObject *mpmul_pytype, mpmul_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.MPMul", /* @tp_name@ */
+ "MPMul", /* @tp_name@ */
sizeof(mpmul_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject *mpmont_pytype, mpmont_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.MPMont", /* @tp_name@ */
+ "MPMont", /* @tp_name@ */
sizeof(mpmont_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject *mpbarrett_pytype, mpbarrett_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.MPBarrett", /* @tp_name@ */
+ "MPBarrett", /* @tp_name@ */
sizeof(mpbarrett_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject *mpreduce_pytype, mpreduce_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.MPReduce", /* @tp_name@ */
+ "MPReduce", /* @tp_name@ */
sizeof(mpreduce_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject *mpcrt_pytype, mpcrt_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.MPCRT", /* @tp_name@ */
+ "MPCRT", /* @tp_name@ */
sizeof(mpcrt_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject gf_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.GF", /* @tp_name@ */
+ "GF", /* @tp_name@ */
sizeof(mp_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
if ((zz = mp_read(MP_NEW, r, &mptext_stringops, &sc)) == 0 ||
MP_NEGP(zz)) {
if (zz) MP_DROP(zz);
- SYNERR("bad binary polynomial");
+ VALERR("bad binary polynomial");
}
z = Py_BuildValue("(Ns#)", gf_pywrap(zz), sc.buf, (int)(sc.lim - sc.buf));
end:
static PyTypeObject *gfreduce_pytype, gfreduce_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.GFReduce", /* @tp_name@ */
+ "GFReduce", /* @tp_name@ */
sizeof(gfreduce_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject gfn_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.GFN", /* @tp_name@ */
+ "GFN", /* @tp_name@ */
sizeof(gfn_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
Parse STR as a binary polynomial, according to radix. If radix is zero,\n\
read a prefix from STR to decide radix: allow `0' for octal, `0x' for hex\n\
or `R_' for other radix R.")
+ METH (_MP_factorial, "\
+factorial(I) -> I!: compute factorial")
+ METH (_MP_fibonacci, "\
+fibonacci(I) -> F(I): compute Fibonacci number")
METH (_MP_loadl, "\
loadl(STR) -> X: read little-endian bytes")
METH (_MP_loadb, "\
static PyTypeObject pixie_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.Pixie", /* @tp_name@ */
+ "Pixie", /* @tp_name@ */
sizeof(pixie_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject pfilt_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeFilter", /* @tp_name@ */
+ "PrimeFilter", /* @tp_name@ */
sizeof(pfilt_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject rabin_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.RabinMiller", /* @tp_name@ */
+ "RabinMiller", /* @tp_name@ */
sizeof(rabin_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject pgevent_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeGenEvent", /* @tp_name@ */
+ "PrimeGenEvent", /* @tp_name@ */
sizeof(pgevent_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject pgev_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeGenBuiltinHandler", /* @tp_name@ */
+ "PrimeGenBuiltinHandler", /* @tp_name@ */
sizeof(pgev_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject pgstep_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeGenStepper", /* @tp_name@ */
+ "PrimeGenStepper", /* @tp_name@ */
sizeof(pgstep_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject pgjump_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeGenJumper", /* @tp_name@ */
+ "PrimeGenJumper", /* @tp_name@ */
sizeof(pgjump_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject pgtest_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeGenTester", /* @tp_name@ */
+ "PrimeGenTester", /* @tp_name@ */
sizeof(pgtest_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject dsapub_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.DSAPub", /* @tp_name@ */
+ "DSAPub", /* @tp_name@ */
sizeof(dsa_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject dsapriv_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.DSAPriv", /* @tp_name@ */
+ "DSAPriv", /* @tp_name@ */
sizeof(dsa_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject kcdsapub_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KCDSAPub", /* @tp_name@ */
+ "KCDSAPub", /* @tp_name@ */
sizeof(dsa_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject kcdsapriv_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.KCDSAPriv", /* @tp_name@ */
+ "KCDSAPriv", /* @tp_name@ */
sizeof(dsa_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject rsapub_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.RSAPub", /* @tp_name@ */
+ "RSAPub", /* @tp_name@ */
sizeof(rsapub_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject rsapriv_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.RSAPriv", /* @tp_name@ */
+ "RSAPriv", /* @tp_name@ */
sizeof(rsapriv_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
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@ */
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@ */
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@ */
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@ */
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
};
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);
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);
}
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@ */
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@ */
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@ */
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@ */
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@ */
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@ */
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@ */
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@ */
static PyTypeObject gfshare_pytype_skel = {
PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.GFShare", /* @tp_name@ */
+ "GFShare", /* @tp_name@ */
sizeof(gfshare_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject gfsharesplit_pytype_skel = {
PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.GFShareSplit", /* @tp_name@ */
+ "GFShareSplit", /* @tp_name@ */
sizeof(gfshare_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject gfsharejoin_pytype_skel = {
PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.GFShareJoin", /* @tp_name@ */
+ "GFShareJoin", /* @tp_name@ */
sizeof(gfshare_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject share_pytype_skel = {
PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.Share", /* @tp_name@ */
+ "Share", /* @tp_name@ */
sizeof(share_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject sharesplit_pytype_skel = {
PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.ShareSplit", /* @tp_name@ */
+ "ShareSplit", /* @tp_name@ */
sizeof(share_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyTypeObject sharejoin_pytype_skel = {
PyObject_HEAD_INIT(&PyType_Type) 0, /* Header */
- "catacomb.ShareJoin", /* @tp_name@ */
+ "ShareJoin", /* @tp_name@ */
sizeof(share_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
#include "catacomb-python.h"
+/*----- External values ---------------------------------------------------*/
+
+static PyObject *modname = 0;
+
/*----- Conversions -------------------------------------------------------*/
PyObject *getulong(unsigned long w)
return (ty);
}
+void typeready(PyTypeObject *ty)
+{
+ PyType_Ready(ty);
+ PyDict_SetItemString(ty->tp_dict, "__module__", modname);
+}
+
PyTypeObject *inittype(PyTypeObject *tyskel)
{
PyTypeObject *ty = newtype(&PyType_Type, tyskel, 0);
ty->tp_flags |= Py_TPFLAGS_HEAPTYPE;
- PyType_Ready(ty);
+ typeready(ty);
return (ty);
}
void util_pyinit(void)
{
+ modname = PyString_FromString("catacomb");
INITTYPE(itemiter, root);
INITTYPE(valiter, root);
}