2026-02-01 20:59:23 +01:00
|
|
|
use hmac::Hmac;
|
|
|
|
|
use md5::digest::Mac;
|
2026-07-12 18:21:18 +02:00
|
|
|
use rc4::KeyInit;
|
2026-03-24 15:48:56 +01:00
|
|
|
use std::net::{IpAddr, SocketAddr};
|
2025-01-19 15:56:36 +01:00
|
|
|
|
2026-07-12 18:21:18 +02:00
|
|
|
use crate::virtual_port::VirtualPort;
|
|
|
|
|
|
2025-01-22 20:40:18 +01:00
|
|
|
type Md5Hmac = Hmac<md5::Md5>;
|
|
|
|
|
|
2026-07-12 18:21:18 +02:00
|
|
|
#[derive(Eq, PartialEq, Hash, Debug, Copy, Clone, Ord, PartialOrd)]
|
2026-02-01 20:59:23 +01:00
|
|
|
pub struct PRUDPSockAddr {
|
2026-03-24 15:48:56 +01:00
|
|
|
pub regular_socket_addr: SocketAddr,
|
2026-02-01 20:59:23 +01:00
|
|
|
pub virtual_port: VirtualPort,
|
2025-01-22 20:40:18 +01:00
|
|
|
}
|
|
|
|
|
|
2026-02-01 20:59:23 +01:00
|
|
|
impl PRUDPSockAddr {
|
2026-03-24 15:48:56 +01:00
|
|
|
pub fn new(regular_socket_addr: SocketAddr, virtual_port: VirtualPort) -> Self {
|
2026-02-01 20:59:23 +01:00
|
|
|
Self {
|
2025-02-18 22:55:33 +01:00
|
|
|
regular_socket_addr,
|
2026-02-01 20:59:23 +01:00
|
|
|
virtual_port,
|
2025-02-18 22:55:33 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-21 15:59:27 +02:00
|
|
|
pub fn calculate_connection_signature(&self) -> [u8; 16] {
|
2026-07-13 19:38:43 +02:00
|
|
|
let mut hmac = Md5Hmac::new_from_slice(&[0; 16]).expect("incorrect slice size");
|
2025-01-22 20:40:18 +01:00
|
|
|
|
2026-03-24 15:48:56 +01:00
|
|
|
let data = match self.regular_socket_addr.ip() {
|
|
|
|
|
IpAddr::V4(v) => v.octets().to_vec(),
|
|
|
|
|
IpAddr::V6(v) => v.octets().to_vec(),
|
|
|
|
|
};
|
2025-03-25 22:53:43 +01:00
|
|
|
//data.extend_from_slice(&self.regular_socket_addr.port().to_be_bytes());
|
2025-01-22 20:40:18 +01:00
|
|
|
|
2026-07-12 18:21:18 +02:00
|
|
|
hmac.update(&data);
|
2026-02-01 20:59:23 +01:00
|
|
|
let result: [u8; 16] = hmac.finalize().into_bytes()[0..16]
|
|
|
|
|
.try_into()
|
2026-07-13 19:38:43 +02:00
|
|
|
.expect("incorrect result size");
|
2025-01-22 20:40:18 +01:00
|
|
|
result
|
|
|
|
|
}
|
2026-02-01 20:59:23 +01:00
|
|
|
}
|