@@ -26,7 +26,7 @@ use std::{cmp, fmt};
26
26
use std:: io:: Read ;
27
27
use std:: result:: Result ;
28
28
29
- use util:: { byte_utils , events} ;
29
+ use util:: events;
30
30
use util:: ser:: { Readable , Writeable , Writer } ;
31
31
32
32
use ln:: channelmanager:: { PaymentPreimage , PaymentHash } ;
@@ -35,7 +35,7 @@ use ln::channelmanager::{PaymentPreimage, PaymentHash};
35
35
#[ derive( Debug ) ]
36
36
pub enum DecodeError {
37
37
/// 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
39
39
UnknownVersion ,
40
40
/// Unknown feature mandating we fail to parse message
41
41
UnknownRequiredFeature ,
@@ -47,7 +47,6 @@ pub enum DecodeError {
47
47
/// node_announcement included more than one address of a given type!
48
48
ExtraAddressesPerType ,
49
49
/// A length descriptor in the packet didn't describe the later data correctly
50
- /// (currently only generated in node_announcement)
51
50
BadLengthDescriptor ,
52
51
/// Error from std::io
53
52
Io ( :: std:: io:: Error ) ,
@@ -336,7 +335,7 @@ pub struct AnnouncementSignatures {
336
335
}
337
336
338
337
/// An address which can be used to connect to a remote peer
339
- #[ derive( Clone ) ]
338
+ #[ derive( PartialEq , Clone ) ]
340
339
pub enum NetAddress {
341
340
/// An IPv4 address/port on which the peer is listenting.
342
341
IPv4 {
@@ -372,6 +371,12 @@ pub enum NetAddress {
372
371
/// The port on which the node is listenting
373
372
port : u16 ,
374
373
} ,
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
+ } ,
375
380
}
376
381
impl NetAddress {
377
382
fn get_id ( & self ) -> u8 {
@@ -380,11 +385,99 @@ impl NetAddress {
380
385
& NetAddress :: IPv6 { ..} => { 2 } ,
381
386
& NetAddress :: OnionV2 { ..} => { 3 } ,
382
387
& 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) } ,
383
400
}
384
401
}
385
402
}
386
403
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 ) ]
388
481
// Only exposed as broadcast of node_announcement should be filtered by node_id
389
482
/// The unsigned part of a node_announcement
390
483
pub struct UnsignedNodeAnnouncement {
@@ -401,7 +494,7 @@ pub struct UnsignedNodeAnnouncement {
401
494
pub ( crate ) excess_address_data : Vec < u8 > ,
402
495
pub ( crate ) excess_data : Vec < u8 > ,
403
496
}
404
- #[ derive( Clone ) ]
497
+ #[ derive( PartialEq , Clone ) ]
405
498
/// A node_announcement message to be sent or received from a peer
406
499
pub struct NodeAnnouncement {
407
500
pub ( crate ) signature : Signature ,
@@ -669,7 +762,7 @@ impl Error for DecodeError {
669
762
DecodeError :: InvalidValue => "Nonsense bytes didn't map to the type they were interpreted as" ,
670
763
DecodeError :: ShortRead => "Packet extended beyond the provided bytes" ,
671
764
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" ,
673
766
DecodeError :: Io ( ref e) => e. description ( ) ,
674
767
}
675
768
}
@@ -1134,7 +1227,7 @@ impl<R: Read> Readable<R> for ErrorMessage {
1134
1227
sz = cmp:: min ( data_len, sz) ;
1135
1228
match String :: from_utf8 ( data[ ..sz as usize ] . to_vec ( ) ) {
1136
1229
Ok ( s) => s,
1137
- Err ( _) => return Err ( DecodeError :: InvalidValue ) ,
1230
+ Err ( _) => return Err ( DecodeError :: InvalidValue ) ,
1138
1231
}
1139
1232
}
1140
1233
} )
@@ -1150,38 +1243,17 @@ impl Writeable for UnsignedNodeAnnouncement {
1150
1243
w. write_all ( & self . rgb ) ?;
1151
1244
self . alias . write ( w) ?;
1152
1245
1153
- let mut addr_slice = Vec :: with_capacity ( self . addresses . len ( ) * 18 ) ;
1154
1246
let mut addrs_to_encode = self . addresses . clone ( ) ;
1155
1247
addrs_to_encode. sort_unstable_by ( |a, b| { a. get_id ( ) . cmp ( & b. get_id ( ) ) } ) ;
1156
1248
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) ?;
1182
1256
}
1183
- ( ( addr_slice. len ( ) + self . excess_address_data . len ( ) ) as u16 ) . write ( w) ?;
1184
- w. write_all ( & addr_slice[ ..] ) ?;
1185
1257
w. write_all ( & self . excess_address_data [ ..] ) ?;
1186
1258
w. write_all ( & self . excess_data [ ..] ) ?;
1187
1259
Ok ( ( ) )
@@ -1200,112 +1272,77 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
1200
1272
r. read_exact ( & mut rgb) ?;
1201
1273
let alias: [ u8 ; 32 ] = Readable :: read ( r) ?;
1202
1274
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 ) ;
1204
1277
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 ;
1208
1280
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
+ }
1224
1289
} ,
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
+ }
1241
1294
} ,
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
+ }
1258
1299
} ,
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
+ }
1266
1310
}
1267
- if addrlen < addr_readpos + 1 + 37 {
1311
+ if addr_len < addr_readpos + 1 + addr . len ( ) {
1268
1312
return Err ( DecodeError :: BadLengthDescriptor ) ;
1269
1313
}
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) ;
1277
1316
} ,
1278
- _ => { excess = 1 ; break ; }
1317
+ Err ( DecodeError :: ShortRead ) => return Err ( DecodeError :: BadLengthDescriptor ) ,
1318
+ _ => unreachable ! ( ) ,
1279
1319
}
1280
1320
}
1281
1321
1282
1322
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 ;
1288
1328
}
1289
1329
excess_address_data
1290
1330
} else {
1291
- if excess == 1 {
1292
- excess_data. push ( f ) ;
1331
+ if excess {
1332
+ excess_data. push ( excess_byte ) ;
1293
1333
}
1294
1334
Vec :: new ( )
1295
1335
} ;
1296
-
1336
+ r . read_to_end ( & mut excess_data ) ? ;
1297
1337
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,
1309
1346
} )
1310
1347
}
1311
1348
}
0 commit comments