github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/consensus/hotstuff/bls12-381/primitive.go (about) 1 package bls 2 3 import ( 4 "math/big" 5 6 bls12381 "github.com/kilic/bls12-381" 7 ) 8 9 var ( 10 domain = []byte("BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_") 11 12 // the order r of G1 13 curveOrder, _ = new(big.Int).SetString("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16) 14 ) 15 16 func subgroupCheck(point *bls12381.PointG2) bool { 17 g2, p := bls12381.NewG2(), new(bls12381.PointG2) 18 g2.MulScalarBig(p, point, curveOrder) 19 return g2.IsZero(p) 20 } 21 22 func sign(sec *big.Int, msg []byte) (*bls12381.PointG2, error) { 23 g2 := bls12381.NewG2() 24 point, err := g2.HashToCurve(msg, domain) 25 if err != nil { 26 return nil, err 27 } 28 g2.MulScalarBig(point, point, sec) 29 return point, nil 30 } 31 32 func verify(pub *bls12381.PointG1, msg []byte, sig *bls12381.PointG2) bool { 33 if !subgroupCheck(sig) { 34 return false 35 } 36 g2 := bls12381.NewG2() 37 point, err := g2.HashToCurve(msg, domain) 38 if err != nil { 39 return false 40 } 41 engine := bls12381.NewEngine() 42 engine.AddPairInv(&bls12381.G1One, sig) 43 engine.AddPair(pub, point) 44 return engine.Result().IsOne() 45 } 46 47 func fastAggregateVerify(msg []byte, sig *bls12381.PointG2, pubs ...*bls12381.PointG1) bool { 48 engine, aggregate := bls12381.NewEngine(), new(bls12381.PointG1) 49 for _, pub := range pubs { 50 engine.G1.Add(aggregate, aggregate, pub) 51 } 52 return verify(aggregate, msg, sig) 53 } 54 55 func combine(sigs ...*bls12381.PointG2) *bls12381.PointG2 { 56 g2, aggregate := bls12381.NewG2(), new(bls12381.PointG2) 57 for _, sig := range sigs { 58 g2.Add(aggregate, aggregate, sig) 59 } 60 return aggregate 61 }