X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Frouting%2Fnetwork_graph.rs;h=2e0679eba79f6cbbb1473ebdf89a0e113cf8fd5e;hb=10f9795149cdfcd5160418d9cb5cee1ae310629d;hp=5268d443771cf48d668c1dee6e3a05c14e1c6b39;hpb=1386a0c96b96b119dd9690ea72f4e3cce05cb5cb;p=rust-lightning diff --git a/lightning/src/routing/network_graph.rs b/lightning/src/routing/network_graph.rs index 5268d443..2e0679eb 100644 --- a/lightning/src/routing/network_graph.rs +++ b/lightning/src/routing/network_graph.rs @@ -10,7 +10,7 @@ //! The top-level network map tracking logic lives here. use bitcoin::secp256k1::constants::PUBLIC_KEY_SIZE; -use bitcoin::secp256k1::key::PublicKey; +use bitcoin::secp256k1::PublicKey; use bitcoin::secp256k1::Secp256k1; use bitcoin::secp256k1; @@ -295,7 +295,7 @@ where C::Target: chain::Access, L::Target: Logger macro_rules! secp_verify_sig { ( $secp_ctx: expr, $msg: expr, $sig: expr, $pubkey: expr, $msg_type: expr ) => { - match $secp_ctx.verify($msg, $sig, $pubkey) { + match $secp_ctx.verify_ecdsa($msg, $sig, $pubkey) { Ok(_) => {}, Err(_) => { return Err(LightningError { @@ -1033,6 +1033,15 @@ impl NetworkGraph { } } + /// Clears the `NodeAnnouncementInfo` field for all nodes in the `NetworkGraph` for testing + /// purposes. + #[cfg(test)] + pub fn clear_nodes_announcement_info(&self) { + for node in self.nodes.write().unwrap().iter_mut() { + node.1.announcement_info = None; + } + } + /// For an already known node (from channel announcements), update its stored properties from a /// given node announcement. /// @@ -1347,10 +1356,10 @@ impl NetworkGraph { /// If built with `no-std`, any updates with a timestamp more than two weeks in the past or /// materially in the future will be rejected. pub fn update_channel_unsigned(&self, msg: &msgs::UnsignedChannelUpdate) -> Result<(), LightningError> { - self.update_channel_intern(msg, None, None::<(&secp256k1::Signature, &Secp256k1)>) + self.update_channel_intern(msg, None, None::<(&secp256k1::ecdsa::Signature, &Secp256k1)>) } - fn update_channel_intern(&self, msg: &msgs::UnsignedChannelUpdate, full_msg: Option<&msgs::ChannelUpdate>, sig_info: Option<(&secp256k1::Signature, &Secp256k1)>) -> Result<(), LightningError> { + fn update_channel_intern(&self, msg: &msgs::UnsignedChannelUpdate, full_msg: Option<&msgs::ChannelUpdate>, sig_info: Option<(&secp256k1::ecdsa::Signature, &Secp256k1)>) -> Result<(), LightningError> { let dest_node_id; let chan_enabled = msg.flags & (1 << 1) != (1 << 1); let chan_was_enabled; @@ -1385,8 +1394,8 @@ impl NetworkGraph { } } } - macro_rules! maybe_update_channel_info { - ( $target: expr, $src_node: expr) => { + macro_rules! check_update_latest { + ($target: expr) => { if let Some(existing_chan_info) = $target.as_ref() { // The timestamp field is somewhat of a misnomer - the BOLTs use it to // order updates to ensure you always have the latest one, only @@ -1403,7 +1412,11 @@ impl NetworkGraph { } else { chan_was_enabled = false; } + } + } + macro_rules! get_new_channel_info { + () => { { let last_update_message = if msg.excess_data.len() <= MAX_EXCESS_BYTES_FOR_RELAY { full_msg.cloned() } else { None }; @@ -1419,29 +1432,31 @@ impl NetworkGraph { }, last_update_message }; - $target = Some(updated_channel_update_info); - } + Some(updated_channel_update_info) + } } } let msg_hash = hash_to_message!(&Sha256dHash::hash(&msg.encode()[..])[..]); if msg.flags & 1 == 1 { dest_node_id = channel.node_one.clone(); + check_update_latest!(channel.two_to_one); if let Some((sig, ctx)) = sig_info { 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); + channel.two_to_one = get_new_channel_info!(); } else { dest_node_id = channel.node_two.clone(); + check_update_latest!(channel.one_to_two); if let Some((sig, ctx)) = sig_info { 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); + channel.one_to_two = get_new_channel_info!(); } } } @@ -1563,10 +1578,11 @@ mod tests { use hex; - use bitcoin::secp256k1::key::{PublicKey, SecretKey}; + use bitcoin::secp256k1::{PublicKey, SecretKey}; use bitcoin::secp256k1::{All, Secp256k1}; use io; + use bitcoin::secp256k1; use prelude::*; use sync::Arc; @@ -1613,7 +1629,7 @@ mod tests { f(&mut unsigned_announcement); let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]); NodeAnnouncement { - signature: secp_ctx.sign(&msghash, node_key), + signature: secp_ctx.sign_ecdsa(&msghash, node_key), contents: unsigned_announcement } } @@ -1637,10 +1653,10 @@ mod tests { f(&mut unsigned_announcement); let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]); ChannelAnnouncement { - node_signature_1: secp_ctx.sign(&msghash, node_1_key), - node_signature_2: secp_ctx.sign(&msghash, node_2_key), - bitcoin_signature_1: secp_ctx.sign(&msghash, node_1_btckey), - bitcoin_signature_2: secp_ctx.sign(&msghash, node_2_btckey), + node_signature_1: secp_ctx.sign_ecdsa(&msghash, node_1_key), + node_signature_2: secp_ctx.sign_ecdsa(&msghash, node_2_key), + bitcoin_signature_1: secp_ctx.sign_ecdsa(&msghash, node_1_btckey), + bitcoin_signature_2: secp_ctx.sign_ecdsa(&msghash, node_2_btckey), contents: unsigned_announcement, } } @@ -1672,7 +1688,7 @@ mod tests { f(&mut unsigned_channel_update); let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]); ChannelUpdate { - signature: secp_ctx.sign(&msghash, node_key), + signature: secp_ctx.sign_ecdsa(&msghash, node_key), contents: unsigned_channel_update } } @@ -1709,7 +1725,7 @@ mod tests { let fake_msghash = hash_to_message!(&zero_hash); match net_graph_msg_handler.handle_node_announcement( &NodeAnnouncement { - signature: secp_ctx.sign(&fake_msghash, node_1_privkey), + signature: secp_ctx.sign_ecdsa(&fake_msghash, node_1_privkey), contents: valid_announcement.contents.clone() }) { Ok(_) => panic!(), @@ -1948,7 +1964,7 @@ mod tests { }, node_1_privkey, &secp_ctx); let zero_hash = Sha256dHash::hash(&[0; 32]); let fake_msghash = hash_to_message!(&zero_hash); - invalid_sig_channel_update.signature = secp_ctx.sign(&fake_msghash, node_1_privkey); + invalid_sig_channel_update.signature = secp_ctx.sign_ecdsa(&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 on channel_update message")