diff options
Diffstat (limited to 'core/utils')
-rw-r--r-- | core/utils/crypto.go | 27 | ||||
-rw-r--r-- | core/utils/crypto_test.go | 23 | ||||
-rw-r--r-- | core/utils/round-event.go | 2 | ||||
-rw-r--r-- | core/utils/signer.go | 7 |
4 files changed, 58 insertions, 1 deletions
diff --git a/core/utils/crypto.go b/core/utils/crypto.go index 496944d..42ee612 100644 --- a/core/utils/crypto.go +++ b/core/utils/crypto.go @@ -325,6 +325,19 @@ func hashDKGFinalize(final *typesDKG.Finalize) common.Hash { ) } +func hashDKGSuccess(success *typesDKG.Success) common.Hash { + binaryRound := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryRound, success.Round) + binaryReset := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryReset, success.Reset) + + return crypto.Keccak256Hash( + success.ProposerID.Hash[:], + binaryRound, + binaryReset, + ) +} + // VerifyDKGFinalizeSignature verifies DKGFinalize signature. func VerifyDKGFinalizeSignature( final *typesDKG.Finalize) (bool, error) { @@ -339,6 +352,20 @@ func VerifyDKGFinalizeSignature( return true, nil } +// VerifyDKGSuccessSignature verifies DKGSuccess signature. +func VerifyDKGSuccessSignature( + success *typesDKG.Success) (bool, error) { + hash := hashDKGSuccess(success) + pubKey, err := crypto.SigToPub(hash, success.Signature) + if err != nil { + return false, err + } + if success.ProposerID != types.NewNodeID(pubKey) { + return false, nil + } + return true, nil +} + // Rehash hashes the hash again and again and again... func Rehash(hash common.Hash, count uint) common.Hash { result := hash diff --git a/core/utils/crypto_test.go b/core/utils/crypto_test.go index 24ea68e..29396c5 100644 --- a/core/utils/crypto_test.go +++ b/core/utils/crypto_test.go @@ -302,6 +302,29 @@ func (s *CryptoTestSuite) TestDKGSignature() { s.Require().NoError(err) s.False(ok) final.Reset-- + + success := &typesDKG.Success{ + ProposerID: nID, + Round: 5, + Reset: 6, + } + success.Signature, err = prv.Sign(hashDKGSuccess(success)) + s.Require().NoError(err) + ok, err = VerifyDKGSuccessSignature(success) + s.Require().NoError(err) + s.True(ok) + // Test incorrect round. + success.Round++ + ok, err = VerifyDKGSuccessSignature(success) + s.Require().NoError(err) + s.False(ok) + success.Round-- + // Test incorrect reset. + success.Reset++ + ok, err = VerifyDKGSuccessSignature(success) + s.Require().NoError(err) + s.False(ok) + success.Reset-- } func TestCrypto(t *testing.T) { diff --git a/core/utils/round-event.go b/core/utils/round-event.go index 602d2da..b1d4d23 100644 --- a/core/utils/round-event.go +++ b/core/utils/round-event.go @@ -84,7 +84,7 @@ func (e RoundEventParam) NextTouchNodeSetCacheHeight() uint64 { // NextDKGResetHeight returns the height to reset DKG for next period. func (e RoundEventParam) NextDKGResetHeight() uint64 { - return e.BeginHeight + e.Config.RoundLength*8/10 + return e.BeginHeight + e.Config.RoundLength*85/100 } // NextDKGRegisterHeight returns the height to register DKG. diff --git a/core/utils/signer.go b/core/utils/signer.go index 9904410..ff76743 100644 --- a/core/utils/signer.go +++ b/core/utils/signer.go @@ -145,3 +145,10 @@ func (s *Signer) SignDKGFinalize(final *typesDKG.Finalize) (err error) { final.Signature, err = s.prvKey.Sign(hashDKGFinalize(final)) return } + +// SignDKGSuccess signs a DKG success message. +func (s *Signer) SignDKGSuccess(success *typesDKG.Success) (err error) { + success.ProposerID = s.proposerID + success.Signature, err = s.prvKey.Sign(hashDKGSuccess(success)) + return +} |