Skip to content

Commit 0caa19e

Browse files
committed
Hide OnionV2 struct detail
1 parent d37b5b6 commit 0caa19e

File tree

2 files changed

+27
-38
lines changed

2 files changed

+27
-38
lines changed

lightning/src/ln/msgs.rs

+26-37
Original file line numberDiff line numberDiff line change
@@ -774,13 +774,8 @@ pub enum SocketAddress {
774774
/// An old-style Tor onion address/port on which the peer is listening.
775775
///
776776
/// 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]),
784779
/// A new-style Tor onion address/port on which the peer is listening.
785780
///
786781
/// To create the human-readable "hostname", concatenate the ED25519 pubkey, checksum, and version,
@@ -810,7 +805,7 @@ impl SocketAddress {
810805
match self {
811806
&SocketAddress::TcpIpV4 {..} => { 1 },
812807
&SocketAddress::TcpIpV6 {..} => { 2 },
813-
&SocketAddress::OnionV2 {..} => { 3 },
808+
&SocketAddress::OnionV2(_) => { 3 },
814809
&SocketAddress::OnionV3 {..} => { 4 },
815810
&SocketAddress::Hostname {..} => { 5 },
816811
}
@@ -821,7 +816,7 @@ impl SocketAddress {
821816
match self {
822817
&SocketAddress::TcpIpV4 { .. } => { 6 },
823818
&SocketAddress::TcpIpV6 { .. } => { 18 },
824-
&SocketAddress::OnionV2 { .. } => { 12 },
819+
&SocketAddress::OnionV2(_) => { 12 },
825820
&SocketAddress::OnionV3 { .. } => { 37 },
826821
// Consists of 1-byte hostname length, hostname bytes, and 2-byte port.
827822
&SocketAddress::Hostname { ref hostname, .. } => { u16::from(hostname.len()) + 3 },
@@ -847,10 +842,9 @@ impl Writeable for SocketAddress {
847842
addr.write(writer)?;
848843
port.write(writer)?;
849844
},
850-
&SocketAddress::OnionV2{ ref addr, ref port } => {
845+
&SocketAddress::OnionV2(bytes) => {
851846
3u8.write(writer)?;
852-
addr.write(writer)?;
853-
port.write(writer)?;
847+
bytes.write(writer)?;
854848
},
855849
&SocketAddress::OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
856850
4u8.write(writer)?;
@@ -885,10 +879,7 @@ impl Readable for Result<SocketAddress, u8> {
885879
port: Readable::read(reader)?,
886880
}))
887881
},
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)?))),
892883
4 => {
893884
Ok(Ok(SocketAddress::OnionV3 {
894885
ed25519_pubkey: Readable::read(reader)?,
@@ -967,23 +958,24 @@ impl From<std::net::SocketAddr> for SocketAddress {
967958
}
968959
}
969960

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`].
971962
///
972963
/// The host part must end with ".onion".
973964
pub fn parse_onion_address(host: &str, port: u16) -> Result<SocketAddress, SocketAddressParseError> {
974965
if host.ends_with(".onion") {
975966
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 {
981968
return Err(SocketAddressParseError::InvalidOnion);
982969
}
970+
let mut onion = base32::Alphabet::RFC4648 { padding: false }.decode(&domain).map_err(|_| SocketAddressParseError::InvalidOnion)?;
983971
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);
987979
}
988980
let version = onion[0];
989981
let first_checksum_flag = onion[1];
@@ -999,8 +991,9 @@ pub fn parse_onion_address(host: &str, port: u16) -> Result<SocketAddress, Socke
999991
}
1000992

1001993
/// [`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]]);
1004997
format!("{}.onion:{}", onion, port)
1005998
}
1006999

@@ -1019,7 +1012,7 @@ impl Display for SocketAddress {
10191012
match self {
10201013
SocketAddress::TcpIpV4{addr, port} => write!(f, "{}:{}", std::net::Ipv4Addr::from(*addr), port)?,
10211014
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))?,
10231016
SocketAddress::OnionV3 {
10241017
ed25519_pubkey,
10251018
checksum,
@@ -2904,10 +2897,9 @@ mod tests {
29042897
});
29052898
}
29062899
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+
));
29112903
}
29122904
if onionv3 {
29132905
addresses.push(msgs::SocketAddress::OnionV3 {
@@ -4136,11 +4128,8 @@ mod tests {
41364128
assert_eq!(hostname, SocketAddress::from_str("lightning-node.mydomain.com:1234").unwrap());
41374129
assert_eq!(hostname, SocketAddress::from_str(&hostname.to_string()).unwrap());
41384130

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());
41444133
assert_eq!(onion_v2, SocketAddress::from_str(&onion_v2.to_string()).unwrap());
41454134

41464135
let onion_v3 = SocketAddress::OnionV3 {

lightning/src/util/ser.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ macro_rules! impl_array {
587587

588588
impl_array!(3, u8); // for rgb, ISO 4712 code
589589
impl_array!(4, u8); // for IPv4
590-
impl_array!(10, u8); // for OnionV2
590+
impl_array!(12, u8); // for OnionV2
591591
impl_array!(16, u8); // for IPv6
592592
impl_array!(32, u8); // for channel id & hmac
593593
impl_array!(PUBLIC_KEY_SIZE, u8); // for PublicKey

0 commit comments

Comments
 (0)