@@ -774,13 +774,8 @@ pub enum SocketAddress {
774
774
/// An old-style Tor onion address/port on which the peer is listening.
775
775
///
776
776
/// This field is deprecated and the Tor network generally no longer supports V2 Onion
777
- /// addresses.
778
- OnionV2 {
779
- /// The base32 of first 80 bits
780
- addr : [ u8 ; 10 ] ,
781
- /// The port on which the node is listening
782
- port : u16 ,
783
- } ,
777
+ /// addresses. Thus, the details are not parsed here.
778
+ OnionV2 ( [ u8 ; 12 ] ) ,
784
779
/// A new-style Tor onion address/port on which the peer is listening.
785
780
///
786
781
/// To create the human-readable "hostname", concatenate the ED25519 pubkey, checksum, and version,
@@ -810,7 +805,7 @@ impl SocketAddress {
810
805
match self {
811
806
& SocketAddress :: TcpIpV4 { ..} => { 1 } ,
812
807
& SocketAddress :: TcpIpV6 { ..} => { 2 } ,
813
- & SocketAddress :: OnionV2 { .. } => { 3 } ,
808
+ & SocketAddress :: OnionV2 ( _ ) => { 3 } ,
814
809
& SocketAddress :: OnionV3 { ..} => { 4 } ,
815
810
& SocketAddress :: Hostname { ..} => { 5 } ,
816
811
}
@@ -821,7 +816,7 @@ impl SocketAddress {
821
816
match self {
822
817
& SocketAddress :: TcpIpV4 { .. } => { 6 } ,
823
818
& SocketAddress :: TcpIpV6 { .. } => { 18 } ,
824
- & SocketAddress :: OnionV2 { .. } => { 12 } ,
819
+ & SocketAddress :: OnionV2 ( _ ) => { 12 } ,
825
820
& SocketAddress :: OnionV3 { .. } => { 37 } ,
826
821
// Consists of 1-byte hostname length, hostname bytes, and 2-byte port.
827
822
& SocketAddress :: Hostname { ref hostname, .. } => { u16:: from ( hostname. len ( ) ) + 3 } ,
@@ -847,10 +842,9 @@ impl Writeable for SocketAddress {
847
842
addr. write ( writer) ?;
848
843
port. write ( writer) ?;
849
844
} ,
850
- & SocketAddress :: OnionV2 { ref addr , ref port } => {
845
+ & SocketAddress :: OnionV2 ( bytes ) => {
851
846
3u8 . write ( writer) ?;
852
- addr. write ( writer) ?;
853
- port. write ( writer) ?;
847
+ bytes. write ( writer) ?;
854
848
} ,
855
849
& SocketAddress :: OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
856
850
4u8 . write ( writer) ?;
@@ -885,10 +879,7 @@ impl Readable for Result<SocketAddress, u8> {
885
879
port : Readable :: read ( reader) ?,
886
880
} ) )
887
881
} ,
888
- 3 => Ok ( Ok ( SocketAddress :: OnionV2 {
889
- addr : Readable :: read ( reader) ?,
890
- port : Readable :: read ( reader) ?,
891
- } ) ) ,
882
+ 3 => Ok ( Ok ( SocketAddress :: OnionV2 ( Readable :: read ( reader) ?) ) ) ,
892
883
4 => {
893
884
Ok ( Ok ( SocketAddress :: OnionV3 {
894
885
ed25519_pubkey : Readable :: read ( reader) ?,
@@ -967,23 +958,24 @@ impl From<std::net::SocketAddr> for SocketAddress {
967
958
}
968
959
}
969
960
970
- /// Parses an Onion host and port into a [`SocketAddress::OnionV3`].
961
+ /// Parses an Onion host and port into a [`SocketAddress::OnionV3`] or [`SocketAddress::OnionV2`] .
971
962
///
972
963
/// The host part must end with ".onion".
973
964
pub fn parse_onion_address ( host : & str , port : u16 ) -> Result < SocketAddress , SocketAddressParseError > {
974
965
if host. ends_with ( ".onion" ) {
975
966
let domain = & host[ ..host. len ( ) - ".onion" . len ( ) ] ;
976
- if domain. len ( ) != 56 && domain. len ( ) !=16 {
977
- return Err ( SocketAddressParseError :: InvalidOnion ) ;
978
- }
979
- let onion = base32:: Alphabet :: RFC4648 { padding : false } . decode ( & domain) . map_err ( |_| SocketAddressParseError :: InvalidOnion ) ?;
980
- if onion. len ( ) != 35 && onion. len ( ) != 10 {
967
+ if domain. len ( ) != 56 && domain. len ( ) != 16 {
981
968
return Err ( SocketAddressParseError :: InvalidOnion ) ;
982
969
}
970
+ let mut onion = base32:: Alphabet :: RFC4648 { padding : false } . decode ( & domain) . map_err ( |_| SocketAddressParseError :: InvalidOnion ) ?;
983
971
if onion. len ( ) == 10 {
984
- let mut addr = [ 0 ; 10 ] ;
985
- addr. copy_from_slice ( & onion) ;
986
- return Ok ( SocketAddress :: OnionV2 { addr, port } ) ;
972
+ onion. extend_from_slice ( & port. to_be_bytes ( ) ) ;
973
+ let mut bytes = [ 0 ; 12 ] ;
974
+ bytes. copy_from_slice ( & onion) ;
975
+ return Ok ( SocketAddress :: OnionV2 ( bytes) ) ;
976
+ }
977
+ if onion. len ( ) != 35 {
978
+ return Err ( SocketAddressParseError :: InvalidOnion ) ;
987
979
}
988
980
let version = onion[ 0 ] ;
989
981
let first_checksum_flag = onion[ 1 ] ;
@@ -999,8 +991,9 @@ pub fn parse_onion_address(host: &str, port: u16) -> Result<SocketAddress, Socke
999
991
}
1000
992
1001
993
/// [`SocketAddress::OnionV2`] to onion address string
1002
- pub fn to_onion_v2_string ( addr : & [ u8 ; 10 ] , port : & u16 ) -> String {
1003
- let onion = base32:: Alphabet :: RFC4648 { padding : false } . encode ( & addr[ ..] ) ;
994
+ pub fn to_onion_v2_string ( bytes : & [ u8 ; 12 ] ) -> String {
995
+ let onion = base32:: Alphabet :: RFC4648 { padding : false } . encode ( & bytes[ ..10 ] ) ;
996
+ let port = u16:: from_be_bytes ( [ bytes[ 10 ] , bytes[ 11 ] ] ) ;
1004
997
format ! ( "{}.onion:{}" , onion, port)
1005
998
}
1006
999
@@ -1019,7 +1012,7 @@ impl Display for SocketAddress {
1019
1012
match self {
1020
1013
SocketAddress :: TcpIpV4 { addr, port} => write ! ( f, "{}:{}" , std:: net:: Ipv4Addr :: from( * addr) , port) ?,
1021
1014
SocketAddress :: TcpIpV6 { addr, port} => write ! ( f, "[{}]:{}" , std:: net:: Ipv6Addr :: from( * addr) , port) ?,
1022
- SocketAddress :: OnionV2 { addr , port } => write ! ( f, "{}" , to_onion_v2_string( addr , port ) ) ?,
1015
+ SocketAddress :: OnionV2 ( bytes ) => write ! ( f, "{}" , to_onion_v2_string( & bytes ) ) ?,
1023
1016
SocketAddress :: OnionV3 {
1024
1017
ed25519_pubkey,
1025
1018
checksum,
@@ -2904,10 +2897,9 @@ mod tests {
2904
2897
} ) ;
2905
2898
}
2906
2899
if onionv2 {
2907
- addresses. push ( msgs:: SocketAddress :: OnionV2 {
2908
- addr : [ 255 , 254 , 253 , 252 , 251 , 250 , 249 , 248 , 247 , 246 ] ,
2909
- port : 9735 ,
2910
- } ) ;
2900
+ addresses. push ( msgs:: SocketAddress :: OnionV2 (
2901
+ [ 255 , 254 , 253 , 252 , 251 , 250 , 249 , 248 , 247 , 246 , 38 , 7 ]
2902
+ ) ) ;
2911
2903
}
2912
2904
if onionv3 {
2913
2905
addresses. push ( msgs:: SocketAddress :: OnionV3 {
@@ -4136,11 +4128,8 @@ mod tests {
4136
4128
assert_eq ! ( hostname, SocketAddress :: from_str( "lightning-node.mydomain.com:1234" ) . unwrap( ) ) ;
4137
4129
assert_eq ! ( hostname, SocketAddress :: from_str( & hostname. to_string( ) ) . unwrap( ) ) ;
4138
4130
4139
- let onion_v2 = SocketAddress :: OnionV2 {
4140
- addr : [ 40 , 4 , 64 , 185 , 202 , 19 , 162 , 75 , 90 , 200 ] ,
4141
- port : 80 ,
4142
- } ;
4143
- assert_eq ! ( onion_v2, SocketAddress :: from_str( "facebookcorewwwi.onion:80" ) . unwrap( ) ) ;
4131
+ let onion_v2 = SocketAddress :: OnionV2 ( [ 40 , 4 , 64 , 185 , 202 , 19 , 162 , 75 , 90 , 200 , 38 , 7 ] , ) ;
4132
+ assert_eq ! ( onion_v2, SocketAddress :: from_str( "facebookcorewwwi.onion:9735" ) . unwrap( ) ) ;
4144
4133
assert_eq ! ( onion_v2, SocketAddress :: from_str( & onion_v2. to_string( ) ) . unwrap( ) ) ;
4145
4134
4146
4135
let onion_v3 = SocketAddress :: OnionV3 {
0 commit comments