Skip to content

Commit 736dd97

Browse files
author
Antoine Riard
committed
Implement serialize/deserialize for Router.
Extend route_test to check if serialize/deserialize of NetworkMap works. Add PartialEq traits on some Router's structs. Modify also UnsignedNodeAnnouncement serialization
1 parent 301f91e commit 736dd97

File tree

6 files changed

+421
-129
lines changed

6 files changed

+421
-129
lines changed

fuzz/fuzz_targets/router_target.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ pub fn do_test(data: &[u8]) {
125125
match <($MsgType)>::read(&mut reader) {
126126
Ok(msg) => msg,
127127
Err(e) => match e {
128-
msgs::DecodeError::UnknownVersion => return,
128+
msgs::DecodeError::UnknownVersion { .. } => return,
129129
msgs::DecodeError::UnknownRequiredFeature => return,
130-
msgs::DecodeError::InvalidValue => return,
130+
msgs::DecodeError::InvalidValue { .. } => return,
131131
msgs::DecodeError::ExtraAddressesPerType => return,
132132
msgs::DecodeError::BadLengthDescriptor => return,
133133
msgs::DecodeError::ShortRead => panic!("We picked the length..."),

src/ln/msgs.rs

Lines changed: 159 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::{cmp, fmt};
2626
use std::io::Read;
2727
use std::result::Result;
2828

29-
use util::{byte_utils, events};
29+
use util::events;
3030
use util::ser::{Readable, Writeable, Writer};
3131

3232
use ln::channelmanager::{PaymentPreimage, PaymentHash};
@@ -35,7 +35,7 @@ use ln::channelmanager::{PaymentPreimage, PaymentHash};
3535
#[derive(Debug)]
3636
pub enum DecodeError {
3737
/// A version byte specified something we don't know how to handle.
38-
/// Includes unknown realm byte in an OnionHopData packet
38+
/// Includes unknown realm byte in an OnionHopData packet or an address type in NodeAnnouncement
3939
UnknownVersion,
4040
/// Unknown feature mandating we fail to parse message
4141
UnknownRequiredFeature,
@@ -47,7 +47,6 @@ pub enum DecodeError {
4747
/// node_announcement included more than one address of a given type!
4848
ExtraAddressesPerType,
4949
/// A length descriptor in the packet didn't describe the later data correctly
50-
/// (currently only generated in node_announcement)
5150
BadLengthDescriptor,
5251
/// Error from std::io
5352
Io(::std::io::Error),
@@ -336,7 +335,7 @@ pub struct AnnouncementSignatures {
336335
}
337336

338337
/// An address which can be used to connect to a remote peer
339-
#[derive(Clone)]
338+
#[derive(PartialEq, Clone)]
340339
pub enum NetAddress {
341340
/// An IPv4 address/port on which the peer is listenting.
342341
IPv4 {
@@ -372,6 +371,12 @@ pub enum NetAddress {
372371
/// The port on which the node is listenting
373372
port: u16,
374373
},
374+
/// An unsupported address.
375+
/// At deserialization, we retrieve first byte of it if needed by caller.
376+
Unknown {
377+
/// The unknown address descriptor
378+
descriptor: u8,
379+
},
375380
}
376381
impl NetAddress {
377382
fn get_id(&self) -> u8 {
@@ -380,11 +385,99 @@ impl NetAddress {
380385
&NetAddress::IPv6 {..} => { 2 },
381386
&NetAddress::OnionV2 {..} => { 3 },
382387
&NetAddress::OnionV3 {..} => { 4 },
388+
&NetAddress::Unknown { ref descriptor } => { panic!("Shouldn't have in-memory unsupported address {}", descriptor) },
389+
}
390+
}
391+
392+
/// Strict byte-length of address descriptor, 1-byte type not recorded
393+
fn len(&self) -> u16 {
394+
match self {
395+
&NetAddress::IPv4 { .. } => { 6 },
396+
&NetAddress::IPv6 { .. } => { 18 },
397+
&NetAddress::OnionV2 { .. } => { 12 },
398+
&NetAddress::OnionV3 { .. } => { 37 },
399+
&NetAddress::Unknown { ref descriptor } => { panic!("Shouldn't have in-memory unsupported address {}", descriptor) },
383400
}
384401
}
385402
}
386403

387-
#[derive(Clone)]
404+
impl Writeable for NetAddress {
405+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
406+
match self {
407+
&NetAddress::IPv4 { ref addr, ref port } => {
408+
1u8.write(writer)?;
409+
addr.write(writer)?;
410+
port.write(writer)?;
411+
},
412+
&NetAddress::IPv6 { ref addr, ref port } => {
413+
2u8.write(writer)?;
414+
addr.write(writer)?;
415+
port.write(writer)?;
416+
},
417+
&NetAddress::OnionV2 { ref addr, ref port } => {
418+
3u8.write(writer)?;
419+
addr.write(writer)?;
420+
port.write(writer)?;
421+
},
422+
&NetAddress::OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
423+
4u8.write(writer)?;
424+
ed25519_pubkey.write(writer)?;
425+
checksum.write(writer)?;
426+
version.write(writer)?;
427+
port.write(writer)?;
428+
}
429+
&NetAddress::Unknown { ref descriptor } => { panic!("Shouldn't have in-memory unsupported address {}", descriptor) },
430+
}
431+
Ok(())
432+
}
433+
}
434+
435+
impl<R: ::std::io::Read> Readable<R> for NetAddress {
436+
fn read(reader: &mut R) -> Result<NetAddress, DecodeError> {
437+
let byte = <u8 as Readable<R>>::read(reader)?;
438+
match byte {
439+
1 => {
440+
let addr = Readable::read(reader)?;
441+
let port = Readable::read(reader)?;
442+
Ok(NetAddress::IPv4 {
443+
addr,
444+
port,
445+
})
446+
},
447+
2 => {
448+
let addr = Readable::read(reader)?;
449+
let port = Readable::read(reader)?;
450+
Ok(NetAddress::IPv6 {
451+
addr,
452+
port,
453+
})
454+
},
455+
3 => {
456+
let addr = Readable::read(reader)?;
457+
let port = Readable::read(reader)?;
458+
Ok(NetAddress::OnionV2 {
459+
addr,
460+
port,
461+
})
462+
},
463+
4 => {
464+
let ed25519_pubkey = Readable::read(reader)?;
465+
let checksum = Readable::read(reader)?;
466+
let version = Readable::read(reader)?;
467+
let port = Readable::read(reader)?;
468+
Ok(NetAddress::OnionV3 {
469+
ed25519_pubkey,
470+
checksum,
471+
version,
472+
port,
473+
})
474+
}
475+
_ => return Ok((NetAddress::Unknown { descriptor: byte }))
476+
}
477+
}
478+
}
479+
480+
#[derive(PartialEq, Clone)]
388481
// Only exposed as broadcast of node_announcement should be filtered by node_id
389482
/// The unsigned part of a node_announcement
390483
pub struct UnsignedNodeAnnouncement {
@@ -401,7 +494,7 @@ pub struct UnsignedNodeAnnouncement {
401494
pub(crate) excess_address_data: Vec<u8>,
402495
pub(crate) excess_data: Vec<u8>,
403496
}
404-
#[derive(Clone)]
497+
#[derive(PartialEq, Clone)]
405498
/// A node_announcement message to be sent or received from a peer
406499
pub struct NodeAnnouncement {
407500
pub(crate) signature: Signature,
@@ -669,7 +762,7 @@ impl Error for DecodeError {
669762
DecodeError::InvalidValue => "Nonsense bytes didn't map to the type they were interpreted as",
670763
DecodeError::ShortRead => "Packet extended beyond the provided bytes",
671764
DecodeError::ExtraAddressesPerType => "More than one address of a single type",
672-
DecodeError::BadLengthDescriptor => "A length descriptor in the packet didn't describe the later data correctly",
765+
DecodeError::BadLengthDescriptor => "A length descriptor in the packet didn't describe the later correctly",
673766
DecodeError::Io(ref e) => e.description(),
674767
}
675768
}
@@ -1134,7 +1227,7 @@ impl<R: Read> Readable<R> for ErrorMessage {
11341227
sz = cmp::min(data_len, sz);
11351228
match String::from_utf8(data[..sz as usize].to_vec()) {
11361229
Ok(s) => s,
1137-
Err(_) => return Err(DecodeError::InvalidValue),
1230+
Err(_) => return Err(DecodeError::InvalidValue ),
11381231
}
11391232
}
11401233
})
@@ -1150,38 +1243,17 @@ impl Writeable for UnsignedNodeAnnouncement {
11501243
w.write_all(&self.rgb)?;
11511244
self.alias.write(w)?;
11521245

1153-
let mut addr_slice = Vec::with_capacity(self.addresses.len() * 18);
11541246
let mut addrs_to_encode = self.addresses.clone();
11551247
addrs_to_encode.sort_unstable_by(|a, b| { a.get_id().cmp(&b.get_id()) });
11561248
addrs_to_encode.dedup_by(|a, b| { a.get_id() == b.get_id() });
1157-
for addr in addrs_to_encode.iter() {
1158-
match addr {
1159-
&NetAddress::IPv4{addr, port} => {
1160-
addr_slice.push(1);
1161-
addr_slice.extend_from_slice(&addr);
1162-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1163-
},
1164-
&NetAddress::IPv6{addr, port} => {
1165-
addr_slice.push(2);
1166-
addr_slice.extend_from_slice(&addr);
1167-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1168-
},
1169-
&NetAddress::OnionV2{addr, port} => {
1170-
addr_slice.push(3);
1171-
addr_slice.extend_from_slice(&addr);
1172-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1173-
},
1174-
&NetAddress::OnionV3{ed25519_pubkey, checksum, version, port} => {
1175-
addr_slice.push(4);
1176-
addr_slice.extend_from_slice(&ed25519_pubkey);
1177-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(checksum));
1178-
addr_slice.push(version);
1179-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1180-
},
1181-
}
1249+
let mut addr_len = 0;
1250+
for addr in &addrs_to_encode {
1251+
addr_len += 1 + addr.len();
1252+
}
1253+
(addr_len + self.excess_address_data.len() as u16).write(w)?;
1254+
for addr in addrs_to_encode {
1255+
addr.write(w)?;
11821256
}
1183-
((addr_slice.len() + self.excess_address_data.len()) as u16).write(w)?;
1184-
w.write_all(&addr_slice[..])?;
11851257
w.write_all(&self.excess_address_data[..])?;
11861258
w.write_all(&self.excess_data[..])?;
11871259
Ok(())
@@ -1200,112 +1272,77 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
12001272
r.read_exact(&mut rgb)?;
12011273
let alias: [u8; 32] = Readable::read(r)?;
12021274

1203-
let addrlen: u16 = Readable::read(r)?;
1275+
let addr_len: u16 = Readable::read(r)?;
1276+
let mut addresses: Vec<NetAddress> = Vec::with_capacity(4);
12041277
let mut addr_readpos = 0;
1205-
let mut addresses = Vec::with_capacity(4);
1206-
let mut f: u8 = 0;
1207-
let mut excess = 0;
1278+
let mut excess = false;
1279+
let mut excess_byte = 0;
12081280
loop {
1209-
if addrlen <= addr_readpos { break; }
1210-
f = Readable::read(r)?;
1211-
match f {
1212-
1 => {
1213-
if addresses.len() > 0 {
1214-
return Err(DecodeError::ExtraAddressesPerType);
1215-
}
1216-
if addrlen < addr_readpos + 1 + 6 {
1217-
return Err(DecodeError::BadLengthDescriptor);
1218-
}
1219-
addresses.push(NetAddress::IPv4 {
1220-
addr: {
1221-
let mut addr = [0; 4];
1222-
r.read_exact(&mut addr)?;
1223-
addr
1281+
if addr_len < addr_readpos { break; }
1282+
match Readable::read(r) {
1283+
Ok(addr) => {
1284+
match addr {
1285+
NetAddress::IPv4 { .. } => {
1286+
if addresses.len() > 0 {
1287+
return Err(DecodeError::ExtraAddressesPerType);
1288+
}
12241289
},
1225-
port: Readable::read(r)?,
1226-
});
1227-
addr_readpos += 1 + 6
1228-
},
1229-
2 => {
1230-
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1231-
return Err(DecodeError::ExtraAddressesPerType);
1232-
}
1233-
if addrlen < addr_readpos + 1 + 18 {
1234-
return Err(DecodeError::BadLengthDescriptor);
1235-
}
1236-
addresses.push(NetAddress::IPv6 {
1237-
addr: {
1238-
let mut addr = [0; 16];
1239-
r.read_exact(&mut addr)?;
1240-
addr
1290+
NetAddress::IPv6 { .. } => {
1291+
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1292+
return Err(DecodeError::ExtraAddressesPerType);
1293+
}
12411294
},
1242-
port: Readable::read(r)?,
1243-
});
1244-
addr_readpos += 1 + 18
1245-
},
1246-
3 => {
1247-
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1248-
return Err(DecodeError::ExtraAddressesPerType);
1249-
}
1250-
if addrlen < addr_readpos + 1 + 12 {
1251-
return Err(DecodeError::BadLengthDescriptor);
1252-
}
1253-
addresses.push(NetAddress::OnionV2 {
1254-
addr: {
1255-
let mut addr = [0; 10];
1256-
r.read_exact(&mut addr)?;
1257-
addr
1295+
NetAddress::OnionV2 { .. } => {
1296+
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1297+
return Err(DecodeError::ExtraAddressesPerType);
1298+
}
12581299
},
1259-
port: Readable::read(r)?,
1260-
});
1261-
addr_readpos += 1 + 12
1262-
},
1263-
4 => {
1264-
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1265-
return Err(DecodeError::ExtraAddressesPerType);
1300+
NetAddress::OnionV3 { .. } => {
1301+
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1302+
return Err(DecodeError::ExtraAddressesPerType);
1303+
}
1304+
},
1305+
NetAddress::Unknown { descriptor } => {
1306+
excess = true;
1307+
excess_byte = descriptor;
1308+
break;
1309+
}
12661310
}
1267-
if addrlen < addr_readpos + 1 + 37 {
1311+
if addr_len < addr_readpos + 1 + addr.len() {
12681312
return Err(DecodeError::BadLengthDescriptor);
12691313
}
1270-
addresses.push(NetAddress::OnionV3 {
1271-
ed25519_pubkey: Readable::read(r)?,
1272-
checksum: Readable::read(r)?,
1273-
version: Readable::read(r)?,
1274-
port: Readable::read(r)?,
1275-
});
1276-
addr_readpos += 1 + 37
1314+
addr_readpos += (1 + addr.len()) as u16;
1315+
addresses.push(addr);
12771316
},
1278-
_ => { excess = 1; break; }
1317+
Err(DecodeError::ShortRead) => return Err(DecodeError::BadLengthDescriptor),
1318+
_ => unreachable!(),
12791319
}
12801320
}
12811321

12821322
let mut excess_data = vec![];
1283-
let excess_address_data = if addr_readpos < addrlen {
1284-
let mut excess_address_data = vec![0; (addrlen - addr_readpos) as usize];
1285-
r.read_exact(&mut excess_address_data[excess..])?;
1286-
if excess == 1 {
1287-
excess_address_data[0] = f;
1323+
let excess_address_data = if addr_readpos < addr_len {
1324+
let mut excess_address_data = vec![0; (addr_len - addr_readpos) as usize];
1325+
r.read_exact(&mut excess_address_data[if excess { 1 } else { 0 }..])?;
1326+
if excess {
1327+
excess_address_data[0] = excess_byte;
12881328
}
12891329
excess_address_data
12901330
} else {
1291-
if excess == 1 {
1292-
excess_data.push(f);
1331+
if excess {
1332+
excess_data.push(excess_byte);
12931333
}
12941334
Vec::new()
12951335
};
1296-
1336+
r.read_to_end(&mut excess_data)?;
12971337
Ok(UnsignedNodeAnnouncement {
1298-
features: features,
1299-
timestamp: timestamp,
1300-
node_id: node_id,
1301-
rgb: rgb,
1302-
alias: alias,
1303-
addresses: addresses,
1304-
excess_address_data: excess_address_data,
1305-
excess_data: {
1306-
r.read_to_end(&mut excess_data)?;
1307-
excess_data
1308-
},
1338+
features,
1339+
timestamp,
1340+
node_id,
1341+
rgb,
1342+
alias,
1343+
addresses,
1344+
excess_address_data,
1345+
excess_data,
13091346
})
13101347
}
13111348
}

0 commit comments

Comments
 (0)