rand.c: Add missing return-value mnemonic in docstring.
[catacomb-python] / group.c
diff --git a/group.c b/group.c
index e591301..9f7bbcd 100644 (file)
--- a/group.c
+++ b/group.c
@@ -695,8 +695,8 @@ static PyObject *ge_pyint(PyObject *me)
 
   if ((x = G_TOINT(GE_G(me), MP_NEW, GE_X(me))) == 0)
     TYERR("can't convert to integer");
-  if (mp_tolong_checked(x, &l)) goto end;
-  rc = PyInt_FromLong(l);
+  if (!mp_tolong_checked(x, &l, 0)) rc = PyInt_FromLong(l);
+  else rc = mp_topylong(x);
 end:
   mp_drop(x);
   return (rc);
@@ -717,18 +717,34 @@ end:
 static PyObject *gemeth_toec(PyObject *me, PyObject *arg, PyObject *kw)
 {
   char *kwlist[] = { "curve", 0 };
-  PyTypeObject *cty = ecpt_pytype;
+  PyTypeObject *cty = 0;
+  PyObject *rc = 0;
+  group *g;
+  ec_curve *c;
   ec p = EC_INIT;
 
   if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O:toec", kwlist,
                                   &cty)) goto end;
-  if (!PyType_Check(cty) || !PyType_IsSubtype(cty, ecpt_pytype))
-    TYERR("want subtype of catacomb.ECPt");
-  if (G_TOEC(GE_G(me), &p, GE_X(me)))
+  g = GROUP_G(GE_GOBJ(me));
+  if (cty) {
+    if (!PyType_Check(cty) || !PyType_IsSubtype(cty, ecpt_pytype))
+      TYERR("want subtype of catacomb.ECPt");
+    Py_INCREF((PyObject *)cty);
+  } else if (strcmp(G_NAME(g), "ec") == 0) {
+    c = eccurve_copy(((gctx_ec *)g)->ei.c);
+    cty = (PyTypeObject *)eccurve_pywrap(0, c);
+  } else  {
+    cty = ecpt_pytype;
+    Py_INCREF((PyObject *)cty);
+  }
+  if (G_TOEC(GE_G(me), &p, GE_X(me))) {
+    Py_DECREF((PyObject *)cty);
     TYERR("can't convert to ec point");
-  return (ecpt_pywrapout(cty, &p));
+  }
+  rc = ecpt_pywrapout(cty, &p);
+  Py_DECREF((PyObject *)cty);
 end:
-  return (0);
+  return (rc);
 }
 
 static PyObject *gemeth_tobuf(PyObject *me, PyObject *arg)
@@ -948,7 +964,7 @@ static PyMethodDef ge_pymethods[] = {
   METH (check,         "X.check() -> check X really belongs to its group")
   METH (toint,         "X.toint() -> X converted to an integer")
   KWMETH(toec,         "\
-X.toec(curve = ecpt) -> X converted to elliptic curve point")
+X.toec([curve = ECPt]) -> X converted to elliptic curve point")
   METH (tobuf,         "X.tobuf() -> X in buffer representation")
   METH (toraw,         "X.toraw() -> X in raw representation")
 #undef METHNAME
@@ -1063,7 +1079,7 @@ static PyMethodDef group_pymethods[] = {
 #define METHNAME(name) gmeth_##name
   METH (mexp,          "\
 G.mexp([(X0, N0), (X1, N1), ...]) -> X0^N0 X1^N1 ...")
-  KWMETH(checkgroup,   "G.checkgroup(rand = random): check group is good")
+  KWMETH(checkgroup,   "G.checkgroup([rng = rand]): check group is good")
 #undef METHNAME
   { 0 }
 };
@@ -1122,7 +1138,7 @@ static PyObject *pgget_info(PyObject *me, void *hunoz)
   gctx_prime *gg = (gctx_prime *)GROUP_G(me);
   dp.p = MP_COPY(gg->mm.m);
   dp.q = MP_COPY(gg->g.r);
-  dp.g = mpmont_reduce(&gg->mm, MP_NEW, gg->gen);
+  dp.g = mpmont_reduce(&gg->mm, MP_NEW, gg->gen.x);
   return (fginfo_pywrap(&dp, dhinfo_pytype));
 }
 
@@ -1199,7 +1215,7 @@ static PyObject *bgget_info(PyObject *me, void *hunoz)
   gctx_bin *gg = (gctx_bin *)GROUP_G(me);
   dp.p = MP_COPY(gg->r.p);
   dp.q = MP_COPY(gg->g.r);
-  dp.g = MP_COPY(gg->gen);
+  dp.g = MP_COPY(gg->gen.x);
   return (fginfo_pywrap(&dp, bindhinfo_pytype));
 }
 
@@ -1361,16 +1377,16 @@ static PyMethodDef methods[] = {
   METH (_DHInfo__groupn,       0)
   METH (_BinDHInfo__groupn,    0)
   KWMETH(_DHInfo_generate,     "\
-generate(PBITS, [qbits = 0, event = pgen_nullev,\n\
-        rng = rand, nsteps = 0]) -> D")
+generate(PBITS, [qbits = 0], [event = pgen_nullev],\n\
+        [rng = rand], [nsteps = 0]) -> D")
   KWMETH(_DHInfo_genlimlee,    "\
-genlimlee(PBITS, QBITS, [event = pgen_nullev, ievent = pgen_nullev,\n\
-         rng = rand, nsteps = 0, subgroupp = True]) -> (D, [Q, ...])")
+genlimlee(PBITS, QBITS, [event = pgen_nullev], [ievent = pgen_nullev],\n\
+         [rng = rand], [nsteps = 0], [subgroupp = True]) -> (D, [Q, ...])")
   KWMETH(_DHInfo_gendsa,       "\
-gendsa(PBITS, QBITS, SEED, [event = pgen_nullevnsteps = 0])\n\
+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\
+gendsa(PBITS, QBITS, [event = pgen_nullev], [rng = rand], [nsteps = 0])\n\
   -> (D, V)")
 #undef METHNAME
   { 0 }