Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

aggregate validation ticket sig #3078

Open
wants to merge 15 commits into
base: sprint-1.12
Choose a base branch
from
41 changes: 28 additions & 13 deletions code/go/0chain.net/core/encryption/bls0chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,20 @@ func init() {
}
}

//BLS0ChainScheme - a signature scheme for BLS0Chain Signature
// BLS0ChainScheme - a signature scheme for BLS0Chain Signature
type BLS0ChainScheme struct {
privateKey []byte
publicKey []byte
pubKey *bls.PublicKey
secKey *bls.SecretKey
}

//NewBLS0ChainScheme - create a BLS0ChainScheme object
// NewBLS0ChainScheme - create a BLS0ChainScheme object
func NewBLS0ChainScheme() *BLS0ChainScheme {
return &BLS0ChainScheme{}
}

//GenerateKeys - implement interface
// GenerateKeys - implement interface
func (b0 *BLS0ChainScheme) GenerateKeys() error {
var skey bls.SecretKey
skey.SetByCSPRNG()
Expand All @@ -58,7 +58,7 @@ func (b0 *BLS0ChainScheme) GenerateKeys() error {
return nil
}

//ReadKeys - implement interface
// ReadKeys - implement interface
func (b0 *BLS0ChainScheme) ReadKeys(reader io.Reader) error {
scanner := bufio.NewScanner(reader)
result := scanner.Scan()
Expand Down Expand Up @@ -98,7 +98,6 @@ func (b0 *BLS0ChainScheme) ReadKeys(reader io.Reader) error {
// This is an example of the raw public key we expect from MIRACL
var miraclExamplePK = `0418a02c6bd223ae0dfda1d2f9a3c81726ab436ce5e9d17c531ff0a385a13a0b491bdfed3a85690775ee35c61678957aaba7b1a1899438829f1dc94248d87ed36817f6dfafec19bfa87bf791a4d694f43fec227ae6f5a867490e30328cac05eaff039ac7dfc3364e851ebd2631ea6f1685609fc66d50223cc696cb59ff2fee47ac`

//
// This is an example of the same MIRACL public key serialized with ToString().
// pk ([1bdfed3a85690775ee35c61678957aaba7b1a1899438829f1dc94248d87ed368,18a02c6bd223ae0dfda1d2f9a3c81726ab436ce5e9d17c531ff0a385a13a0b49],[039ac7dfc3364e851ebd2631ea6f1685609fc66d50223cc696cb59ff2fee47ac,17f6dfafec19bfa87bf791a4d694f43fec227ae6f5a867490e30328cac05eaff])
func MiraclToHerumiPK(pk string) string {
Expand Down Expand Up @@ -146,15 +145,15 @@ func MiraclToHerumiSig(sig string) string {
return sign.SerializeToHexStr()
}

//WriteKeys - implement interface
// WriteKeys - implement interface
func (b0 *BLS0ChainScheme) WriteKeys(writer io.Writer) error {
publicKey := hex.EncodeToString(b0.publicKey)
privateKey := hex.EncodeToString(b0.privateKey)
_, err := fmt.Fprintf(writer, "%v\n%v\n", publicKey, privateKey)
return err
}

//SetPublicKey - implement interface
// SetPublicKey - implement interface
func (b0 *BLS0ChainScheme) SetPublicKey(publicKey string) error {
if len(b0.privateKey) > 0 {
return errors.New("cannot set public key when there is a private key")
Expand Down Expand Up @@ -196,7 +195,7 @@ func (b0 *BLS0ChainScheme) GetBLSPublicKey() *bls.PublicKey {
return b0.pubKey
}

//Sign - implement interface
// Sign - implement interface
func (b0 *BLS0ChainScheme) Sign(hash interface{}) (string, error) {
if b0.secKey == nil {
return "", errors.New("private key is nil")
Expand All @@ -210,7 +209,7 @@ func (b0 *BLS0ChainScheme) Sign(hash interface{}) (string, error) {
return sig.SerializeToHexStr(), nil
}

//Verify - implement interface
// Verify - implement interface
func (b0 *BLS0ChainScheme) Verify(signature string, hash string) (bool, error) {
if b0.pubKey == nil {
return false, errors.New("public key is nil")
Expand All @@ -226,7 +225,7 @@ func (b0 *BLS0ChainScheme) Verify(signature string, hash string) (bool, error) {
return sign.Verify(b0.pubKey, string(rawHash)), nil
}

//GetSignature - given a string return the signature object
// GetSignature - given a string return the signature object
func (b0 *BLS0ChainScheme) GetSignature(signature string) (*bls.Sign, error) {
if signature == "" {
return nil, errors.New("empty signature")
Expand All @@ -248,7 +247,7 @@ func decodePublicKey(key []byte) (*bls.PublicKey, error) {
return pk, nil
}

//PairMessageHash - Pair a given message hash
// PairMessageHash - Pair a given message hash
func (b0 *BLS0ChainScheme) PairMessageHash(hash string) (*bls.GT, error) {
g2 := bls.CastFromPublicKey(b0.pubKey)
var g1 = &bls.G1{}
Expand All @@ -264,7 +263,7 @@ func (b0 *BLS0ChainScheme) PairMessageHash(hash string) (*bls.GT, error) {
return gt, nil
}

//GenerateSplitKeys - implement interface
// GenerateSplitKeys - implement interface
func (b0 *BLS0ChainScheme) GenerateSplitKeys(numSplits int) ([]SignatureScheme, error) {
var primarySk bls.Fr
if err := primarySk.SetLittleEndian(b0.privateKey); err != nil {
Expand Down Expand Up @@ -312,7 +311,7 @@ func (b0 *BLS0ChainScheme) GenerateSplitKeys(numSplits int) ([]SignatureScheme,
return splitKeys, nil
}

//AggregateSignatures - implement interface
// AggregateSignatures - implement interface
func (b0 *BLS0ChainScheme) AggregateSignatures(signatures []string) (string, error) {
var aggSign bls.Sign
for _, signature := range signatures {
Expand All @@ -324,3 +323,19 @@ func (b0 *BLS0ChainScheme) AggregateSignatures(signatures []string) (string, err
}
return aggSign.SerializeToHexStr(), nil
}

// FastAggregateVerify - implement interface
func (b0 *BLS0ChainScheme) FastAggregateVerify(aggSig string, hash []byte, pubKeys []string) (bool, error) {
var aggregatedSignature bls.Sign
err := aggregatedSignature.DeserializeHexStr(aggSig)
if err != nil {
return false, err
}
pubs := make([]bls.PublicKey, len(pubKeys))
for i := 0; i < len(pubKeys); i++ {
if err = pubs[i].DeserializeHexStr(pubKeys[i]); err != nil {
return false, err
}
}
return aggregatedSignature.FastAggregateVerify(pubs, hash), nil
}
28 changes: 19 additions & 9 deletions code/go/0chain.net/core/encryption/ed25519.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@ import (
"golang.org/x/crypto/ed25519"
)

//ED25519Scheme - a signature scheme based on ED25519
// ED25519Scheme - a signature scheme based on ED25519
type ED25519Scheme struct {
privateKey []byte
publicKey []byte
}

//NewED25519Scheme - create a ED255219Scheme object
// NewED25519Scheme - create a ED255219Scheme object
func NewED25519Scheme() *ED25519Scheme {
return &ED25519Scheme{}
}

//GenerateKeys - implement interface
// GenerateKeys - implement interface
func (ed *ED25519Scheme) GenerateKeys() error {
public, private, err := GenerateKeysBytes()
if err != nil {
Expand All @@ -32,7 +32,7 @@ func (ed *ED25519Scheme) GenerateKeys() error {
return nil
}

//ReadKeys - implement interface
// ReadKeys - implement interface
func (ed *ED25519Scheme) ReadKeys(reader io.Reader) error {
scanner := bufio.NewScanner(reader)
result := scanner.Scan()
Expand All @@ -56,15 +56,15 @@ func (ed *ED25519Scheme) ReadKeys(reader io.Reader) error {
return nil
}

//WriteKeys - implement interface
// WriteKeys - implement interface
func (ed *ED25519Scheme) WriteKeys(writer io.Writer) error {
publicKey := hex.EncodeToString(ed.publicKey)
privateKey := hex.EncodeToString(ed.privateKey)
_, err := fmt.Fprintf(writer, "%v\n%v\n", publicKey, privateKey)
return err
}

//SetPublicKey - implement interface
// SetPublicKey - implement interface
func (ed *ED25519Scheme) SetPublicKey(publicKey string) error {
if len(ed.privateKey) > 0 {
return errors.New("cannot set public key when there is a private key")
Expand All @@ -77,17 +77,17 @@ func (ed *ED25519Scheme) SetPublicKey(publicKey string) error {
return nil
}

//GetPublicKey - implement interface
// GetPublicKey - implement interface
func (ed *ED25519Scheme) GetPublicKey() string {
return hex.EncodeToString(ed.publicKey)
}

//Sign - impelemnt interface
// Sign - impelemnt interface
func (ed *ED25519Scheme) Sign(hash interface{}) (string, error) {
return signED25519(ed.privateKey, hash)
}

//Verify - implement interface
// Verify - implement interface
func (ed *ED25519Scheme) Verify(signature string, hash string) (bool, error) {
return verifyED25519(ed.publicKey, signature, hash)
}
Expand Down Expand Up @@ -138,3 +138,13 @@ func verifyED25519(publicKey interface{}, signature string, hash string) (bool,
}
return ed25519.Verify(public, data, sign), nil
}

// AggregateSignatures
func (ed *ED25519Scheme) AggregateSignatures(signatures []string) (string, error) {
return "", errors.New("not implemented")
}

// FastAggregateVerify - implement interface
func (ed *ED25519Scheme) FastAggregateVerify(aggSig string, hash []byte, pubKeys []string) (bool, error) {
return false, errors.New("not implemented")
}
2 changes: 2 additions & 0 deletions code/go/0chain.net/core/encryption/signature_scheme.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ type SignatureScheme interface {

Sign(hash interface{}) (string, error)
Verify(signature string, hash string) (bool, error)
AggregateSignatures(signatures []string) (string, error)
FastAggregateVerify(aggSig string, hash []byte, pubKeys []string) (bool, error)
}

// AggregateSignatureScheme - a signature scheme that can aggregate individual signatures
Expand Down
43 changes: 29 additions & 14 deletions code/go/0chain.net/smartcontract/benchmark/main/cmd/bls0chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,18 @@ func init() {
}
}

//BLS0ChainScheme - a signature scheme for BLS0Chain Signature
// BLS0ChainScheme - a signature scheme for BLS0Chain Signature
type BLS0ChainScheme struct {
privateKey []byte
publicKey []byte
}

//NewBLS0ChainScheme - create a BLS0ChainScheme object
// NewBLS0ChainScheme - create a BLS0ChainScheme object
func NewBLS0ChainScheme() *BLS0ChainScheme {
return &BLS0ChainScheme{}
}

//GenerateKeys - implement interface
// GenerateKeys - implement interface
func (b0 *BLS0ChainScheme) GenerateKeys() error {
var skey bls.SecretKey
skey.SetByCSPRNG()
Expand All @@ -58,7 +58,7 @@ func (b0 *BLS0ChainScheme) GenerateKeys() error {
return nil
}

//ReadKeys - implement interface
// ReadKeys - implement interface
func (b0 *BLS0ChainScheme) ReadKeys(reader io.Reader) error {
scanner := bufio.NewScanner(reader)
result := scanner.Scan()
Expand Down Expand Up @@ -91,7 +91,6 @@ func (b0 *BLS0ChainScheme) ReadKeys(reader io.Reader) error {
// This is an example of the raw public key we expect from MIRACL
var miraclExamplePK = `0418a02c6bd223ae0dfda1d2f9a3c81726ab436ce5e9d17c531ff0a385a13a0b491bdfed3a85690775ee35c61678957aaba7b1a1899438829f1dc94248d87ed36817f6dfafec19bfa87bf791a4d694f43fec227ae6f5a867490e30328cac05eaff039ac7dfc3364e851ebd2631ea6f1685609fc66d50223cc696cb59ff2fee47ac`

//
// This is an example of the same MIRACL public key serialized with ToString().
// pk ([1bdfed3a85690775ee35c61678957aaba7b1a1899438829f1dc94248d87ed368,18a02c6bd223ae0dfda1d2f9a3c81726ab436ce5e9d17c531ff0a385a13a0b49],[039ac7dfc3364e851ebd2631ea6f1685609fc66d50223cc696cb59ff2fee47ac,17f6dfafec19bfa87bf791a4d694f43fec227ae6f5a867490e30328cac05eaff])
func MiraclToHerumiPK(pk string) string {
Expand Down Expand Up @@ -139,15 +138,15 @@ func MiraclToHerumiSig(sig string) string {
return sign.SerializeToHexStr()
}

//WriteKeys - implement interface
// WriteKeys - implement interface
func (b0 *BLS0ChainScheme) WriteKeys(writer io.Writer) error {
publicKey := hex.EncodeToString(b0.publicKey)
privateKey := hex.EncodeToString(b0.privateKey)
_, err := fmt.Fprintf(writer, "%v\n%v\n", publicKey, privateKey)
return err
}

//SetPublicKey - implement interface
// SetPublicKey - implement interface
func (b0 *BLS0ChainScheme) SetPublicKey(publicKey string) error {
publicKey = MiraclToHerumiPK(publicKey)
publicKeyBytes, err := hex.DecodeString(publicKey)
Expand All @@ -162,7 +161,7 @@ func (b0 *BLS0ChainScheme) SetPrivateKey(privateKey string) {
b0.privateKey = []byte(privateKey)
}

//GetPublicKey - implement interface
// GetPublicKey - implement interface
func (b0 *BLS0ChainScheme) GetPublicKey() string {
return hex.EncodeToString(b0.publicKey)
}
Expand All @@ -171,7 +170,7 @@ func (b0 *BLS0ChainScheme) GetPrivateKey() string {
return string(b0.privateKey)
}

//Sign - implement interface
// Sign - implement interface
func (b0 *BLS0ChainScheme) Sign(hash interface{}) (string, error) {
var sk bls.SecretKey
if err := sk.SetLittleEndian(b0.privateKey); err != nil {
Expand All @@ -185,7 +184,7 @@ func (b0 *BLS0ChainScheme) Sign(hash interface{}) (string, error) {
return sig.SerializeToHexStr(), nil
}

//Verify - implement interface
// Verify - implement interface
func (b0 *BLS0ChainScheme) Verify(signature string, hash string) (bool, error) {
pk, err := b0.getPublicKey()
if err != nil {
Expand All @@ -202,7 +201,7 @@ func (b0 *BLS0ChainScheme) Verify(signature string, hash string) (bool, error) {
return sign.Verify(pk, string(rawHash)), nil
}

//GetSignature - given a string return the signature object
// GetSignature - given a string return the signature object
func (b0 *BLS0ChainScheme) GetSignature(signature string) (*bls.Sign, error) {
if signature == "" {
return nil, errors.New("empty signature")
Expand All @@ -224,7 +223,7 @@ func (b0 *BLS0ChainScheme) getPublicKey() (*bls.PublicKey, error) {
return pk, nil
}

//PairMessageHash - Pair a given message hash
// PairMessageHash - Pair a given message hash
func (b0 *BLS0ChainScheme) PairMessageHash(hash string) (*bls.GT, error) {
g2 := &bls.G2{}
err := g2.Deserialize(b0.publicKey)
Expand All @@ -244,7 +243,7 @@ func (b0 *BLS0ChainScheme) PairMessageHash(hash string) (*bls.GT, error) {
return gt, nil
}

//GenerateSplitKeys - implement interface
// GenerateSplitKeys - implement interface
func (b0 *BLS0ChainScheme) GenerateSplitKeys(numSplits int) ([]encryption.SignatureScheme, error) {
var primarySk bls.Fr
err := primarySk.SetLittleEndian(b0.privateKey)
Expand Down Expand Up @@ -296,7 +295,7 @@ func (b0 *BLS0ChainScheme) GenerateSplitKeys(numSplits int) ([]encryption.Signat
return splitKeys, nil
}

//AggregateSignatures - implement interface
// AggregateSignatures - implement interface
func (b0 *BLS0ChainScheme) AggregateSignatures(signatures []string) (string, error) {
var aggSign bls.Sign
for _, signature := range signatures {
Expand All @@ -308,3 +307,19 @@ func (b0 *BLS0ChainScheme) AggregateSignatures(signatures []string) (string, err
}
return aggSign.SerializeToHexStr(), nil
}

// FastAggregateVerify - implement interface
func (b0 *BLS0ChainScheme) FastAggregateVerify(aggSig string, hash []byte, pubKeys []string) (bool, error) {
var aggregatedSignature bls.Sign
err := aggregatedSignature.DeserializeHexStr(aggSig)
if err != nil {
return false, err
}
pubs := make([]bls.PublicKey, len(pubKeys))
for i := 0; i < len(pubKeys); i++ {
if err = pubs[i].DeserializeHexStr(MiraclToHerumiPK(pubKeys[i])); err != nil {
return false, err
}
}
return aggregatedSignature.FastAggregateVerify(pubs, hash), nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -2210,7 +2210,7 @@ func Test_finalize_allocation(t *testing.T) {
b := &block.Block{}
b.Round = 100 + i
balances.setBlock(t, b)

chall.SetAggregateSignature(balances.GetSignatureScheme())
_, err = ssc.verifyChallenge(tx, mustEncode(t, chall), balances)
require.NoError(t, err)
}
Expand Down Expand Up @@ -2386,6 +2386,7 @@ func Test_finalize_allocation_do_not_remove_challenge_ready(t *testing.T) {
b := &block.Block{}
b.Round = 100 + i
balances.setBlock(t, b)
chall.SetAggregateSignature(balances.GetSignatureScheme())
_, err = ssc.verifyChallenge(tx, mustEncode(t, chall), balances)
require.NoError(t, err)
}
Expand Down