aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2017-08-17 21:46:46 +0800
committerPéter Szilágyi <peterke@gmail.com>2017-08-17 21:46:46 +0800
commit1335a6cc8c65aabe5e4b35b013f91f474a243442 (patch)
treef8eb49459dcf023f2781632b86510f83a5bddbf6 /crypto
parent0b978f91b6adcc4b595391096a72db73bc625bcf (diff)
downloaddexon-1335a6cc8c65aabe5e4b35b013f91f474a243442.tar.gz
dexon-1335a6cc8c65aabe5e4b35b013f91f474a243442.tar.zst
dexon-1335a6cc8c65aabe5e4b35b013f91f474a243442.zip
core/vm, crypto/bn256: fix bn256 use and pairing corner case
Diffstat (limited to 'crypto')
-rw-r--r--crypto/bn256/bn256.go18
-rw-r--r--crypto/bn256/optate.go1
2 files changed, 12 insertions, 7 deletions
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 &GT{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
}