aboutsummaryrefslogtreecommitdiffstats
path: root/core/utils
diff options
context:
space:
mode:
Diffstat (limited to 'core/utils')
-rw-r--r--core/utils/crypto.go27
-rw-r--r--core/utils/crypto_test.go23
-rw-r--r--core/utils/round-event.go2
-rw-r--r--core/utils/signer.go7
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
+}