aboutsummaryrefslogtreecommitdiffstats
path: root/core/utils
diff options
context:
space:
mode:
authorMission Liao <mission.liao@dexon.org>2019-03-17 09:56:23 +0800
committerJimmy Hu <jimmy.hu@dexon.org>2019-03-17 09:56:23 +0800
commit4b40c1b8990d2a371a77018feea32d038163f2ec (patch)
treeb482aee945e1f60c6c9c9efd86c39abe812a353b /core/utils
parentb636901c60aa666c6c6b532d06e78b529537d315 (diff)
downloaddexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.tar
dexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.tar.gz
dexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.tar.bz2
dexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.tar.lz
dexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.tar.xz
dexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.tar.zst
dexon-consensus-4b40c1b8990d2a371a77018feea32d038163f2ec.zip
dkg: add reset field (#492)
* Add Reset fields to DKG types * Fix crypto part after adding Reset field * Prohibit DKG messages with different resetCount * Add TODO * Add reset parameter to dkgProtocol constructor * Add TODO * Fix inconsist hash to prepare CRS * Add reset parameter when runnning DKG * Fix test for utils.RoundEvent * Add dummy test to prohibit DKG messages with unexpected reset count * Fix test.App
Diffstat (limited to 'core/utils')
-rw-r--r--core/utils/crypto.go18
-rw-r--r--core/utils/crypto_test.go47
2 files changed, 63 insertions, 2 deletions
diff --git a/core/utils/crypto.go b/core/utils/crypto.go
index f5343ca..7532d29 100644
--- a/core/utils/crypto.go
+++ b/core/utils/crypto.go
@@ -148,11 +148,14 @@ func hashPosition(position types.Position) common.Hash {
func hashDKGPrivateShare(prvShare *typesDKG.PrivateShare) common.Hash {
binaryRound := make([]byte, 8)
binary.LittleEndian.PutUint64(binaryRound, prvShare.Round)
+ binaryReset := make([]byte, 8)
+ binary.LittleEndian.PutUint64(binaryReset, prvShare.Reset)
return crypto.Keccak256Hash(
prvShare.ProposerID.Hash[:],
prvShare.ReceiverID.Hash[:],
binaryRound,
+ binaryReset,
prvShare.PrivateShare.Bytes(),
)
}
@@ -175,12 +178,15 @@ func VerifyDKGPrivateShareSignature(
func hashDKGMasterPublicKey(mpk *typesDKG.MasterPublicKey) common.Hash {
binaryRound := make([]byte, 8)
binary.LittleEndian.PutUint64(binaryRound, mpk.Round)
+ binaryReset := make([]byte, 8)
+ binary.LittleEndian.PutUint64(binaryReset, mpk.Reset)
return crypto.Keccak256Hash(
mpk.ProposerID.Hash[:],
mpk.DKGID.GetLittleEndian(),
mpk.PublicKeyShares.MasterKeyBytes(),
binaryRound,
+ binaryReset,
)
}
@@ -201,12 +207,15 @@ func VerifyDKGMasterPublicKeySignature(
func hashDKGComplaint(complaint *typesDKG.Complaint) common.Hash {
binaryRound := make([]byte, 8)
binary.LittleEndian.PutUint64(binaryRound, complaint.Round)
+ binaryReset := make([]byte, 8)
+ binary.LittleEndian.PutUint64(binaryReset, complaint.Reset)
hashPrvShare := hashDKGPrivateShare(&complaint.PrivateShare)
return crypto.Keccak256Hash(
complaint.ProposerID.Hash[:],
binaryRound,
+ binaryReset,
hashPrvShare[:],
)
}
@@ -217,6 +226,9 @@ func VerifyDKGComplaintSignature(
if complaint.Round != complaint.PrivateShare.Round {
return false, nil
}
+ if complaint.Reset != complaint.PrivateShare.Reset {
+ return false, nil
+ }
hash := hashDKGComplaint(complaint)
pubKey, err := crypto.SigToPub(hash, complaint.Signature)
if err != nil {
@@ -261,10 +273,13 @@ func VerifyDKGPartialSignatureSignature(
func hashDKGMPKReady(ready *typesDKG.MPKReady) common.Hash {
binaryRound := make([]byte, 8)
binary.LittleEndian.PutUint64(binaryRound, ready.Round)
+ binaryReset := make([]byte, 8)
+ binary.LittleEndian.PutUint64(binaryReset, ready.Reset)
return crypto.Keccak256Hash(
ready.ProposerID.Hash[:],
binaryRound,
+ binaryReset,
)
}
@@ -285,10 +300,13 @@ func VerifyDKGMPKReadySignature(
func hashDKGFinalize(final *typesDKG.Finalize) common.Hash {
binaryRound := make([]byte, 8)
binary.LittleEndian.PutUint64(binaryRound, final.Round)
+ binaryReset := make([]byte, 8)
+ binary.LittleEndian.PutUint64(binaryReset, final.Reset)
return crypto.Keccak256Hash(
final.ProposerID.Hash[:],
binaryRound,
+ binaryReset,
)
}
diff --git a/core/utils/crypto_test.go b/core/utils/crypto_test.go
index 1077277..3151a39 100644
--- a/core/utils/crypto_test.go
+++ b/core/utils/crypto_test.go
@@ -160,6 +160,7 @@ func (s *CryptoTestSuite) TestDKGSignature() {
prvShare := &typesDKG.PrivateShare{
ProposerID: nID,
Round: 5,
+ Reset: 6,
PrivateShare: *dkg.NewPrivateKey(),
}
prvShare.Signature, err = prv.Sign(hashDKGPrivateShare(prvShare))
@@ -171,12 +172,19 @@ func (s *CryptoTestSuite) TestDKGSignature() {
ok, err = VerifyDKGPrivateShareSignature(prvShare)
s.Require().NoError(err)
s.False(ok)
+ prvShare.Round--
+ prvShare.Reset++
+ ok, err = VerifyDKGPrivateShareSignature(prvShare)
+ s.Require().NoError(err)
+ s.False(ok)
+ prvShare.Reset--
id := dkg.NewID([]byte{13})
_, pkShare := dkg.NewPrivateKeyShares(1)
mpk := &typesDKG.MasterPublicKey{
ProposerID: nID,
Round: 5,
+ Reset: 6,
DKGID: id,
PublicKeyShares: *pkShare,
}
@@ -185,17 +193,25 @@ func (s *CryptoTestSuite) TestDKGSignature() {
ok, err = VerifyDKGMasterPublicKeySignature(mpk)
s.Require().NoError(err)
s.True(ok)
+ // Test incorrect round.
mpk.Round++
ok, err = VerifyDKGMasterPublicKeySignature(mpk)
s.Require().NoError(err)
s.False(ok)
+ mpk.Round--
+ // Test incorrect reset.
+ mpk.Reset++
+ ok, err = VerifyDKGMasterPublicKeySignature(mpk)
+ s.Require().NoError(err)
+ s.False(ok)
+ mpk.Reset--
- prvShare.Round = 5
prvShare.Signature, err = prv.Sign(hashDKGPrivateShare(prvShare))
s.Require().NoError(err)
complaint := &typesDKG.Complaint{
ProposerID: nID,
Round: 5,
+ Reset: 6,
PrivateShare: *prvShare,
}
complaint.Signature, err = prv.Sign(hashDKGComplaint(complaint))
@@ -208,14 +224,23 @@ func (s *CryptoTestSuite) TestDKGSignature() {
ok, err = VerifyDKGComplaintSignature(complaint)
s.Require().NoError(err)
s.False(ok)
- // Test mismatch round.
complaint.Round--
+ // Test mismatch round.
complaint.PrivateShare.Round++
complaint.Signature, err = prv.Sign(hashDKGComplaint(complaint))
s.Require().NoError(err)
ok, err = VerifyDKGComplaintSignature(complaint)
s.Require().NoError(err)
s.False(ok)
+ complaint.PrivateShare.Round--
+ // Test mismatch reset.
+ complaint.PrivateShare.Reset++
+ complaint.Signature, err = prv.Sign(hashDKGComplaint(complaint))
+ s.Require().NoError(err)
+ ok, err = VerifyDKGComplaintSignature(complaint)
+ s.Require().NoError(err)
+ s.False(ok)
+ complaint.PrivateShare.Reset--
// Test incorrect private share signature.
complaint.PrivateShare.Round--
complaint.PrivateShare.ReceiverID = types.NodeID{Hash: common.NewRandomHash()}
@@ -243,30 +268,48 @@ func (s *CryptoTestSuite) TestDKGSignature() {
ready := &typesDKG.MPKReady{
ProposerID: nID,
Round: 5,
+ Reset: 6,
}
ready.Signature, err = prv.Sign(hashDKGMPKReady(ready))
s.Require().NoError(err)
ok, err = VerifyDKGMPKReadySignature(ready)
s.Require().NoError(err)
s.True(ok)
+ // Test incorrect round.
ready.Round++
ok, err = VerifyDKGMPKReadySignature(ready)
s.Require().NoError(err)
s.False(ok)
+ ready.Round--
+ // Test incorrect reset.
+ ready.Reset++
+ ok, err = VerifyDKGMPKReadySignature(ready)
+ s.Require().NoError(err)
+ s.False(ok)
+ ready.Reset--
final := &typesDKG.Finalize{
ProposerID: nID,
Round: 5,
+ Reset: 6,
}
final.Signature, err = prv.Sign(hashDKGFinalize(final))
s.Require().NoError(err)
ok, err = VerifyDKGFinalizeSignature(final)
s.Require().NoError(err)
s.True(ok)
+ // Test incorrect round.
final.Round++
ok, err = VerifyDKGFinalizeSignature(final)
s.Require().NoError(err)
s.False(ok)
+ final.Round--
+ // Test incorrect reset.
+ final.Reset++
+ ok, err = VerifyDKGFinalizeSignature(final)
+ s.Require().NoError(err)
+ s.False(ok)
+ final.Reset--
}
func TestCrypto(t *testing.T) {