diff options
author | Mission Liao <mission.liao@dexon.org> | 2019-03-17 09:56:23 +0800 |
---|---|---|
committer | Jimmy Hu <jimmy.hu@dexon.org> | 2019-03-17 09:56:23 +0800 |
commit | 4b40c1b8990d2a371a77018feea32d038163f2ec (patch) | |
tree | b482aee945e1f60c6c9c9efd86c39abe812a353b /core/utils | |
parent | b636901c60aa666c6c6b532d06e78b529537d315 (diff) | |
download | dexon-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.go | 18 | ||||
-rw-r--r-- | core/utils/crypto_test.go | 47 |
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) { |