From 771fbfde7191cf31bee633be948a3ba41482df97 Mon Sep 17 00:00:00 2001 From: Ignacio Hagopian Date: Tue, 5 Sep 2023 12:05:08 -0300 Subject: [PATCH 1/2] edwards/pointextended: avoid equality check in Add Signed-off-by: Ignacio Hagopian --- .../generator/edwards/template/point.go.tmpl | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/internal/generator/edwards/template/point.go.tmpl b/internal/generator/edwards/template/point.go.tmpl index 6a32519ec..4851916fe 100644 --- a/internal/generator/edwards/template/point.go.tmpl +++ b/internal/generator/edwards/template/point.go.tmpl @@ -472,28 +472,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) From db9e0f50ca58d937780ca8548961ab43d5f7e10a Mon Sep 17 00:00:00 2001 From: Ignacio Hagopian Date: Tue, 5 Sep 2023 12:05:08 -0300 Subject: [PATCH 2/2] go generate Signed-off-by: Ignacio Hagopian --- ecc/bls12-377/twistededwards/point.go | 31 +++++++++++---------------- ecc/bls12-378/twistededwards/point.go | 31 +++++++++++---------------- ecc/bls12-381/bandersnatch/point.go | 31 +++++++++++---------------- ecc/bls12-381/twistededwards/point.go | 31 +++++++++++---------------- ecc/bls24-315/twistededwards/point.go | 31 +++++++++++---------------- ecc/bls24-317/twistededwards/point.go | 31 +++++++++++---------------- ecc/bn254/twistededwards/point.go | 31 +++++++++++---------------- ecc/bw6-633/twistededwards/point.go | 31 +++++++++++---------------- ecc/bw6-756/twistededwards/point.go | 31 +++++++++++---------------- ecc/bw6-761/twistededwards/point.go | 31 +++++++++++---------------- 10 files changed, 130 insertions(+), 180 deletions(-) diff --git a/ecc/bls12-377/twistededwards/point.go b/ecc/bls12-377/twistededwards/point.go index f8e953b2f..59a75fafc 100644 --- a/ecc/bls12-377/twistededwards/point.go +++ b/ecc/bls12-377/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bls12-378/twistededwards/point.go b/ecc/bls12-378/twistededwards/point.go index ba15bd171..4cd7c6d43 100644 --- a/ecc/bls12-378/twistededwards/point.go +++ b/ecc/bls12-378/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bls12-381/bandersnatch/point.go b/ecc/bls12-381/bandersnatch/point.go index 62edd905b..1046d9cae 100644 --- a/ecc/bls12-381/bandersnatch/point.go +++ b/ecc/bls12-381/bandersnatch/point.go @@ -459,28 +459,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bls12-381/twistededwards/point.go b/ecc/bls12-381/twistededwards/point.go index 5e6d156d0..38b952f5a 100644 --- a/ecc/bls12-381/twistededwards/point.go +++ b/ecc/bls12-381/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bls24-315/twistededwards/point.go b/ecc/bls24-315/twistededwards/point.go index 134acfe0d..44de4d67f 100644 --- a/ecc/bls24-315/twistededwards/point.go +++ b/ecc/bls24-315/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bls24-317/twistededwards/point.go b/ecc/bls24-317/twistededwards/point.go index 5195a1740..406e55e77 100644 --- a/ecc/bls24-317/twistededwards/point.go +++ b/ecc/bls24-317/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bn254/twistededwards/point.go b/ecc/bn254/twistededwards/point.go index d883b553f..83f589356 100644 --- a/ecc/bn254/twistededwards/point.go +++ b/ecc/bn254/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bw6-633/twistededwards/point.go b/ecc/bw6-633/twistededwards/point.go index 6c4125e75..d50a4081d 100644 --- a/ecc/bw6-633/twistededwards/point.go +++ b/ecc/bw6-633/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bw6-756/twistededwards/point.go b/ecc/bw6-756/twistededwards/point.go index 3714d6f4c..e46bac929 100644 --- a/ecc/bw6-756/twistededwards/point.go +++ b/ecc/bw6-756/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H) diff --git a/ecc/bw6-761/twistededwards/point.go b/ecc/bw6-761/twistededwards/point.go index 27910c378..1943561d4 100644 --- a/ecc/bw6-761/twistededwards/point.go +++ b/ecc/bw6-761/twistededwards/point.go @@ -484,28 +484,23 @@ func (p *PointExtended) FromAffine(p1 *PointAffine) *PointExtended { } // Add adds points in extended coordinates -// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd-2 +// See https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd func (p *PointExtended) Add(p1, p2 *PointExtended) *PointExtended { - if p1.Equal(p2) { - p.Double(p1) - return p - } - var A, B, C, D, E, F, G, H, tmp fr.Element A.Mul(&p1.X, &p2.X) B.Mul(&p1.Y, &p2.Y) - C.Mul(&p1.Z, &p2.T) - D.Mul(&p1.T, &p2.Z) - E.Add(&D, &C) - tmp.Sub(&p1.X, &p1.Y) - F.Add(&p2.X, &p2.Y). - Mul(&F, &tmp). - Add(&F, &B). - Sub(&F, &A) - G.Set(&A) - mulByA(&G) - G.Add(&G, &B) - H.Sub(&D, &C) + C.Mul(&p1.T, &p2.T).Mul(&C, &curveParams.D) + D.Mul(&p1.Z, &p2.Z) + tmp.Add(&p1.X, &p1.Y) + E.Add(&p2.X, &p2.Y). + Mul(&E, &tmp). + Sub(&E, &A). + Sub(&E, &B) + F.Sub(&D, &C) + G.Add(&D, &C) + H.Set(&A) + mulByA(&H) + H.Sub(&B, &H) p.X.Mul(&E, &F) p.Y.Mul(&G, &H)