|
10 | 10 | //! The [`NetworkGraph`] stores the network gossip and [`P2PGossipSync`] fetches it from peers
|
11 | 11 |
|
12 | 12 | use bitcoin::secp256k1::constants::PUBLIC_KEY_SIZE;
|
13 |
| -use bitcoin::secp256k1::PublicKey; |
| 13 | +use bitcoin::secp256k1::{PublicKey, Verification}; |
14 | 14 | use bitcoin::secp256k1::Secp256k1;
|
15 | 15 | use bitcoin::secp256k1;
|
16 | 16 |
|
@@ -409,6 +409,29 @@ macro_rules! get_pubkey_from_node_id {
|
409 | 409 | }
|
410 | 410 | }
|
411 | 411 |
|
| 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 | + |
412 | 435 | impl<G: Deref<Target=NetworkGraph<L>>, U: Deref, L: Deref> RoutingMessageHandler for P2PGossipSync<G, U, L>
|
413 | 436 | where U::Target: UtxoLookup, L::Target: Logger
|
414 | 437 | {
|
@@ -1403,8 +1426,7 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
|
1403 | 1426 | /// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
|
1404 | 1427 | /// routing messages from a source using a protocol other than the lightning P2P protocol.
|
1405 | 1428 | 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)?; |
1408 | 1430 | self.update_node_from_announcement_intern(&msg.contents, Some(&msg))
|
1409 | 1431 | }
|
1410 | 1432 |
|
@@ -1467,11 +1489,7 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
|
1467 | 1489 | where
|
1468 | 1490 | U::Target: UtxoLookup,
|
1469 | 1491 | {
|
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)?; |
1475 | 1493 | self.update_channel_from_unsigned_announcement_intern(&msg.contents, Some(msg), utxo_lookup)
|
1476 | 1494 | }
|
1477 | 1495 |
|
|
0 commit comments