use std::io;
#[derive(Debug, Clone)]
pub struct TcpFingerprint {
pub window_size: u32,
pub ttl: u8,
pub mss: u16,
pub window_scale: u8,
pub sack_permitted: bool,
pub timestamps: bool,
}
impl Default for TcpFingerprint {
fn default() -> Self {
Self {
window_size: 65535,
ttl: 64, mss: 1460, window_scale: 6,
sack_permitted: true,
timestamps: true,
}
}
}
impl TcpFingerprint {
pub fn chrome() -> Self {
Self::default()
}
pub fn firefox() -> Self {
Self::default()
}
}
pub fn configure_tcp_socket(socket: &socket2::Socket, fp: &TcpFingerprint) -> io::Result<()> {
socket.set_recv_buffer_size(fp.window_size as usize)?;
socket.set_send_buffer_size(fp.window_size as usize)?;
socket.set_ttl_v4(fp.ttl as u32)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tcp_fingerprint_defaults() {
let fp = TcpFingerprint::default();
assert_eq!(fp.window_size, 65535);
assert_eq!(fp.ttl, 64);
assert_eq!(fp.mss, 1460);
assert_eq!(fp.window_scale, 6);
assert!(fp.sack_permitted);
assert!(fp.timestamps);
}
#[test]
fn test_chrome_firefox_similar() {
let chrome = TcpFingerprint::chrome();
let firefox = TcpFingerprint::firefox();
assert_eq!(chrome.window_size, firefox.window_size);
assert_eq!(chrome.ttl, firefox.ttl);
}
}