Skip to content

Commit 76aedb4

Browse files
committed
Add helper functions to verify node and channel annoucements
1 parent 498f233 commit 76aedb4

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

lightning/src/routing/gossip.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//! The [`NetworkGraph`] stores the network gossip and [`P2PGossipSync`] fetches it from peers
1111
1212
use bitcoin::secp256k1::constants::PUBLIC_KEY_SIZE;
13-
use bitcoin::secp256k1::PublicKey;
13+
use bitcoin::secp256k1::{PublicKey, Verification};
1414
use bitcoin::secp256k1::Secp256k1;
1515
use bitcoin::secp256k1;
1616

@@ -404,6 +404,25 @@ macro_rules! get_pubkey_from_node_id {
404404
}
405405
}
406406

407+
/// Verifies the signature of a [NodeAnnouncement]. Returns an error if it is invalid.
408+
pub fn verify_node_announcement<C: Verification>(msg: &NodeAnnouncement, secp_ctx: &Secp256k1<C>) -> Result<(), LightningError> {
409+
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
410+
secp_verify_sig!(secp_ctx, &msg_hash, &msg.signature, &get_pubkey_from_node_id!(msg.contents.node_id, "node_announcement"), "node_announcement");
411+
412+
Ok(())
413+
}
414+
415+
/// Verifies the signature of a [ChannelAnnouncement]. Returns an error if it is invalid.
416+
pub fn verify_channel_announcement<C: Verification>(msg: &ChannelAnnouncement, secp_ctx: &Secp256k1<C>) -> Result<(), LightningError> {
417+
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
418+
secp_verify_sig!(secp_ctx, &msg_hash, &msg.node_signature_1, &get_pubkey_from_node_id!(msg.contents.node_id_1, "channel_announcement"), "channel_announcement");
419+
secp_verify_sig!(secp_ctx, &msg_hash, &msg.node_signature_2, &get_pubkey_from_node_id!(msg.contents.node_id_2, "channel_announcement"), "channel_announcement");
420+
secp_verify_sig!(secp_ctx, &msg_hash, &msg.bitcoin_signature_1, &get_pubkey_from_node_id!(msg.contents.bitcoin_key_1, "channel_announcement"), "channel_announcement");
421+
secp_verify_sig!(secp_ctx, &msg_hash, &msg.bitcoin_signature_2, &get_pubkey_from_node_id!(msg.contents.bitcoin_key_2, "channel_announcement"), "channel_announcement");
422+
423+
Ok(())
424+
}
425+
407426
impl<G: Deref<Target=NetworkGraph<L>>, U: Deref, L: Deref> RoutingMessageHandler for P2PGossipSync<G, U, L>
408427
where U::Target: UtxoLookup, L::Target: Logger
409428
{
@@ -1387,8 +1406,7 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
13871406
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
13881407
/// routing messages from a source using a protocol other than the lightning P2P protocol.
13891408
pub fn update_node_from_announcement(&self, msg: &msgs::NodeAnnouncement) -> Result<(), LightningError> {
1390-
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
1391-
secp_verify_sig!(self.secp_ctx, &msg_hash, &msg.signature, &get_pubkey_from_node_id!(msg.contents.node_id, "node_announcement"), "node_announcement");
1409+
verify_node_announcement(msg, &self.secp_ctx)?;
13921410
self.update_node_from_announcement_intern(&msg.contents, Some(&msg))
13931411
}
13941412

@@ -1451,11 +1469,7 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
14511469
where
14521470
U::Target: UtxoLookup,
14531471
{
1454-
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
1455-
secp_verify_sig!(self.secp_ctx, &msg_hash, &msg.node_signature_1, &get_pubkey_from_node_id!(msg.contents.node_id_1, "channel_announcement"), "channel_announcement");
1456-
secp_verify_sig!(self.secp_ctx, &msg_hash, &msg.node_signature_2, &get_pubkey_from_node_id!(msg.contents.node_id_2, "channel_announcement"), "channel_announcement");
1457-
secp_verify_sig!(self.secp_ctx, &msg_hash, &msg.bitcoin_signature_1, &get_pubkey_from_node_id!(msg.contents.bitcoin_key_1, "channel_announcement"), "channel_announcement");
1458-
secp_verify_sig!(self.secp_ctx, &msg_hash, &msg.bitcoin_signature_2, &get_pubkey_from_node_id!(msg.contents.bitcoin_key_2, "channel_announcement"), "channel_announcement");
1472+
verify_channel_announcement(msg, &self.secp_ctx)?;
14591473
self.update_channel_from_unsigned_announcement_intern(&msg.contents, Some(msg), utxo_lookup)
14601474
}
14611475

0 commit comments

Comments
 (0)