Skip to content

Commit 8ec92f5

Browse files
committed
Fix encryption of broadcasted gossip messages
In 47e818f, forwarding broadcasted gossip messages was split into a separate per-peer message buffer. However, both it and the original regular-message queue are encrypted immediately when the messages are enqueued. Because the lightning P2P encryption algorithm is order-dependent, this causes messages to fail their MAC checks as the messages from the two queues may not be sent to peers in the order in which they were encrypted. The fix is to simply queue broadcast gossip messages unencrypted, encrypting them when we add them to the regular outbound buffer.
1 parent 15a5966 commit 8ec92f5

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,10 @@ struct Peer {
367367

368368
pending_outbound_buffer: LinkedList<Vec<u8>>,
369369
pending_outbound_buffer_first_msg_offset: usize,
370-
// Queue gossip broadcasts separately from `pending_outbound_buffer` so we can easily prioritize
371-
// channel messages over them.
370+
/// Queue gossip broadcasts separately from `pending_outbound_buffer` so we can easily
371+
/// prioritize channel messages over them.
372+
///
373+
/// Note that these messages are *not* encrypted/MAC'd, and are only serialized.
372374
gossip_broadcast_buffer: LinkedList<Vec<u8>>,
373375
awaiting_write_event: bool,
374376

@@ -822,7 +824,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
822824
}
823825
if peer.should_buffer_gossip_broadcast() {
824826
if let Some(msg) = peer.gossip_broadcast_buffer.pop_front() {
825-
peer.pending_outbound_buffer.push_back(msg);
827+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&msg[..]));
826828
}
827829
}
828830
if peer.should_buffer_gossip_backfill() {
@@ -954,9 +956,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
954956
}
955957

956958
/// Append a message to a peer's pending outbound/write gossip broadcast buffer
957-
fn enqueue_encoded_gossip_broadcast(&self, peer: &mut Peer, encoded_message: &Vec<u8>) {
959+
fn enqueue_encoded_gossip_broadcast(&self, peer: &mut Peer, encoded_message: Vec<u8>) {
958960
peer.msgs_sent_since_pong += 1;
959-
peer.gossip_broadcast_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_message[..]));
961+
peer.gossip_broadcast_buffer.push_back(encoded_message);
960962
}
961963

962964
fn do_read_event(&self, peer_descriptor: &mut Descriptor, data: &[u8]) -> Result<bool, PeerHandleError> {
@@ -1435,7 +1437,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
14351437
if except_node.is_some() && peer.their_node_id.as_ref() == except_node {
14361438
continue;
14371439
}
1438-
self.enqueue_encoded_gossip_broadcast(&mut *peer, &encoded_msg);
1440+
self.enqueue_encoded_gossip_broadcast(&mut *peer, encoded_msg.clone());
14391441
}
14401442
},
14411443
wire::Message::NodeAnnouncement(ref msg) => {
@@ -1458,7 +1460,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
14581460
if except_node.is_some() && peer.their_node_id.as_ref() == except_node {
14591461
continue;
14601462
}
1461-
self.enqueue_encoded_gossip_broadcast(&mut *peer, &encoded_msg);
1463+
self.enqueue_encoded_gossip_broadcast(&mut *peer, encoded_msg.clone());
14621464
}
14631465
},
14641466
wire::Message::ChannelUpdate(ref msg) => {
@@ -1478,7 +1480,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
14781480
if except_node.is_some() && peer.their_node_id.as_ref() == except_node {
14791481
continue;
14801482
}
1481-
self.enqueue_encoded_gossip_broadcast(&mut *peer, &encoded_msg);
1483+
self.enqueue_encoded_gossip_broadcast(&mut *peer, encoded_msg.clone());
14821484
}
14831485
},
14841486
_ => debug_assert!(false, "We shouldn't attempt to forward anything but gossip messages"),

0 commit comments

Comments
 (0)