diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..96b6873 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,45 @@ + + +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; + } + } +} |