Skip to content

Commit f92e540

Browse files
committed
Flatten OnionHopData struct with the Realm0 struct.
Previously OnionHopData contained a OnionRealm0HopData field however instead of bumping the realm number, it has been replaced with a length, used to indicte the length of a TLV-formatted object. Because a TLV-formatted hop data can contain the same information as a realm-0 hop data, we flatten the field and simply keep track of what format it was in.
1 parent d046ab5 commit f92e540

File tree

4 files changed

+63
-83
lines changed

4 files changed

+63
-83
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -943,11 +943,11 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
943943
return_err!("The final CLTV expiry is too soon to handle", 17, &[0;0]);
944944
}
945945
// final_incorrect_htlc_amount
946-
if next_hop_data.data.amt_to_forward > msg.amount_msat {
946+
if next_hop_data.amt_to_forward > msg.amount_msat {
947947
return_err!("Upstream node sent less than we were supposed to receive in payment", 19, &byte_utils::be64_to_array(msg.amount_msat));
948948
}
949949
// final_incorrect_cltv_expiry
950-
if next_hop_data.data.outgoing_cltv_value != msg.cltv_expiry {
950+
if next_hop_data.outgoing_cltv_value != msg.cltv_expiry {
951951
return_err!("Upstream node set CLTV to the wrong value", 18, &byte_utils::be32_to_array(msg.cltv_expiry));
952952
}
953953

@@ -961,8 +961,8 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
961961
payment_hash: msg.payment_hash.clone(),
962962
short_channel_id: 0,
963963
incoming_shared_secret: shared_secret,
964-
amt_to_forward: next_hop_data.data.amt_to_forward,
965-
outgoing_cltv_value: next_hop_data.data.outgoing_cltv_value,
964+
amt_to_forward: next_hop_data.amt_to_forward,
965+
outgoing_cltv_value: next_hop_data.outgoing_cltv_value,
966966
})
967967
} else {
968968
let mut new_packet_data = [0; 20*65];
@@ -992,10 +992,10 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
992992
PendingHTLCStatus::Forward(PendingForwardHTLCInfo {
993993
onion_packet: Some(outgoing_packet),
994994
payment_hash: msg.payment_hash.clone(),
995-
short_channel_id: next_hop_data.data.short_channel_id,
995+
short_channel_id: next_hop_data.short_channel_id,
996996
incoming_shared_secret: shared_secret,
997-
amt_to_forward: next_hop_data.data.amt_to_forward,
998-
outgoing_cltv_value: next_hop_data.data.outgoing_cltv_value,
997+
amt_to_forward: next_hop_data.amt_to_forward,
998+
outgoing_cltv_value: next_hop_data.outgoing_cltv_value,
999999
})
10001000
};
10011001

lightning/src/ln/functional_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5001,7 +5001,7 @@ fn test_onion_failure() {
50015001
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
50025002
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
50035003
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
5004-
onion_payloads[0].realm = 3;
5004+
onion_payloads[0].format = msgs::OnionHopDataFormat::BogusRealm(3);
50055005
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
50065006
}, ||{}, true, Some(PERM|1), Some(msgs::HTLCFailChannelUpdate::ChannelClosed{short_channel_id: channels[1].0.contents.short_channel_id, is_permanent: true}));//XXX incremented channels idx here
50075007

@@ -5011,7 +5011,7 @@ fn test_onion_failure() {
50115011
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
50125012
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
50135013
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
5014-
onion_payloads[1].realm = 3;
5014+
onion_payloads[1].format = msgs::OnionHopDataFormat::BogusRealm(3);
50155015
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
50165016
}, ||{}, false, Some(PERM|1), Some(msgs::HTLCFailChannelUpdate::ChannelClosed{short_channel_id: channels[1].0.contents.short_channel_id, is_permanent: true}));
50175017

lightning/src/ln/msgs.rs

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -606,21 +606,25 @@ pub trait RoutingMessageHandler : Send + Sync {
606606
fn get_next_node_announcements(&self, starting_point: Option<&PublicKey>, batch_amount: u8) -> Vec<NodeAnnouncement>;
607607
}
608608

609-
pub(crate) struct OnionRealm0HopData {
610-
pub(crate) short_channel_id: u64,
611-
pub(crate) amt_to_forward: u64,
612-
pub(crate) outgoing_cltv_value: u32,
613-
// 12 bytes of 0-padding
614-
}
615-
616609
mod fuzzy_internal_msgs {
617610
// These types aren't intended to be pub, but are exposed for direct fuzzing (as we deserialize
618611
// them from untrusted input):
619612

620-
use super::OnionRealm0HopData;
613+
pub(crate) enum OnionHopDataFormat {
614+
Legacy, // aka Realm-0
615+
// Some tests expect to be able to generate bogus non-deserializable OnionHopDatas. In the
616+
// future we can use bogus TLV attributes, but for now we have to expose a "bogus realm"
617+
// option.
618+
#[cfg(test)]
619+
BogusRealm(u8),
620+
}
621+
621622
pub struct OnionHopData {
622-
pub(crate) realm: u8,
623-
pub(crate) data: OnionRealm0HopData,
623+
pub(crate) format: OnionHopDataFormat,
624+
pub(crate) short_channel_id: u64,
625+
pub(crate) amt_to_forward: u64,
626+
pub(crate) outgoing_cltv_value: u32,
627+
// 12 bytes of 0-padding
624628
pub(crate) hmac: [u8; 32],
625629
}
626630

@@ -958,36 +962,18 @@ impl_writeable!(UpdateAddHTLC, 32+8+8+32+4+1366, {
958962
onion_routing_packet
959963
});
960964

961-
impl Writeable for OnionRealm0HopData {
965+
impl Writeable for OnionHopData {
962966
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
963-
w.size_hint(32);
967+
w.size_hint(65);
968+
match self.format {
969+
OnionHopDataFormat::Legacy => 0u8.write(w)?,
970+
#[cfg(test)]
971+
OnionHopDataFormat::BogusRealm(v) => v.write(w)?,
972+
}
964973
self.short_channel_id.write(w)?;
965974
self.amt_to_forward.write(w)?;
966975
self.outgoing_cltv_value.write(w)?;
967976
w.write_all(&[0;12])?;
968-
Ok(())
969-
}
970-
}
971-
972-
impl<R: Read> Readable<R> for OnionRealm0HopData {
973-
fn read(r: &mut R) -> Result<Self, DecodeError> {
974-
Ok(OnionRealm0HopData {
975-
short_channel_id: Readable::read(r)?,
976-
amt_to_forward: Readable::read(r)?,
977-
outgoing_cltv_value: {
978-
let v: u32 = Readable::read(r)?;
979-
r.read_exact(&mut [0; 12])?;
980-
v
981-
}
982-
})
983-
}
984-
}
985-
986-
impl Writeable for OnionHopData {
987-
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
988-
w.size_hint(65);
989-
self.realm.write(w)?;
990-
self.data.write(w)?;
991977
self.hmac.write(w)?;
992978
Ok(())
993979
}
@@ -996,14 +982,20 @@ impl Writeable for OnionHopData {
996982
impl<R: Read> Readable<R> for OnionHopData {
997983
fn read(r: &mut R) -> Result<Self, DecodeError> {
998984
Ok(OnionHopData {
999-
realm: {
985+
format: {
1000986
let r: u8 = Readable::read(r)?;
1001987
if r != 0 {
1002988
return Err(DecodeError::UnknownVersion);
1003989
}
1004-
r
990+
OnionHopDataFormat::Legacy
991+
},
992+
short_channel_id: Readable::read(r)?,
993+
amt_to_forward: Readable::read(r)?,
994+
outgoing_cltv_value: {
995+
let v: u32 = Readable::read(r)?;
996+
r.read_exact(&mut [0; 12])?;
997+
v
1005998
},
1006-
data: Readable::read(r)?,
1007999
hmac: Readable::read(r)?,
10081000
})
10091001
}

lightning/src/ln/onion_utils.rs

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,10 @@ pub(super) fn build_onion_payloads(route: &Route, starting_htlc_offset: u32) ->
121121
let value_msat = if cur_value_msat == 0 { hop.fee_msat } else { cur_value_msat };
122122
let cltv = if cur_cltv == starting_htlc_offset { hop.cltv_expiry_delta + starting_htlc_offset } else { cur_cltv };
123123
res.insert(0, msgs::OnionHopData {
124-
realm: 0,
125-
data: msgs::OnionRealm0HopData {
126-
short_channel_id: last_short_channel_id,
127-
amt_to_forward: value_msat,
128-
outgoing_cltv_value: cltv,
129-
},
124+
format: msgs::OnionHopDataFormat::Legacy,
125+
short_channel_id: last_short_channel_id,
126+
amt_to_forward: value_msat,
127+
outgoing_cltv_value: cltv,
130128
hmac: [0; 32],
131129
});
132130
cur_value_msat += hop.fee_msat;
@@ -516,48 +514,38 @@ mod tests {
516514
// Test vectors below are flat-out wrong: they claim to set outgoing_cltv_value to non-0 :/
517515
let payloads = vec!(
518516
msgs::OnionHopData {
519-
realm: 0,
520-
data: msgs::OnionRealm0HopData {
521-
short_channel_id: 0,
522-
amt_to_forward: 0,
523-
outgoing_cltv_value: 0,
524-
},
517+
format: msgs::OnionHopDataFormat::Legacy,
518+
short_channel_id: 0,
519+
amt_to_forward: 0,
520+
outgoing_cltv_value: 0,
525521
hmac: [0; 32],
526522
},
527523
msgs::OnionHopData {
528-
realm: 0,
529-
data: msgs::OnionRealm0HopData {
530-
short_channel_id: 0x0101010101010101,
531-
amt_to_forward: 0x0100000001,
532-
outgoing_cltv_value: 0,
533-
},
524+
format: msgs::OnionHopDataFormat::Legacy,
525+
short_channel_id: 0x0101010101010101,
526+
amt_to_forward: 0x0100000001,
527+
outgoing_cltv_value: 0,
534528
hmac: [0; 32],
535529
},
536530
msgs::OnionHopData {
537-
realm: 0,
538-
data: msgs::OnionRealm0HopData {
539-
short_channel_id: 0x0202020202020202,
540-
amt_to_forward: 0x0200000002,
541-
outgoing_cltv_value: 0,
542-
},
531+
format: msgs::OnionHopDataFormat::Legacy,
532+
short_channel_id: 0x0202020202020202,
533+
amt_to_forward: 0x0200000002,
534+
outgoing_cltv_value: 0,
543535
hmac: [0; 32],
544536
},
545537
msgs::OnionHopData {
546-
realm: 0,
547-
data: msgs::OnionRealm0HopData {
548-
short_channel_id: 0x0303030303030303,
549-
amt_to_forward: 0x0300000003,
550-
outgoing_cltv_value: 0,
551-
},
538+
format: msgs::OnionHopDataFormat::Legacy,
539+
short_channel_id: 0x0303030303030303,
540+
amt_to_forward: 0x0300000003,
541+
outgoing_cltv_value: 0,
552542
hmac: [0; 32],
553543
},
554544
msgs::OnionHopData {
555-
realm: 0,
556-
data: msgs::OnionRealm0HopData {
557-
short_channel_id: 0x0404040404040404,
558-
amt_to_forward: 0x0400000004,
559-
outgoing_cltv_value: 0,
560-
},
545+
format: msgs::OnionHopDataFormat::Legacy,
546+
short_channel_id: 0x0404040404040404,
547+
amt_to_forward: 0x0400000004,
548+
outgoing_cltv_value: 0,
561549
hmac: [0; 32],
562550
},
563551
);

0 commit comments

Comments
 (0)