From 1335a6cc8c65aabe5e4b35b013f91f474a243442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 17 Aug 2017 16:46:46 +0300 Subject: core/vm, crypto/bn256: fix bn256 use and pairing corner case --- crypto/bn256/bn256.go | 18 ++++++++++++------ crypto/bn256/optate.go | 1 - 2 files changed, 12 insertions(+), 7 deletions(-) (limited to 'crypto') diff --git a/crypto/bn256/bn256.go b/crypto/bn256/bn256.go index 92418369b..7144c31a8 100644 --- a/crypto/bn256/bn256.go +++ b/crypto/bn256/bn256.go @@ -379,16 +379,22 @@ func Pair(g1 *G1, g2 *G2) *GT { return >{optimalAte(g2.p, g1.p, new(bnPool))} } +// PairingCheck calculates the Optimal Ate pairing for a set of points. func PairingCheck(a []*G1, b []*G2) bool { pool := new(bnPool) - e := newGFp12(pool) - e.SetOne() + + acc := newGFp12(pool) + acc.SetOne() + for i := 0; i < len(a); i++ { - new_e := miller(b[i].p, a[i].p, pool) - e.Mul(e, new_e, pool) + if a[i].p.IsInfinity() || b[i].p.IsInfinity() { + continue + } + acc.Mul(acc, miller(b[i].p, a[i].p, pool), pool) } - ret := finalExponentiation(e, pool) - e.Put(pool) + ret := finalExponentiation(acc, pool) + acc.Put(pool) + return ret.IsOne() } diff --git a/crypto/bn256/optate.go b/crypto/bn256/optate.go index 68716b62b..9d6957062 100644 --- a/crypto/bn256/optate.go +++ b/crypto/bn256/optate.go @@ -393,6 +393,5 @@ func optimalAte(a *twistPoint, b *curvePoint, pool *bnPool) *gfP12 { if a.IsInfinity() || b.IsInfinity() { ret.SetOne() } - return ret } -- cgit v1.2.3