mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-08-30 15:40:59 +02:00
multi: move channel announcement validation to netann
from the graph package.
This commit is contained in:
@@ -2,7 +2,10 @@ package netann
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
|
||||
"github.com/btcsuite/btcd/btcec/v2"
|
||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||
"github.com/lightningnetwork/lnd/channeldb/models"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
)
|
||||
@@ -84,3 +87,75 @@ func CreateChanAnnouncement(chanProof *models.ChannelAuthProof,
|
||||
|
||||
return chanAnn, edge1Ann, edge2Ann, nil
|
||||
}
|
||||
|
||||
// ValidateChannelAnn validates the channel announcement message and checks
|
||||
// that node signatures covers the announcement message, and that the bitcoin
|
||||
// signatures covers the node keys.
|
||||
func ValidateChannelAnn(a *lnwire.ChannelAnnouncement1) error {
|
||||
// First, we'll compute the digest (h) which is to be signed by each of
|
||||
// the keys included within the node announcement message. This hash
|
||||
// digest includes all the keys, so the (up to 4 signatures) will
|
||||
// attest to the validity of each of the keys.
|
||||
data, err := a.DataToSign()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dataHash := chainhash.DoubleHashB(data)
|
||||
|
||||
// First we'll verify that the passed bitcoin key signature is indeed a
|
||||
// signature over the computed hash digest.
|
||||
bitcoinSig1, err := a.BitcoinSig1.ToSignature()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
bitcoinKey1, err := btcec.ParsePubKey(a.BitcoinKey1[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !bitcoinSig1.Verify(dataHash, bitcoinKey1) {
|
||||
return errors.New("can't verify first bitcoin signature")
|
||||
}
|
||||
|
||||
// If that checks out, then we'll verify that the second bitcoin
|
||||
// signature is a valid signature of the bitcoin public key over hash
|
||||
// digest as well.
|
||||
bitcoinSig2, err := a.BitcoinSig2.ToSignature()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
bitcoinKey2, err := btcec.ParsePubKey(a.BitcoinKey2[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !bitcoinSig2.Verify(dataHash, bitcoinKey2) {
|
||||
return errors.New("can't verify second bitcoin signature")
|
||||
}
|
||||
|
||||
// Both node signatures attached should indeed be a valid signature
|
||||
// over the selected digest of the channel announcement signature.
|
||||
nodeSig1, err := a.NodeSig1.ToSignature()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
nodeKey1, err := btcec.ParsePubKey(a.NodeID1[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !nodeSig1.Verify(dataHash, nodeKey1) {
|
||||
return errors.New("can't verify data in first node signature")
|
||||
}
|
||||
|
||||
nodeSig2, err := a.NodeSig2.ToSignature()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
nodeKey2, err := btcec.ParsePubKey(a.NodeID2[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !nodeSig2.Verify(dataHash, nodeKey2) {
|
||||
return errors.New("can't verify data in second node signature")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user