aboutsummaryrefslogtreecommitdiffstats
path: root/core/crypto.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-08-08 11:28:57 +0800
committerGitHub <noreply@github.com>2018-08-08 11:28:57 +0800
commita418ea95c0f5afb50cbb78aedecc68373353d06e (patch)
tree79bee8ef152f58c0b3bbcbe38d4dd537050b72aa /core/crypto.go
parent3a929b656b6bd5846849fd98dc29ff761db97ed3 (diff)
downloadtangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.tar
tangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.tar.gz
tangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.tar.bz2
tangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.tar.lz
tangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.tar.xz
tangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.tar.zst
tangerine-consensus-a418ea95c0f5afb50cbb78aedecc68373353d06e.zip
crypto: Add crypto module. (#34)
Diffstat (limited to 'core/crypto.go')
-rw-r--r--core/crypto.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/core/crypto.go b/core/crypto.go
new file mode 100644
index 0000000..679b045
--- /dev/null
+++ b/core/crypto.go
@@ -0,0 +1,58 @@
+// Copyright 2018 The dexon-consensus-core Authors
+// This file is part of the dexon-consensus-core library.
+//
+// The dexon-consensus-core library is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// The dexon-consensus-core library is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+// General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the dexon-consensus-core library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package core
+
+import (
+ "encoding/binary"
+
+ "github.com/dexon-foundation/dexon-consensus-core/common"
+ "github.com/dexon-foundation/dexon-consensus-core/core/types"
+ "github.com/dexon-foundation/dexon-consensus-core/crypto"
+)
+
+func hashCompactionChainAck(block *types.Block) (common.Hash, error) {
+ binaryTime, err := block.ConsensusInfo.Timestamp.MarshalBinary()
+ if err != nil {
+ return common.Hash{}, err
+ }
+ binaryHeight := make([]byte, 8)
+ binary.LittleEndian.PutUint64(binaryHeight, block.ConsensusInfo.Height)
+ hash := crypto.Keccak256Hash(
+ block.ConsensusInfoParentHash[:],
+ binaryTime,
+ binaryHeight)
+ return hash, nil
+}
+
+func signCompactionChainAck(block *types.Block,
+ prv crypto.PrivateKey) (crypto.Signature, error) {
+ hash, err := hashCompactionChainAck(block)
+ if err != nil {
+ return crypto.Signature{}, err
+ }
+ return prv.Sign(hash)
+}
+
+func verifyCompactionChainAckSignature(pubkey crypto.PublicKey,
+ ackingBlock *types.Block, sig crypto.Signature) (bool, error) {
+ hash, err := hashCompactionChainAck(ackingBlock)
+ if err != nil {
+ return false, err
+ }
+ return pubkey.VerifySignature(hash, sig), nil
+}