chiark / gitweb /
catacomb.c, ec.c: Bindings for the new EC2OSP/OS2ECP functions.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 22 Dec 2014 20:32:58 +0000 (20:32 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 29 May 2015 09:44:58 +0000 (10:44 +0100)
catacomb.c
ec.c

index 015c5a76c705fb0aef857912183c7e1a96643a0b..49d0f4001be6285b48b91ffc9e5bdaeebae9f17a 100644 (file)
@@ -44,6 +44,7 @@ static const struct nameval consts[] = {
   C(KF_CATMASK), C(KCAT_SYMM), C(KCAT_PRIV), C(KCAT_PUB), C(KCAT_SHARE),
   C(KF_NONSECRET),
   C(KF_BURN), C(KF_OPT),
+  C(EC_XONLY), C(EC_YBIT), C(EC_LSB), C(EC_CMPR), C(EC_EXPLY), C(EC_SORT),
 #define ENTRY(tag, val, str) C(KERR_##tag),
   KEY_ERRORS(ENTRY)
 #undef ENTRY
diff --git a/ec.c b/ec.c
index 13b7798592601d2c174e42d1c7a56a2adc4200c7..9d4d6e75faeb742858d9e75b63b1a661178f79fb 100644 (file)
--- a/ec.c
+++ b/ec.c
@@ -290,6 +290,34 @@ static PyObject *epmeth_toraw(PyObject *me, PyObject *arg)
   return (rc);
 }
 
+static PyObject *epmeth_ec2osp(PyObject *me, PyObject *arg, PyObject *kw)
+{
+  buf b;
+  PyObject *rc;
+  char *p;
+  ec_curve *c = ECPT_C(me);
+  ec pp = EC_INIT;
+  int f = EC_EXPLY;
+  int len;
+  char *kwlist[] = { "flags", 0 };
+
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "|i:ectosp", kwlist, &f))
+    return (0);
+  len = c->f->noctets * 2 + 1;
+  rc = bytestring_pywrap(0, len);
+  p = PyString_AS_STRING(rc);
+  buf_init(&b, p, len);
+  EC_OUT(c, &pp, ECPT_P(me));
+  if (ec_ec2osp(c, f, &b, &pp)) {
+    Py_DECREF(rc); rc = 0;
+    VALERR("invalid flags");
+  }
+  EC_DESTROY(&pp);
+  _PyString_Resize(&rc, BLEN(&b));
+end:
+  return (rc);
+}
+
 static PyObject *epget_curve(PyObject *me, void *hunoz)
   { RETURN_OBJ(ECPT_COBJ(me)); }
 
@@ -656,6 +684,7 @@ static PyGetSetDef ecpt_pygetset[] = {
 static PyMethodDef ecpt_pymethods[] = {
 #define METHNAME(func) epmeth_##func
   METH (toraw,         "X.toraw() -> BIN")
+  KWMETH(ec2osp,       "X.ec2osp([flags = EC_EXPLY]) -> BIN")
   METH (dbl,           "X.dbl() -> X + X")
   METH (oncurvep,      "X.oncurvep() -> BOOL")
 #undef METHNAME
@@ -824,6 +853,30 @@ end:
   return (rc);
 }
 
+static PyObject *meth__ECPtCurve_os2ecp(PyObject *me,
+                                       PyObject *arg, PyObject *kw)
+{
+  char *p;
+  int len;
+  buf b;
+  PyObject *rc = 0;
+  ec_curve *cc;
+  int f = EC_XONLY | EC_LSB | EC_SORT | EC_EXPLY;
+  ec pp = EC_INIT;
+  char *kwlist[] = { "buf", "flags", 0 };
+
+  if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|f:os2ecp", kwlist,
+                                  &me, &p, &len, &f))
+    return (0);
+  buf_init(&b, p, len);
+  cc = ECCURVE_C(me);
+  if (ec_os2ecp(cc, f, &b, &pp)) VALERR("bad point");
+  EC_IN(cc, &pp, &pp);
+  rc = Py_BuildValue("(NN)", ecpt_pywrap(me, &pp), bytestring_pywrapbuf(&b));
+end:
+  return (rc);
+}
+
 static PyObject *meth__ECPt_frombuf(PyObject *me, PyObject *arg)
 {
   buf b;
@@ -1492,6 +1545,7 @@ static PyMethodDef methods[] = {
 #define METHNAME(func) meth_##func
   METH (_ECPt_frombuf,         "frombuf(E, STR) -> (P, REST)")
   METH (_ECPtCurve_fromraw,    "fromraw(E, STR) -> (P, REST)")
+  KWMETH(_ECPtCurve_os2ecp,    "os2ecp(E, STR, [flags = ...]) -> (P, REST)")
   METH (_ECPt_parse,           "parse(E, STR) -> (P, REST)")
   METH (_ECCurve_parse,        "parse(STR) -> (E, REST)")
   METH (_ECInfo_parse,         "parse(STR) -> (I, REST)")