@@ -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
/// An error in decoding a message or struct.
@@ -334,7 +334,7 @@ pub struct AnnouncementSignatures {
334
334
}
335
335
336
336
/// An address which can be used to connect to a remote peer
337
- #[ derive( Clone ) ]
337
+ #[ derive( PartialEq , Clone ) ]
338
338
pub enum NetAddress {
339
339
/// An IPv4 address/port on which the peer is listenting.
340
340
IPv4 {
@@ -382,7 +382,81 @@ impl NetAddress {
382
382
}
383
383
}
384
384
385
- #[ derive( Clone ) ]
385
+ impl Writeable for NetAddress {
386
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
387
+ match self {
388
+ & NetAddress :: IPv4 { ref addr, ref port } => {
389
+ 0u8 . write ( writer) ?;
390
+ addr. write ( writer) ?;
391
+ port. write ( writer) ?;
392
+ } ,
393
+ & NetAddress :: IPv6 { ref addr, ref port } => {
394
+ 1u8 . write ( writer) ?;
395
+ addr. write ( writer) ?;
396
+ port. write ( writer) ?;
397
+ } ,
398
+ & NetAddress :: OnionV2 { ref addr, ref port } => {
399
+ 2u8 . write ( writer) ?;
400
+ addr. write ( writer) ?;
401
+ port. write ( writer) ?;
402
+ } ,
403
+ & NetAddress :: OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
404
+ 3u8 . write ( writer) ?;
405
+ ed25519_pubkey. write ( writer) ?;
406
+ checksum. write ( writer) ?;
407
+ version. write ( writer) ?;
408
+ port. write ( writer) ?;
409
+ }
410
+ }
411
+ Ok ( ( ) )
412
+ }
413
+ }
414
+
415
+ impl < R : :: std:: io:: Read > Readable < R > for NetAddress {
416
+ fn read ( reader : & mut R ) -> Result < NetAddress , DecodeError > {
417
+ match <u8 as Readable < R > >:: read ( reader) ? {
418
+ 0 => {
419
+ let addr = Readable :: read ( reader) ?;
420
+ let port = Readable :: read ( reader) ?;
421
+ Ok ( NetAddress :: IPv4 {
422
+ addr,
423
+ port,
424
+ } )
425
+ } ,
426
+ 1 => {
427
+ let addr = Readable :: read ( reader) ?;
428
+ let port = Readable :: read ( reader) ?;
429
+ Ok ( NetAddress :: IPv6 {
430
+ addr,
431
+ port,
432
+ } )
433
+ } ,
434
+ 2 => {
435
+ let addr = Readable :: read ( reader) ?;
436
+ let port = Readable :: read ( reader) ?;
437
+ Ok ( NetAddress :: OnionV2 {
438
+ addr,
439
+ port,
440
+ } )
441
+ } ,
442
+ 3 => {
443
+ let ed25519_pubkey = Readable :: read ( reader) ?;
444
+ let checksum = Readable :: read ( reader) ?;
445
+ let version = Readable :: read ( reader) ?;
446
+ let port = Readable :: read ( reader) ?;
447
+ Ok ( NetAddress :: OnionV3 {
448
+ ed25519_pubkey,
449
+ checksum,
450
+ version,
451
+ port,
452
+ } )
453
+ }
454
+ _ => return Err ( DecodeError :: InvalidValue ) ,
455
+ }
456
+ }
457
+ }
458
+
459
+ #[ derive( PartialEq , Clone ) ]
386
460
// Only exposed as broadcast of node_announcement should be filtered by node_id
387
461
/// The unsigned part of a node_announcement
388
462
pub struct UnsignedNodeAnnouncement {
@@ -399,7 +473,7 @@ pub struct UnsignedNodeAnnouncement {
399
473
pub ( crate ) excess_address_data : Vec < u8 > ,
400
474
pub ( crate ) excess_data : Vec < u8 > ,
401
475
}
402
- #[ derive( Clone ) ]
476
+ #[ derive( PartialEq , Clone ) ]
403
477
/// A node_announcement message to be sent or received from a peer
404
478
pub struct NodeAnnouncement {
405
479
pub ( crate ) signature : Signature ,
@@ -1148,39 +1222,16 @@ impl Writeable for UnsignedNodeAnnouncement {
1148
1222
w. write_all ( & self . rgb ) ?;
1149
1223
self . alias . write ( w) ?;
1150
1224
1151
- let mut addr_slice = Vec :: with_capacity ( self . addresses . len ( ) * 18 ) ;
1152
1225
let mut addrs_to_encode = self . addresses . clone ( ) ;
1153
1226
addrs_to_encode. sort_unstable_by ( |a, b| { a. get_id ( ) . cmp ( & b. get_id ( ) ) } ) ;
1154
1227
addrs_to_encode. dedup_by ( |a, b| { a. get_id ( ) == b. get_id ( ) } ) ;
1155
- for addr in addrs_to_encode. iter ( ) {
1156
- match addr {
1157
- & NetAddress :: IPv4 { addr, port} => {
1158
- addr_slice. push ( 1 ) ;
1159
- addr_slice. extend_from_slice ( & addr) ;
1160
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1161
- } ,
1162
- & NetAddress :: IPv6 { addr, port} => {
1163
- addr_slice. push ( 2 ) ;
1164
- addr_slice. extend_from_slice ( & addr) ;
1165
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1166
- } ,
1167
- & NetAddress :: OnionV2 { addr, port} => {
1168
- addr_slice. push ( 3 ) ;
1169
- addr_slice. extend_from_slice ( & addr) ;
1170
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1171
- } ,
1172
- & NetAddress :: OnionV3 { ed25519_pubkey, checksum, version, port} => {
1173
- addr_slice. push ( 4 ) ;
1174
- addr_slice. extend_from_slice ( & ed25519_pubkey) ;
1175
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( checksum) ) ;
1176
- addr_slice. push ( version) ;
1177
- addr_slice. extend_from_slice ( & byte_utils:: be16_to_array ( port) ) ;
1178
- } ,
1179
- }
1228
+ ( addrs_to_encode. len ( ) as u64 ) . write ( w) ?;
1229
+ for addr in addrs_to_encode {
1230
+ addr. write ( w) ?;
1180
1231
}
1181
- ( ( addr_slice. len ( ) + self . excess_address_data . len ( ) ) as u16 ) . write ( w) ?;
1182
- w. write_all ( & addr_slice[ ..] ) ?;
1232
+ ( self . excess_address_data . len ( ) as u64 ) . write ( w) ?;
1183
1233
w. write_all ( & self . excess_address_data [ ..] ) ?;
1234
+ ( self . excess_data . len ( ) as u64 ) . write ( w) ?;
1184
1235
w. write_all ( & self . excess_data [ ..] ) ?;
1185
1236
Ok ( ( ) )
1186
1237
}
@@ -1198,112 +1249,33 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
1198
1249
r. read_exact ( & mut rgb) ?;
1199
1250
let alias: [ u8 ; 32 ] = Readable :: read ( r) ?;
1200
1251
1201
- let addrlen: u16 = Readable :: read ( r) ?;
1202
- let mut addr_readpos = 0 ;
1203
- let mut addresses = Vec :: with_capacity ( 4 ) ;
1204
- let mut f: u8 = 0 ;
1205
- let mut excess = 0 ;
1206
- loop {
1207
- if addrlen <= addr_readpos { break ; }
1208
- f = Readable :: read ( r) ?;
1209
- match f {
1210
- 1 => {
1211
- if addresses. len ( ) > 0 {
1212
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1213
- }
1214
- if addrlen < addr_readpos + 1 + 6 {
1215
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1216
- }
1217
- addresses. push ( NetAddress :: IPv4 {
1218
- addr : {
1219
- let mut addr = [ 0 ; 4 ] ;
1220
- r. read_exact ( & mut addr) ?;
1221
- addr
1222
- } ,
1223
- port : Readable :: read ( r) ?,
1224
- } ) ;
1225
- addr_readpos += 1 + 6
1226
- } ,
1227
- 2 => {
1228
- if addresses. len ( ) > 1 || ( addresses. len ( ) == 1 && addresses[ 0 ] . get_id ( ) != 1 ) {
1229
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1230
- }
1231
- if addrlen < addr_readpos + 1 + 18 {
1232
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1233
- }
1234
- addresses. push ( NetAddress :: IPv6 {
1235
- addr : {
1236
- let mut addr = [ 0 ; 16 ] ;
1237
- r. read_exact ( & mut addr) ?;
1238
- addr
1239
- } ,
1240
- port : Readable :: read ( r) ?,
1241
- } ) ;
1242
- addr_readpos += 1 + 18
1243
- } ,
1244
- 3 => {
1245
- if addresses. len ( ) > 2 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 2 ) {
1246
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1247
- }
1248
- if addrlen < addr_readpos + 1 + 12 {
1249
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1250
- }
1251
- addresses. push ( NetAddress :: OnionV2 {
1252
- addr : {
1253
- let mut addr = [ 0 ; 10 ] ;
1254
- r. read_exact ( & mut addr) ?;
1255
- addr
1256
- } ,
1257
- port : Readable :: read ( r) ?,
1258
- } ) ;
1259
- addr_readpos += 1 + 12
1260
- } ,
1261
- 4 => {
1262
- if addresses. len ( ) > 3 || ( addresses. len ( ) > 0 && addresses. last ( ) . unwrap ( ) . get_id ( ) > 3 ) {
1263
- return Err ( DecodeError :: ExtraAddressesPerType ) ;
1264
- }
1265
- if addrlen < addr_readpos + 1 + 37 {
1266
- return Err ( DecodeError :: BadLengthDescriptor ) ;
1267
- }
1268
- addresses. push ( NetAddress :: OnionV3 {
1269
- ed25519_pubkey : Readable :: read ( r) ?,
1270
- checksum : Readable :: read ( r) ?,
1271
- version : Readable :: read ( r) ?,
1272
- port : Readable :: read ( r) ?,
1273
- } ) ;
1274
- addr_readpos += 1 + 37
1275
- } ,
1276
- _ => { excess = 1 ; break ; }
1277
- }
1252
+ let addresses_count: u64 = Readable :: read ( r) ?;
1253
+ let mut addresses = Vec :: with_capacity ( addresses_count as usize ) ;
1254
+ for _ in 0 ..addresses_count {
1255
+ addresses. push ( Readable :: read ( r) ?) ;
1278
1256
}
1279
1257
1280
- let mut excess_data = vec ! [ ] ;
1281
- let excess_address_data = if addr_readpos < addrlen {
1282
- let mut excess_address_data = vec ! [ 0 ; ( addrlen - addr_readpos) as usize ] ;
1283
- r. read_exact ( & mut excess_address_data[ excess..] ) ?;
1284
- if excess == 1 {
1285
- excess_address_data[ 0 ] = f;
1286
- }
1287
- excess_address_data
1288
- } else {
1289
- if excess == 1 {
1290
- excess_data. push ( f) ;
1291
- }
1292
- Vec :: new ( )
1293
- } ;
1258
+ let excess_address_data_count: u64 = Readable :: read ( r) ?;
1259
+ let mut excess_address_data = Vec :: with_capacity ( excess_address_data_count as usize ) ;
1260
+ for _ in 0 ..excess_address_data_count {
1261
+ excess_address_data. push ( Readable :: read ( r) ?) ;
1262
+ }
1263
+
1264
+ let excess_data_count: u64 = Readable :: read ( r) ?;
1265
+ let mut excess_data = Vec :: with_capacity ( excess_data_count as usize ) ;
1266
+ for _ in 0 ..excess_data_count {
1267
+ excess_data. push ( Readable :: read ( r) ?) ;
1268
+ }
1294
1269
1295
1270
Ok ( UnsignedNodeAnnouncement {
1296
- features : features,
1297
- timestamp : timestamp,
1298
- node_id : node_id,
1299
- rgb : rgb,
1300
- alias : alias,
1301
- addresses : addresses,
1302
- excess_address_data : excess_address_data,
1303
- excess_data : {
1304
- r. read_to_end ( & mut excess_data) ?;
1305
- excess_data
1306
- } ,
1271
+ features,
1272
+ timestamp,
1273
+ node_id,
1274
+ rgb,
1275
+ alias,
1276
+ addresses,
1277
+ excess_address_data,
1278
+ excess_data
1307
1279
} )
1308
1280
}
1309
1281
}
0 commit comments