Skip to content

Commit 407e306

Browse files
committed
slightly refactor internal_announcement_signatures
For making debugging easy. If the user gives a different node_secret for transport layer (`PeerManager`) and for routing msg, internal_announcement_signatures is the first place it causes an error. By giving a detailed error message, user will be able to fix the bug quickly.
1 parent 1fc6d6b commit 407e306

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2745,10 +2745,21 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
27452745

27462746
let were_node_one = announcement.node_id_1 == our_node_id;
27472747
let msghash = hash_to_message!(&Sha256dHash::hash(&announcement.encode()[..])[..]);
2748-
if self.secp_ctx.verify(&msghash, &msg.node_signature, if were_node_one { &announcement.node_id_2 } else { &announcement.node_id_1 }).is_err() ||
2749-
self.secp_ctx.verify(&msghash, &msg.bitcoin_signature, if were_node_one { &announcement.bitcoin_key_2 } else { &announcement.bitcoin_key_1 }).is_err() {
2750-
let chan_err: ChannelError = ChannelError::Close("Bad announcement_signatures node_signature".to_owned());
2751-
try_chan_entry!(self, Err(chan_err), channel_state, chan);
2748+
{
2749+
let their_node_key = if were_node_one { &announcement.node_id_2 } else { &announcement.node_id_1 };
2750+
let their_bitcoin_key = if were_node_one { &announcement.bitcoin_key_2 } else { &announcement.bitcoin_key_1 };
2751+
match (self.secp_ctx.verify(&msghash, &msg.node_signature, their_node_key),
2752+
self.secp_ctx.verify(&msghash, &msg.bitcoin_signature, their_bitcoin_key)) {
2753+
(Err(e), _) => {
2754+
let chan_err: ChannelError = ChannelError::Close(format!("Bad announcement_signatures. Failed to verify node_signature: {:?}. Maybe using different node_secret for transport and routing msg? UnsignedChannelAnnouncement used for verification is {:?}. their_node_key is {:?}", e, &announcement, their_node_key));
2755+
try_chan_entry!(self, Err(chan_err), channel_state, chan);
2756+
},
2757+
(_, Err(e)) => {
2758+
let chan_err: ChannelError = ChannelError::Close(format!("Bad announcement_signatures. Failed to verify bitcoin_signature: {:?}. UnsignedChannelAnnouncement used for verification is {:?}. their_bitcoin_key is ({:?})", e, &announcement, their_bitcoin_key));
2759+
try_chan_entry!(self, Err(chan_err), channel_state, chan);
2760+
},
2761+
_ => {}
2762+
}
27522763
}
27532764

27542765
let our_node_sig = self.secp_ctx.sign(&msghash, &self.our_network_key);

0 commit comments

Comments
 (0)