Merge pull request #1013 from TheBlueMatt/2021-07-warning-msgs
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Tue, 11 Jan 2022 22:52:44 +0000 (22:52 +0000)
committerGitHub <noreply@github.com>
Tue, 11 Jan 2022 22:52:44 +0000 (22:52 +0000)
1  2 
lightning/src/ln/functional_test_utils.rs
lightning/src/routing/network_graph.rs

index 8410cac9132dc66d844d71583873bb72cc517f64,6012b54644aa7e4a0831e9065c3641f4f7d6fd7c..2c1bc8a91eb8084137003d730b12918db24b946f
@@@ -22,7 -22,7 +22,7 @@@ use ln::msgs
  use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
  use util::enforcing_trait_impls::EnforcingSigner;
  use util::test_utils;
 -use util::test_utils::TestChainMonitor;
 +use util::test_utils::{panicking, TestChainMonitor};
  use util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose};
  use util::errors::APIError;
  use util::config::UserConfig;
@@@ -40,7 -40,7 +40,7 @@@ use bitcoin::secp256k1::key::PublicKey
  use io;
  use prelude::*;
  use core::cell::RefCell;
 -use std::rc::Rc;
 +use alloc::rc::Rc;
  use sync::{Arc, Mutex};
  use core::mem;
  
@@@ -231,7 -231,7 +231,7 @@@ impl<'a, 'b, 'c> Node<'a, 'b, 'c> 
  
  impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
        fn drop(&mut self) {
 -              if !::std::thread::panicking() {
 +              if !panicking() {
                        // Check that we processed all pending events
                        assert!(self.node.get_and_clear_pending_msg_events().is_empty());
                        assert!(self.node.get_and_clear_pending_events().is_empty());
@@@ -780,6 -780,22 +780,22 @@@ macro_rules! get_closing_signed_broadca
        }
  }
  
+ #[cfg(test)]
+ macro_rules! check_warn_msg {
+       ($node: expr, $recipient_node_id: expr, $chan_id: expr) => {{
+               let msg_events = $node.node.get_and_clear_pending_msg_events();
+               assert_eq!(msg_events.len(), 1);
+               match msg_events[0] {
+                       MessageSendEvent::HandleError { action: ErrorAction::SendWarningMessage { ref msg, log_level: _ }, node_id } => {
+                               assert_eq!(node_id, $recipient_node_id);
+                               assert_eq!(msg.channel_id, $chan_id);
+                               msg.data.clone()
+                       },
+                       _ => panic!("Unexpected event"),
+               }
+       }}
+ }
  /// Check that a channel's closing channel update has been broadcasted, and optionally
  /// check whether an error message event has occurred.
  #[macro_export]
index 0b09b74aa9a484db8912587accd83e9f2ff7434a,6f431d940af9c2059c48a16da64ef631ff8fe84e..a26b549b43d45de4d96cc91ddf3d32921c241f3b
@@@ -294,10 -294,21 +294,21 @@@ where C::Target: chain::Access, L::Targ
  }
  
  macro_rules! secp_verify_sig {
-       ( $secp_ctx: expr, $msg: expr, $sig: expr, $pubkey: expr ) => {
+       ( $secp_ctx: expr, $msg: expr, $sig: expr, $pubkey: expr, $msg_type: expr ) => {
                match $secp_ctx.verify($msg, $sig, $pubkey) {
                        Ok(_) => {},
-                       Err(_) => return Err(LightningError{err: "Invalid signature from remote node".to_owned(), action: ErrorAction::IgnoreError}),
+                       Err(_) => {
+                               return Err(LightningError {
+                                       err: format!("Invalid signature on {} message", $msg_type),
+                                       action: ErrorAction::SendWarningMessage {
+                                               msg: msgs::WarningMessage {
+                                                       channel_id: [0; 32],
+                                                       data: format!("Invalid signature on {} message", $msg_type),
+                                               },
+                                               log_level: Level::Trace,
+                                       },
+                               });
+                       },
                }
        };
  }
@@@ -850,7 -861,7 +861,7 @@@ impl NetworkGraph 
        /// routing messages from a source using a protocol other than the lightning P2P protocol.
        pub fn update_node_from_announcement<T: secp256k1::Verification>(&self, msg: &msgs::NodeAnnouncement, secp_ctx: &Secp256k1<T>) -> Result<(), LightningError> {
                let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
-               secp_verify_sig!(secp_ctx, &msg_hash, &msg.signature, &msg.contents.node_id);
+               secp_verify_sig!(secp_ctx, &msg_hash, &msg.signature, &msg.contents.node_id, "node_announcement");
                self.update_node_from_announcement_intern(&msg.contents, Some(&msg))
        }
  
                C::Target: chain::Access,
        {
                let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.contents.encode()[..])[..]);
-               secp_verify_sig!(secp_ctx, &msg_hash, &msg.node_signature_1, &msg.contents.node_id_1);
-               secp_verify_sig!(secp_ctx, &msg_hash, &msg.node_signature_2, &msg.contents.node_id_2);
-               secp_verify_sig!(secp_ctx, &msg_hash, &msg.bitcoin_signature_1, &msg.contents.bitcoin_key_1);
-               secp_verify_sig!(secp_ctx, &msg_hash, &msg.bitcoin_signature_2, &msg.contents.bitcoin_key_2);
+               secp_verify_sig!(secp_ctx, &msg_hash, &msg.node_signature_1, &msg.contents.node_id_1, "channel_announcement");
+               secp_verify_sig!(secp_ctx, &msg_hash, &msg.node_signature_2, &msg.contents.node_id_2, "channel_announcement");
+               secp_verify_sig!(secp_ctx, &msg_hash, &msg.bitcoin_signature_1, &msg.contents.bitcoin_key_1, "channel_announcement");
+               secp_verify_sig!(secp_ctx, &msg_hash, &msg.bitcoin_signature_2, &msg.contents.bitcoin_key_2, "channel_announcement");
                self.update_channel_from_unsigned_announcement_intern(&msg.contents, Some(msg), chain_access)
        }
  
                        // disable this check during tests!
                        let time = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time must be > 1970").as_secs();
                        if (msg.timestamp as u64) < time - STALE_CHANNEL_UPDATE_AGE_LIMIT_SECS {
 -                              return Err(LightningError{err: "channel_update is older than two weeks old".to_owned(), action: ErrorAction::IgnoreError});
 +                              return Err(LightningError{err: "channel_update is older than two weeks old".to_owned(), action: ErrorAction::IgnoreAndLog(Level::Gossip)});
                        }
                        if msg.timestamp as u64 > time + 60 * 60 * 24 {
 -                              return Err(LightningError{err: "channel_update has a timestamp more than a day in the future".to_owned(), action: ErrorAction::IgnoreError});
 +                              return Err(LightningError{err: "channel_update has a timestamp more than a day in the future".to_owned(), action: ErrorAction::IgnoreAndLog(Level::Gossip)});
                        }
                }
  
                                                secp_verify_sig!(ctx, &msg_hash, &sig, &PublicKey::from_slice(channel.node_two.as_slice()).map_err(|_| LightningError{
                                                        err: "Couldn't parse source node pubkey".to_owned(),
                                                        action: ErrorAction::IgnoreAndLog(Level::Debug)
-                                               })?);
+                                               })?, "channel_update");
                                        }
                                        maybe_update_channel_info!(channel.two_to_one, channel.node_two);
                                } else {
                                                secp_verify_sig!(ctx, &msg_hash, &sig, &PublicKey::from_slice(channel.node_one.as_slice()).map_err(|_| LightningError{
                                                        err: "Couldn't parse destination node pubkey".to_owned(),
                                                        action: ErrorAction::IgnoreAndLog(Level::Debug)
-                                               })?);
+                                               })?, "channel_update");
                                        }
                                        maybe_update_channel_info!(channel.one_to_two, channel.node_one);
                                }
@@@ -1522,7 -1533,7 +1533,7 @@@ mod tests 
                                contents: valid_announcement.contents.clone()
                }) {
                        Ok(_) => panic!(),
-                       Err(e) => assert_eq!(e.err, "Invalid signature from remote node")
+                       Err(e) => assert_eq!(e.err, "Invalid signature on node_announcement message")
                };
  
                let announcement_with_data = get_signed_node_announcement(|unsigned_announcement| {
                invalid_sig_announcement.contents.excess_data = Vec::new();
                match net_graph_msg_handler.handle_channel_announcement(&invalid_sig_announcement) {
                        Ok(_) => panic!(),
-                       Err(e) => assert_eq!(e.err, "Invalid signature from remote node")
+                       Err(e) => assert_eq!(e.err, "Invalid signature on channel_announcement message")
                };
  
                let channel_to_itself_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_1_privkey, &secp_ctx);
                invalid_sig_channel_update.signature = secp_ctx.sign(&fake_msghash, node_1_privkey);
                match net_graph_msg_handler.handle_channel_update(&invalid_sig_channel_update) {
                        Ok(_) => panic!(),
-                       Err(e) => assert_eq!(e.err, "Invalid signature from remote node")
+                       Err(e) => assert_eq!(e.err, "Invalid signature on channel_update message")
                };
        }