Skip to content

Commit a9dc70b

Browse files
committed
Move BogusHopData generation into test instead of OnionHopData.
This, as it should be, restricts OnionHopData to only being able to represent valid states, while still allowing for tests to generate bogus hop data fields to test deserialization.
1 parent b5ed34b commit a9dc70b

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

lightning/src/ln/functional_tests.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use util::enforcing_trait_impls::EnforcingChannelKeys;
1818
use util::test_utils;
1919
use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2020
use util::errors::APIError;
21-
use util::ser::{Writeable, ReadableArgs};
21+
use util::ser::{Writeable, Writer, ReadableArgs};
2222
use util::config::UserConfig;
2323
use util::logger::Logger;
2424

@@ -44,7 +44,7 @@ use std::collections::{BTreeSet, HashMap, HashSet};
4444
use std::default::Default;
4545
use std::sync::{Arc, Mutex};
4646
use std::sync::atomic::Ordering;
47-
use std::mem;
47+
use std::{mem, io};
4848

4949
use rand::{thread_rng, Rng};
5050

@@ -4853,6 +4853,20 @@ impl msgs::ChannelUpdate {
48534853
}
48544854
}
48554855

4856+
struct BogusOnionHopData {
4857+
data: Vec<u8>
4858+
}
4859+
impl BogusOnionHopData {
4860+
fn new(orig: msgs::OnionHopData) -> Self {
4861+
Self { data: orig.encode() }
4862+
}
4863+
}
4864+
impl Writeable for BogusOnionHopData {
4865+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
4866+
writer.write_all(&self.data[..])
4867+
}
4868+
}
4869+
48564870
#[test]
48574871
fn test_onion_failure() {
48584872
use ln::msgs::ChannelUpdate;
@@ -4880,8 +4894,12 @@ fn test_onion_failure() {
48804894
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
48814895
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
48824896
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
4883-
onion_payloads[0].format = msgs::OnionHopDataFormat::BogusRealm(3);
4884-
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
4897+
let mut new_payloads = Vec::new();
4898+
for payload in onion_payloads.drain(..) {
4899+
new_payloads.push(BogusOnionHopData::new(payload));
4900+
}
4901+
new_payloads[0].data[0] = 1;
4902+
msg.onion_routing_packet = onion_utils::construct_onion_packet_bogus_hopdata(new_payloads, onion_keys, [0; 32], &payment_hash);
48854903
}, ||{}, 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
48864904

48874905
// final node failure
@@ -4890,8 +4908,12 @@ fn test_onion_failure() {
48904908
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
48914909
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
48924910
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
4893-
onion_payloads[1].format = msgs::OnionHopDataFormat::BogusRealm(3);
4894-
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
4911+
let mut new_payloads = Vec::new();
4912+
for payload in onion_payloads.drain(..) {
4913+
new_payloads.push(BogusOnionHopData::new(payload));
4914+
}
4915+
new_payloads[1].data[0] = 1;
4916+
msg.onion_routing_packet = onion_utils::construct_onion_packet_bogus_hopdata(new_payloads, onion_keys, [0; 32], &payment_hash);
48954917
}, ||{}, false, Some(PERM|1), Some(msgs::HTLCFailChannelUpdate::ChannelClosed{short_channel_id: channels[1].0.contents.short_channel_id, is_permanent: true}));
48964918

48974919
// the following three with run_onion_failure_test_with_fail_intercept() test only the origin node

lightning/src/ln/msgs.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -611,11 +611,6 @@ mod fuzzy_internal_msgs {
611611

612612
pub(crate) enum OnionHopDataFormat {
613613
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),
619614
}
620615

621616
pub struct OnionHopData {
@@ -965,8 +960,6 @@ impl Writeable for OnionHopData {
965960
w.size_hint(33);
966961
match self.format {
967962
OnionHopDataFormat::Legacy => 0u8.write(w)?,
968-
#[cfg(test)]
969-
OnionHopDataFormat::BogusRealm(v) => v.write(w)?,
970963
}
971964
self.short_channel_id.write(w)?;
972965
self.amt_to_forward.write(w)?;

lightning/src/ln/onion_utils.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,19 @@ pub(super) fn construct_onion_packet(payloads: Vec<msgs::OnionHopData>, onion_ke
169169
construct_onion_packet_with_init_noise(payloads, onion_keys, packet_data, associated_data)
170170
}
171171

172-
fn construct_onion_packet_with_init_noise(mut payloads: Vec<msgs::OnionHopData>, onion_keys: Vec<OnionKeys>, mut packet_data: [u8; 20*65], associated_data: &PaymentHash) -> msgs::OnionPacket {
172+
#[cfg(test)]
173+
// Used in testing to write bogus OnionHopDatas, which is otherwise not representable in
174+
// msgs::OnionHopData.
175+
pub(super) fn construct_onion_packet_bogus_hopdata<HD: Writeable>(payloads: Vec<HD>, onion_keys: Vec<OnionKeys>, prng_seed: [u8; 32], associated_data: &PaymentHash) -> msgs::OnionPacket {
176+
let mut packet_data = [0; 20*65];
177+
178+
let mut chacha = ChaCha20::new(&prng_seed, &[0; 8]);
179+
chacha.process(&[0; 20*65], &mut packet_data);
180+
181+
construct_onion_packet_with_init_noise(payloads, onion_keys, packet_data, associated_data)
182+
}
183+
184+
fn construct_onion_packet_with_init_noise<HD: Writeable>(mut payloads: Vec<HD>, onion_keys: Vec<OnionKeys>, mut packet_data: [u8; 20*65], associated_data: &PaymentHash) -> msgs::OnionPacket {
173185
let mut buf = Vec::with_capacity(21*65);
174186
buf.resize(21*65, 0);
175187

0 commit comments

Comments
 (0)