mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-03-04 09:48:19 +01:00
multi: add tag option to SignMessageSchnorr
This commit is contained in:
parent
dd81edd817
commit
ed373baed0
5 changed files with 23 additions and 13 deletions
|
@ -458,8 +458,8 @@ func (b *BtcWalletKeyRing) SignMessageCompact(keyLoc KeyLocator,
|
||||||
//
|
//
|
||||||
// NOTE: This is part of the keychain.MessageSignerRing interface.
|
// NOTE: This is part of the keychain.MessageSignerRing interface.
|
||||||
func (b *BtcWalletKeyRing) SignMessageSchnorr(keyLoc KeyLocator,
|
func (b *BtcWalletKeyRing) SignMessageSchnorr(keyLoc KeyLocator,
|
||||||
msg []byte, doubleHash bool, taprootTweak []byte) (*schnorr.Signature,
|
msg []byte, doubleHash bool, taprootTweak []byte,
|
||||||
error) {
|
tag []byte) (*schnorr.Signature, error) {
|
||||||
|
|
||||||
privKey, err := b.DerivePrivKey(KeyDescriptor{
|
privKey, err := b.DerivePrivKey(KeyDescriptor{
|
||||||
KeyLocator: keyLoc,
|
KeyLocator: keyLoc,
|
||||||
|
@ -472,10 +472,15 @@ func (b *BtcWalletKeyRing) SignMessageSchnorr(keyLoc KeyLocator,
|
||||||
privKey = txscript.TweakTaprootPrivKey(*privKey, taprootTweak)
|
privKey = txscript.TweakTaprootPrivKey(*privKey, taprootTweak)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If a tag was provided, we need to take the tagged hash of the input.
|
||||||
var digest []byte
|
var digest []byte
|
||||||
if doubleHash {
|
switch {
|
||||||
|
case len(tag) > 0:
|
||||||
|
taggedHash := chainhash.TaggedHash(tag, msg)
|
||||||
|
digest = taggedHash[:]
|
||||||
|
case doubleHash:
|
||||||
digest = chainhash.DoubleHashB(msg)
|
digest = chainhash.DoubleHashB(msg)
|
||||||
} else {
|
default:
|
||||||
digest = chainhash.HashB(msg)
|
digest = chainhash.HashB(msg)
|
||||||
}
|
}
|
||||||
return schnorr.Sign(privKey, digest)
|
return schnorr.Sign(privKey, digest)
|
||||||
|
|
|
@ -239,8 +239,8 @@ type MessageSignerRing interface {
|
||||||
// hashing it first, with the private key described in the key locator
|
// hashing it first, with the private key described in the key locator
|
||||||
// and the optional Taproot tweak applied to the private key.
|
// and the optional Taproot tweak applied to the private key.
|
||||||
SignMessageSchnorr(keyLoc KeyLocator, msg []byte,
|
SignMessageSchnorr(keyLoc KeyLocator, msg []byte,
|
||||||
doubleHash bool, taprootTweak []byte) (*schnorr.Signature,
|
doubleHash bool, taprootTweak []byte,
|
||||||
error)
|
tag []byte) (*schnorr.Signature, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SingleKeyMessageSigner is an abstraction interface that hides the
|
// SingleKeyMessageSigner is an abstraction interface that hides the
|
||||||
|
|
|
@ -633,7 +633,7 @@ func (s *Server) SignMessage(_ context.Context,
|
||||||
if in.SchnorrSig {
|
if in.SchnorrSig {
|
||||||
sig, err := s.cfg.KeyRing.SignMessageSchnorr(
|
sig, err := s.cfg.KeyRing.SignMessageSchnorr(
|
||||||
keyLocator, in.Msg, in.DoubleHash,
|
keyLocator, in.Msg, in.DoubleHash,
|
||||||
in.SchnorrSigTapTweak,
|
in.SchnorrSigTapTweak, in.Tag,
|
||||||
)
|
)
|
||||||
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)
|
||||||
|
|
|
@ -74,13 +74,17 @@ func (s *SecretKeyRing) SignMessageCompact(_ keychain.KeyLocator,
|
||||||
|
|
||||||
// SignMessageSchnorr signs the passed message and ignores the KeyDescriptor.
|
// SignMessageSchnorr signs the passed message and ignores the KeyDescriptor.
|
||||||
func (s *SecretKeyRing) SignMessageSchnorr(_ keychain.KeyLocator,
|
func (s *SecretKeyRing) SignMessageSchnorr(_ keychain.KeyLocator,
|
||||||
msg []byte, doubleHash bool, taprootTweak []byte) (*schnorr.Signature,
|
msg []byte, doubleHash bool, taprootTweak []byte,
|
||||||
error) {
|
tag []byte) (*schnorr.Signature, error) {
|
||||||
|
|
||||||
var digest []byte
|
var digest []byte
|
||||||
if doubleHash {
|
switch {
|
||||||
|
case len(tag) > 0:
|
||||||
|
taggedHash := chainhash.TaggedHash(tag, msg)
|
||||||
|
digest = taggedHash[:]
|
||||||
|
case doubleHash:
|
||||||
digest = chainhash.DoubleHashB(msg)
|
digest = chainhash.DoubleHashB(msg)
|
||||||
} else {
|
default:
|
||||||
digest = chainhash.HashB(msg)
|
digest = chainhash.HashB(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -513,8 +513,8 @@ func (r *RPCKeyRing) SignMessageCompact(keyLoc keychain.KeyLocator,
|
||||||
//
|
//
|
||||||
// NOTE: This method is part of the keychain.MessageSignerRing interface.
|
// NOTE: This method is part of the keychain.MessageSignerRing interface.
|
||||||
func (r *RPCKeyRing) SignMessageSchnorr(keyLoc keychain.KeyLocator,
|
func (r *RPCKeyRing) SignMessageSchnorr(keyLoc keychain.KeyLocator,
|
||||||
msg []byte, doubleHash bool, taprootTweak []byte) (*schnorr.Signature,
|
msg []byte, doubleHash bool, taprootTweak []byte,
|
||||||
error) {
|
tag []byte) (*schnorr.Signature, error) {
|
||||||
|
|
||||||
ctxt, cancel := context.WithTimeout(context.Background(), r.rpcTimeout)
|
ctxt, cancel := context.WithTimeout(context.Background(), r.rpcTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
@ -528,6 +528,7 @@ func (r *RPCKeyRing) SignMessageSchnorr(keyLoc keychain.KeyLocator,
|
||||||
DoubleHash: doubleHash,
|
DoubleHash: doubleHash,
|
||||||
SchnorrSig: true,
|
SchnorrSig: true,
|
||||||
SchnorrSigTapTweak: taprootTweak,
|
SchnorrSigTapTweak: taprootTweak,
|
||||||
|
Tag: tag,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
considerShutdown(err)
|
considerShutdown(err)
|
||||||
|
|
Loading…
Add table
Reference in a new issue