@@ -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 } ;
@@ -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 {
@@ -382,9 +381,84 @@ impl NetAddress {
382
381
& NetAddress :: OnionV3 { ..} => { 4 } ,
383
382
}
384
383
}
384
+
385
+ /// Strict byte-length of address descriptor, 1-byte type not recorded
386
+ fn len ( & self ) -> u16 {
387
+ match self {
388
+ & NetAddress :: IPv4 { .. } => { 6 } ,
389
+ & NetAddress :: IPv6 { .. } => { 18 } ,
390
+ & NetAddress :: OnionV2 { .. } => { 12 } ,
391
+ & NetAddress :: OnionV3 { .. } => { 37 } ,
392
+ }
393
+ }
385
394
}
386
395
387
- #[ derive( Clone ) ]
396
+ impl Writeable for NetAddress {
397
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
398
+ match self {
399
+ & NetAddress :: IPv4 { ref addr, ref port } => {
400
+ 1u8 . write ( writer) ?;
401
+ addr. write ( writer) ?;
402
+ port. write ( writer) ?;
403
+ } ,
404
+ & NetAddress :: IPv6 { ref addr, ref port } => {
405
+ 2u8 . write ( writer) ?;
406
+ addr. write ( writer) ?;
407
+ port. write ( writer) ?;
408
+ } ,
409
+ & NetAddress :: OnionV2 { ref addr, ref port } => {
410
+ 3u8 . write ( writer) ?;
411
+ addr. write ( writer) ?;
412
+ port. write ( writer) ?;
413
+ } ,
414
+ & NetAddress :: OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
415
+ 4u8 . write ( writer) ?;
416
+ ed25519_pubkey. write ( writer) ?;
417
+ checksum. write ( writer) ?;
418
+ version. write ( writer) ?;
419
+ port. write ( writer) ?;
420
+ }
421
+ }
422
+ Ok ( ( ) )
423
+ }
424
+ }
425
+
426
+ impl < R : :: std:: io:: Read > Readable < R > for Result < NetAddress , u8 > {
427
+ fn read ( reader : & mut R ) -> Result < Result < NetAddress , u8 > , DecodeError > {
428
+ let byte = <u8 as Readable < R > >:: read ( reader) ?;
429
+ match byte {
430
+ 1 => {
431
+ Ok ( Ok ( NetAddress :: IPv4 {
432
+ addr : Readable :: read ( reader) ?,
433
+ port : Readable :: read ( reader) ?,
434
+ } ) )
435
+ } ,
436
+ 2 => {
437
+ Ok ( Ok ( NetAddress :: IPv6 {
438
+ addr : Readable :: read ( reader) ?,
439
+ port : Readable :: read ( reader) ?,
440
+ } ) )
441
+ } ,
442
+ 3 => {
443
+ Ok ( Ok ( NetAddress :: OnionV2 {
444
+ addr : Readable :: read ( reader) ?,
445
+ port : Readable :: read ( reader) ?,
446
+ } ) )
447
+ } ,
448
+ 4 => {
449
+ Ok ( Ok ( NetAddress :: OnionV3 {
450
+ ed25519_pubkey : Readable :: read ( reader) ?,
451
+ checksum : Readable :: read ( reader) ?,
452
+ version : Readable :: read ( reader) ?,
453
+ port : Readable :: read ( reader) ?,
454
+ } ) )
455
+ } ,
456
+ _ => return Ok ( Err ( byte) ) ,
457
+ }
458
+ }
459
+ }
460
+
461
+ #[ derive( PartialEq , Clone ) ]
388
462
// Only exposed as broadcast of node_announcement should be filtered by node_id
389
463
/// The unsigned part of a node_announcement
390
464
pub struct UnsignedNodeAnnouncement {
@@ -401,7 +475,7 @@ pub struct UnsignedNodeAnnouncement {
401
475
pub ( crate ) excess_address_data : Vec < u8 > ,
402
476
pub ( crate ) excess_data : Vec < u8 > ,
403
477
}
404
- #[ derive( Clone ) ]
478
+ #[ derive( PartialEq , Clone ) ]
405
479
/// A node_announcement message to be sent or received from a peer
406
480
pub struct NodeAnnouncement {
407
481
pub ( crate ) signature : Signature ,
@@ -1192,38 +1266,17 @@ impl Writeable for UnsignedNodeAnnouncement {
1192
1266
w. write_all ( & self . rgb ) ?;
1193
1267
self . alias . write ( w) ?;
1194
1268
1195
- let mut addr_slice = Vec :: with_capacity ( self . addresses . len ( ) * 18 ) ;
1196
1269
let mut addrs_to_encode = self . addresses . clone ( ) ;
1197
1270
addrs_to_encode. sort_unstable_by ( |a, b| { a. get_id ( ) . cmp ( & b. get_id ( ) ) } ) ;
1198
1271
addrs_to_encode. dedup_by ( |a, b| { a. get_id ( ) == b. get_id ( ) } ) ;
1199
- for addr in addrs_to_encode. iter ( ) {
1200
- match addr {
1201
- & NetAddress :: IPv4 { addr, port} => {
1202
- addr_slice. push ( 1 ) ;
1203
- addr_slice. extend_from_slice ( & addr) ;
1204
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1205
- } ,
1206
- & NetAddress :: IPv6 { addr, port} => {
1207
- addr_slice. push ( 2 ) ;
1208
- addr_slice. extend_from_slice ( & addr) ;
1209
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1210
- } ,
1211
- & NetAddress :: OnionV2 { addr, port} => {
1212
- addr_slice. push ( 3 ) ;
1213
- addr_slice. extend_from_slice ( & addr) ;
1214
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1215
- } ,
1216
- & NetAddress :: OnionV3 { ed25519_pubkey, checksum, version, port} => {
1217
- addr_slice. push ( 4 ) ;
1218
- addr_slice. extend_from_slice ( & ed25519_pubkey) ;
1219
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( checksum) ) ;
1220
- addr_slice. push ( version) ;
1221
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1222
- } ,
1223
- }
1272
+ let mut addr_len = 0 ;
1273
+ for addr in & addrs_to_encode {
1274
+ addr_len += 1 + addr. len ( ) ;
1275
+ }
1276
+ ( addr_len + self . excess_address_data . len ( ) as u16 ) . write ( w) ?;
1277
+ for addr in addrs_to_encode {
1278
+ addr. write ( w) ?;
1224
1279
}
1225
- ( ( addr_slice. len ( ) + self . excess_address_data . len ( ) ) as u16 ) . write ( w) ?;
1226
- w. write_all ( & addr_slice[ ..] ) ?;
1227
1280
w. write_all ( & self . excess_address_data [ ..] ) ?;
1228
1281
w. write_all ( & self . excess_data [ ..] ) ?;
1229
1282
Ok ( ( ) )
@@ -1242,112 +1295,77 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
1242
1295
r. read_exact ( & mut rgb) ?;
1243
1296
let alias: [ u8 ; 32 ] = Readable :: read ( r) ?;
1244
1297
1245
- let addrlen: u16 = Readable :: read ( r) ?;
1298
+ let addr_len: u16 = Readable :: read ( r) ?;
1299
+ let mut addresses: Vec < NetAddress > = Vec :: with_capacity ( 4 ) ;
1246
1300
let mut addr_readpos = 0 ;
1247
- let mut addresses = Vec :: with_capacity ( 4 ) ;
1248
- let mut f: u8 = 0 ;
1249
- let mut excess = 0 ;
1301
+ let mut excess = false ;
1302
+ let mut excess_byte = 0 ;
1250
1303
loop {
1251
- if addrlen <= addr_readpos { break ; }
1252
- f = Readable :: read ( r) ?;
1253
- match f {
1254
- 1 => {
1255
- if addresses. len ( ) > 0 {
1256
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1257
- }
1258
- if addrlen < addr_readpos + 1 + 6 {
1259
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1260
- }
1261
- addresses. push ( NetAddress :: IPv4 {
1262
- addr : {
1263
- let mut addr = [ 0 ; 4 ] ;
1264
- r. read_exact ( & mut addr) ?;
1265
- addr
1304
+ if addr_len <= addr_readpos { break ; }
1305
+ match Readable :: read ( r) {
1306
+ Ok ( Ok ( addr) ) => {
1307
+ match addr {
1308
+ NetAddress :: IPv4 { .. } => {
1309
+ if addresses. len ( ) > 0 {
1310
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1311
+ }
1266
1312
} ,
1267
- port : Readable :: read ( r) ?,
1268
- } ) ;
1269
- addr_readpos += 1 + 6
1270
- } ,
1271
- 2 => {
1272
- if addresses. len ( ) > 1 || ( addresses. len ( ) == 1 && addresses[ 0 ] . get_id ( ) != 1 ) {
1273
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1274
- }
1275
- if addrlen < addr_readpos + 1 + 18 {
1276
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1277
- }
1278
- addresses. push ( NetAddress :: IPv6 {
1279
- addr : {
1280
- let mut addr = [ 0 ; 16 ] ;
1281
- r. read_exact ( & mut addr) ?;
1282
- addr
1313
+ NetAddress :: IPv6 { .. } => {
1314
+ if addresses. len ( ) > 1 || ( addresses. len ( ) == 1 && addresses[ 0 ] . get_id ( ) != 1 ) {
1315
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1316
+ }
1283
1317
} ,
1284
- port : Readable :: read ( r) ?,
1285
- } ) ;
1286
- addr_readpos += 1 + 18
1287
- } ,
1288
- 3 => {
1289
- if addresses. len ( ) > 2 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 2 ) {
1290
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1291
- }
1292
- if addrlen < addr_readpos + 1 + 12 {
1293
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1294
- }
1295
- addresses. push ( NetAddress :: OnionV2 {
1296
- addr : {
1297
- let mut addr = [ 0 ; 10 ] ;
1298
- r. read_exact ( & mut addr) ?;
1299
- addr
1318
+ NetAddress :: OnionV2 { .. } => {
1319
+ if addresses. len ( ) > 2 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 2 ) {
1320
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1321
+ }
1322
+ } ,
1323
+ NetAddress :: OnionV3 { .. } => {
1324
+ if addresses. len ( ) > 3 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 3 ) {
1325
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1326
+ }
1300
1327
} ,
1301
- port : Readable :: read ( r) ?,
1302
- } ) ;
1303
- addr_readpos += 1 + 12
1304
- } ,
1305
- 4 => {
1306
- if addresses. len ( ) > 3 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 3 ) {
1307
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1308
1328
}
1309
- if addrlen < addr_readpos + 1 + 37 {
1329
+ if addr_len < addr_readpos + 1 + addr . len ( ) {
1310
1330
return Err ( DecodeError :: BadLengthDescriptor ) ;
1311
1331
}
1312
- addresses. push ( NetAddress :: OnionV3 {
1313
- ed25519_pubkey : Readable :: read ( r) ?,
1314
- checksum : Readable :: read ( r) ?,
1315
- version : Readable :: read ( r) ?,
1316
- port : Readable :: read ( r) ?,
1317
- } ) ;
1318
- addr_readpos += 1 + 37
1332
+ addr_readpos += ( 1 + addr. len ( ) ) as u16 ;
1333
+ addresses. push ( addr) ;
1319
1334
} ,
1320
- _ => { excess = 1 ; break ; }
1335
+ Ok ( Err ( unknown_descriptor) ) => {
1336
+ excess = true ;
1337
+ excess_byte = unknown_descriptor;
1338
+ break ;
1339
+ } ,
1340
+ Err ( DecodeError :: ShortRead ) => return Err ( DecodeError :: BadLengthDescriptor ) ,
1341
+ Err ( e) => return Err ( e) ,
1321
1342
}
1322
1343
}
1323
1344
1324
1345
let mut excess_data = vec ! [ ] ;
1325
- let excess_address_data = if addr_readpos < addrlen {
1326
- let mut excess_address_data = vec ! [ 0 ; ( addrlen - addr_readpos) as usize ] ;
1327
- r. read_exact ( & mut excess_address_data[ excess..] ) ?;
1328
- if excess == 1 {
1329
- excess_address_data[ 0 ] = f ;
1346
+ let excess_address_data = if addr_readpos < addr_len {
1347
+ let mut excess_address_data = vec ! [ 0 ; ( addr_len - addr_readpos) as usize ] ;
1348
+ r. read_exact ( & mut excess_address_data[ if excess { 1 } else { 0 } ..] ) ?;
1349
+ if excess {
1350
+ excess_address_data[ 0 ] = excess_byte ;
1330
1351
}
1331
1352
excess_address_data
1332
1353
} else {
1333
- if excess == 1 {
1334
- excess_data. push ( f ) ;
1354
+ if excess {
1355
+ excess_data. push ( excess_byte ) ;
1335
1356
}
1336
1357
Vec :: new ( )
1337
1358
} ;
1338
-
1359
+ r . read_to_end ( & mut excess_data ) ? ;
1339
1360
Ok ( UnsignedNodeAnnouncement {
1340
- features : features,
1341
- timestamp : timestamp,
1342
- node_id : node_id,
1343
- rgb : rgb,
1344
- alias : alias,
1345
- addresses : addresses,
1346
- excess_address_data : excess_address_data,
1347
- excess_data : {
1348
- r. read_to_end ( & mut excess_data) ?;
1349
- excess_data
1350
- } ,
1361
+ features,
1362
+ timestamp,
1363
+ node_id,
1364
+ rgb,
1365
+ alias,
1366
+ addresses,
1367
+ excess_address_data,
1368
+ excess_data,
1351
1369
} )
1352
1370
}
1353
1371
}
0 commit comments