multi: add tag option to SignMessageSchnorr

This commit is contained in:
Orbital 2023-10-21 17:05:53 -05:00
parent dd81edd817
commit ed373baed0
No known key found for this signature in database
GPG key ID: E557F37C985848F7
5 changed files with 23 additions and 13 deletions

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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)
} }

View file

@ -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)