use clap::Parser; use tokio::net::UdpSocket; /// Simple program to greet a person #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { /// The address and port to listen and accept cleartext UDP datagrams from #[arg(short, long)] bind: String, /// The destination to send obfuscated UDP datagrams to #[arg(short, long)] sendto: String, /// The hex representation of XOR key to use #[arg(short, long)] key: String, } #[tokio::main] async fn main() { let args = Args::parse(); let key = hex::decode(args.key) .expect("failed to decode key hex string"); let sock = UdpSocket::bind(&args.bind).await .expect("failed to bind UDP endpoint"); let mut buf = [0; 65536]; loop { if let Ok((len, _)) = sock.recv_from(&mut buf).await { let mut i = 0; let n = key.len(); for j in 0..len { buf[j] ^= key[i]; i += 1; if i == n { i = 0; } } let _ = sock.send_to(&buf[..len], &args.sendto).await; } } }