diff options
Diffstat (limited to 'core/authenticator.go')
-rw-r--r-- | core/authenticator.go | 70 |
1 files changed, 63 insertions, 7 deletions
diff --git a/core/authenticator.go b/core/authenticator.go index 7e6505d..91477c5 100644 --- a/core/authenticator.go +++ b/core/authenticator.go @@ -25,21 +25,24 @@ import ( // Authenticator verify data owner. type Authenticator struct { - prvKey crypto.PrivateKey - pubKey crypto.PublicKey + prvKey crypto.PrivateKey + pubKey crypto.PublicKey + proposerID types.NodeID } // NewAuthenticator constructs an Authenticator instance. -func NewAuthenticator(prvKey crypto.PrivateKey) *Authenticator { - return &Authenticator{ +func NewAuthenticator(prvKey crypto.PrivateKey) (auth *Authenticator) { + auth = &Authenticator{ prvKey: prvKey, pubKey: prvKey.PublicKey(), } + auth.proposerID = types.NewNodeID(auth.pubKey) + return } // SignBlock signs a types.Block. func (au *Authenticator) SignBlock(b *types.Block) (err error) { - b.ProposerID = types.NewNodeID(au.pubKey) + b.ProposerID = au.proposerID if b.Hash, err = hashBlock(b); err != nil { return } @@ -51,14 +54,14 @@ func (au *Authenticator) SignBlock(b *types.Block) (err error) { // SignVote signs a types.Vote. func (au *Authenticator) SignVote(v *types.Vote) (err error) { - v.ProposerID = types.NewNodeID(au.pubKey) + v.ProposerID = au.proposerID v.Signature, err = au.prvKey.Sign(hashVote(v)) return } // SignCRS signs CRS signature of types.Block. func (au *Authenticator) SignCRS(b *types.Block, crs common.Hash) (err error) { - if b.ProposerID != types.NewNodeID(au.pubKey) { + if b.ProposerID != au.proposerID { err = ErrInvalidProposerID return } @@ -66,6 +69,59 @@ func (au *Authenticator) SignCRS(b *types.Block, crs common.Hash) (err error) { return } +// SignAsWitnessAck create a witness ack from a confirmed block. +func (au *Authenticator) SignAsWitnessAck( + b *types.Block) (wAck *types.WitnessAck, err error) { + + hash, err := hashWitness(b) + if err != nil { + return + } + sig, err := au.prvKey.Sign(hash) + if err != nil { + return + } + wAck = &types.WitnessAck{ + ProposerID: au.proposerID, + WitnessBlockHash: b.Hash, + Signature: sig, + Hash: hash, + } + return +} + +// SignDKGComplaint signs a DKG complaint. +func (au *Authenticator) SignDKGComplaint( + complaint *types.DKGComplaint) (err error) { + complaint.ProposerID = au.proposerID + complaint.Signature, err = au.prvKey.Sign(hashDKGComplaint(complaint)) + return +} + +// SignDKGMasterPublicKey signs a DKG master public key. +func (au *Authenticator) SignDKGMasterPublicKey( + mpk *types.DKGMasterPublicKey) (err error) { + mpk.ProposerID = au.proposerID + mpk.Signature, err = au.prvKey.Sign(hashDKGMasterPublicKey(mpk)) + return +} + +// SignDKGPrivateShare signs a DKG private share. +func (au *Authenticator) SignDKGPrivateShare( + prvShare *types.DKGPrivateShare) (err error) { + prvShare.ProposerID = au.proposerID + prvShare.Signature, err = au.prvKey.Sign(hashDKGPrivateShare(prvShare)) + return +} + +// SignDKGPartialSignature signs a DKG partial signature. +func (au *Authenticator) SignDKGPartialSignature( + pSig *types.DKGPartialSignature) (err error) { + pSig.ProposerID = au.proposerID + pSig.Signature, err = au.prvKey.Sign(hashDKGPartialSignature(pSig)) + return +} + // VerifyBlock verifies the signature of types.Block. func (au *Authenticator) VerifyBlock(b *types.Block) (err error) { hash, err := hashBlock(b) |