pubkey: Various stupid DSA bugs fixed.
[catacomb-python] / group.c
diff --git a/group.c b/group.c
index 461782c..fe05f15 100644 (file)
--- a/group.c
+++ b/group.c
@@ -35,9 +35,7 @@
 PyObject *fginfo_pywrap(gprime_param *dp, PyTypeObject *ty)
 {
   fginfo_pyobj *z = PyObject_New(fginfo_pyobj, ty);
-  z->dp.p = MP_COPY(dp->p);
-  z->dp.q = MP_COPY(dp->q);
-  z->dp.g = MP_COPY(dp->g);
+  z->dp = *dp;
   return ((PyObject *)z);
 }
 
@@ -51,7 +49,7 @@ static PyObject *fginfo_pynew(PyTypeObject *ty,
   if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&O&:new", kwlist,
                                   convmp, &dp.p,
                                   convmp, &dp.q,
-                                  &convmp, dp.g))
+                                  convmp, &dp.g))
     goto end;
   z = PyObject_New(fginfo_pyobj, ty);
   z->dp = dp;
@@ -64,22 +62,22 @@ end:
 }
 
 static PyObject *figet_r(PyObject *me, void *hunoz)
-  { return mp_pywrap(FGINFO_DP(me)->q); }
+  { return mp_pywrap(MP_COPY(FGINFO_DP(me)->q)); }
 
 static PyObject *diget_p(PyObject *me, void *hunoz)
-  { return mp_pywrap(FGINFO_DP(me)->p); }
+  { return mp_pywrap(MP_COPY(FGINFO_DP(me)->p)); }
 
 static PyObject *diget_g(PyObject *me, void *hunoz)
-  { return mp_pywrap(FGINFO_DP(me)->g); }
+  { return mp_pywrap(MP_COPY(FGINFO_DP(me)->g)); }
 
 static PyObject *biget_p(PyObject *me, void *hunoz)
-  { return gf_pywrap(FGINFO_DP(me)->p); }
+  { return gf_pywrap(MP_COPY(FGINFO_DP(me)->p)); }
 
 static PyObject *biget_m(PyObject *me, void *hunoz)
   { return PyInt_FromLong(mp_octets(FGINFO_DP(me)->p) - 1); }
 
 static PyObject *biget_g(PyObject *me, void *hunoz)
-  { return gf_pywrap(FGINFO_DP(me)->g); }
+  { return gf_pywrap(MP_COPY(FGINFO_DP(me)->g)); }
 
 static void fginfo_pydealloc(PyObject *me)
 {
@@ -151,6 +149,35 @@ end:
   return (rc);
 }
 
+static PyObject *meth__DHInfo_genkcdsa(PyObject *me,
+                                      PyObject *arg, PyObject *kw)
+{
+  dh_param dp;
+  unsigned ql, pl;
+  unsigned steps = 0;
+  grand *r = &rand_global;
+  pgev evt = { 0 };
+  char *kwlist[] = { "class", "pbits", "qbits",
+                    "event", "rng", "nsteps", 0 };
+  mp *v = MP_NEW;
+  PyObject *rc = 0;
+
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&|O&O&O&:genkcdsa", kwlist,
+                                  &me, convuint, &pl, convuint, &ql,
+                                  convpgev, &evt, convgrand, &r,
+                                  convuint, &steps))
+    goto end;
+  if (dh_kcdsagen(&dp, ql, pl, 0, steps, r, evt.proc, evt.ctx))
+    PGENERR;
+  mp_div(&v, 0, dp.p, dp.q);
+  v = mp_lsr(v, v, 1);
+  rc = Py_BuildValue("(NN)", fginfo_pywrap(&dp, dhinfo_pytype),
+                    mp_pywrap(v));
+end:
+  droppgev(&evt);
+  return (rc);
+}
+
 static PyObject *meth__DHInfo_gendsa(PyObject *me,
                                     PyObject *arg, PyObject *kw)
 {
@@ -165,7 +192,7 @@ static PyObject *meth__DHInfo_gendsa(PyObject *me,
     { "class", "pbits", "qbits", "seed", "event", "nsteps", 0 };
   PyObject *rc = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&s#|O&O&:generate", kwlist,
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "OO&O&s#|O&O&:gendsa", kwlist,
                                   &me, convuint, &pl, convuint, &ql,
                                   &k, &ksz, convpgev, &evt,
                                   convuint, &steps))
@@ -307,7 +334,7 @@ static PyTypeObject fginfo_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   fginfo_pygetset,                     /* @tp_getset@ */
@@ -355,7 +382,7 @@ static PyTypeObject dhinfo_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   dhinfo_pygetset,                     /* @tp_getset@ */
@@ -403,7 +430,7 @@ static PyTypeObject bindhinfo_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   bindhinfo_pygetset,                  /* @tp_getset@ */
@@ -507,17 +534,17 @@ static PyObject *group_dopywrap(PyTypeObject *ty, group *g)
 {
   group_pyobj *gobj = newtype(ty, 0, g->ops->name);
   gobj->g = g;
-  gobj->ty.type.tp_basicsize = sizeof(ge_pyobj);
-  gobj->ty.type.tp_base = ge_pytype;
+  gobj->ty.ht_type.tp_basicsize = sizeof(ge_pyobj);
+  gobj->ty.ht_type.tp_base = ge_pytype;
   Py_INCREF(group_pytype);
-  gobj->ty.type.tp_flags = (Py_TPFLAGS_DEFAULT |
-                           Py_TPFLAGS_BASETYPE |
-                           Py_TPFLAGS_CHECKTYPES |
-                           Py_TPFLAGS_HEAPTYPE);
-  gobj->ty.type.tp_alloc = PyType_GenericAlloc;
-  gobj->ty.type.tp_free = 0;
-  gobj->ty.type.tp_new = ge_pynew;
-  PyType_Ready(&gobj->ty.type);
+  gobj->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT |
+                              Py_TPFLAGS_BASETYPE |
+                              Py_TPFLAGS_CHECKTYPES |
+                              Py_TPFLAGS_HEAPTYPE);
+  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);
   return ((PyObject *)gobj);
 }
 
@@ -656,7 +683,7 @@ static PyObject *ge_pylong(PyObject *me)
 
   if ((x = G_TOINT(GE_G(me), MP_NEW, GE_X(me))) == 0)
     TYERR("can't convert to integer");
-  rc = (PyObject *)mp_topylong(x);
+  rc = mp_topylong(x);
 end:
   mp_drop(x);
   return (rc);
@@ -992,7 +1019,7 @@ static PyTypeObject ge_pytype_skel = {
   ge_pyrichcompare,                    /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   ge_pymethods,                                /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   ge_pygetset,                         /* @tp_getset@ */
@@ -1061,7 +1088,7 @@ static PyTypeObject group_pytype_skel = {
   group_pyrichcompare,                 /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   group_pymethods,                     /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   group_pygetset,                      /* @tp_getset@ */
@@ -1138,7 +1165,7 @@ static PyTypeObject primegroup_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   primegroup_pygetset,                 /* @tp_getset@ */
@@ -1215,7 +1242,7 @@ static PyTypeObject bingroup_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   bingroup_pygetset,                   /* @tp_getset@ */
@@ -1293,7 +1320,7 @@ static PyTypeObject ecgroup_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   ecgroup_pygetset,                    /* @tp_getset@ */
@@ -1330,6 +1357,9 @@ genlimlee(PBITS, QBITS, [event = pgen_nullev, ievent = pgen_nullev,\n\
   KWMETH(_DHInfo_gendsa,       "\
 gendsa(PBITS, QBITS, SEED, [event = pgen_nullev, nsteps = 0])\n\
   -> (D, SEED, COUNT)")
+  KWMETH(_DHInfo_genkcdsa,     "\
+gendsa(PBITS, QBITS, [event = pgen_nullev, rng = rand, nsteps = 0])\n\
+  -> (D, V)")
 #undef METHNAME
   { 0 }
 };