From 84fff02e12d4f9d830d65ea724762488a379eebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Mon, 11 Nov 2024 13:57:44 +0200 Subject: [PATCH] Correct IPv6 address generation (#5113) * Correct IPv6 addres generation * Fix clippy --- .../src/v4/registration.rs | 33 ++++++++++++++++--- nym-node/src/logging.rs | 10 +++--- nym-node/src/main.rs | 2 +- .../src/util/generate_new_ip.rs | 2 +- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/common/authenticator-requests/src/v4/registration.rs b/common/authenticator-requests/src/v4/registration.rs index 1121d2c1f1..a7d5a50f34 100644 --- a/common/authenticator-requests/src/v4/registration.rs +++ b/common/authenticator-requests/src/v4/registration.rs @@ -50,12 +50,27 @@ impl fmt::Display for IpPair { impl From for IpPair { fn from(value: IpAddr) -> Self { - let transformed_ipv4 = WG_TUN_DEVICE_IP_ADDRESS_V4; - let transformed_ipv6 = WG_TUN_DEVICE_IP_ADDRESS_V6; - let (ipv4, ipv6) = match value { - std::net::IpAddr::V4(ipv4_addr) => (ipv4_addr, transformed_ipv6), - std::net::IpAddr::V6(ipv6_addr) => (transformed_ipv4, ipv6_addr), + let (before_last_byte, last_byte) = match value { + std::net::IpAddr::V4(ipv4_addr) => (ipv4_addr.octets()[2], ipv4_addr.octets()[3]), + std::net::IpAddr::V6(ipv6_addr) => (ipv6_addr.octets()[14], ipv6_addr.octets()[15]), }; + let last_bytes = (before_last_byte as u16) << 8 | last_byte as u16; + let ipv4 = Ipv4Addr::new( + WG_TUN_DEVICE_IP_ADDRESS_V4.octets()[0], + WG_TUN_DEVICE_IP_ADDRESS_V4.octets()[1], + before_last_byte, + last_byte, + ); + let ipv6 = Ipv6Addr::new( + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[0], + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[1], + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[2], + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[3], + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[4], + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[5], + WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[6], + last_bytes, + ); IpPair::new(ipv4, ipv6) } } @@ -237,6 +252,14 @@ mod tests { use super::*; use nym_crypto::asymmetric::encryption; + #[test] + fn create_ip_pair() { + let ipv4: IpAddr = Ipv4Addr::from_str("10.1.10.50").unwrap().into(); + let ipv6: IpAddr = Ipv6Addr::from_str("fc01::0a32").unwrap().into(); + + assert_eq!(IpPair::from(ipv4), IpPair::from(ipv6)); + } + #[test] #[cfg(feature = "verify")] fn client_request_roundtrip() { diff --git a/nym-node/src/logging.rs b/nym-node/src/logging.rs index 8522eefdbd..2fd15d94b6 100644 --- a/nym-node/src/logging.rs +++ b/nym-node/src/logging.rs @@ -4,9 +4,9 @@ use tracing::level_filters::LevelFilter; use tracing_subscriber::{filter::Directive, EnvFilter}; -pub(crate) fn setup_tracing_logger() { - fn directive_checked(directive: String) -> Directive { - directive.parse().expect("Failed to parse log directive") +pub(crate) fn setup_tracing_logger() -> anyhow::Result<()> { + fn directive_checked(directive: impl Into) -> anyhow::Result { + directive.into().parse().map_err(From::from) } let log_builder = tracing_subscriber::fmt() @@ -26,8 +26,10 @@ pub(crate) fn setup_tracing_logger() { // these crates are more granularly filtered let filter_crates = ["defguard_wireguard_rs"]; for crate_name in filter_crates { - filter = filter.add_directive(directive_checked(format!("{}=warn", crate_name))); + filter = filter.add_directive(directive_checked(format!("{}=warn", crate_name))?); } log_builder.with_env_filter(filter).init(); + + Ok(()) } diff --git a/nym-node/src/main.rs b/nym-node/src/main.rs index 29f1801c37..8d65de2aa6 100644 --- a/nym-node/src/main.rs +++ b/nym-node/src/main.rs @@ -23,7 +23,7 @@ async fn main() -> anyhow::Result<()> { let cli = Cli::parse(); setup_env(cli.config_env_file.as_ref()); - setup_tracing_logger(); + setup_tracing_logger()?; if !cli.no_banner { maybe_print_banner(crate_name!(), crate_version!()); diff --git a/service-providers/ip-packet-router/src/util/generate_new_ip.rs b/service-providers/ip-packet-router/src/util/generate_new_ip.rs index 2d2848d821..ea5325f237 100644 --- a/service-providers/ip-packet-router/src/util/generate_new_ip.rs +++ b/service-providers/ip-packet-router/src/util/generate_new_ip.rs @@ -12,7 +12,7 @@ fn generate_random_ips_within_subnet(rng: &mut R) -> IpPair { let before_last_byte = (last_bytes >> 8) as u8; let last_byte = (last_bytes & 255) as u8; let ipv4 = Ipv4Addr::new(10, 0, before_last_byte, last_byte); - let ipv6 = Ipv6Addr::new(0x2001, 0x0db8, 0xa160, 0, 0, 0, 0, last_bytes); + let ipv6 = Ipv6Addr::new(0xfc00, 0, 0, 0, 0, 0, 0, last_bytes); IpPair::new(ipv4, ipv6) }