chiark / gitweb /
pwsafe: Get the master passphrase before the new password.
[catacomb-python] / ec.c
diff --git a/ec.c b/ec.c
index 8fd32cab72d6305fab32d01d413d88001e172f81..21aa352990ebdaaa0bfc6a23b3dc5317810d7c3b 100644 (file)
--- a/ec.c
+++ b/ec.c
@@ -1,13 +1,11 @@
 /* -*-c-*-
- *
- * $Id$
  *
  * Elliptic curves
  *
  * (c) 2004 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of the Python interface to Catacomb.
  *
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * Catacomb/Python is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with Catacomb/Python; if not, write to the Free Software Foundation,
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
@@ -179,7 +177,7 @@ static void ecpt_pydealloc(PyObject *x)
 {
   EC_DESTROY(ECPT_P(x));
   Py_DECREF(ECPT_COBJ(x));
-  PyObject_DEL(x);
+  FREEOBJ(x);
 }
 
 static PyObject *ecpt_pymul(PyObject *x, PyObject *y)
@@ -233,7 +231,8 @@ end:
 static PyObject *epmeth_oncurvep(PyObject *me, PyObject *arg)
 {
   if (!PyArg_ParseTuple(arg, ":oncurvep")) return (0);
-  return (getbool(!ec_check(ECPT_C(me), ECPT_P(me))));
+  return (getbool(EC_ATINF(ECPT_P(me)) ||
+                 !EC_CHECK(ECPT_C(me), ECPT_P(me))));
 }
 
 static PyObject *epmeth_dbl(PyObject *me, PyObject *arg)
@@ -472,16 +471,6 @@ static int ecptxl(ec_curve *c, ec *p, PyObject *x, PyObject *y, PyObject *z)
     return (ecptxl_1(c, p, x));
 }
 
-static int ecpt_fromobjects(PyObject *cc, ec *p,
-                           PyObject *x, PyObject *y, PyObject *z)
-{
-  ec_curve *c = 0;
-
-  if (cc && PyType_IsSubtype((PyTypeObject *)cc, ecptcurve_pytype))
-    c = ECCURVE_C(cc);
-  return (ecptxl(c, p, x, y, z));
-}
-
 static PyObject *ecptnc_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
 {
   PyObject *x = 0, *y = 0, *z = 0;
@@ -517,7 +506,7 @@ static PyObject *ecpt_pylong(PyObject *me)
   PyObject *rc = 0;
   if (EC_ATINF(ECPT_P(me))) VALERR("point at infinity");
   getecptout(&p, me);
-  rc = (PyObject *)mp_topylong(p.x);
+  rc = mp_topylong(p.x);
 end:
   EC_DESTROY(&p);
   return (rc);
@@ -599,7 +588,7 @@ static PyNumberMethods ecpt_pynumber = {
 };
 
 static PyTypeObject ecpt_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECPt",                     /* @tp_name@ */
   sizeof(ecpt_pyobj),                  /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -631,7 +620,7 @@ static PyTypeObject ecpt_pytype_skel = {
   ecpt_pyrichcompare,                  /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   ecptnc_pymethods,                    /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   ecptnc_pygetset,                     /* @tp_getset@ */
@@ -643,7 +632,7 @@ static PyTypeObject ecpt_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   ecptnc_pynew,                                /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -664,6 +653,7 @@ static PyMethodDef ecpt_pymethods[] = {
 #define METHNAME(func) epmeth_##func
   METH (toraw,         "X.toraw() -> BIN")
   METH (dbl,           "X.dbl() -> X + X")
+  METH (oncurvep,      "X.oncurvep() -> BOOL")
 #undef METHNAME
   { 0 }
 };
@@ -712,7 +702,7 @@ static PyNumberMethods ecptcurve_pynumber = {
 };
 
 static PyTypeObject ecptcurve_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECPtCurve",                        /* @tp_name@ */
   sizeof(ecpt_pyobj),                  /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -744,7 +734,7 @@ static PyTypeObject ecptcurve_pytype_skel = {
   0,                                   /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   ecpt_pymethods,                      /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   ecpt_pygetset,                       /* @tp_getset@ */
@@ -756,7 +746,7 @@ static PyTypeObject ecptcurve_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   abstract_pynew,                      /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -782,10 +772,10 @@ static int ecmmul_fill(void *pp, PyObject *me, PyObject *x, PyObject *m)
 {
   ec_mulfactor *f = pp;
 
+  EC_CREATE(&f->base);
   if (getecpt(ECCURVE_C(me), &f->base, x) ||
       (f->exp = getmp(m)) == 0)
     return (-1);
-  f->base = *ECPT_P(x);
   return (0);
 }
 
@@ -909,21 +899,20 @@ static PyObject *ecmeth_rand(PyObject *me, PyObject *arg, PyObject *kw)
 static PyObject *eccurve_dopywrap(PyTypeObject *ty,
                                  PyObject *fobj, ec_curve *c)
 {
-  eccurve_pyobj *cobj = newtype(ty, 0);
+  eccurve_pyobj *cobj = newtype(ty, 0, c->ops->name);
   cobj->c = c;
   cobj->fobj = fobj;
-  cobj->ty.tp_name = (/*unconst*/ char *)c->ops->name;
-  cobj->ty.tp_basicsize = sizeof(ecpt_pyobj);
-  cobj->ty.tp_base = ecptcurve_pytype;
+  cobj->ty.ht_type.tp_basicsize = sizeof(ecpt_pyobj);
+  cobj->ty.ht_type.tp_base = ecptcurve_pytype;
   Py_INCREF(ecptcurve_pytype);
-  cobj->ty.tp_flags = (Py_TPFLAGS_DEFAULT |
-                      Py_TPFLAGS_BASETYPE |
-                      Py_TPFLAGS_CHECKTYPES |
-                      Py_TPFLAGS_HEAPTYPE);
-  cobj->ty.tp_alloc = PyType_GenericAlloc;
-  cobj->ty.tp_free =_PyObject_Del;
-  cobj->ty.tp_new = ecpt_pynew;
-  PyType_Ready(&cobj->ty);
+  cobj->ty.ht_type.tp_flags = (Py_TPFLAGS_DEFAULT |
+                              Py_TPFLAGS_BASETYPE |
+                              Py_TPFLAGS_CHECKTYPES |
+                              Py_TPFLAGS_HEAPTYPE);
+  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);
   return ((PyObject *)cobj);
 }
 
@@ -958,7 +947,7 @@ static PyObject *eccurve_pynew(PyTypeObject *ty,
   char *kwlist[] = { "field", "a", "b", 0 };
   mp *aa = 0, *bb = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!OO", kwlist,
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O&O&", kwlist,
                                   field_pytype, &fobj,
                                   convmp, &aa, convmp, &bb))
     goto end;
@@ -977,7 +966,7 @@ static PyObject *meth__ECCurve_parse(PyObject *me, PyObject *arg)
   ec_curve *c;
   PyObject *rc = 0;
 
-  if (!PyArg_ParseTuple(arg, "Os", &me, &p))
+  if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p))
     goto end;
   qd.p = p;
   qd.e = 0;
@@ -994,7 +983,7 @@ static PyObject *ecget_name(PyObject *me, void *hunoz)
 static PyObject *ecget_a(PyObject *me, void *hunoz)
   { return (fe_pywrap(ECCURVE_FOBJ(me), MP_COPY(ECCURVE_C(me)->a))); }
 
-static PyObject *ecget_b(PyObject *me, void *hunoz) 
+static PyObject *ecget_b(PyObject *me, void *hunoz)
   { return (fe_pywrap(ECCURVE_FOBJ(me), MP_COPY(ECCURVE_C(me)->b))); }
 
 static PyObject *ecget_field(PyObject *me, void *hunoz)
@@ -1012,7 +1001,7 @@ static PyGetSetDef eccurve_pygetset[] = {
   GET  (inf,           "E.inf -> point at infinity of this curve")
 #undef GETSETNAME
   { 0 }
-};  
+};
 
 static PyMethodDef eccurve_pymethods[] = {
 #define METHNAME(name) ecmeth_##name
@@ -1025,7 +1014,7 @@ E.mmul([(P0, N0), (P1, N1), ...]) = N0 P0 + N1 P1 + ...")
 };
 
 static PyTypeObject eccurve_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECCurve",                  /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1056,7 +1045,7 @@ static PyTypeObject eccurve_pytype_skel = {
   eccurve_pyrichcompare,               /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   eccurve_pymethods,                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   eccurve_pygetset,                    /* @tp_getset@ */
@@ -1068,7 +1057,7 @@ static PyTypeObject eccurve_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   abstract_pynew,                      /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -1079,7 +1068,7 @@ static PyObject *ecprimecurve_pynew(PyTypeObject *ty,
 }
 
 static PyTypeObject ecprimecurve_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECPrimeCurve",             /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1110,7 +1099,7 @@ static PyTypeObject ecprimecurve_pytype_skel = {
   eccurve_pyrichcompare,               /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   0,                                   /* @tp_getset@ */
@@ -1122,7 +1111,7 @@ static PyTypeObject ecprimecurve_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   ecprimecurve_pynew,                  /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -1133,7 +1122,7 @@ static PyObject *ecprimeprojcurve_pynew(PyTypeObject *ty,
 }
 
 static PyTypeObject ecprimeprojcurve_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECPrimeProjCurve",         /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1164,7 +1153,7 @@ static PyTypeObject ecprimeprojcurve_pytype_skel = {
   eccurve_pyrichcompare,               /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   0,                                   /* @tp_getset@ */
@@ -1176,7 +1165,7 @@ static PyTypeObject ecprimeprojcurve_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   ecprimeprojcurve_pynew,              /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -1187,7 +1176,7 @@ static PyObject *ecbincurve_pynew(PyTypeObject *ty,
 }
 
 static PyTypeObject ecbincurve_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECBinCurve",               /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1218,7 +1207,7 @@ static PyTypeObject ecbincurve_pytype_skel = {
   eccurve_pyrichcompare,               /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   0,                                   /* @tp_getset@ */
@@ -1230,7 +1219,7 @@ static PyTypeObject ecbincurve_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   ecbincurve_pynew,                    /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -1241,7 +1230,7 @@ static PyObject *ecbinprojcurve_pynew(PyTypeObject *ty,
 }
 
 static PyTypeObject ecbinprojcurve_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECBinProjCurve",           /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1272,7 +1261,7 @@ static PyTypeObject ecbinprojcurve_pytype_skel = {
   eccurve_pyrichcompare,               /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   0,                                   /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   0,                                   /* @tp_getset@ */
@@ -1284,7 +1273,7 @@ static PyTypeObject ecbinprojcurve_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   ecbinprojcurve_pynew,                        /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -1319,7 +1308,7 @@ static void ecinfo_pydealloc(PyObject *me)
   MP_DROP(ei->r);
   MP_DROP(ei->h);
   Py_DECREF(ECINFO_COBJ(me));
-  PyObject_DEL(me);
+  FREEOBJ(me);
 }
 
 static PyObject *ecinfo_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
@@ -1337,7 +1326,7 @@ static PyObject *ecinfo_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
     TYERR("point not from this curve");
   ei.c = ECCURVE_C(e);
   EC_CREATE(&ei.g);
-  EC_COPY(&ei.g, ECPT_P(g));
+  EC_OUT(ei.c, &ei.g, ECPT_P(g));
   rc = (ecinfo_pyobj *)ty->tp_alloc(ty, 0);
   rc->ei = ei;
   rc->cobj = e;
@@ -1446,7 +1435,7 @@ static PyMethodDef ecinfo_pymethods[] = {
 };
 
 static PyTypeObject ecinfo_pytype_skel = {
-  PyObject_HEAD_INIT(&PyType_Type) 0,  /* Header */
+  PyObject_HEAD_INIT(0) 0,             /* Header */
   "catacomb.ECInfo",                   /* @tp_name@ */
   sizeof(ecinfo_pyobj),                        /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1477,7 +1466,7 @@ static PyTypeObject ecinfo_pytype_skel = {
   ecinfo_pyrichcompare,                        /* @tp_richcompare@ */
   0,                                   /* @tp_weaklistoffset@ */
   0,                                   /* @tp_iter@ */
-  0,                                   /* @tp_iternexr@ */
+  0,                                   /* @tp_iternext@ */
   ecinfo_pymethods,                    /* @tp_methods@ */
   0,                                   /* @tp_members@ */
   ecinfo_pygetset,                     /* @tp_getset@ */
@@ -1489,7 +1478,7 @@ static PyTypeObject ecinfo_pytype_skel = {
   0,                                   /* @tp_init@ */
   PyType_GenericAlloc,                 /* @tp_alloc@ */
   ecinfo_pynew,                                /* @tp_new@ */
-  _PyObject_Del,                       /* @tp_free@ */
+  0,                                   /* @tp_free@ */
   0                                    /* @tp_is_gc@ */
 };
 
@@ -1497,12 +1486,12 @@ static PyTypeObject ecinfo_pytype_skel = {
 
 static PyMethodDef methods[] = {
 #define METHNAME(func) meth_##func
-  METH (_ECPt_frombuf,         "frombuf(E, STR) -> (P, REST)")
-  METH (_ECPtCurve_fromraw,    "fromraw(E, STR) -> (P, REST)")
-  METH (_ECPt_parse,           "parse(E, STR) -> (P, REST)")
-  METH (_ECCurve_parse,        "parse(STR) -> (E, REST)")
-  METH (_ECInfo_parse,         "parse(STR) -> (I, REST)")
-  METH (_ECInfo__curven,       "_curven(N) -> I")
+  METH (_ECPt_frombuf,         "frombuf(E, STR) -> (P, REST)")
+  METH (_ECPtCurve_fromraw,    "fromraw(E, STR) -> (P, REST)")
+  METH (_ECPt_parse,           "parse(E, STR) -> (P, REST)")
+  METH (_ECCurve_parse,        "parse(STR) -> (E, REST)")
+  METH (_ECInfo_parse,         "parse(STR) -> (I, REST)")
+  METH (_ECInfo__curven,       "_curven(N) -> I")
 #undef METHNAME
   { 0 }
 };
@@ -1538,7 +1527,7 @@ static PyObject *namedcurves(void)
     }
     c = PyInt_FromLong(i);
   found:
-    PyDict_SetItemString(d, (/*unconst*/ char *)ectab[i].name, c);
+    PyDict_SetItemString(d, (/*unconst*/ char *)p, c);
     Py_DECREF(c);
   }
   ncurves = i;