Skip to content

Commit 990d1de

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 c07b4de commit 990d1de

11 files changed

+116
-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
@@ -43,9 +43,9 @@ use ln::channelmanager::{HTLCSource, PaymentPreimage, PaymentHash};
4343
use ln::onchaintx::{OnchainTxHandler, InputDescriptors};
4444
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
4545
use chain::transaction::{OutPoint, TransactionData};
46-
use chain::keysinterface::{SpendableOutputDescriptor, ChannelKeys};
46+
use chain::keysinterface::{SpendableOutputDescriptor, ChannelKeys, KeysInterface};
4747
use util::logger::Logger;
48-
use util::ser::{Readable, MaybeReadable, Writer, Writeable, U48};
48+
use util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, U48};
4949
use util::byte_utils;
5050
use util::events::Event;
5151

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

23022302
const MAX_ALLOC_SIZE: usize = 64*1024;
23032303

2304-
impl<ChanSigner: ChannelKeys + Readable> Readable for (BlockHash, ChannelMonitor<ChanSigner>) {
2305-
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
2304+
impl<'a, ChanSigner: ChannelKeys, K: KeysInterface<ChanKeySigner = ChanSigner>> ReadableArgs<&'a K>
2305+
for (BlockHash, ChannelMonitor<ChanSigner>) {
2306+
fn read<R: ::std::io::Read>(reader: &mut R, keys_manager: &'a K) -> Result<Self, DecodeError> {
23062307
macro_rules! unwrap_obj {
23072308
($key: expr) => {
23082309
match $key {
@@ -2536,7 +2537,7 @@ impl<ChanSigner: ChannelKeys + Readable> Readable for (BlockHash, ChannelMonitor
25362537
return Err(DecodeError::InvalidValue);
25372538
}
25382539
}
2539-
let onchain_tx_handler = Readable::read(reader)?;
2540+
let onchain_tx_handler = ReadableArgs::read(reader, keys_manager)?;
25402541

25412542
let lockdown_from_offchain = Readable::read(reader)?;
25422543
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};
@@ -4072,7 +4072,13 @@ impl<ChanSigner: ChannelKeys> Writeable for Channel<ChanSigner> {
40724072

40734073
self.latest_monitor_update_id.write(writer)?;
40744074

4075-
self.holder_keys.write(writer)?;
4075+
let mut key_data = VecWriter(Vec::new());
4076+
self.holder_keys.write(&mut key_data)?;
4077+
assert!(key_data.0.len() < std::usize::MAX);
4078+
assert!(key_data.0.len() < std::u32::MAX as usize);
4079+
(key_data.0.len() as u32).write(writer)?;
4080+
writer.write_all(&key_data.0[..])?;
4081+
40764082
self.shutdown_pubkey.write(writer)?;
40774083
self.destination_script.write(writer)?;
40784084

@@ -4237,8 +4243,10 @@ impl<ChanSigner: ChannelKeys> Writeable for Channel<ChanSigner> {
42374243
}
42384244
}
42394245

4240-
impl<ChanSigner: ChannelKeys + Readable> Readable for Channel<ChanSigner> {
4241-
fn read<R : ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
4246+
const MAX_ALLOC_SIZE: usize = 64*1024;
4247+
impl<'a, ChanSigner: ChannelKeys, K: Deref> ReadableArgs<&'a K> for Channel<ChanSigner>
4248+
where K::Target: KeysInterface<ChanKeySigner = ChanSigner> {
4249+
fn read<R : ::std::io::Read>(reader: &mut R, keys_source: &'a K) -> Result<Self, DecodeError> {
42424250
let _ver: u8 = Readable::read(reader)?;
42434251
let min_ver: u8 = Readable::read(reader)?;
42444252
if min_ver > SERIALIZATION_VERSION {
@@ -4254,7 +4262,17 @@ impl<ChanSigner: ChannelKeys + Readable> Readable for Channel<ChanSigner> {
42544262

42554263
let latest_monitor_update_id = Readable::read(reader)?;
42564264

4257-
let holder_keys = Readable::read(reader)?;
4265+
let keys_len: u32 = Readable::read(reader)?;
4266+
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
4267+
while keys_data.len() != keys_len as usize {
4268+
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
4269+
let mut data = [0; 1024];
4270+
let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
4271+
reader.read_exact(read_slice)?;
4272+
keys_data.extend_from_slice(read_slice);
4273+
}
4274+
let holder_keys = keys_source.read_chan_signer(&keys_data)?;
4275+
42584276
let shutdown_pubkey = Readable::read(reader)?;
42594277
let destination_script = Readable::read(reader)?;
42604278

@@ -4528,7 +4546,7 @@ mod tests {
45284546
self.chan_keys.clone()
45294547
}
45304548
fn get_secure_random_bytes(&self) -> [u8; 32] { [0; 32] }
4531-
fn read_chan_signer(&self, data: &[u8]) -> Result<Self::ChanKeySigner, DecodeError> { panic!(); }
4549+
fn read_chan_signer(&self, _data: &[u8]) -> Result<Self::ChanKeySigner, DecodeError> { panic!(); }
45324550
}
45334551

45344552
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
@@ -3784,7 +3784,8 @@ pub struct ChannelManagerReadArgs<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T:
37843784
L::Target: Logger,
37853785
{
37863786
/// The keys provider which will give us relevant keys. Some keys will be loaded during
3787-
/// deserialization.
3787+
/// deserialization and KeysInterface::read_chan_signer will be used to read per-Channel
3788+
/// signing data.
37883789
pub keys_manager: K,
37893790

37903791
/// The fee_estimator for use in the ChannelManager in the future.
@@ -3846,7 +3847,7 @@ impl<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L
38463847

38473848
// Implement ReadableArgs for an Arc'd ChannelManager to make it a bit easier to work with the
38483849
// SipmleArcChannelManager type:
3849-
impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
3850+
impl<'a, ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
38503851
ReadableArgs<ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F, L>> for (BlockHash, Arc<ChannelManager<ChanSigner, M, T, K, F, L>>)
38513852
where M::Target: chain::Watch<Keys=ChanSigner>,
38523853
T::Target: BroadcasterInterface,
@@ -3860,7 +3861,7 @@ impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: De
38603861
}
38613862
}
38623863

3863-
impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
3864+
impl<'a, ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
38643865
ReadableArgs<ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F, L>> for (BlockHash, ChannelManager<ChanSigner, M, T, K, F, L>)
38653866
where M::Target: chain::Watch<Keys=ChanSigner>,
38663867
T::Target: BroadcasterInterface,
@@ -3886,7 +3887,7 @@ impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: De
38863887
let mut by_id = HashMap::with_capacity(cmp::min(channel_count as usize, 128));
38873888
let mut short_to_id = HashMap::with_capacity(cmp::min(channel_count as usize, 128));
38883889
for _ in 0..channel_count {
3889-
let mut channel: Channel<ChanSigner> = Readable::read(reader)?;
3890+
let mut channel: Channel<ChanSigner> = Channel::read(reader, &args.keys_manager)?;
38903891
if channel.last_block_connected != Default::default() && channel.last_block_connected != last_block_hash {
38913892
return Err(DecodeError::InvalidValue);
38923893
}

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)