@@ -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,95 @@ 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
+ /// If address is unknown, we give back a len of 0
387
+ fn len ( & self ) -> u16 {
388
+ match self {
389
+ & NetAddress :: IPv4 { .. } => { 6 } ,
390
+ & NetAddress :: IPv6 { .. } => { 18 } ,
391
+ & NetAddress :: OnionV2 { .. } => { 12 } ,
392
+ & NetAddress :: OnionV3 { .. } => { 37 } ,
393
+ }
394
+ }
385
395
}
386
396
387
- #[ derive( Clone ) ]
397
+ impl Writeable for NetAddress {
398
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
399
+ match self {
400
+ & NetAddress :: IPv4 { ref addr, ref port } => {
401
+ 1u8 . write ( writer) ?;
402
+ addr. write ( writer) ?;
403
+ port. write ( writer) ?;
404
+ } ,
405
+ & NetAddress :: IPv6 { ref addr, ref port } => {
406
+ 2u8 . write ( writer) ?;
407
+ addr. write ( writer) ?;
408
+ port. write ( writer) ?;
409
+ } ,
410
+ & NetAddress :: OnionV2 { ref addr, ref port } => {
411
+ 3u8 . write ( writer) ?;
412
+ addr. write ( writer) ?;
413
+ port. write ( writer) ?;
414
+ } ,
415
+ & NetAddress :: OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
416
+ 4u8 . write ( writer) ?;
417
+ ed25519_pubkey. write ( writer) ?;
418
+ checksum. write ( writer) ?;
419
+ version. write ( writer) ?;
420
+ port. write ( writer) ?;
421
+ }
422
+ }
423
+ Ok ( ( ) )
424
+ }
425
+ }
426
+
427
+ impl < R : :: std:: io:: Read > Readable < R > for Result < NetAddress , u8 > {
428
+ fn read ( reader : & mut R ) -> Result < Result < NetAddress , u8 > , DecodeError > {
429
+ let byte = <u8 as Readable < R > >:: read ( reader) ?;
430
+ match byte {
431
+ 1 => {
432
+ let addr = Readable :: read ( reader) ?;
433
+ let port = Readable :: read ( reader) ?;
434
+ Ok ( Ok ( NetAddress :: IPv4 {
435
+ addr,
436
+ port,
437
+ } ) )
438
+ } ,
439
+ 2 => {
440
+ let addr = Readable :: read ( reader) ?;
441
+ let port = Readable :: read ( reader) ?;
442
+ Ok ( Ok ( NetAddress :: IPv6 {
443
+ addr,
444
+ port,
445
+ } ) )
446
+ } ,
447
+ 3 => {
448
+ let addr = Readable :: read ( reader) ?;
449
+ let port = Readable :: read ( reader) ?;
450
+ Ok ( Ok ( NetAddress :: OnionV2 {
451
+ addr,
452
+ port,
453
+ } ) )
454
+ } ,
455
+ 4 => {
456
+ let ed25519_pubkey = Readable :: read ( reader) ?;
457
+ let checksum = Readable :: read ( reader) ?;
458
+ let version = Readable :: read ( reader) ?;
459
+ let port = Readable :: read ( reader) ?;
460
+ Ok ( Ok ( NetAddress :: OnionV3 {
461
+ ed25519_pubkey,
462
+ checksum,
463
+ version,
464
+ port,
465
+ } ) )
466
+ } ,
467
+ _ => return Ok ( Err ( byte) ) ,
468
+ }
469
+ }
470
+ }
471
+
472
+ #[ derive( PartialEq , Clone ) ]
388
473
// Only exposed as broadcast of node_announcement should be filtered by node_id
389
474
/// The unsigned part of a node_announcement
390
475
pub struct UnsignedNodeAnnouncement {
@@ -401,7 +486,7 @@ pub struct UnsignedNodeAnnouncement {
401
486
pub ( crate ) excess_address_data : Vec < u8 > ,
402
487
pub ( crate ) excess_data : Vec < u8 > ,
403
488
}
404
- #[ derive( Clone ) ]
489
+ #[ derive( PartialEq , Clone ) ]
405
490
/// A node_announcement message to be sent or received from a peer
406
491
pub struct NodeAnnouncement {
407
492
pub ( crate ) signature : Signature ,
@@ -669,7 +754,7 @@ impl Error for DecodeError {
669
754
DecodeError :: InvalidValue => "Nonsense bytes didn't map to the type they were interpreted as" ,
670
755
DecodeError :: ShortRead => "Packet extended beyond the provided bytes" ,
671
756
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" ,
757
+ DecodeError :: BadLengthDescriptor => "A length descriptor in the packet didn't describe the later correctly" ,
673
758
DecodeError :: Io ( ref e) => e. description ( ) ,
674
759
}
675
760
}
@@ -1134,7 +1219,7 @@ impl<R: Read> Readable<R> for ErrorMessage {
1134
1219
sz = cmp:: min ( data_len, sz) ;
1135
1220
match String :: from_utf8 ( data[ ..sz as usize ] . to_vec ( ) ) {
1136
1221
Ok ( s) => s,
1137
- Err ( _) => return Err ( DecodeError :: InvalidValue ) ,
1222
+ Err ( _) => return Err ( DecodeError :: InvalidValue ) ,
1138
1223
}
1139
1224
}
1140
1225
} )
@@ -1150,38 +1235,17 @@ impl Writeable for UnsignedNodeAnnouncement {
1150
1235
w. write_all ( & self . rgb ) ?;
1151
1236
self . alias . write ( w) ?;
1152
1237
1153
- let mut addr_slice = Vec :: with_capacity ( self . addresses . len ( ) * 18 ) ;
1154
1238
let mut addrs_to_encode = self . addresses . clone ( ) ;
1155
1239
addrs_to_encode. sort_unstable_by ( |a, b| { a. get_id ( ) . cmp ( & b. get_id ( ) ) } ) ;
1156
1240
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
- }
1241
+ let mut addr_len = 0 ;
1242
+ for addr in & addrs_to_encode {
1243
+ addr_len += 1 + addr. len ( ) ;
1244
+ }
1245
+ ( addr_len + self . excess_address_data . len ( ) as u16 ) . write ( w) ?;
1246
+ for addr in addrs_to_encode {
1247
+ addr. write ( w) ?;
1182
1248
}
1183
- ( ( addr_slice. len ( ) + self . excess_address_data . len ( ) ) as u16 ) . write ( w) ?;
1184
- w. write_all ( & addr_slice[ ..] ) ?;
1185
1249
w. write_all ( & self . excess_address_data [ ..] ) ?;
1186
1250
w. write_all ( & self . excess_data [ ..] ) ?;
1187
1251
Ok ( ( ) )
@@ -1200,112 +1264,81 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
1200
1264
r. read_exact ( & mut rgb) ?;
1201
1265
let alias: [ u8 ; 32 ] = Readable :: read ( r) ?;
1202
1266
1203
- let addrlen: u16 = Readable :: read ( r) ?;
1267
+ let addr_len: u16 = Readable :: read ( r) ?;
1268
+ let mut addresses: Vec < NetAddress > = Vec :: with_capacity ( 4 ) ;
1204
1269
let mut addr_readpos = 0 ;
1205
- let mut addresses = Vec :: with_capacity ( 4 ) ;
1206
- let mut f: u8 = 0 ;
1207
- let mut excess = 0 ;
1270
+ let mut excess = false ;
1271
+ let mut excess_byte = 0 ;
1208
1272
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
1224
- } ,
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 ) ;
1273
+ if addr_len < addr_readpos { break ; }
1274
+ match Readable :: read ( r) {
1275
+ Ok ( res) => {
1276
+ match res {
1277
+ Ok ( addr) => {
1278
+ match addr {
1279
+ NetAddress :: IPv4 { .. } => {
1280
+ if addresses. len ( ) > 0 {
1281
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1282
+ }
1283
+ } ,
1284
+ NetAddress :: IPv6 { .. } => {
1285
+ if addresses. len ( ) > 1 || ( addresses. len ( ) == 1 && addresses[ 0 ] . get_id ( ) != 1 ) {
1286
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1287
+ }
1288
+ } ,
1289
+ NetAddress :: OnionV2 { .. } => {
1290
+ if addresses. len ( ) > 2 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 2 ) {
1291
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1292
+ }
1293
+ } ,
1294
+ NetAddress :: OnionV3 { .. } => {
1295
+ if addresses. len ( ) > 3 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 3 ) {
1296
+ return Err ( DecodeError :: ExtraAddressesPerType ) ;
1297
+ }
1298
+ } ,
1299
+ }
1300
+ if addr_len < addr_readpos + 1 + addr. len ( ) {
1301
+ return Err ( DecodeError :: BadLengthDescriptor ) ;
1302
+ }
1303
+ addr_readpos += ( 1 + addr. len ( ) ) as u16 ;
1304
+ addresses. push ( addr) ;
1305
+ }
1306
+ Err ( unknown_descriptor) => {
1307
+ excess = true ;
1308
+ excess_byte = unknown_descriptor;
1309
+ break ;
1310
+ }
1232
1311
}
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
1241
- } ,
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
1258
- } ,
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 ) ;
1266
- }
1267
- if addrlen < addr_readpos + 1 + 37 {
1268
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1269
- }
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
1277
1312
} ,
1278
- _ => { excess = 1 ; break ; }
1313
+ Err ( DecodeError :: ShortRead ) => return Err ( DecodeError :: BadLengthDescriptor ) ,
1314
+ _ => unreachable ! ( ) ,
1279
1315
}
1280
1316
}
1281
1317
1282
1318
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 ;
1319
+ let excess_address_data = if addr_readpos < addr_len {
1320
+ let mut excess_address_data = vec ! [ 0 ; ( addr_len - addr_readpos) as usize ] ;
1321
+ r. read_exact ( & mut excess_address_data[ if excess { 1 } else { 0 } ..] ) ?;
1322
+ if excess {
1323
+ excess_address_data[ 0 ] = excess_byte ;
1288
1324
}
1289
1325
excess_address_data
1290
1326
} else {
1291
- if excess == 1 {
1292
- excess_data. push ( f ) ;
1327
+ if excess {
1328
+ excess_data. push ( excess_byte ) ;
1293
1329
}
1294
1330
Vec :: new ( )
1295
1331
} ;
1296
-
1332
+ r . read_to_end ( & mut excess_data ) ? ;
1297
1333
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
- } ,
1334
+ features,
1335
+ timestamp,
1336
+ node_id,
1337
+ rgb,
1338
+ alias,
1339
+ addresses,
1340
+ excess_address_data,
1341
+ excess_data,
1309
1342
} )
1310
1343
}
1311
1344
}
0 commit comments