Skip to content

Commit 4401fc5

Browse files
committed
f! remove new ser version + allow downgrade in onchain tx handler
1 parent f337555 commit 4401fc5

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

lightning/src/chain/onchaintx.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::chain::keysinterface::{Sign, KeysInterface};
3636
use crate::chain::package::PackageSolvingData;
3737
use crate::chain::package::PackageTemplate;
3838
use crate::util::logger::Logger;
39-
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable};
39+
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, VecWriter};
4040
use crate::util::byte_utils;
4141

4242
use crate::io;
@@ -250,7 +250,7 @@ pub struct OnchainTxHandler<ChannelSigner: Sign> {
250250
pub(super) secp_ctx: Secp256k1<secp256k1::All>,
251251
}
252252

253-
const SERIALIZATION_VERSION: u8 = 2;
253+
const SERIALIZATION_VERSION: u8 = 1;
254254
const MIN_SERIALIZATION_VERSION: u8 = 1;
255255

256256
impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
@@ -265,6 +265,13 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
265265

266266
self.channel_transaction_parameters.write(writer)?;
267267

268+
let mut key_data = VecWriter(Vec::new());
269+
self.signer.write(&mut key_data)?;
270+
assert!(key_data.0.len() < core::usize::MAX);
271+
assert!(key_data.0.len() < core::u32::MAX as usize);
272+
(key_data.0.len() as u32).write(writer)?;
273+
writer.write_all(&key_data.0[..])?;
274+
268275
writer.write_all(&byte_utils::be64_to_array(self.pending_claim_requests.len() as u64))?;
269276
for (ref ancestor_claim_txid, request) in self.pending_claim_requests.iter() {
270277
ancestor_claim_txid.write(writer)?;
@@ -303,7 +310,7 @@ impl<'a, K: KeysInterface> ReadableArgs<(&'a K, u64, [u8; 32])> for OnchainTxHan
303310
let channel_value_satoshis = args.1;
304311
let channel_keys_id = args.2;
305312

306-
let ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
313+
let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
307314

308315
let destination_script = Readable::read(reader)?;
309316

@@ -314,21 +321,19 @@ impl<'a, K: KeysInterface> ReadableArgs<(&'a K, u64, [u8; 32])> for OnchainTxHan
314321

315322
let channel_parameters = Readable::read(reader)?;
316323

317-
let mut signer: K::Signer;
318-
if ver <= 1 {
319-
let keys_len: u32 = Readable::read(reader)?;
320-
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
321-
while keys_data.len() != keys_len as usize {
322-
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
323-
let mut data = [0; 1024];
324-
let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
325-
reader.read_exact(read_slice)?;
326-
keys_data.extend_from_slice(read_slice);
327-
}
328-
signer = keys_manager.read_chan_signer(&keys_data)?;
329-
} else {
330-
signer = keys_manager.derive_channel_signer(channel_value_satoshis, channel_keys_id);
324+
// Read the serialized signer bytes, but don't deserialize them, as we'll obtain our signer
325+
// by re-deriving the private key material.
326+
let keys_len: u32 = Readable::read(reader)?;
327+
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
328+
while keys_data.len() != keys_len as usize {
329+
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
330+
let mut data = [0; 1024];
331+
let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
332+
reader.read_exact(read_slice)?;
333+
keys_data.extend_from_slice(read_slice);
331334
}
335+
336+
let mut signer = keys_manager.derive_channel_signer(channel_value_satoshis, Some(channel_keys_id));
332337
signer.ready_channel(&channel_parameters);
333338

334339
let pending_claim_requests_len: u64 = Readable::read(reader)?;

0 commit comments

Comments
 (0)