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)