Skip to content

Commit 0c9b601

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 5e4df5b commit 0c9b601

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
@@ -962,11 +962,11 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
962962
return_err!("The final CLTV expiry is too soon to handle", 17, &[0;0]);
963963
}
964964
// final_incorrect_htlc_amount
965-
if next_hop_data.data.amt_to_forward > msg.amount_msat {
965+
if next_hop_data.amt_to_forward > msg.amount_msat {
966966
return_err!("Upstream node sent less than we were supposed to receive in payment", 19, &byte_utils::be64_to_array(msg.amount_msat));
967967
}
968968
// final_incorrect_cltv_expiry
969-
if next_hop_data.data.outgoing_cltv_value != msg.cltv_expiry {
969+
if next_hop_data.outgoing_cltv_value != msg.cltv_expiry {
970970
return_err!("Upstream node set CLTV to the wrong value", 18, &byte_utils::be32_to_array(msg.cltv_expiry));
971971
}
972972

@@ -980,8 +980,8 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
980980
payment_hash: msg.payment_hash.clone(),
981981
short_channel_id: 0,
982982
incoming_shared_secret: shared_secret,
983-
amt_to_forward: next_hop_data.data.amt_to_forward,
984-
outgoing_cltv_value: next_hop_data.data.outgoing_cltv_value,
983+
amt_to_forward: next_hop_data.amt_to_forward,
984+
outgoing_cltv_value: next_hop_data.outgoing_cltv_value,
985985
})
986986
} else {
987987
let mut new_packet_data = [0; 20*65];
@@ -1011,10 +1011,10 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
10111011
PendingHTLCStatus::Forward(PendingForwardHTLCInfo {
10121012
onion_packet: Some(outgoing_packet),
10131013
payment_hash: msg.payment_hash.clone(),
1014-
short_channel_id: next_hop_data.data.short_channel_id,
1014+
short_channel_id: next_hop_data.short_channel_id,
10151015
incoming_shared_secret: shared_secret,
1016-
amt_to_forward: next_hop_data.data.amt_to_forward,
1017-
outgoing_cltv_value: next_hop_data.data.outgoing_cltv_value,
1016+
amt_to_forward: next_hop_data.amt_to_forward,
1017+
outgoing_cltv_value: next_hop_data.outgoing_cltv_value,
10181018
})
10191019
};
10201020

lightning/src/ln/functional_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4880,7 +4880,7 @@ fn test_onion_failure() {
48804880
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
48814881
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
48824882
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
4883-
onion_payloads[0].realm = 3;
4883+
onion_payloads[0].format = msgs::OnionHopDataFormat::BogusRealm(3);
48844884
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
48854885
}, ||{}, 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
48864886

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

lightning/src/ln/msgs.rs

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

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

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

@@ -957,36 +961,18 @@ impl_writeable!(UpdateAddHTLC, 32+8+8+32+4+1366, {
957961
onion_routing_packet
958962
});
959963

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

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)