Skip to content

Commit c7a69d6

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 935227e commit c7a69d6

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
@@ -17,7 +17,7 @@ use util::enforcing_trait_impls::EnforcingChannelKeys;
1717
use util::test_utils;
1818
use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
1919
use util::errors::APIError;
20-
use util::ser::{Writeable, ReadableArgs};
20+
use util::ser::{Writeable, Writer, ReadableArgs};
2121
use util::config::UserConfig;
2222
use util::logger::Logger;
2323

@@ -43,7 +43,7 @@ use std::collections::{BTreeSet, HashMap, HashSet};
4343
use std::default::Default;
4444
use std::sync::{Arc, Mutex};
4545
use std::sync::atomic::Ordering;
46-
use std::mem;
46+
use std::{mem, io};
4747

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

@@ -4827,6 +4827,20 @@ impl msgs::ChannelUpdate {
48274827
}
48284828
}
48294829

4830+
struct BogusOnionHopData {
4831+
data: Vec<u8>
4832+
}
4833+
impl BogusOnionHopData {
4834+
fn new(orig: msgs::OnionHopData) -> Self {
4835+
Self { data: orig.encode() }
4836+
}
4837+
}
4838+
impl Writeable for BogusOnionHopData {
4839+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
4840+
writer.write_all(&self.data[..])
4841+
}
4842+
}
4843+
48304844
#[test]
48314845
fn test_onion_failure() {
48324846
use ln::msgs::ChannelUpdate;
@@ -4854,8 +4868,12 @@ fn test_onion_failure() {
48544868
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
48554869
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
48564870
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
4857-
onion_payloads[0].format = msgs::OnionHopDataFormat::BogusRealm(3);
4858-
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
4871+
let mut new_payloads = Vec::new();
4872+
for payload in onion_payloads.drain(..) {
4873+
new_payloads.push(BogusOnionHopData::new(payload));
4874+
}
4875+
new_payloads[0].data[0] = 1;
4876+
msg.onion_routing_packet = onion_utils::construct_onion_packet_bogus_hopdata(new_payloads, onion_keys, [0; 32], &payment_hash);
48594877
}, ||{}, 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
48604878

48614879
// final node failure
@@ -4864,8 +4882,12 @@ fn test_onion_failure() {
48644882
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
48654883
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
48664884
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route, cur_height).unwrap();
4867-
onion_payloads[1].format = msgs::OnionHopDataFormat::BogusRealm(3);
4868-
msg.onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
4885+
let mut new_payloads = Vec::new();
4886+
for payload in onion_payloads.drain(..) {
4887+
new_payloads.push(BogusOnionHopData::new(payload));
4888+
}
4889+
new_payloads[1].data[0] = 1;
4890+
msg.onion_routing_packet = onion_utils::construct_onion_packet_bogus_hopdata(new_payloads, onion_keys, [0; 32], &payment_hash);
48694891
}, ||{}, false, Some(PERM|1), Some(msgs::HTLCFailChannelUpdate::ChannelClosed{short_channel_id: channels[1].0.contents.short_channel_id, is_permanent: true}));
48704892

48714893
// 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
@@ -817,11 +817,6 @@ mod fuzzy_internal_msgs {
817817

818818
pub(crate) enum OnionHopDataFormat {
819819
Legacy, // aka Realm-0
820-
// Some tests expect to be able to generate bogus non-deserializable OnionHopDatas. In the
821-
// future we can use bogus TLV attributes, but for now we have to expose a "bogus realm"
822-
// option.
823-
#[cfg(test)]
824-
BogusRealm(u8),
825820
}
826821

827822
pub struct OnionHopData {
@@ -1207,8 +1202,6 @@ impl Writeable for OnionHopData {
12071202
w.size_hint(33);
12081203
match self.format {
12091204
OnionHopDataFormat::Legacy => 0u8.write(w)?,
1210-
#[cfg(test)]
1211-
OnionHopDataFormat::BogusRealm(v) => v.write(w)?,
12121205
}
12131206
self.short_channel_id.write(w)?;
12141207
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)