From 31e55c65069899d8f88bc1cac435dc93e40d6d42 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Tue, 15 Oct 2019 12:02:59 +0100 Subject: [PATCH 1/1] ec.c (ecpt_pyhash): Fix hashing. Previously, hashing a curveless point would just crash, which is surprisingly bad form. Replace this mess with a simpler thing which just converts the point to external form and hashes the coordinates. --- ec.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/ec.c b/ec.c index 4ee4d05..1bf24cf 100644 --- a/ec.c +++ b/ec.c @@ -195,19 +195,13 @@ static PyObject *ecpt_pymul(PyObject *x, PyObject *y) static long ecpt_pyhash(PyObject *me) { uint32 h; - buf b; 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); - 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) -- 2.11.0