Skip to content

Commit a358ba2

Browse files
authored
Merge pull request #2307 from benthecarman/verify-funcs
Add helper functions to verify node and channel annoucements
2 parents 0d3adb8 + 5cc400c commit a358ba2

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

lightning/src/routing/gossip.rs

Lines changed: 26 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

@@ -409,6 +409,29 @@ macro_rules! get_pubkey_from_node_id {
409409
}
410410
}
411411

412+
/// Verifies the signature of a [`NodeAnnouncement`].
413+
///
414+
/// Returns an error if it is invalid.
415+
pub fn verify_node_announcement<C: Verification>(msg: &NodeAnnouncement, secp_ctx: &Secp256k1<C>) -> Result<(), LightningError> {
416+
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
417+
secp_verify_sig!(secp_ctx, &msg_hash, &msg.signature, &get_pubkey_from_node_id!(msg.contents.node_id, "node_announcement"), "node_announcement");
418+
419+
Ok(())
420+
}
421+
422+
/// Verifies all signatures included in a [`ChannelAnnouncement`].
423+
///
424+
/// Returns an error if one of the signatures is invalid.
425+
pub fn verify_channel_announcement<C: Verification>(msg: &ChannelAnnouncement, secp_ctx: &Secp256k1<C>) -> Result<(), LightningError> {
426+
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
427+
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");
428+
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");
429+
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");
430+
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");
431+
432+
Ok(())
433+
}
434+
412435
impl<G: Deref<Target=NetworkGraph<L>>, U: Deref, L: Deref> RoutingMessageHandler for P2PGossipSync<G, U, L>
413436
where U::Target: UtxoLookup, L::Target: Logger
414437
{
@@ -1403,8 +1426,7 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
14031426
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
14041427
/// routing messages from a source using a protocol other than the lightning P2P protocol.
14051428
pub fn update_node_from_announcement(&self, msg: &msgs::NodeAnnouncement) -> Result<(), LightningError> {
1406-
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
1407-
secp_verify_sig!(self.secp_ctx, &msg_hash, &msg.signature, &get_pubkey_from_node_id!(msg.contents.node_id, "node_announcement"), "node_announcement");
1429+
verify_node_announcement(msg, &self.secp_ctx)?;
14081430
self.update_node_from_announcement_intern(&msg.contents, Some(&msg))
14091431
}
14101432

@@ -1467,11 +1489,7 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
14671489
where
14681490
U::Target: UtxoLookup,
14691491
{
1470-
let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
1471-
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");
1472-
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");
1473-
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");
1474-
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");
1492+
verify_channel_announcement(msg, &self.secp_ctx)?;
14751493
self.update_channel_from_unsigned_announcement_intern(&msg.contents, Some(msg), utxo_lookup)
14761494
}
14771495

0 commit comments

Comments
 (0)