github.com/decred/dcrlnd@v0.7.6/keychain/signer.go (about)

     1  package keychain
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/decred/dcrd/chaincfg/chainhash"
     7  	"github.com/decred/dcrd/dcrec/secp256k1/v4"
     8  	"github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa"
     9  )
    10  
    11  func NewPubKeyMessageSigner(pubKey *secp256k1.PublicKey, keyLoc KeyLocator,
    12  	signer MessageSignerRing) *PubKeyMessageSigner {
    13  
    14  	return &PubKeyMessageSigner{
    15  		pubKey:       pubKey,
    16  		keyLoc:       keyLoc,
    17  		digestSigner: signer,
    18  	}
    19  }
    20  
    21  type PubKeyMessageSigner struct {
    22  	pubKey       *secp256k1.PublicKey
    23  	keyLoc       KeyLocator
    24  	digestSigner MessageSignerRing
    25  }
    26  
    27  func (p *PubKeyMessageSigner) PubKey() *secp256k1.PublicKey {
    28  	return p.pubKey
    29  }
    30  
    31  func (p *PubKeyMessageSigner) KeyLocator() KeyLocator {
    32  	return p.keyLoc
    33  }
    34  
    35  func (p *PubKeyMessageSigner) SignMessage(message []byte,
    36  	doubleHash bool) (*ecdsa.Signature, error) {
    37  
    38  	return p.digestSigner.SignMessage(p.keyLoc, message, doubleHash)
    39  }
    40  
    41  func (p *PubKeyMessageSigner) SignMessageCompact(msg []byte,
    42  	doubleHash bool) ([]byte, error) {
    43  
    44  	return p.digestSigner.SignMessageCompact(p.keyLoc, msg, doubleHash)
    45  }
    46  
    47  func NewPrivKeyMessageSigner(privKey *secp256k1.PrivateKey,
    48  	keyLoc KeyLocator) *PrivKeyMessageSigner {
    49  
    50  	return &PrivKeyMessageSigner{
    51  		privKey: privKey,
    52  		keyLoc:  keyLoc,
    53  	}
    54  }
    55  
    56  type PrivKeyMessageSigner struct {
    57  	keyLoc  KeyLocator
    58  	privKey *secp256k1.PrivateKey
    59  }
    60  
    61  func (p *PrivKeyMessageSigner) PubKey() *secp256k1.PublicKey {
    62  	return p.privKey.PubKey()
    63  }
    64  
    65  func (p *PrivKeyMessageSigner) KeyLocator() KeyLocator {
    66  	return p.keyLoc
    67  }
    68  
    69  func (p *PrivKeyMessageSigner) SignMessage(msg []byte,
    70  	doubleHash bool) (*ecdsa.Signature, error) {
    71  
    72  	var digest []byte
    73  	if doubleHash {
    74  		return nil, fmt.Errorf("dcrlnd does not do doubleHash signing")
    75  	} else {
    76  		digest = chainhash.HashB(msg)
    77  	}
    78  	return ecdsa.Sign(p.privKey, digest), nil
    79  }
    80  
    81  func (p *PrivKeyMessageSigner) SignMessageCompact(msg []byte,
    82  	doubleHash bool) ([]byte, error) {
    83  
    84  	var digest []byte
    85  	if doubleHash {
    86  		return nil, fmt.Errorf("dcrlnd does not do doubleHash signing")
    87  	} else {
    88  		digest = chainhash.HashB(msg)
    89  	}
    90  	return ecdsa.SignCompact(p.privKey, digest[:], true), nil
    91  }
    92  
    93  var _ SingleKeyMessageSigner = (*PubKeyMessageSigner)(nil)
    94  var _ SingleKeyMessageSigner = (*PrivKeyMessageSigner)(nil)