chiark / gitweb /
Merge remote-tracking branch 'origin/HEAD'
[catacomb-python] / group.c
diff --git a/group.c b/group.c
index 1432fc86e204c49ffa17ad8d57659d0dcafe1869..cc8bbc1986608450df3132db8bb72b6a33c7aee0 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)