Bug squashing.
[pyke] / catacomb-python.h
index 368c7bb..40ac758 100644 (file)
 #include <longintrepr.h>
 #include <structmember.h>
 
+#undef ULLONG_MAX
+#undef ULONG_LONG_MAX
+
 #include <mLib/darray.h>
 #include <mLib/dstr.h>
 #include <mLib/macros.h>
+#include <mLib/quis.h>
 
 #include <catacomb/buf.h>
 
@@ -55,6 +59,7 @@
 #include <catacomb/dsarand.h>
 #include <catacomb/sslprf.h>
 #include <catacomb/tlsprf.h>
+#include <catacomb/blkc.h>
 
 #include <catacomb/gcipher.h>
 #include <catacomb/ghash.h>
 #include <catacomb/passphrase.h>
 #include <catacomb/pixie.h>
 
+#include <catacomb/share.h>
+#include <catacomb/gfshare.h>
+
 /*----- Utility macros ----------------------------------------------------*/
 
 #define RETURN_OBJ(obj) do { Py_INCREF(obj); return (obj); } while (0)
 #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 {                                             \
+  PyErr_SetObject(PyExc_KeyError, idx);                                        \
+  goto end;                                                            \
+} while (0)
 #define OSERR(name) do {                                               \
   PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);                 \
   goto end;                                                            \
   PyModule_AddObject(mod, name, _o);                                   \
 } while (0)
 
+#define INSEXC(name, var, base, meth)                                  \
+  INSERT(name, var = mkexc(mod, base, name, meth))
+
 #define METH(func, doc)                                                        \
   { #func, METHNAME(func), METH_VARARGS, doc },
 #define KWMETH(func, doc)                                              \
 #define MEMBER(name, ty, f, doc)                                       \
   { #name, ty, offsetof(MEMBERSTRUCT, name), f, doc },
 
-#define MODULES(DO)                                                    \
-  DO(bytestring)                                                       \
-  DO(rand) DO(algorithms) DO(pubkey) DO(pgen)                          \
-  DO(mp) DO(field) DO(ec) DO(group)                                    \
-  DO(passphrase)
+#define MODULES(_)                                                     \
+  _(bytestring) _(buffer)                                              \
+  _(rand) _(algorithms) _(pubkey) _(pgen)                              \
+  _(mp) _(field) _(ec) _(group)                                                \
+  _(passphrase) _(share) _(key)
 #define DOMODINIT(m) m##_pyinit();
 #define DOMODINSERT(m) m##_pyinsert(mod);
 #define INIT_MODULES do { MODULES(DOMODINIT) } while (0)
@@ -185,6 +201,82 @@ MODULES(DO)
 #define FREEOBJ(obj)                                                   \
   (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj)))
 
+#define GEN(func, base)                                                        \
+  static PyObject *func(void)                                          \
+  {                                                                    \
+    PyObject *d = PyDict_New();                                                \
+    PyObject *o;                                                       \
+    int i;                                                             \
+                                                                       \
+    for (i = 0; g##base##tab[i]; i++) {                                        \
+      o = gc##base##_pywrap((/*unconst*/ gc##base *)g##base##tab[i]);  \
+      PyDict_SetItemString(d,                                          \
+                          (/*unconst*/ char *)g##base##tab[i]->name,   \
+                          o);                                          \
+      Py_DECREF(o);                                                    \
+    }                                                                  \
+    return (d);                                                                \
+  }
+
+struct nameval { const char *name; unsigned long value; };
+extern void setconstants(PyObject *, const struct nameval *);
+
+extern PyObject *mexp_common(PyObject *, PyObject *, size_t,
+                            PyObject *(*id)(PyObject *),
+                            int (*fill)(void *, PyObject *,
+                                        PyObject *, PyObject *),
+                            PyObject *(*exp)(PyObject *, void *, int),
+                            void (*drop)(void *));
+
+extern int convulong(PyObject *, void *);
+#define DECL_CONVU_(n) extern int convu##n(PyObject *, void *);
+DOUINTSZ(DECL_CONVU_)
+extern int convmpw(PyObject *, void *);
+extern int convuint(PyObject *, void *);
+extern int convszt(PyObject *, void *);
+extern int convbool(PyObject *, void *);
+extern PyObject *abstract_pynew(PyTypeObject *, PyObject *, PyObject *);
+extern PyObject *getbool(int);
+#define DECL_GETU_(n) extern PyObject *getu##n(uint##n);
+DOUINTSZ(DECL_GETU_)
+extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *);
+
+extern PyObject * mkexc(PyObject *, PyObject *, const char *, PyMethodDef *);
+extern PyTypeObject *inittype(PyTypeObject *);
+extern void addmethods(const PyMethodDef *);
+extern PyMethodDef *donemethods(void);
+
+/*----- Mapping methods ---------------------------------------------------*/
+
+#define GMAP_METH(func, doc) { #func, gmapmeth_##func, METH_VARARGS, doc },
+#define GMAP_KWMETH(func, doc)                                         \
+  { #func, (PyCFunction)gmapmeth_##func, METH_VARARGS|METH_KEYWORDS, doc },
+#define GMAP_METHDECL(func, doc)                                       \
+  extern PyObject *gmapmeth_##func(PyObject *, PyObject *);
+#define GMAP_KWMETHDECL(func, doc)                                     \
+  extern PyObject *gmapmeth_##func(PyObject *, PyObject *, PyObject *);
+
+#define GMAP_DOMETHODS(METH, KWMETH)                                   \
+  METH (has_key,       "D.has_key(KEY) -> BOOL")                       \
+  METH (keys,          "D.keys() -> LIST")                             \
+  METH (values,        "D.values() -> LIST")                           \
+  METH (items,         "D.items() -> LIST")                            \
+  METH (iterkeys,      "D.iterkeys() -> ITER")                         \
+  METH (itervalues,    "D.itervalues() -> ITER")                       \
+  METH (iteritems,     "D.iteritems() -> ITER")                        \
+  METH (clear,         "D.clear()")                                    \
+  KWMETH(get,          "D.get(KEY, [default = None]) -> VALUE")        \
+  KWMETH(setdefault,   "D.setdefault(K, [default = None]) -> VALUE")   \
+  KWMETH(pop,          "D.pop(KEY, [default = <error>]) -> VALUE")     \
+  METH (popitem,       "D.popitem() -> (KEY, VALUE)")                  \
+  METH (update,        "D.update(MAP)")
+
+GMAP_DOMETHODS(GMAP_METHDECL, GMAP_KWMETHDECL)
+#define GMAP_METHODS GMAP_DOMETHODS(GMAP_METH, GMAP_KWMETH)
+extern int gmap_pysize(PyObject *);
+extern PySequenceMethods gmap_pysequence;
+extern PyMethodDef gmap_pymethods[];
+
 /*----- Bytestrings -------------------------------------------------------*/
 
 PyTypeObject *bytestring_pyobj;
@@ -204,8 +296,8 @@ extern PyTypeObject *gf_pytype;
 #define MP_PYCHECK(o) PyObject_TypeCheck((o), mp_pytype)
 #define GF_PYCHECK(o) PyObject_TypeCheck((o), gf_pytype)
 
-extern mp *mp_frompylong(PyLongObject *);
-extern PyLongObject *mp_topylong(mp *);
+extern mp *mp_frompylong(PyObject *);
+extern PyObject *mp_topylong(mp *);
 extern mp *tomp(PyObject *);
 extern mp *getmp(PyObject *);
 extern int convmp(PyObject *, void *);
@@ -221,7 +313,7 @@ extern int mp_tolong_checked(mp *, long *);
 /*----- Abstract fields ---------------------------------------------------*/
 
 typedef struct field_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   field *f;
 } field_pyobj;
 
@@ -236,7 +328,6 @@ extern mp *getfe(field *, PyObject *);
 typedef struct fe_pyobj {
   PyObject_HEAD
   field *f;
-  PyObject *fobj; /* to keep it alive */
   mp *x;
 } fe_pyobj;
       
@@ -271,10 +362,10 @@ extern PyObject *ecpt_pywrapout(void *, ec *);
 extern int toecpt(ec_curve *, ec *, PyObject *);
 extern int getecpt(ec_curve *, ec *, PyObject *);
 extern void getecptout(ec *, PyObject *);
-extern int convec(PyObject *, void *);
+extern int convecpt(PyObject *, void *);
 
 typedef struct eccurve_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   ec_curve *c;
   PyObject *fobj;
 } eccurve_pyobj;
@@ -328,7 +419,7 @@ extern PyTypeObject *ge_pytype;
 extern PyObject *ge_pywrap(PyObject *, ge *);
 
 typedef struct group_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   group *g;
 } group_pyobj;
 
@@ -383,7 +474,7 @@ extern PyObject *keysz_pywrap(const octet *);
 /*----- Symmetric cryptography --------------------------------------------*/
 
 typedef struct gccipher_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   gccipher *cc;
 } gccipher_pyobj;
 
@@ -409,7 +500,7 @@ extern PyObject *gcipher_pywrap(PyObject *, gcipher *, unsigned);
 extern int convgcipher(PyObject *, void *);
 
 typedef struct gchash_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   gchash *ch;
 } gchash_pyobj;
 
@@ -436,7 +527,7 @@ extern int convghash(PyObject *, void *);
 extern int convgmhash(PyObject *, void *);
 
 typedef struct gcmac_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   gcmac *cm;
 } gcmac_pyobj;
 
@@ -448,22 +539,18 @@ extern PyObject *gcmac_pywrap(gcmac *);
 extern int convgcmac(PyObject *, void *);
 
 typedef struct gmac_pyobj {
-  PyTypeObject ty;
+  PyHeapTypeObject ty;
   unsigned f;
   gmac *m;
-  PyObject *nameobj;
 } gmac_pyobj;
 
 extern PyTypeObject *gmac_pytype;
 #define GMAC_PYCHECK(o) PyObject_TypeCheck((o), gmac_pytype)
 #define GMAC_M(o) (((gmac_pyobj *)(o))->m)
-#define GMAC_NAMEOBJ(o) (((gmac_pyobj *)(o))->nameobj)
 #define GMAC_F(o) (((gmac_pyobj *)(o))->f)
 extern PyObject *gmac_pywrap(PyObject *, gmac *, unsigned);
 extern int convgmac(PyObject *, void *);
 
-/*----- Public key crypto -------------------------------------------------*/
-
 /*----- Key generation ----------------------------------------------------*/
     
 typedef struct pfilt_pyobj {
@@ -492,28 +579,6 @@ extern int convpgev(PyObject *, void *);
 extern void droppgev(pgev *);
 extern void pgenerr(void);
 
-/*----- Core utility functions --------------------------------------------*/
-
-extern PyObject *mexp_common(PyObject *, PyObject *, size_t,
-                            PyObject *(*id)(PyObject *),
-                            int (*fill)(void *, PyObject *,
-                                        PyObject *, PyObject *),
-                            PyObject *(*exp)(PyObject *, void *, int),
-                            void (*drop)(void *));
-
-extern int convulong(PyObject *, void *);
-extern int convu32(PyObject *, void *);
-extern int convmpw(PyObject *, void *);
-extern int convuint(PyObject *, void *);
-extern int convszt(PyObject *, void *);
-extern int convbool(PyObject *, void *);
-extern PyObject *abstract_pynew(PyTypeObject *, PyObject *, PyObject *);
-extern PyObject *getbool(int);
-extern PyObject *getu32(uint32);
-extern void *newtype(PyTypeObject *, const PyTypeObject *);
-extern PyTypeObject *inittype(PyTypeObject *);
-extern void addmethods(const PyMethodDef *);
-
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus