core/vm, crypto/bn256: fix bn256 use and pairing corner case

parent 0b978f91
...@@ -307,8 +307,9 @@ func (c *bn256Add) Run(input []byte) ([]byte, error) { ...@@ -307,8 +307,9 @@ func (c *bn256Add) Run(input []byte) ([]byte, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
x.Add(x, y) res := new(bn256.G1)
return x.Marshal(), nil res.Add(x, y)
return res.Marshal(), nil
} }
// bn256ScalarMul implements a native elliptic curve scalar multiplication. // bn256ScalarMul implements a native elliptic curve scalar multiplication.
...@@ -324,8 +325,9 @@ func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { ...@@ -324,8 +325,9 @@ func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
p.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) res := new(bn256.G1)
return p.Marshal(), nil res.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32)))
return res.Marshal(), nil
} }
var ( var (
...@@ -370,8 +372,7 @@ func (c *bn256Pairing) Run(input []byte) ([]byte, error) { ...@@ -370,8 +372,7 @@ func (c *bn256Pairing) Run(input []byte) ([]byte, error) {
ts = append(ts, t) ts = append(ts, t)
} }
// Execute the pairing checks and return the results // Execute the pairing checks and return the results
ok := bn256.PairingCheck(cs, ts) if bn256.PairingCheck(cs, ts) {
if ok {
return true32Byte, nil return true32Byte, nil
} }
return false32Byte, nil return false32Byte, nil
......
This diff is collapsed.
...@@ -379,16 +379,22 @@ func Pair(g1 *G1, g2 *G2) *GT { ...@@ -379,16 +379,22 @@ func Pair(g1 *G1, g2 *G2) *GT {
return &GT{optimalAte(g2.p, g1.p, new(bnPool))} 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 { func PairingCheck(a []*G1, b []*G2) bool {
pool := new(bnPool) pool := new(bnPool)
e := newGFp12(pool)
e.SetOne() acc := newGFp12(pool)
acc.SetOne()
for i := 0; i < len(a); i++ { for i := 0; i < len(a); i++ {
new_e := miller(b[i].p, a[i].p, pool) if a[i].p.IsInfinity() || b[i].p.IsInfinity() {
e.Mul(e, new_e, pool) continue
} }
ret := finalExponentiation(e, pool) acc.Mul(acc, miller(b[i].p, a[i].p, pool), pool)
e.Put(pool) }
ret := finalExponentiation(acc, pool)
acc.Put(pool)
return ret.IsOne() return ret.IsOne()
} }
......
...@@ -393,6 +393,5 @@ func optimalAte(a *twistPoint, b *curvePoint, pool *bnPool) *gfP12 { ...@@ -393,6 +393,5 @@ func optimalAte(a *twistPoint, b *curvePoint, pool *bnPool) *gfP12 {
if a.IsInfinity() || b.IsInfinity() { if a.IsInfinity() || b.IsInfinity() {
ret.SetOne() ret.SetOne()
} }
return ret return ret
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment