*.py: Add explicit conversions between binary and text strings.
[catacomb-python] / ec.c
diff --git a/ec.c b/ec.c
index 606b235..e5fd254 100644 (file)
--- a/ec.c
+++ b/ec.c
@@ -192,7 +192,7 @@ static PyObject *ecpt_pymul(PyObject *x, PyObject *y)
   return (ecpt_pywrap(ECPT_COBJ(y), &zz));
 }
 
-static long ecpt_pyhash(PyObject *me)
+static Py_hash_t ecpt_pyhash(PyObject *me)
 {
   uint32 h;
   ec p = EC_INIT;
@@ -251,10 +251,10 @@ static PyObject *epmeth_tobuf(PyObject *me)
   else
     n = mp_octets(p.x) + mp_octets(p.y) + 6;
   rc = bytestring_pywrap(0, n);
-  buf_init(&b, PyString_AS_STRING(rc), n);
+  buf_init(&b, BIN_PTR(rc), n);
   buf_putec(&b, &p);
   assert(BOK(&b));
-  _PyString_Resize(&rc, BLEN(&b));
+  BIN_SETLEN(rc, BLEN(&b));
   EC_DESTROY(&p);
   return (rc);
 }
@@ -270,12 +270,12 @@ static PyObject *epmeth_toraw(PyObject *me)
 
   len = c->f->noctets * 2 + 1;
   rc = bytestring_pywrap(0, len);
-  p = PyString_AS_STRING(rc);
+  p = BIN_PTR(rc);
   buf_init(&b, p, len);
   EC_OUT(c, &pp, ECPT_P(me));
   ec_putraw(c, &b, &pp);
   EC_DESTROY(&pp);
-  _PyString_Resize(&rc, BLEN(&b));
+  BIN_SETLEN(rc, BLEN(&b));
   return (rc);
 }
 
@@ -295,7 +295,7 @@ static PyObject *epmeth_ec2osp(PyObject *me, PyObject *arg, PyObject *kw)
     return (0);
   len = c->f->noctets * 2 + 1;
   rc = bytestring_pywrap(0, len);
-  p = PyString_AS_STRING(rc);
+  p = BIN_PTR(rc);
   buf_init(&b, p, len);
   EC_OUT(c, &pp, ECPT_P(me));
   if (ec_ec2osp(c, f, &b, &pp)) {
@@ -303,21 +303,20 @@ static PyObject *epmeth_ec2osp(PyObject *me, PyObject *arg, PyObject *kw)
     VALERR("invalid flags");
   }
   EC_DESTROY(&pp);
-  _PyString_Resize(&rc, BLEN(&b));
+  BIN_SETLEN(rc, BLEN(&b));
 end:
   return (rc);
 }
 
 static PyObject *epmeth_frombuf(PyObject *me, PyObject *arg)
 {
+  struct bin in;
   buf b;
-  char *p;
-  Py_ssize_t sz;
   PyObject *rc = 0;
   ec pp = EC_INIT;
 
-  if (!PyArg_ParseTuple(arg, "s#:frombuf", &p, &sz)) goto end;
-  buf_init(&b, p, sz);
+  if (!PyArg_ParseTuple(arg, "O&:frombuf", convbin, &in)) goto end;
+  buf_init(&b, (/*unconst*/ void *)in.p, in.sz);
   if (buf_getec(&b, &pp)) VALERR("malformed data");
   rc = Py_BuildValue("(NN)", ecpt_pywrapout(me, &pp),
                     bytestring_pywrapbuf(&b));
@@ -342,15 +341,14 @@ end:
 
 static PyObject *epmeth_fromraw(PyObject *me, PyObject *arg)
 {
-  char *p;
-  Py_ssize_t len;
+  struct bin in;
   buf b;
   PyObject *rc = 0;
   ec_curve *cc;
   ec pp = EC_INIT;
 
-  if (!PyArg_ParseTuple(arg, "s#:fromraw", &me, &p, &len)) return (0);
-  buf_init(&b, p, len);
+  if (!PyArg_ParseTuple(arg, "O&:fromraw", convbin, &in)) return (0);
+  buf_init(&b, (/*unconst*/ void *)in.p, in.sz);
   cc = ECCURVE_C(me);
   if (ec_getraw(cc, &b, &pp))
     VALERR("bad point");
@@ -362,8 +360,7 @@ end:
 
 static PyObject *epmeth_os2ecp(PyObject *me, PyObject *arg, PyObject *kw)
 {
-  char *p;
-  Py_ssize_t len;
+  struct bin in;
   buf b;
   PyObject *rc = 0;
   ec_curve *cc;
@@ -371,10 +368,10 @@ static PyObject *epmeth_os2ecp(PyObject *me, PyObject *arg, PyObject *kw)
   ec pp = EC_INIT;
   static const char *const kwlist[] = { "buf", "flags", 0 };
 
-  if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:os2ecp", KWLIST,
-                                  &p, &len, convuint, &f))
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&:os2ecp", KWLIST,
+                                  convbin, &in, convuint, &f))
     return (0);
-  buf_init(&b, p, len);
+  buf_init(&b, (/*unconst*/ void *)in.p, in.sz);
   cc = ECCURVE_C(me);
   if (ec_os2ecp(cc, f, &b, &pp)) VALERR("bad point");
   EC_IN(cc, &pp, &pp);
@@ -510,7 +507,6 @@ static int ecptxl_1(ec_curve *c, ec *p, PyObject *x)
   int rc = -1;
   PyObject *y = 0, *z = 0, *t = 0;
   mp *xx = 0;
-  const void *q;
   int n;
   qd_parse qd;
 
@@ -520,10 +516,8 @@ static int ecptxl_1(ec_curve *c, ec *p, PyObject *x)
   else if (ECPT_PYCHECK(x)) {
     getecptout(p, x);
     goto fix;
-  } else if (PyString_Check(x)) {
-    if (PyObject_AsReadBuffer(x, &q, &n))
-      goto end;
-    qd.p = q;
+  } else if (TEXT_CHECK(x)) {
+    qd.p = TEXT_PTR(x);
     qd.e = 0;
     if (!ec_ptparse(&qd, p))
       VALERR(qd.e);
@@ -685,7 +679,7 @@ static const PyNumberMethods ecpt_pynumber = {
 };
 
 static const PyTypeObject ecpt_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECPt",                              /* @tp_name@ */
   sizeof(ecpt_pyobj),                  /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -811,7 +805,7 @@ static const PyNumberMethods ecptcurve_pynumber = {
 };
 
 static const PyTypeObject ecptcurve_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECPtCurve",                         /* @tp_name@ */
   sizeof(ecpt_pyobj),                  /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1034,7 +1028,7 @@ end:
 }
 
 static PyObject *ecget_name(PyObject *me, void *hunoz)
-  { return (PyString_FromString(EC_NAME(ECCURVE_C(me)))); }
+  { return (TEXT_FROMSTR(EC_NAME(ECCURVE_C(me)))); }
 
 static PyObject *ecget_a(PyObject *me, void *hunoz)
   { return (fe_pywrap(ECCURVE_FOBJ(me), MP_COPY(ECCURVE_C(me)->a))); }
@@ -1070,7 +1064,7 @@ static const PyMethodDef eccurve_pymethods[] = {
 };
 
 static const PyTypeObject eccurve_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECCurve",                           /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1124,7 +1118,7 @@ static PyObject *ecprimecurve_pynew(PyTypeObject *ty,
 }
 
 static const PyTypeObject ecprimecurve_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECPrimeCurve",                      /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1179,7 +1173,7 @@ static PyObject *ecprimeprojcurve_pynew(PyTypeObject *ty,
 }
 
 static const PyTypeObject ecprimeprojcurve_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECPrimeProjCurve",                  /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1234,7 +1228,7 @@ static PyObject *ecbincurve_pynew(PyTypeObject *ty,
 }
 
 static const PyTypeObject ecbincurve_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECBinCurve",                                /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1289,7 +1283,7 @@ static PyObject *ecbinprojcurve_pynew(PyTypeObject *ty,
 }
 
 static const PyTypeObject ecbinprojcurve_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECBinProjCurve",                    /* @tp_name@ */
   sizeof(eccurve_pyobj),               /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */
@@ -1477,7 +1471,7 @@ static const PyMethodDef ecinfo_pymethods[] = {
 };
 
 static const PyTypeObject ecinfo_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "ECInfo",                            /* @tp_name@ */
   sizeof(ecinfo_pyobj),                        /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */