ref: 42c4cc75a6a0c35e9858479e69816d1a26b3d085
parent: 2fa4c8ef663d774467dbcf61222c44a8826311b9
author: cinap_lenrek <[email protected]>
date: Thu Apr 21 16:41:19 EDT 2016
libsec: remove affine coordinate point operations from ecc we now just do point addtion in jacobian coordinate system, and convert the result to affine when s->z == nil.
--- a/sys/src/libsec/port/ecc.c
+++ b/sys/src/libsec/port/ecc.c
@@ -35,8 +35,6 @@
void
ecadd(ECdomain *dom, ECpoint *a, ECpoint *b, ECpoint *s)
{
- mpint *l, *k, *sx, *sy;
-
if(a->inf && b->inf){
s->inf = 1;
return;
@@ -50,81 +48,26 @@
return;
}
- if(s->z != nil){
- if(a == b)
- jacobian_dbl(dom->p, dom->a,
- a->x, a->y, a->z != nil ? a->z : mpone,
- s->x, s->y, s->z);
- else
- jacobian_add(dom->p, dom->a,
- a->x, a->y, a->z != nil ? a->z : mpone,
- b->x, b->y, b->z != nil ? b->z : mpone,
- s->x, s->y, s->z);
- s->inf = mpcmp(s->z, mpzero) == 0;
+ if(s->z == nil){
+ s->z = mpcopy(mpone);
+ ecadd(dom, a, b, s);
+ if(!s->inf)
+ jacobian_affine(dom->p, s->x, s->y, s->z);
+ mpfree(s->z);
+ s->z = nil;
return;
}
- if(mpcmp(a->x, b->x) == 0 && (mpcmp(a->y, mpzero) == 0 || mpcmp(a->y, b->y) != 0)){
- s->inf = 1;
- return;
- }
- s->inf = 0;
- l = mpnew(0);
- k = mpnew(0);
- sx = mpnew(0);
- sy = mpnew(0);
- if(mpcmp(a->x, b->x) == 0 && mpcmp(a->y, b->y) == 0){
- mpadd(mpone, mptwo, k);
- mpmul(a->x, a->x, l);
- mpmul(l, k, l);
- mpadd(l, dom->a, l);
- mpleft(a->y, 1, k);
- mpmod(k, dom->p, k);
- mpinvert(k, dom->p, k);
- mpmul(k, l, l);
- mpmod(l, dom->p, l);
-
- mpleft(a->x, 1, k);
- mpmul(l, l, sx);
- mpsub(sx, k, sx);
- mpmod(sx, dom->p, sx);
-
- mpsub(a->x, sx, sy);
- mpmul(l, sy, sy);
- mpsub(sy, a->y, sy);
- mpmod(sy, dom->p, sy);
- mpassign(sx, s->x);
- mpassign(sy, s->y);
- mpfree(sx);
- mpfree(sy);
- mpfree(l);
- mpfree(k);
- return;
- }
- mpsub(b->y, a->y, l);
- mpmod(l, dom->p, l);
- mpsub(b->x, a->x, k);
- mpmod(k, dom->p, k);
- mpinvert(k, dom->p, k);
- mpmul(k, l, l);
- mpmod(l, dom->p, l);
-
- mpmul(l, l, sx);
- mpsub(sx, a->x, sx);
- mpsub(sx, b->x, sx);
- mpmod(sx, dom->p, sx);
-
- mpsub(a->x, sx, sy);
- mpmul(sy, l, sy);
- mpsub(sy, a->y, sy);
- mpmod(sy, dom->p, sy);
-
- mpassign(sx, s->x);
- mpassign(sy, s->y);
- mpfree(sx);
- mpfree(sy);
- mpfree(l);
- mpfree(k);
+ if(a == b)
+ jacobian_dbl(dom->p, dom->a,
+ a->x, a->y, a->z != nil ? a->z : mpone,
+ s->x, s->y, s->z);
+ else
+ jacobian_add(dom->p, dom->a,
+ a->x, a->y, a->z != nil ? a->z : mpone,
+ b->x, b->y, b->z != nil ? b->z : mpone,
+ s->x, s->y, s->z);
+ s->inf = mpcmp(s->z, mpzero) == 0;
}
void
@@ -173,10 +116,10 @@
mpint *p, *q;
int r;
- assert(a->z == nil); /* need affine coordinates */
if(a->inf)
return 1;
+ assert(a->z == nil); /* need affine coordinates */
p = mpnew(0);
q = mpnew(0);
mpmodmul(a->y, a->y, dom->p, p);