Skip to content

Commit 22ba65d

Browse files
authored
crypto/tpke: consensus/dbft: fix signature computation (#463)
* crypto/tpke: consensus/dbft: fix signature computation * privnet: set neoXEthSigBlock
1 parent 26f20bf commit 22ba65d

File tree

14 files changed

+146
-59
lines changed

14 files changed

+146
-59
lines changed

antimev/signature.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,27 @@ var (
1313
)
1414

1515
// SignShare tries to sign a message with local private key.
16-
func (ks *KeyStore) SignShare(msg []byte) (*tpke.SignatureShare, error) {
16+
func (ks *KeyStore) SignShare(msg []byte, negateResult bool) (*tpke.SignatureShare, error) {
1717
if ks.shared == nil || ks.shared.localPrvKey == nil {
1818
return nil, ErrNoPrvKey
1919
}
20-
return ks.shared.localPrvKey.SignShare(msg), nil
20+
return ks.shared.localPrvKey.SignShare(msg, negateResult), nil
2121
}
2222

2323
// AggregateAndVerifySig tries to aggregate signature shares and returns
2424
// the final signature if the verification passes. The key of inputs is
2525
// dkg index which starts from 1, when the array index of a member in the
2626
// key group starts from 0.
27-
func (ks *KeyStore) AggregateAndVerifySig(msg []byte, inputs map[int]*tpke.SignatureShare) (*tpke.Signature, error) {
27+
func (ks *KeyStore) AggregateAndVerifySig(msg []byte, inputs map[int]*tpke.SignatureShare, isNegatedResult bool) (*tpke.Signature, error) {
2828
if ks.shared == nil {
2929
return nil, ErrNoPubKey
3030
}
31-
return ks.shared.aggregateAndVerifySig(msg, inputs, ks.threshold, ks.scaler)
31+
return ks.shared.aggregateAndVerifySig(msg, inputs, ks.threshold, ks.scaler, isNegatedResult)
3232
}
3333

3434
// aggregateAndVerifySig tries to aggregate signature shares and returns
3535
// the final signature if the verification passes.
36-
func (tkg *thresholdKeyGroup) aggregateAndVerifySig(msg []byte, inputs map[int]*tpke.SignatureShare, threshold int, scaler int) (*tpke.Signature, error) {
36+
func (tkg *thresholdKeyGroup) aggregateAndVerifySig(msg []byte, inputs map[int]*tpke.SignatureShare, threshold int, scaler int, isNegatedResult bool) (*tpke.Signature, error) {
3737
if len(inputs) < threshold {
3838
return nil, ErrSigShareNotEnough
3939
}
@@ -67,7 +67,7 @@ func (tkg *thresholdKeyGroup) aggregateAndVerifySig(msg []byte, inputs map[int]*
6767
}
6868
sig, err := tpke.AggregateSigShares(m, s, scaler)
6969
// Verify if the aggregation is valid
70-
if err == nil && tkg.globalPubKey.VerifySig(msg, sig) {
70+
if err == nil && tkg.globalPubKey.VerifySig(msg, sig, isNegatedResult) {
7171
return sig, nil
7272
}
7373
}

antimev/signature_test.go

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"maps"
66
"math/big"
77
"path/filepath"
8+
"slices"
89
"testing"
910

1011
bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381"
@@ -20,8 +21,40 @@ func TestSingleSignature(t *testing.T) {
2021
pk := sk.GetPublicKey()
2122

2223
msg := []byte("pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza")
23-
share := sk.SignShare(msg)
24-
if !pk.VerifySigShare(msg, share) {
24+
share := sk.SignShare(msg, false)
25+
if !pk.VerifySigShare(msg, share, false) {
26+
t.Fatalf("invalid signature")
27+
}
28+
share = sk.SignShare(msg, true)
29+
if !pk.VerifySigShare(msg, share, true) {
30+
t.Fatalf("invalid signature")
31+
}
32+
}
33+
34+
// Verify against results from https://github.com/ChainSafe/bls
35+
func TestEthBLSSignEquivalence(t *testing.T) {
36+
sk, err := new(tpke.PrivateKey).FromBytes(common.FromHex("0x0075d54c786f77c983e59d452f933f98a8aba65a4c09fca937dfe15cb46631f1"))
37+
require.NoError(t, err)
38+
pk, err := tpke.NewPublicKeyFromBytes(common.FromHex("0xa257e2f600440a678e23f5db21d28ff65682c08ea20ea90a2a25f0a46340ccb893f04bd789a3b65bebaa298c99c2d220"))
39+
require.NoError(t, err)
40+
if !pk.Equal(sk.GetPublicKey()) {
41+
t.Fatalf("invalid keypair")
42+
}
43+
msg := []byte("pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza")
44+
sig := common.FromHex("0x853c6e915ad9176e6af5bc4b4e258f1457175347d72a393725605de7f33160123682a9eb2bb52bb64e8198a2aa01b0f4171d9ff07ab6589a29dfbe1286444739766f253935a7caefea7920e012794bd5420d4c8d3259251e789a28c54f3b6a2e")
45+
if !slices.Equal(sk.SignShare(msg, false).Bytes(), sig) {
46+
t.Fatalf("invalid signature")
47+
}
48+
}
49+
50+
// Test vectors from https://github.com/ethereum/consensus-spec-tests
51+
func TestEthBLSVerifyEquivalence(t *testing.T) {
52+
pk, err := tpke.NewPublicKeyFromBytes(common.FromHex("0xa491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a"))
53+
require.NoError(t, err)
54+
msg := common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000000")
55+
sig, err := tpke.NewSignatureFromBytes(common.FromHex("0xb6ed936746e01f8ecf281f020953fbf1f01debd5657c4a383940b020b26507f6076334f91e2366c96e9ab279fb5158090352ea1c5b0c9274504f4f0e7053af24802e51e4568d164fe986834f41e55c8e850ce1f98458c0cfc9ab380b55285a55"))
56+
require.NoError(t, err)
57+
if !pk.VerifySig(msg, sig, false) {
2558
t.Fatalf("invalid signature")
2659
}
2760
}
@@ -81,7 +114,7 @@ func TestThresholdSignature(t *testing.T) {
81114
msg := []byte("pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza")
82115
shares := make(map[int]*tpke.SignatureShare)
83116
for i := 0; i < size; i++ {
84-
share, err := kss[i].SignShare(msg)
117+
share, err := kss[i].SignShare(msg, false)
85118
require.NoError(t, err)
86119
shares[i+1] = share
87120
}
@@ -90,12 +123,12 @@ func TestThresholdSignature(t *testing.T) {
90123
sh1 := maps.Clone(shares)
91124
delete(sh0, 1)
92125
delete(sh1, 2)
93-
sig, err := kss[0].AggregateAndVerifySig(msg, shares)
126+
sig, err := kss[0].AggregateAndVerifySig(msg, shares, false)
94127
require.NoError(t, err)
95128
require.NotNil(t, sig)
96-
sig0, err := kss[0].AggregateAndVerifySig(msg, sh0)
129+
sig0, err := kss[0].AggregateAndVerifySig(msg, sh0, false)
97130
require.NoError(t, err)
98-
sig1, err := kss[0].AggregateAndVerifySig(msg, sh1)
131+
sig1, err := kss[0].AggregateAndVerifySig(msg, sh1, false)
99132
require.NoError(t, err)
100133
require.Equal(t, sig0, sig1)
101134
}

consensus/dbft/block.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (b *Block) Verify(pub dbft.PublicKey, sign []byte) error {
108108
if pub.(*PublicKey).Account != ecrypto.PubkeyBytesToAddress(pubkey) {
109109
return errors.New("invalid block signature")
110110
}
111-
case dbftutil.ExtraV1:
111+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
112112
switch ss := extra.SignatureScheme(); ss {
113113
case dbftutil.ExtraV1ECDSAScheme:
114114
sealHash := HonestSealHashV0(b.header)

consensus/dbft/commit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (c *commit) DecodeRLP(s *rlp.Stream) error {
5858
// share returns [tpke.SignatureShare] unpacked from commit's signature in case of
5959
// [dbftutil.ExtraV1] commit version. No error is returned for other commit versions.
6060
func (c *commit) share() (*tpke.SignatureShare, error) {
61-
if c.version != dbftutil.ExtraV1 {
61+
if c.version != dbftutil.ExtraV1 && c.version != dbftutil.ExtraV2 {
6262
return nil, nil
6363
}
6464
if c.shareCache == nil {

consensus/dbft/dbft.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ func (c *DBFT) verifyCommitCb(p dbft.ConsensusPayload[common.Hash]) error {
756756
switch v {
757757
case dbftutil.ExtraV0:
758758
expectedLen = crypto.SignatureLength
759-
case dbftutil.ExtraV1:
759+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
760760
if c.config.enforceECDSASignatures || (!isAMEV && c.chain.Config().IsNeoXAMEV(new(big.Int).Add(h, bigOne))) {
761761
expectedLen = crypto.SignatureLength
762762
} else {
@@ -801,7 +801,7 @@ func (c *DBFT) verifyPrepareRequestCb(p dbft.ConsensusPayload[common.Hash]) erro
801801
// A separate check for post-NeoXAMEV block signing scheme since it depends
802802
// on runtime node configuration.
803803
extra := dbftutil.Extra(req.SealingProposal.Extra)
804-
if c.chain.Config().IsNeoXAMEV(req.SealingProposal.Number) && extra.Version() == dbftutil.ExtraV1 {
804+
if c.chain.Config().IsNeoXAMEV(req.SealingProposal.Number) && (extra.Version() == dbftutil.ExtraV1 || extra.Version() == dbftutil.ExtraV2) {
805805
var expected = dbftutil.ExtraV1ThresholdScheme
806806
if c.config.enforceECDSASignatures {
807807
expected = dbftutil.ExtraV1ECDSAScheme
@@ -1367,7 +1367,7 @@ func (c *DBFT) getBlockWitness(pub *tpke.PublicKey, block *Block) ([]byte, error
13671367
switch v := dbftutil.Extra(block.header.Extra).Version(); v {
13681368
case dbftutil.ExtraV0:
13691369
return res, nil
1370-
case dbftutil.ExtraV1:
1370+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
13711371
// Enforce multisignature-based signing scheme for NeoXAMEV-1 height or if
13721372
// enforcing configured.
13731373
cfg := c.chain.Config()
@@ -1403,7 +1403,7 @@ func (c *DBFT) getBlockWitness(pub *tpke.PublicKey, block *Block) ([]byte, error
14031403
c.lock.RLock()
14041404
ks := c.amevKeystore
14051405
c.lock.RUnlock()
1406-
sig, err := ks.AggregateAndVerifySig(msg, shares)
1406+
sig, err := ks.AggregateAndVerifySig(msg, shares, v == dbftutil.ExtraV1)
14071407
if err != nil {
14081408
return nil, fmt.Errorf("failed to aggregate signature: %w", err)
14091409
}
@@ -1638,20 +1638,25 @@ func (c *DBFT) verifyHeader(chain consensus.ChainHeaderReader, header *types.Hea
16381638
var (
16391639
cfg = chain.Config()
16401640
isAMEV = cfg.IsNeoXAMEV(header.Number)
1641+
isEthSig = cfg.IsNeoXEthSig(header.Number)
16411642
isV1Extra = isAMEV || cfg.IsNeoXAMEV(new(big.Int).Add(header.Number, bigOne))
1643+
isV2Extra = isEthSig || cfg.IsNeoXEthSig(new(big.Int).Add(header.Number, bigOne))
16421644
expectedExtra = dbftutil.ExtraV0
16431645
extra = dbftutil.Extra(header.Extra)
16441646
)
16451647
if isV1Extra {
16461648
expectedExtra = dbftutil.ExtraV1
16471649
}
1650+
if isV2Extra {
1651+
expectedExtra = dbftutil.ExtraV2
1652+
}
16481653
if v := extra.Version(); v != expectedExtra {
16491654
return fmt.Errorf("%w: expected %d, got %d", dbftutil.ErrUnexpectedExtraVersion, expectedExtra, v)
16501655
}
16511656

16521657
// Check that extra-data contains hashable part filled.
16531658
var expectedHashableExtraLen = dbftutil.HashableExtraV0Len
1654-
if isV1Extra {
1659+
if isV1Extra || isV2Extra {
16551660
expectedHashableExtraLen = dbftutil.HashableExtraV1Len
16561661
}
16571662
if len(header.Extra) < expectedHashableExtraLen {
@@ -1664,7 +1669,7 @@ func (c *DBFT) verifyHeader(chain consensus.ChainHeaderReader, header *types.Hea
16641669
m = crypto.GetBFTHonestNodeCount(n)
16651670
expected int
16661671
)
1667-
if isV1Extra {
1672+
if isV1Extra || isV2Extra {
16681673
if !isAMEV && extra.SignatureScheme() != dbftutil.ExtraV1ECDSAScheme {
16691674
return fmt.Errorf("%w for pre-NeoXAMEV block: expected %d, got %d", dbftutil.ErrUnexpectedBlockSignatureScheme, dbftutil.ExtraV1ECDSAScheme, extra.SignatureScheme())
16701675
}
@@ -1843,7 +1848,7 @@ func (c *DBFT) verifyExtra(sealHashBytes []byte, extra dbftutil.Extra, parentNex
18431848
return fmt.Errorf("%w: %s", errUnauthorizedSigner, err)
18441849
}
18451850
return nil
1846-
case dbftutil.ExtraV1:
1851+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
18471852
switch ss := extra.SignatureScheme(); ss {
18481853
case dbftutil.ExtraV1ECDSAScheme:
18491854
vals, sigs, err := extra.ECDSASigners(len(c.config.StandByValidators))
@@ -1857,7 +1862,7 @@ func (c *DBFT) verifyExtra(sealHashBytes []byte, extra dbftutil.Extra, parentNex
18571862
switch pv := parentExtra.Version(); pv {
18581863
case dbftutil.ExtraV0:
18591864
expected = parentNextConsensus
1860-
case dbftutil.ExtraV1:
1865+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
18611866
var offset = dbftutil.ExtraVersionLen + dbftutil.ExtraV1SignatureSchemeLen
18621867
expected.SetBytes(parentExtra[offset : offset+common.HashLength])
18631868
default:
@@ -1887,8 +1892,7 @@ func (c *DBFT) verifyExtra(sealHashBytes []byte, extra dbftutil.Extra, parentNex
18871892
if err != nil {
18881893
return fmt.Errorf("seal hash is not a G2 point on BLS12-381: %w", err)
18891894
}
1890-
1891-
return pub.Verify(hash, sig)
1895+
return pub.Verify(hash, sig, v == dbftutil.ExtraV1)
18921896
default:
18931897
return fmt.Errorf("%w: %d", dbftutil.ErrUnexpectedBlockSignatureScheme, ss)
18941898
}
@@ -1913,14 +1917,20 @@ func (c *DBFT) Prepare(chain consensus.ChainHeaderReader, header *types.Header)
19131917
// Header's Extra (validators addresses / global TPKE pub and validators
19141918
// signatures) are treated as changeable and are not filled in during Prepare.
19151919
if chain.Config().IsNeoXAMEV(new(big.Int).Add(header.Number, bigOne)) {
1920+
var extraVersion dbftutil.ExtraVersion
1921+
if chain.Config().IsNeoXEthSig(new(big.Int).Add(header.Number, bigOne)) {
1922+
extraVersion = dbftutil.ExtraV2
1923+
} else {
1924+
extraVersion = dbftutil.ExtraV1
1925+
}
19161926
var sigScheme dbftutil.ExtraV1SignatureScheme
19171927
// Enforce multisignature block signing if we're not at NeoXAMEV yet.
19181928
if c.config.enforceECDSASignatures || !chain.Config().IsNeoXAMEV(header.Number) {
19191929
sigScheme = dbftutil.ExtraV1ECDSAScheme
19201930
} else {
19211931
sigScheme = dbftutil.ExtraV1ThresholdScheme
19221932
}
1923-
header.Extra = []byte{byte(dbftutil.ExtraV1), byte(sigScheme)}
1933+
header.Extra = []byte{byte(extraVersion), byte(sigScheme)}
19241934
} else {
19251935
header.Extra = []byte{byte(dbftutil.ExtraV0)}
19261936
}
@@ -2343,6 +2353,9 @@ func (c *DBFT) OnPayload(cp *dbftproto.Message) error {
23432353
}
23442354

23452355
func (c *DBFT) getBlockExtraVersion(height *big.Int) dbftutil.ExtraVersion {
2356+
if c.chain.Config().IsNeoXEthSig(height) || c.chain.Config().IsNeoXEthSig(new(big.Int).Add(height, bigOne)) {
2357+
return dbftutil.ExtraV2
2358+
}
23462359
if c.chain.Config().IsNeoXAMEV(height) || c.chain.Config().IsNeoXAMEV(new(big.Int).Add(height, bigOne)) {
23472360
return dbftutil.ExtraV1
23482361
}
@@ -2560,7 +2573,7 @@ func honestSealHash(header *types.Header) ([]byte, error) {
25602573
switch v := extra.Version(); v {
25612574
case dbftutil.ExtraV0:
25622575
sealHash = HonestSealHashV0(header).Bytes()
2563-
case dbftutil.ExtraV1:
2576+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
25642577
switch ss := extra.SignatureScheme(); ss {
25652578
case dbftutil.ExtraV1ECDSAScheme:
25662579
sealHash = HonestSealHashV0(header).Bytes()
@@ -2612,7 +2625,7 @@ func encodeSigHeader(w io.Writer, header *types.Header) {
26122625
switch v := dbftutil.Extra(header.Extra).Version(); v {
26132626
case dbftutil.ExtraV0:
26142627
hashableExtraLen = dbftutil.HashableExtraV0Len
2615-
case dbftutil.ExtraV1:
2628+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
26162629
hashableExtraLen = dbftutil.HashableExtraV1Len
26172630
default:
26182631
panic(fmt.Errorf("%w: %d", dbftutil.ErrUnexpectedExtraVersion, v)) // a dangerous program bug

consensus/dbft/dbftutil/util.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,25 @@ const (
2323
// ExtraV1 is the 1-st version of block's Extra. Extra of this version includes global
2424
// TPKE public key followed by aggregated validators' threshold signature.
2525
ExtraV1 ExtraVersion = 0x01
26+
// ExtraV2 is the 2-nd version of block's Extra. Extra of this version includes global
27+
// TPKE public key followed by aggregated validators' threshold signature compatible
28+
// with Ethereum CL.
29+
ExtraV2 ExtraVersion = 0x02
2630
)
2731

2832
// ExtraV1SignatureScheme is a scheme of block signature (ECDSA multisignature or
29-
// threshold signature) that is used for ExtraV1 extra.
33+
// threshold signature) that is used for ExtraV1 and ExtraV2 extra.
3034
type ExtraV1SignatureScheme byte
3135

3236
const (
3337
// ExtraV1SignatureSchemeLen is the length of block signing scheme version for
34-
// ExtraV1 extra.
38+
// ExtraV1 and ExtraV2 extra.
3539
ExtraV1SignatureSchemeLen = 1
3640
// ExtraV1ECDSAScheme denotes fallback ECDSA multisignature block signing scheme
37-
// for ExtraV1 extra.
41+
// for ExtraV1 and ExtraV2 extra.
3842
ExtraV1ECDSAScheme ExtraV1SignatureScheme = 0x00
3943
// ExtraV1ThresholdScheme denotes primary threshold signature block signing scheme
40-
// for ExtraV1 extra.
44+
// for ExtraV1 and ExtraV2 extra.
4145
ExtraV1ThresholdScheme ExtraV1SignatureScheme = 0x01
4246
)
4347

@@ -48,7 +52,7 @@ const (
4852
// ExtraV0 extra version.
4953
HashableExtraV0Len = ExtraVersionLen
5054
// HashableExtraV1Len is the length of hashable part of block extra data for
51-
// ExtraV1 extra version.
55+
// ExtraV1 and ExtraV2 extra version.
5256
HashableExtraV1Len = ExtraVersionLen + ExtraV1SignatureSchemeLen + common.HashLength // signing version byte + fallback NextConsensus address
5357
)
5458

@@ -74,8 +78,8 @@ func (e Extra) Version() ExtraVersion {
7478
return ExtraVersion(e[0])
7579
}
7680

77-
// SignatureScheme returns version of block signature for ExtraV1. It's no-op to apply
78-
// this method to non-V1 extra.
81+
// SignatureScheme returns version of block signature for ExtraV1 and ExtraV2. It's no-op
82+
// to apply this method to V0 extra.
7983
func (e Extra) SignatureScheme() ExtraV1SignatureScheme {
8084
return ExtraV1SignatureScheme(e[1])
8185
}
@@ -90,7 +94,7 @@ func (e Extra) ECDSASigners(n int) ([]common.Address, [][]byte, error) {
9094
switch e.Version() {
9195
case ExtraV0:
9296
buf = e[HashableExtraV0Len:]
93-
case ExtraV1:
97+
case ExtraV1, ExtraV2:
9498
buf = e[HashableExtraV1Len:]
9599
default:
96100
return nil, nil, fmt.Errorf("%w: %d", ErrUnexpectedExtraVersion, e.Version())
@@ -124,8 +128,8 @@ func (e Extra) ECDSASigners(n int) ([]common.Address, [][]byte, error) {
124128
// ThresholdSigners returns global public key and threshold signature.
125129
func (e Extra) ThresholdSigners() (*tpke.PublicKey, *tpke.Signature, error) {
126130
// Sanity check.
127-
if v := e.Version(); v != ExtraV1 {
128-
return nil, nil, fmt.Errorf("%w: expected %d, got %d", ErrUnexpectedExtraVersion, ExtraV1, v)
131+
if v := e.Version(); v != ExtraV1 && v != ExtraV2 {
132+
return nil, nil, fmt.Errorf("%w: expected %d or %d, got %d", ErrUnexpectedExtraVersion, ExtraV1, ExtraV2, v)
129133
}
130134
if ss := e.SignatureScheme(); ss != ExtraV1ThresholdScheme {
131135
return nil, nil, fmt.Errorf("%w: expected %d, got %d", ErrUnexpectedBlockSignatureScheme, ExtraV1ThresholdScheme, ss)

consensus/dbft/signer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ func (s *Signer) signBlock(extra dbftutil.Extra, blockRLP []byte) ([]byte, error
3535
switch v := extra.Version(); v {
3636
case dbftutil.ExtraV0:
3737
return s.SignFn(accounts.Account{Address: s.Signer}, accounts.MimetypeTextPlain, blockRLP)
38-
case dbftutil.ExtraV1:
38+
case dbftutil.ExtraV1, dbftutil.ExtraV2:
3939
switch ss := extra.SignatureScheme(); ss {
4040
case dbftutil.ExtraV1ECDSAScheme:
4141
return s.SignFn(accounts.Account{Address: s.Signer}, accounts.MimetypeTextPlain, blockRLP)
4242
case dbftutil.ExtraV1ThresholdScheme:
43-
share, err := s.AmevKeystore.SignShare(blockRLP)
43+
share, err := s.AmevKeystore.SignShare(blockRLP, v == dbftutil.ExtraV1)
4444
if err != nil {
4545
return nil, fmt.Errorf("failed to sign share: %w", err)
4646
}

crypto/tpke/private_key.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,14 @@ func (sk *PrivateKey) DecryptShare(ct *CipherText) *DecryptionShare {
6868
}
6969

7070
// SignShare returns a signature share for input message
71-
func (sk *PrivateKey) SignShare(msg []byte) *SignatureShare {
71+
func (sk *PrivateKey) SignShare(msg []byte, negateResult bool) *SignatureShare {
7272
// S=H(msg)*sk
7373
g2Hash, _ := bls12381.HashToG2(msg, Domain)
74-
sig := new(bls12381.G2Affine).ScalarMultiplication(&g2Hash, sk.fr)
75-
sig.Neg(sig)
76-
return &SignatureShare{
77-
pg2: sig,
74+
sig := &SignatureShare{
75+
pg2: new(bls12381.G2Affine).ScalarMultiplication(&g2Hash, sk.fr),
7876
}
77+
if negateResult {
78+
return sig.Neg()
79+
}
80+
return sig
7981
}

0 commit comments

Comments
 (0)