~mdw
/
catacomb-python
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
.gdbinit: Delete this obsolete file.
[catacomb-python]
/
ec.c
diff --git
a/ec.c
b/ec.c
index
4ee4d05
..
9034c5e
100644
(file)
--- a/
ec.c
+++ b/
ec.c
@@
-48,13
+48,13
@@
ec_curve *eccurve_copy(ec_curve *c)
return (0);
a = F_OUT(f, MP_NEW, c->a);
b = F_OUT(f, MP_NEW, c->b);
return (0);
a = F_OUT(f, MP_NEW, c->a);
b = F_OUT(f, MP_NEW, c->b);
- if (
strcmp(EC_NAME(c), "prime") == 0
)
+ if (
STRCMP(EC_NAME(c), ==, "prime")
)
c = ec_prime(f, a, b);
c = ec_prime(f, a, b);
- else if (
strcmp(EC_NAME(c), "primeproj") == 0
)
+ else if (
STRCMP(EC_NAME(c), ==, "primeproj")
)
c = ec_primeproj(f, a, b);
c = ec_primeproj(f, a, b);
- else if (
strcmp(EC_NAME(c), "bin") == 0
)
+ else if (
STRCMP(EC_NAME(c), ==, "bin")
)
c = ec_bin(f, a, b);
c = ec_bin(f, a, b);
- else if (
strcmp(EC_NAME(c), "binproj") == 0
)
+ else if (
STRCMP(EC_NAME(c), ==, "binproj")
)
c = ec_binproj(f, a, b);
else
c = 0;
c = ec_binproj(f, a, b);
else
c = 0;
@@
-195,32
+195,24
@@
static PyObject *ecpt_pymul(PyObject *x, PyObject *y)
static long ecpt_pyhash(PyObject *me)
{
uint32 h;
static long ecpt_pyhash(PyObject *me)
{
uint32 h;
- buf b;
ec p = EC_INIT;
ec p = EC_INIT;
- size_t sz = 2*ECPT_C(me)->f->noctets + 1;
- octet *q = xmalloc(sz);
- h = 0xe0fdd039 + ECPT_C(me)->f->ops->ty;
- buf_init(&b, q, sz);
- EC_OUT(ECPT_C(me), &p, ECPT_P(me));
- ec_putraw(ECPT_C(me), &b, &p);
+ getecptout(&p, me);
+ if (EC_ATINF(&p)) h = 0x81d81a94;
+ else h = 0xe0fdd039 ^ (2*mphash(p.x)) ^ (3*mphash(p.y));
EC_DESTROY(&p);
EC_DESTROY(&p);
- h = unihash_hash(&unihash_global, h, BBASE(&b), BLEN(&b));
- xfree(q);
- return (h % LONG_MAX);
+ return (h%LONG_MAX);
}
static PyObject *ecpt_pyrichcompare(PyObject *x, PyObject *y, int op)
{
}
static PyObject *ecpt_pyrichcompare(PyObject *x, PyObject *y, int op)
{
- ec_curve *c;
- PyObject *cobj;
ec p = EC_INIT, q = EC_INIT;
int b;
PyObject *rc = 0;
ec p = EC_INIT, q = EC_INIT;
int b;
PyObject *rc = 0;
- if (
ecbinop(x, y, &c, &cobj, &p, &q
)) RETURN_NOTIMPL;
-
EC_OUT(c, &p, &p
);
-
EC_OUT(c, &q, &q
);
+ if (
!ECPT_PYCHECK(y
)) RETURN_NOTIMPL;
+
getecptout(&p, x
);
+
getecptout(&q, y
);
switch (op) {
case Py_EQ: b = EC_EQ(&p, &q); break;
case Py_NE: b = !EC_EQ(&p, &q); break;
switch (op) {
case Py_EQ: b = EC_EQ(&p, &q); break;
case Py_NE: b = !EC_EQ(&p, &q); break;
@@
-260,7
+252,7
@@
static PyObject *epmeth_tobuf(PyObject *me, PyObject *arg)
if (EC_ATINF(&p))
n = 2;
else
if (EC_ATINF(&p))
n = 2;
else
- n = mp_octets(p.x) + mp_octets(p.y) +
4
;
+ n = mp_octets(p.x) + mp_octets(p.y) +
6
;
rc = bytestring_pywrap(0, n);
buf_init(&b, PyString_AS_STRING(rc), n);
buf_putec(&b, &p);
rc = bytestring_pywrap(0, n);
buf_init(&b, PyString_AS_STRING(rc), n);
buf_putec(&b, &p);
@@
-300,9
+292,9
@@
static PyObject *epmeth_ec2osp(PyObject *me, PyObject *arg, PyObject *kw)
ec pp = EC_INIT;
unsigned f = EC_EXPLY;
int len;
ec pp = EC_INIT;
unsigned f = EC_EXPLY;
int len;
-
char *
kwlist[] = { "flags", 0 };
+
static const char *const
kwlist[] = { "flags", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:ec2osp",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:ec2osp",
KWLIST
,
convuint, &f))
return (0);
len = c->f->noctets * 2 + 1;
convuint, &f))
return (0);
len = c->f->noctets * 2 + 1;
@@
-451,7
+443,7
@@
static int ecptxl_1(ec_curve *c, ec *p, PyObject *x)
PyObject *y = 0, *z = 0, *t = 0;
mp *xx = 0;
const void *q;
PyObject *y = 0, *z = 0, *t = 0;
mp *xx = 0;
const void *q;
-
in
t n;
+
Py_ssize_
t n;
qd_parse qd;
Py_XINCREF(x);
qd_parse qd;
Py_XINCREF(x);
@@
-461,7
+453,7
@@
static int ecptxl_1(ec_curve *c, ec *p, PyObject *x)
getecptout(p, x);
goto fix;
} else if (PyString_Check(x)) {
getecptout(p, x);
goto fix;
} else if (PyString_Check(x)) {
- if (PyObject_AsReadBuffer(x, &q,
0
))
+ if (PyObject_AsReadBuffer(x, &q,
&n
))
goto end;
qd.p = q;
qd.e = 0;
goto end;
qd.p = q;
qd.e = 0;
@@
-473,7
+465,7
@@
static int ecptxl_1(ec_curve *c, ec *p, PyObject *x)
if (!EC_FIND(c, p, xx)) VALERR("not on the curve");
} else if (PySequence_Check(x)) {
t = x; x = 0;
if (!EC_FIND(c, p, xx)) VALERR("not on the curve");
} else if (PySequence_Check(x)) {
t = x; x = 0;
- n = PySequence_Size(t);
+ n = PySequence_Size(t);
if (n < 0) goto end;
if (n != 2 && (n != 3 || !c))
TYERR("want sequence of two or three items");
if ((x = PySequence_GetItem(t, 0)) == 0 ||
if (n != 2 && (n != 3 || !c))
TYERR("want sequence of two or three items");
if ((x = PySequence_GetItem(t, 0)) == 0 ||
@@
-481,6
+473,7
@@
static int ecptxl_1(ec_curve *c, ec *p, PyObject *x)
(n == 3 && (z = PySequence_GetItem(t, 2)) == 0))
goto end;
rc = (n == 2) ? ecptxl_2(c, p, x, y) : ecptxl_3(c, p, x, y, z);
(n == 3 && (z = PySequence_GetItem(t, 2)) == 0))
goto end;
rc = (n == 2) ? ecptxl_2(c, p, x, y) : ecptxl_3(c, p, x, y, z);
+ goto end;
} else
TYERR("can't convert to curve point");
goto ok;
} else
TYERR("can't convert to curve point");
goto ok;
@@
-509,14
+502,14
@@
static PyObject *ecptnc_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
PyObject *x = 0, *y = 0, *z = 0;
ec p = EC_INIT;
{
PyObject *x = 0, *y = 0, *z = 0;
ec p = EC_INIT;
-
char *
kwlist[] = { "x", "y", 0 };
+
static const char *const
kwlist[] = { "x", "y", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|OO:new",
kwlist
, &x, &y) ||
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|OO:new",
KWLIST
, &x, &y) ||
ecptxl(0, &p, x, y, z))
goto end;
return (ecpt_pywrapout(ty, &p));
end:
ecptxl(0, &p, x, y, z))
goto end;
return (ecpt_pywrapout(ty, &p));
end:
-
EC_DESTROY(&p
);
+
mp_drop(p.x); mp_drop(p.y); mp_drop(p.z
);
return (0);
}
return (0);
}
@@
-550,15
+543,15
@@
static PyObject *ecpt_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
PyObject *x = 0, *y = 0, *z = 0;
ec p = EC_INIT;
{
PyObject *x = 0, *y = 0, *z = 0;
ec p = EC_INIT;
-
char *
kwlist[] = { "x", "y", "z", 0 };
+
static const char *const
kwlist[] = { "x", "y", "z", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|OOO:new",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|OOO:new",
KWLIST
,
&x, &y, &z) ||
ecptxl(ECCURVE_C(ty), &p, x, y, z))
goto end;
return (ecpt_pywrap((PyObject *)ty, &p));
end:
&x, &y, &z) ||
ecptxl(ECCURVE_C(ty), &p, x, y, z))
goto end;
return (ecpt_pywrap((PyObject *)ty, &p));
end:
-
EC_DESTROY(&p
);
+
mp_drop(p.x); mp_drop(p.y); mp_drop(p.z
);
return (0);
}
return (0);
}
@@
-647,7
+640,9
@@
static PyTypeObject ecpt_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"Elliptic curve points, not associated with any curve.",
+"ECPt([X, [Y]]): elliptic curve points, not associated with any curve.\n\
+ X alone may be None, an existing point, a string 'X, Y', an\n\
+ x-coordinate, or a pair (X, Y); X and Y should be a coordinate pair.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-869,9
+864,9
@@
static PyObject *meth__ECPtCurve_os2ecp(PyObject *me,
ec_curve *cc;
unsigned f = EC_XONLY | EC_LSB | EC_SORT | EC_EXPLY;
ec pp = EC_INIT;
ec_curve *cc;
unsigned f = EC_XONLY | EC_LSB | EC_SORT | EC_EXPLY;
ec pp = EC_INIT;
-
char *
kwlist[] = { "class", "buf", "flags", 0 };
+
static const char *const
kwlist[] = { "class", "buf", "flags", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|O&:os2ecp",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|O&:os2ecp",
KWLIST
,
&me, &p, &len, convuint, &f))
return (0);
buf_init(&b, p, len);
&me, &p, &len, convuint, &f))
return (0);
buf_init(&b, p, len);
@@
-947,11
+942,11
@@
end:
static PyObject *ecmeth_rand(PyObject *me, PyObject *arg, PyObject *kw)
{
static PyObject *ecmeth_rand(PyObject *me, PyObject *arg, PyObject *kw)
{
-
char *
kwlist[] = { "rng", 0 };
+
static const char *const
kwlist[] = { "rng", 0 };
grand *r = &rand_global;
ec p = EC_INIT;
grand *r = &rand_global;
ec p = EC_INIT;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:rand",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:rand",
KWLIST
,
convgrand, &r))
return (0);
ec_rand(ECCURVE_C(me), &p, r);
convgrand, &r))
return (0);
ec_rand(ECCURVE_C(me), &p, r);
@@
-988,13
+983,13
@@
PyObject *eccurve_pywrap(PyObject *fobj, ec_curve *c)
else
Py_INCREF(fobj);
assert(FIELD_F(fobj) == c->f);
else
Py_INCREF(fobj);
assert(FIELD_F(fobj) == c->f);
- if (
strcmp(EC_NAME(c), "prime") == 0
)
+ if (
STRCMP(EC_NAME(c), ==, "prime")
)
ty = ecprimecurve_pytype;
ty = ecprimecurve_pytype;
- else if (
strcmp(EC_NAME(c), "primeproj") == 0
)
+ else if (
STRCMP(EC_NAME(c), ==, "primeproj")
)
ty = ecprimeprojcurve_pytype;
ty = ecprimeprojcurve_pytype;
- else if (
strcmp(EC_NAME(c), "bin") == 0
)
+ else if (
STRCMP(EC_NAME(c), ==, "bin")
)
ty = ecbincurve_pytype;
ty = ecbincurve_pytype;
- else if (
strcmp(EC_NAME(c), "binproj") == 0
)
+ else if (
STRCMP(EC_NAME(c), ==, "binproj")
)
ty = ecbinprojcurve_pytype;
else
abort();
ty = ecbinprojcurve_pytype;
else
abort();
@@
-1007,10
+1002,10
@@
static PyObject *eccurve_pynew(PyTypeObject *ty,
{
PyObject *fobj;
PyObject *cobj = 0;
{
PyObject *fobj;
PyObject *cobj = 0;
-
char *
kwlist[] = { "field", "a", "b", 0 };
+
static const char *const
kwlist[] = { "field", "a", "b", 0 };
mp *aa = 0, *bb = 0;
mp *aa = 0, *bb = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O&O&",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O&O&",
KWLIST
,
field_pytype, &fobj,
convmp, &aa, convmp, &bb))
goto end;
field_pytype, &fobj,
convmp, &aa, convmp, &bb))
goto end;
@@
-1071,7
+1066,7
@@
static PyMethodDef eccurve_pymethods[] = {
METH (mmul, "\
E.mmul([(P0, N0), (P1, N1), ...]) = N0 P0 + N1 P1 + ...")
METH (find, "E.find(X) -> P")
METH (mmul, "\
E.mmul([(P0, N0), (P1, N1), ...]) = N0 P0 + N1 P1 + ...")
METH (find, "E.find(X) -> P")
- KWMETH(rand, "E.rand(
rng = rand) ->
P")
+ KWMETH(rand, "E.rand(
[rng = rand]) ->
P")
#undef METHNAME
{ 0 }
};
#undef METHNAME
{ 0 }
};
@@
-1101,7
+1096,7
@@
static PyTypeObject eccurve_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-
"An elliptic curve. Abstract class.",
+"An elliptic curve. Abstract class.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1155,7
+1150,8
@@
static PyTypeObject ecprimecurve_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "An elliptic curve over a prime field. Use ecprimeprojcurve.",
+"ECPrimeCurve(FIELD, A, B): an elliptic curve over a prime field.\n\
+ Use ECPrimeProjCurve instead.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1209,7
+1205,8
@@
static PyTypeObject ecprimeprojcurve_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "An elliptic curve over a prime field, using projective coordinates.",
+"ECPrimeProjCurve(FIELD, A, B): an elliptic curve over a prime field\n\
+ using projective coordinates.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1263,7
+1260,8
@@
static PyTypeObject ecbincurve_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "An elliptic curve over a binary field. Use ecbinprojcurve.",
+"ECBinCurve(FIELD, A, B): an elliptic curve over a binary field.\n\
+ Use ECBinProjCurve instead.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1317,7
+1315,8
@@
static PyTypeObject ecbinprojcurve_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "An elliptic curve over a binary field, using projective coordinates.",
+"ECBinProjCurve(FIELD, A, B): an elliptic curve over a binary field,\n\
+ using projective coordinates.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1378,10
+1377,10
@@
static PyObject *ecinfo_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
ec_info ei = { 0 };
PyObject *e, *g;
{
ec_info ei = { 0 };
PyObject *e, *g;
-
char *
kwlist[] = { "curve", "G", "r", "h", 0 };
+
static const char *const
kwlist[] = { "curve", "G", "r", "h", 0 };
ecinfo_pyobj *rc = 0;
ecinfo_pyobj *rc = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O!O&O&:new",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O!O&O&:new",
KWLIST
,
eccurve_pytype, &e, ecpt_pytype, &g,
convmp, &ei.r, convmp, &ei.h))
goto end;
eccurve_pytype, &e, ecpt_pytype, &g,
convmp, &ei.r, convmp, &ei.h))
goto end;
@@
-1449,11
+1448,11
@@
end:
static PyObject *eimeth_check(PyObject *me, PyObject *arg, PyObject *kw)
{
static PyObject *eimeth_check(PyObject *me, PyObject *arg, PyObject *kw)
{
-
char *
kwlist[] = { "rng", 0 };
+
static const char *const
kwlist[] = { "rng", 0 };
grand *r = &rand_global;
const char *p;
grand *r = &rand_global;
const char *p;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:check",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:check",
KWLIST
,
convgrand, &r))
goto end;
if ((p = ec_checkinfo(ECINFO_EI(me), r)) != 0)
convgrand, &r))
goto end;
if ((p = ec_checkinfo(ECINFO_EI(me), r)) != 0)
@@
-1492,7
+1491,7
@@
static PyGetSetDef ecinfo_pygetset[] = {
static PyMethodDef ecinfo_pymethods[] = {
#define METHNAME(name) eimeth_##name
static PyMethodDef ecinfo_pymethods[] = {
#define METHNAME(name) eimeth_##name
- KWMETH(check, "I.check() -> None")
+ KWMETH(check, "I.check(
[rng = rand]
) -> None")
#undef METHNAME
{ 0 }
};
#undef METHNAME
{ 0 }
};
@@
-1522,7
+1521,7
@@
static PyTypeObject ecinfo_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-
"E
lliptic curve domain parameters.",
+
"ECInfo(CURVE, G, R, H): e
lliptic curve domain parameters.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */