Skip to content

Commit 2a7d5d1

Browse files
committed
Use KeysInterface::read_chan_signer for all channel keys deser
This drops any direct calls to a generic `ChannelKeys::read()` and replaces it with the new `KeysInterface::read_chan_signer()`. Still, under the hood all of our own `KeysInterface::read_chan_signer()` implementations simply call out to a `Readable::read()` implemention.
1 parent 44e3756 commit 2a7d5d1

11 files changed

+114
-59
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ use lightning::util::logger::Logger;
4545
use lightning::util::config::UserConfig;
4646
use lightning::util::events::{EventsProvider, MessageSendEventsProvider};
4747
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
48+
use lightning::util::test_utils::OnlyReadsKeysInterface;
4849
use lightning::routing::router::{Route, RouteHop};
4950

5051

@@ -128,7 +129,7 @@ impl chain::Watch for TestChainMonitor {
128129
hash_map::Entry::Vacant(_) => panic!("Didn't have monitor on update call"),
129130
};
130131
let mut deserialized_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::
131-
read(&mut Cursor::new(&map_entry.get().1)).unwrap().1;
132+
read(&mut Cursor::new(&map_entry.get().1), &OnlyReadsKeysInterface {}).unwrap().1;
132133
deserialized_monitor.update_monitor(&update, &&TestBroadcaster{}, &&FuzzEstimator{}, &self.logger).unwrap();
133134
let mut ser = VecWriter(Vec::new());
134135
deserialized_monitor.write(&mut ser).unwrap();
@@ -311,7 +312,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
311312
let mut monitors = HashMap::new();
312313
let mut old_monitors = $old_monitors.latest_monitors.lock().unwrap();
313314
for (outpoint, (update_id, monitor_ser)) in old_monitors.drain() {
314-
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&monitor_ser)).expect("Failed to read monitor").1);
315+
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&monitor_ser), &OnlyReadsKeysInterface {}).expect("Failed to read monitor").1);
315316
chain_monitor.latest_monitors.lock().unwrap().insert(outpoint, (update_id, monitor_ser));
316317
}
317318
let mut monitor_refs = HashMap::new();

fuzz/src/chanmon_deser.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use bitcoin::hash_types::BlockHash;
55

66
use lightning::chain::channelmonitor;
77
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
8-
use lightning::util::ser::{Readable, Writer, Writeable};
8+
use lightning::util::ser::{ReadableArgs, Writer, Writeable};
9+
use lightning::util::test_utils::OnlyReadsKeysInterface;
910

1011
use utils::test_logger;
1112

@@ -24,10 +25,10 @@ impl Writer for VecWriter {
2425

2526
#[inline]
2627
pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
27-
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(data)) {
28+
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(data), &OnlyReadsKeysInterface {}) {
2829
let mut w = VecWriter(Vec::new());
2930
monitor.write(&mut w).unwrap();
30-
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&w.0)).unwrap();
31+
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&w.0), &OnlyReadsKeysInterface {}).unwrap();
3132
assert!(latest_block_hash == deserialized_copy.0);
3233
assert!(monitor == deserialized_copy.1);
3334
}

lightning-persister/src/lib.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, Cha
77
use lightning::chain::channelmonitor;
88
use lightning::chain::keysinterface::ChannelKeys;
99
use lightning::chain::transaction::OutPoint;
10-
use lightning::util::ser::{Writeable, Readable};
10+
use lightning::util::ser::Writeable;
1111
use std::fs;
1212
use std::io::Error;
1313
use std::path::{Path, PathBuf};
1414

1515
#[cfg(test)]
1616
use {
17+
lightning::chain::keysinterface::KeysInterface,
18+
lightning::util::ser::ReadableArgs,
1719
bitcoin::{BlockHash, Txid},
1820
bitcoin::hashes::hex::FromHex,
1921
std::collections::HashMap,
@@ -94,8 +96,8 @@ impl FilesystemPersister {
9496
}
9597

9698
#[cfg(test)]
97-
fn load_channel_data<ChanSigner: ChannelKeys + Readable>(&self) ->
98-
Result<HashMap<OutPoint, ChannelMonitor<ChanSigner>>, ChannelMonitorUpdateErr> {
99+
fn load_channel_data<Keys: KeysInterface>(&self, keys: &Keys) ->
100+
Result<HashMap<OutPoint, ChannelMonitor<Keys::ChanKeySigner>>, ChannelMonitorUpdateErr> {
99101
if let Err(_) = fs::create_dir_all(&self.path_to_channel_data) {
100102
return Err(ChannelMonitorUpdateErr::PermanentFailure);
101103
}
@@ -118,7 +120,7 @@ impl FilesystemPersister {
118120
if contents.is_err() { return Err(ChannelMonitorUpdateErr::PermanentFailure); }
119121

120122
if let Ok((_, loaded_monitor)) =
121-
<(BlockHash, ChannelMonitor<ChanSigner>)>::read(&mut Cursor::new(&contents.unwrap())) {
123+
<(BlockHash, ChannelMonitor<Keys::ChanKeySigner>)>::read(&mut Cursor::new(&contents.unwrap()), keys) {
122124
res.insert(OutPoint { txid: txid.unwrap(), index: index.unwrap() }, loaded_monitor);
123125
} else {
124126
return Err(ChannelMonitorUpdateErr::PermanentFailure);
@@ -128,7 +130,7 @@ impl FilesystemPersister {
128130
}
129131
}
130132

131-
impl<ChanSigner: ChannelKeys + Readable + Send + Sync> channelmonitor::Persist<ChanSigner> for FilesystemPersister {
133+
impl<ChanSigner: ChannelKeys + Send + Sync> channelmonitor::Persist<ChanSigner> for FilesystemPersister {
132134
fn persist_new_channel(&self, funding_txo: OutPoint, monitor: &ChannelMonitor<ChanSigner>) -> Result<(), ChannelMonitorUpdateErr> {
133135
self.write_channel_data(funding_txo, monitor)
134136
.map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
@@ -168,7 +170,6 @@ mod tests {
168170
use lightning::ln::features::InitFeatures;
169171
use lightning::ln::functional_test_utils::*;
170172
use lightning::ln::msgs::ErrorAction;
171-
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
172173
use lightning::util::events::{MessageSendEventsProvider, MessageSendEvent};
173174
use lightning::util::ser::Writer;
174175
use lightning::util::test_utils;
@@ -206,20 +207,20 @@ mod tests {
206207

207208
// Check that the persisted channel data is empty before any channels are
208209
// open.
209-
let mut persisted_chan_data_0 = persister_0.load_channel_data::<EnforcingChannelKeys>().unwrap();
210+
let mut persisted_chan_data_0 = persister_0.load_channel_data(nodes[0].keys_manager).unwrap();
210211
assert_eq!(persisted_chan_data_0.keys().len(), 0);
211-
let mut persisted_chan_data_1 = persister_1.load_channel_data::<EnforcingChannelKeys>().unwrap();
212+
let mut persisted_chan_data_1 = persister_1.load_channel_data(nodes[1].keys_manager).unwrap();
212213
assert_eq!(persisted_chan_data_1.keys().len(), 0);
213214

214215
// Helper to make sure the channel is on the expected update ID.
215216
macro_rules! check_persisted_data {
216217
($expected_update_id: expr) => {
217-
persisted_chan_data_0 = persister_0.load_channel_data::<EnforcingChannelKeys>().unwrap();
218+
persisted_chan_data_0 = persister_0.load_channel_data(nodes[0].keys_manager).unwrap();
218219
assert_eq!(persisted_chan_data_0.keys().len(), 1);
219220
for mon in persisted_chan_data_0.values() {
220221
assert_eq!(mon.get_latest_update_id(), $expected_update_id);
221222
}
222-
persisted_chan_data_1 = persister_1.load_channel_data::<EnforcingChannelKeys>().unwrap();
223+
persisted_chan_data_1 = persister_1.load_channel_data(nodes[1].keys_manager).unwrap();
223224
assert_eq!(persisted_chan_data_1.keys().len(), 1);
224225
for mon in persisted_chan_data_1.values() {
225226
assert_eq!(mon.get_latest_update_id(), $expected_update_id);

lightning/src/chain/channelmonitor.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ use ln::channelmanager::{HTLCSource, PaymentPreimage, PaymentHash};
4444
use ln::onchaintx::{OnchainTxHandler, InputDescriptors};
4545
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
4646
use chain::transaction::{OutPoint, TransactionData};
47-
use chain::keysinterface::{SpendableOutputDescriptor, ChannelKeys};
47+
use chain::keysinterface::{SpendableOutputDescriptor, ChannelKeys, KeysInterface};
4848
use util::logger::Logger;
49-
use util::ser::{Readable, MaybeReadable, Writer, Writeable, U48};
49+
use util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, U48};
5050
use util::byte_utils;
5151
use util::events::Event;
5252

@@ -2289,8 +2289,9 @@ pub trait Persist<Keys: ChannelKeys>: Send + Sync {
22892289

22902290
const MAX_ALLOC_SIZE: usize = 64*1024;
22912291

2292-
impl<ChanSigner: ChannelKeys + Readable> Readable for (BlockHash, ChannelMonitor<ChanSigner>) {
2293-
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
2292+
impl<'a, ChanSigner: ChannelKeys, K: KeysInterface<ChanKeySigner = ChanSigner>> ReadableArgs<&'a K>
2293+
for (BlockHash, ChannelMonitor<ChanSigner>) {
2294+
fn read<R: ::std::io::Read>(reader: &mut R, keys_manager: &'a K) -> Result<Self, DecodeError> {
22942295
macro_rules! unwrap_obj {
22952296
($key: expr) => {
22962297
match $key {
@@ -2524,7 +2525,7 @@ impl<ChanSigner: ChannelKeys + Readable> Readable for (BlockHash, ChannelMonitor
25242525
return Err(DecodeError::InvalidValue);
25252526
}
25262527
}
2527-
let onchain_tx_handler = Readable::read(reader)?;
2528+
let onchain_tx_handler = ReadableArgs::read(reader, keys_manager)?;
25282529

25292530
let lockdown_from_offchain = Readable::read(reader)?;
25302531
let holder_tx_signed = Readable::read(reader)?;

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use routing::router::get_route;
2626
use util::enforcing_trait_impls::EnforcingChannelKeys;
2727
use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2828
use util::errors::APIError;
29-
use util::ser::{Readable, Writeable};
29+
use util::ser::{ReadableArgs, Writeable};
3030

3131
use bitcoin::hashes::sha256::Hash as Sha256;
3232
use bitcoin::hashes::Hash;
@@ -107,7 +107,7 @@ fn test_monitor_and_persister_update_fail() {
107107
let mut w = test_utils::TestVecWriter(Vec::new());
108108
monitor.write(&mut w).unwrap();
109109
let new_monitor = <(BlockHash, ChannelMonitor<EnforcingChannelKeys>)>::read(
110-
&mut ::std::io::Cursor::new(&w.0)).unwrap().1;
110+
&mut ::std::io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
111111
assert!(new_monitor == *monitor);
112112
let chain_mon = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister);
113113
assert!(chain_mon.watch_channel(outpoint, new_monitor).is_ok());

lightning/src/ln/channel.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitor
3333
use chain::transaction::{OutPoint, TransactionData};
3434
use chain::keysinterface::{ChannelKeys, KeysInterface};
3535
use util::transaction_utils;
36-
use util::ser::{Readable, Writeable, Writer};
36+
use util::ser::{Readable, ReadableArgs, Writeable, Writer, VecWriter};
3737
use util::logger::Logger;
3838
use util::errors::APIError;
3939
use util::config::{UserConfig,ChannelConfig};
@@ -4092,7 +4092,13 @@ impl<ChanSigner: ChannelKeys> Writeable for Channel<ChanSigner> {
40924092

40934093
self.latest_monitor_update_id.write(writer)?;
40944094

4095-
self.holder_keys.write(writer)?;
4095+
let mut key_data = VecWriter(Vec::new());
4096+
self.holder_keys.write(&mut key_data)?;
4097+
assert!(key_data.0.len() < std::usize::MAX);
4098+
assert!(key_data.0.len() < std::u32::MAX as usize);
4099+
(key_data.0.len() as u32).write(writer)?;
4100+
writer.write_all(&key_data.0[..])?;
4101+
40964102
self.shutdown_pubkey.write(writer)?;
40974103
self.destination_script.write(writer)?;
40984104

@@ -4260,8 +4266,10 @@ impl<ChanSigner: ChannelKeys> Writeable for Channel<ChanSigner> {
42604266
}
42614267
}
42624268

4263-
impl<ChanSigner: ChannelKeys + Readable> Readable for Channel<ChanSigner> {
4264-
fn read<R : ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
4269+
const MAX_ALLOC_SIZE: usize = 64*1024;
4270+
impl<'a, ChanSigner: ChannelKeys, K: Deref> ReadableArgs<&'a K> for Channel<ChanSigner>
4271+
where K::Target: KeysInterface<ChanKeySigner = ChanSigner> {
4272+
fn read<R : ::std::io::Read>(reader: &mut R, keys_source: &'a K) -> Result<Self, DecodeError> {
42654273
let _ver: u8 = Readable::read(reader)?;
42664274
let min_ver: u8 = Readable::read(reader)?;
42674275
if min_ver > SERIALIZATION_VERSION {
@@ -4278,7 +4286,17 @@ impl<ChanSigner: ChannelKeys + Readable> Readable for Channel<ChanSigner> {
42784286

42794287
let latest_monitor_update_id = Readable::read(reader)?;
42804288

4281-
let holder_keys = Readable::read(reader)?;
4289+
let keys_len: u32 = Readable::read(reader)?;
4290+
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
4291+
while keys_data.len() != keys_len as usize {
4292+
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
4293+
let mut data = [0; 1024];
4294+
let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
4295+
reader.read_exact(read_slice)?;
4296+
keys_data.extend_from_slice(read_slice);
4297+
}
4298+
let holder_keys = keys_source.read_chan_signer(&keys_data)?;
4299+
42824300
let shutdown_pubkey = Readable::read(reader)?;
42834301
let destination_script = Readable::read(reader)?;
42844302

@@ -4559,7 +4577,7 @@ mod tests {
45594577
self.chan_keys.clone()
45604578
}
45614579
fn get_secure_random_bytes(&self) -> [u8; 32] { [0; 32] }
4562-
fn read_chan_signer(&self, data: &[u8]) -> Result<Self::ChanKeySigner, DecodeError> { panic!(); }
4580+
fn read_chan_signer(&self, _data: &[u8]) -> Result<Self::ChanKeySigner, DecodeError> { panic!(); }
45634581
}
45644582

45654583
fn public_from_secret_hex(secp_ctx: &Secp256k1<All>, hex: &str) -> PublicKey {

lightning/src/ln/channelmanager.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3782,7 +3782,8 @@ pub struct ChannelManagerReadArgs<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T:
37823782
L::Target: Logger,
37833783
{
37843784
/// The keys provider which will give us relevant keys. Some keys will be loaded during
3785-
/// deserialization.
3785+
/// deserialization and KeysInterface::read_chan_signer will be used to read per-Channel
3786+
/// signing data.
37863787
pub keys_manager: K,
37873788

37883789
/// The fee_estimator for use in the ChannelManager in the future.
@@ -3844,7 +3845,7 @@ impl<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L
38443845

38453846
// Implement ReadableArgs for an Arc'd ChannelManager to make it a bit easier to work with the
38463847
// SipmleArcChannelManager type:
3847-
impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
3848+
impl<'a, ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
38483849
ReadableArgs<ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F, L>> for (BlockHash, Arc<ChannelManager<ChanSigner, M, T, K, F, L>>)
38493850
where M::Target: chain::Watch<Keys=ChanSigner>,
38503851
T::Target: BroadcasterInterface,
@@ -3858,7 +3859,7 @@ impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: De
38583859
}
38593860
}
38603861

3861-
impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
3862+
impl<'a, ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
38623863
ReadableArgs<ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F, L>> for (BlockHash, ChannelManager<ChanSigner, M, T, K, F, L>)
38633864
where M::Target: chain::Watch<Keys=ChanSigner>,
38643865
T::Target: BroadcasterInterface,
@@ -3884,7 +3885,7 @@ impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: De
38843885
let mut by_id = HashMap::with_capacity(cmp::min(channel_count as usize, 128));
38853886
let mut short_to_id = HashMap::with_capacity(cmp::min(channel_count as usize, 128));
38863887
for _ in 0..channel_count {
3887-
let mut channel: Channel<ChanSigner> = Readable::read(reader)?;
3888+
let mut channel: Channel<ChanSigner> = Channel::read(reader, &args.keys_manager)?;
38883889
if channel.last_block_connected != Default::default() && channel.last_block_connected != last_block_hash {
38893890
return Err(DecodeError::InvalidValue);
38903891
}

lightning/src/ln/functional_test_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use ln::msgs;
2121
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
2222
use util::enforcing_trait_impls::EnforcingChannelKeys;
2323
use util::test_utils;
24-
use util::test_utils::TestChainMonitor;
24+
use util::test_utils::{TestChainMonitor, OnlyReadsKeysInterface};
2525
use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2626
use util::errors::APIError;
2727
use util::config::UserConfig;
@@ -172,7 +172,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
172172
let mut w = test_utils::TestVecWriter(Vec::new());
173173
old_monitor.write(&mut w).unwrap();
174174
let (_, deserialized_monitor) = <(BlockHash, ChannelMonitor<EnforcingChannelKeys>)>::read(
175-
&mut ::std::io::Cursor::new(&w.0)).unwrap();
175+
&mut ::std::io::Cursor::new(&w.0), &OnlyReadsKeysInterface {}).unwrap();
176176
deserialized_monitors.push(deserialized_monitor);
177177
}
178178
}

0 commit comments

Comments
 (0)