mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-07-28 13:52:55 +02:00
multi: use key locator only for signing messages
To simplify the API surface of a remote signer even more, we refactor the SignMessage and SignMessageCompact calls to only accept a key locator as we always know what key we're using for signing anyway.
This commit is contained in:
@@ -392,13 +392,15 @@ func (b *BtcWalletKeyRing) ECDH(keyDesc KeyDescriptor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SignMessage signs the given message, single or double SHA256 hashing it
|
// SignMessage signs the given message, single or double SHA256 hashing it
|
||||||
// first, with the private key described in the key descriptor.
|
// first, with the private key described in the key locator.
|
||||||
//
|
//
|
||||||
// NOTE: This is part of the keychain.MessageSignerRing interface.
|
// NOTE: This is part of the keychain.MessageSignerRing interface.
|
||||||
func (b *BtcWalletKeyRing) SignMessage(keyDesc KeyDescriptor,
|
func (b *BtcWalletKeyRing) SignMessage(keyLoc KeyLocator,
|
||||||
msg []byte, doubleHash bool) (*btcec.Signature, error) {
|
msg []byte, doubleHash bool) (*btcec.Signature, error) {
|
||||||
|
|
||||||
privKey, err := b.DerivePrivKey(keyDesc)
|
privKey, err := b.DerivePrivKey(KeyDescriptor{
|
||||||
|
KeyLocator: keyLoc,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -413,14 +415,16 @@ func (b *BtcWalletKeyRing) SignMessage(keyDesc KeyDescriptor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SignMessageCompact signs the given message, single or double SHA256 hashing
|
// SignMessageCompact signs the given message, single or double SHA256 hashing
|
||||||
// it first, with the private key described in the key descriptor and returns
|
// it first, with the private key described in the key locator and returns
|
||||||
// the signature in the compact, public key recoverable format.
|
// the signature in the compact, public key recoverable format.
|
||||||
//
|
//
|
||||||
// NOTE: This is part of the keychain.MessageSignerRing interface.
|
// NOTE: This is part of the keychain.MessageSignerRing interface.
|
||||||
func (b *BtcWalletKeyRing) SignMessageCompact(keyDesc KeyDescriptor,
|
func (b *BtcWalletKeyRing) SignMessageCompact(keyLoc KeyLocator,
|
||||||
msg []byte, doubleHash bool) ([]byte, error) {
|
msg []byte, doubleHash bool) ([]byte, error) {
|
||||||
|
|
||||||
privKey, err := b.DerivePrivKey(keyDesc)
|
privKey, err := b.DerivePrivKey(KeyDescriptor{
|
||||||
|
KeyLocator: keyLoc,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@@ -192,15 +192,15 @@ type SecretKeyRing interface {
|
|||||||
// signing on keys within a key ring.
|
// signing on keys within a key ring.
|
||||||
type MessageSignerRing interface {
|
type MessageSignerRing interface {
|
||||||
// SignMessage signs the given message, single or double SHA256 hashing
|
// SignMessage signs the given message, single or double SHA256 hashing
|
||||||
// it first, with the private key described in the key descriptor.
|
// it first, with the private key described in the key locator.
|
||||||
SignMessage(keyDesc KeyDescriptor, message []byte,
|
SignMessage(keyLoc KeyLocator, msg []byte,
|
||||||
doubleHash bool) (*btcec.Signature, error)
|
doubleHash bool) (*btcec.Signature, error)
|
||||||
|
|
||||||
// SignMessageCompact signs the given message, single or double SHA256
|
// SignMessageCompact signs the given message, single or double SHA256
|
||||||
// hashing it first, with the private key described in the key
|
// hashing it first, with the private key described in the key locator
|
||||||
// descriptor and returns the signature in the compact, public key
|
// and returns the signature in the compact, public key recoverable
|
||||||
// recoverable format.
|
// format.
|
||||||
SignMessageCompact(keyDesc KeyDescriptor, message []byte,
|
SignMessageCompact(keyLoc KeyLocator, msg []byte,
|
||||||
doubleHash bool) ([]byte, error)
|
doubleHash bool) ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,34 +5,36 @@ import (
|
|||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewPubKeyMessageSigner(keyDesc KeyDescriptor,
|
func NewPubKeyMessageSigner(pubKey *btcec.PublicKey, keyLoc KeyLocator,
|
||||||
signer MessageSignerRing) *PubKeyMessageSigner {
|
signer MessageSignerRing) *PubKeyMessageSigner {
|
||||||
|
|
||||||
return &PubKeyMessageSigner{
|
return &PubKeyMessageSigner{
|
||||||
keyDesc: keyDesc,
|
pubKey: pubKey,
|
||||||
|
keyLoc: keyLoc,
|
||||||
digestSigner: signer,
|
digestSigner: signer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type PubKeyMessageSigner struct {
|
type PubKeyMessageSigner struct {
|
||||||
keyDesc KeyDescriptor
|
pubKey *btcec.PublicKey
|
||||||
|
keyLoc KeyLocator
|
||||||
digestSigner MessageSignerRing
|
digestSigner MessageSignerRing
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PubKeyMessageSigner) PubKey() *btcec.PublicKey {
|
func (p *PubKeyMessageSigner) PubKey() *btcec.PublicKey {
|
||||||
return p.keyDesc.PubKey
|
return p.pubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PubKeyMessageSigner) SignMessage(message []byte,
|
func (p *PubKeyMessageSigner) SignMessage(message []byte,
|
||||||
doubleHash bool) (*btcec.Signature, error) {
|
doubleHash bool) (*btcec.Signature, error) {
|
||||||
|
|
||||||
return p.digestSigner.SignMessage(p.keyDesc, message, doubleHash)
|
return p.digestSigner.SignMessage(p.keyLoc, message, doubleHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PubKeyMessageSigner) SignMessageCompact(msg []byte,
|
func (p *PubKeyMessageSigner) SignMessageCompact(msg []byte,
|
||||||
doubleHash bool) ([]byte, error) {
|
doubleHash bool) ([]byte, error) {
|
||||||
|
|
||||||
return p.digestSigner.SignMessageCompact(p.keyDesc, msg, doubleHash)
|
return p.digestSigner.SignMessageCompact(p.keyLoc, msg, doubleHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
type PrivKeyMessageSigner struct {
|
type PrivKeyMessageSigner struct {
|
||||||
|
@@ -457,17 +457,15 @@ func (s *Server) SignMessage(_ context.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Describe the private key we'll be using for signing.
|
// Describe the private key we'll be using for signing.
|
||||||
keyDescriptor := keychain.KeyDescriptor{
|
keyLocator := keychain.KeyLocator{
|
||||||
KeyLocator: keychain.KeyLocator{
|
Family: keychain.KeyFamily(in.KeyLoc.KeyFamily),
|
||||||
Family: keychain.KeyFamily(in.KeyLoc.KeyFamily),
|
Index: uint32(in.KeyLoc.KeyIndex),
|
||||||
Index: uint32(in.KeyLoc.KeyIndex),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the raw ECDSA signature first and convert it to the final wire
|
// Create the raw ECDSA signature first and convert it to the final wire
|
||||||
// format after.
|
// format after.
|
||||||
sig, err := s.cfg.KeyRing.SignMessage(
|
sig, err := s.cfg.KeyRing.SignMessage(
|
||||||
keyDescriptor, in.Msg, in.DoubleHash,
|
keyLocator, in.Msg, in.DoubleHash,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("can't sign the hash: %v", err)
|
return nil, fmt.Errorf("can't sign the hash: %v", err)
|
||||||
|
@@ -12,8 +12,8 @@ type SecretKeyRing struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DeriveNextKey currently returns dummy values.
|
// DeriveNextKey currently returns dummy values.
|
||||||
func (s *SecretKeyRing) DeriveNextKey(keyFam keychain.KeyFamily) (
|
func (s *SecretKeyRing) DeriveNextKey(
|
||||||
keychain.KeyDescriptor, error) {
|
_ keychain.KeyFamily) (keychain.KeyDescriptor, error) {
|
||||||
|
|
||||||
return keychain.KeyDescriptor{
|
return keychain.KeyDescriptor{
|
||||||
PubKey: s.RootKey.PubKey(),
|
PubKey: s.RootKey.PubKey(),
|
||||||
@@ -21,28 +21,30 @@ func (s *SecretKeyRing) DeriveNextKey(keyFam keychain.KeyFamily) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DeriveKey currently returns dummy values.
|
// DeriveKey currently returns dummy values.
|
||||||
func (s *SecretKeyRing) DeriveKey(keyLoc keychain.KeyLocator) (keychain.KeyDescriptor,
|
func (s *SecretKeyRing) DeriveKey(
|
||||||
error) {
|
_ keychain.KeyLocator) (keychain.KeyDescriptor, error) {
|
||||||
|
|
||||||
return keychain.KeyDescriptor{
|
return keychain.KeyDescriptor{
|
||||||
PubKey: s.RootKey.PubKey(),
|
PubKey: s.RootKey.PubKey(),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DerivePrivKey currently returns dummy values.
|
// DerivePrivKey currently returns dummy values.
|
||||||
func (s *SecretKeyRing) DerivePrivKey(keyDesc keychain.KeyDescriptor) (*btcec.PrivateKey,
|
func (s *SecretKeyRing) DerivePrivKey(
|
||||||
error) {
|
_ keychain.KeyDescriptor) (*btcec.PrivateKey, error) {
|
||||||
|
|
||||||
return s.RootKey, nil
|
return s.RootKey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ECDH currently returns dummy values.
|
// ECDH currently returns dummy values.
|
||||||
func (s *SecretKeyRing) ECDH(_ keychain.KeyDescriptor, pubKey *btcec.PublicKey) ([32]byte,
|
func (s *SecretKeyRing) ECDH(_ keychain.KeyDescriptor,
|
||||||
error) {
|
_ *btcec.PublicKey) ([32]byte, error) {
|
||||||
|
|
||||||
return [32]byte{}, nil
|
return [32]byte{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignMessage signs the passed message and ignores the KeyDescriptor.
|
// SignMessage signs the passed message and ignores the KeyDescriptor.
|
||||||
func (s *SecretKeyRing) SignMessage(_ keychain.KeyDescriptor,
|
func (s *SecretKeyRing) SignMessage(_ keychain.KeyLocator,
|
||||||
msg []byte, doubleHash bool) (*btcec.Signature, error) {
|
msg []byte, doubleHash bool) (*btcec.Signature, error) {
|
||||||
|
|
||||||
var digest []byte
|
var digest []byte
|
||||||
@@ -55,7 +57,7 @@ func (s *SecretKeyRing) SignMessage(_ keychain.KeyDescriptor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SignMessageCompact signs the passed message.
|
// SignMessageCompact signs the passed message.
|
||||||
func (s *SecretKeyRing) SignMessageCompact(_ keychain.KeyDescriptor,
|
func (s *SecretKeyRing) SignMessageCompact(_ keychain.KeyLocator,
|
||||||
msg []byte, doubleHash bool) ([]byte, error) {
|
msg []byte, doubleHash bool) ([]byte, error) {
|
||||||
|
|
||||||
var digest []byte
|
var digest []byte
|
||||||
|
@@ -449,10 +449,13 @@ func newServer(cfg *Config, listenAddrs []net.Addr,
|
|||||||
torController *tor.Controller) (*server, error) {
|
torController *tor.Controller) (*server, error) {
|
||||||
|
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
nodeKeyECDH = keychain.NewPubKeyECDH(*nodeKeyDesc, cc.KeyRing)
|
nodeKeyECDH = keychain.NewPubKeyECDH(*nodeKeyDesc, cc.KeyRing)
|
||||||
|
|
||||||
|
// We just derived the full descriptor, so we know the public
|
||||||
|
// key is set on it.
|
||||||
nodeKeySigner = keychain.NewPubKeyMessageSigner(
|
nodeKeySigner = keychain.NewPubKeyMessageSigner(
|
||||||
*nodeKeyDesc, cc.KeyRing,
|
nodeKeyDesc.PubKey, nodeKeyDesc.KeyLocator, cc.KeyRing,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user