From aa78441e5a996b682ac7a8c639d7d110c72aef2f Mon Sep 17 00:00:00 2001 From: Andy Pack Date: Thu, 8 Feb 2024 17:22:06 +0000 Subject: [PATCH] adding asym crypto, fixing txt, appending logs --- Cargo.lock | 381 ++++++++++++++++++++++++++ dnstp-client/src/main.rs | 19 +- dnstp-server/src/main.rs | 21 +- dnstp/Cargo.toml | 6 +- dnstp/src/config.rs | 6 + dnstp/src/crypto/mod.rs | 70 +++++ dnstp/src/crypto/tests.rs | 35 +++ dnstp/src/lib.rs | 6 +- dnstp/src/message/answer/txt_rdata.rs | 2 +- dnstp/src/processor/encryption/mod.rs | 0 dnstp/src/processor/mod.rs | 1 + dnstp/src/processor/request.rs | 35 ++- 12 files changed, 562 insertions(+), 20 deletions(-) create mode 100644 dnstp/src/config.rs create mode 100644 dnstp/src/crypto/mod.rs create mode 100644 dnstp/src/crypto/tests.rs create mode 100644 dnstp/src/processor/encryption/mod.rs diff --git a/Cargo.lock b/Cargo.lock index c42ea7b..d3ed302 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,42 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + [[package]] name = "anstream" version = "0.6.11" @@ -50,12 +86,43 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.4.18" @@ -102,6 +169,64 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -111,6 +236,18 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + [[package]] name = "dnstp" version = "0.1.0" @@ -136,10 +273,69 @@ dependencies = [ name = "dnstplib" version = "0.1.0" dependencies = [ + "aes-gcm-siv", "log", + "p256", + "rand_core", "urlencoding", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + [[package]] name = "getrandom" version = "0.2.12" @@ -151,12 +347,50 @@ dependencies = [ "wasi", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "itoa" version = "1.0.10" @@ -184,6 +418,55 @@ dependencies = [ "libc", ] +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "polyval" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -196,6 +479,15 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.76" @@ -244,6 +536,30 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "serde" version = "1.0.196" @@ -264,6 +580,27 @@ dependencies = [ "syn", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "simplelog" version = "0.12.1" @@ -275,12 +612,28 @@ dependencies = [ "time", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "2.0.48" @@ -332,12 +685,28 @@ dependencies = [ "time-core", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "urlencoding" version = "2.1.3" @@ -350,6 +719,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -452,3 +827,9 @@ name = "windows_x86_64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/dnstp-client/src/main.rs b/dnstp-client/src/main.rs index d0d8c0f..635ed91 100644 --- a/dnstp-client/src/main.rs +++ b/dnstp-client/src/main.rs @@ -1,4 +1,4 @@ -use std::fs::File; +use std::fs::{File, OpenOptions}; use std::net::SocketAddr; use std::thread; use std::time::Duration; @@ -17,13 +17,24 @@ struct Args { /// Addresses to send requests #[arg(short, long)] address: String, + /// Base domain to operate on + #[arg(long)] + base_domain: String, + /// Sub-domain to handle key handling when requested + #[arg(long, default_value = "static")] + key_endpoint: String } fn main() { CombinedLogger::init( vec![ TermLogger::new(LevelFilter::Info, Config::default(), TerminalMode::Mixed, ColorChoice::Auto), - WriteLogger::new(LevelFilter::Info, Config::default(), File::create("dnstp.log").unwrap()), + WriteLogger::new(LevelFilter::Info, Config::default(), OpenOptions::new() + .read(true) + .write(true) + .append(true) + .create(true) + .open("dnstp.log").unwrap()), ] ).unwrap(); @@ -42,12 +53,14 @@ fn main() { socket.run_rx(processor.get_message_channel().expect("couldn't get message processing channel")); + let domain = vec![args.key_endpoint, args.base_domain].join("."); + let mut rng = rand::thread_rng(); loop { info!("sending..."); - let message = DNSRequest::from_hostname(address, rng.next_u32() as u16, "duck.com".to_string()); + let message = DNSRequest::from_hostname(address, rng.next_u32() as u16, domain.clone()); let bytes = message.to_bytes(); diff --git a/dnstp-server/src/main.rs b/dnstp-server/src/main.rs index 46f5a05..674898d 100644 --- a/dnstp-server/src/main.rs +++ b/dnstp-server/src/main.rs @@ -5,8 +5,9 @@ use std::{thread}; use log::info; use simplelog::*; -use std::fs::File; +use std::fs::{File, OpenOptions}; use std::net::SocketAddr; +use dnstplib::DomainConfig; use dnstplib::net::DNSSocket; use dnstplib::processor::RequestProcesor; @@ -18,13 +19,24 @@ struct Args { /// Addresses to bind server to #[arg(short, long)] address: Vec, + /// Base domain to operate on + #[arg(long)] + base_domain: String, + /// Sub-domain to handle key handling when requested + #[arg(long, default_value = "static")] + key_endpoint: String } fn main() { CombinedLogger::init( vec![ TermLogger::new(LevelFilter::Info, Config::default(), TerminalMode::Mixed, ColorChoice::Auto), - WriteLogger::new(LevelFilter::Info, Config::default(), File::create("dnstp.log").unwrap()), + WriteLogger::new(LevelFilter::Info, Config::default(), OpenOptions::new() + .read(true) + .write(true) + .append(true) + .create(true) + .open("dnstp.log").unwrap()), ] ).unwrap(); @@ -47,7 +59,10 @@ fn main() { socket.bind(); socket.run_tx(); - let mut processor = RequestProcesor::new(); + let mut processor = RequestProcesor::new(DomainConfig { + base_domain: args.base_domain, + key_endpoint: args.key_endpoint + }); processor.run(socket.get_tx_message_channel().expect("couldn't get message transmitting channel")); socket.run_rx(processor.get_message_channel().expect("couldn't get message processing channel")); diff --git a/dnstp/Cargo.toml b/dnstp/Cargo.toml index 408b1dd..e952b79 100644 --- a/dnstp/Cargo.toml +++ b/dnstp/Cargo.toml @@ -7,4 +7,8 @@ edition = "2021" [dependencies] log = "0.4.20" -urlencoding = "2.1.3" \ No newline at end of file +urlencoding = "2.1.3" + +rand_core = { version = "0.6.4", features = ["getrandom"] } +p256 = { version = "0.13.2", features = ["ecdh"] } +aes-gcm-siv = "0.11.1" \ No newline at end of file diff --git a/dnstp/src/config.rs b/dnstp/src/config.rs new file mode 100644 index 0000000..a5f9afa --- /dev/null +++ b/dnstp/src/config.rs @@ -0,0 +1,6 @@ + +#[derive(Clone)] +pub struct DomainConfig { + pub base_domain: String, + pub key_endpoint: String, +} \ No newline at end of file diff --git a/dnstp/src/crypto/mod.rs b/dnstp/src/crypto/mod.rs new file mode 100644 index 0000000..5c16f5b --- /dev/null +++ b/dnstp/src/crypto/mod.rs @@ -0,0 +1,70 @@ +#[cfg(test)] +mod tests; + +use p256::{EncodedPoint, PublicKey, ecdh::EphemeralSecret, NistP256}; +use p256::elliptic_curve::ecdh::SharedSecret; +use aes_gcm_siv::{aead::{Aead, KeyInit}, AeadCore, Aes256GcmSiv, Nonce}; + +use rand_core::OsRng; + +pub fn get_random_asym_pair() -> (EphemeralSecret, EncodedPoint) +{ + let secret = EphemeralSecret::random(&mut OsRng); + let public_point = EncodedPoint::from(secret.public_key()); + + (secret, public_point) +} + +pub fn get_shared_asym_secret(secret: EphemeralSecret, opposing_public_key: EncodedPoint) -> Result, ()> { + + match PublicKey::from_sec1_bytes(opposing_public_key.as_ref()) { + Ok(other_public) => { + Ok(secret.diffie_hellman(&other_public)) + } + Err(_) => { + Err(()) + } + } +} + +// pub fn generate_aes_nonce() -> Nonce +// { +// let mut nonce_buffer: [u8; 12] = [0; 12]; +// &OsRng.fill_bytes(&mut nonce_buffer); +// +// Nonce::from(nonce_buffer) +// } + +pub fn generate_aes_nonce() -> Nonce +{ + Aes256GcmSiv::generate_nonce(OsRng) +} + +pub fn asym_to_sym_key(secret: &SharedSecret) -> Aes256GcmSiv +{ + Aes256GcmSiv::new(secret.raw_secret_bytes()) +} + +pub fn encrypt(key: &Aes256GcmSiv, nonce: &Nonce, bytes: &Vec) -> Result, ()> +{ + match key.encrypt(nonce, bytes.as_ref()) { + Ok(r) => { + Ok(r) + } + Err(_) => { + Err(()) + } + } +} + +pub fn decrypt(key: &Aes256GcmSiv, nonce: &Nonce, bytes: &Vec) -> Result, ()> +{ + match key.decrypt(nonce, bytes.as_ref()) { + Ok(r) => { + Ok(r) + } + Err(_) => { + Err(()) + } + } +} \ No newline at end of file diff --git a/dnstp/src/crypto/tests.rs b/dnstp/src/crypto/tests.rs new file mode 100644 index 0000000..f9d072d --- /dev/null +++ b/dnstp/src/crypto/tests.rs @@ -0,0 +1,35 @@ +use super::*; + +#[test] +fn matching_shared_secrets() { + let (secret_alice, point_alice) = get_random_asym_pair(); + let (secret_bob, point_bob) = get_random_asym_pair(); + + let shared_alice = get_shared_asym_secret(secret_alice, point_bob).unwrap(); + let shared_bob = get_shared_asym_secret(secret_bob, point_alice).unwrap(); + + assert_eq!(shared_alice.raw_secret_bytes(), shared_bob.raw_secret_bytes()); +} + +#[test] +fn arbitrary_string_back_and_forth() { + let data = String::from("hello world!"); + let nonce = generate_aes_nonce(); + + let (secret_alice, point_alice) = get_random_asym_pair(); + let (secret_bob, point_bob) = get_random_asym_pair(); + + let shared_alice = get_shared_asym_secret(secret_alice, point_bob).unwrap(); + let shared_bob = get_shared_asym_secret(secret_bob, point_alice).unwrap(); + + assert_eq!(shared_alice.raw_secret_bytes(), shared_bob.raw_secret_bytes()); + + let sym_key = asym_to_sym_key(&shared_alice); + + let cipher_text = encrypt(&sym_key, &nonce, &data.clone().into_bytes()).unwrap(); + let plain_text = decrypt(&sym_key, &nonce, &cipher_text).unwrap(); + + let result = String::from_utf8(plain_text).unwrap(); + + assert_eq!(data, result); +} \ No newline at end of file diff --git a/dnstp/src/lib.rs b/dnstp/src/lib.rs index ac72d94..95908aa 100644 --- a/dnstp/src/lib.rs +++ b/dnstp/src/lib.rs @@ -4,4 +4,8 @@ mod byte; pub mod processor; pub mod message; pub mod net; -mod string; \ No newline at end of file +mod string; +pub mod config; +mod crypto; + +pub use config::DomainConfig; \ No newline at end of file diff --git a/dnstp/src/message/answer/txt_rdata.rs b/dnstp/src/message/answer/txt_rdata.rs index c204b6b..f28c486 100644 --- a/dnstp/src/message/answer/txt_rdata.rs +++ b/dnstp/src/message/answer/txt_rdata.rs @@ -15,7 +15,7 @@ impl Debug for TXTRdata { impl RData for TXTRdata { fn to_bytes(&self) -> Vec { - self.rdata.into_bytes() + self.rdata.clone().into_bytes() } } diff --git a/dnstp/src/processor/encryption/mod.rs b/dnstp/src/processor/encryption/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/dnstp/src/processor/mod.rs b/dnstp/src/processor/mod.rs index ef5afd7..e8d1ffb 100644 --- a/dnstp/src/processor/mod.rs +++ b/dnstp/src/processor/mod.rs @@ -1,6 +1,7 @@ pub mod request; pub mod response; +pub mod encryption; pub use request::RequestProcesor; pub use response::ResponseProcesor; diff --git a/dnstp/src/processor/request.rs b/dnstp/src/processor/request.rs index 6aff9b8..55a173a 100644 --- a/dnstp/src/processor/request.rs +++ b/dnstp/src/processor/request.rs @@ -3,19 +3,22 @@ use std::sync::mpsc; use std::sync::mpsc::{Receiver, Sender}; use std::thread; use log::{error, info}; +use crate::config::DomainConfig; use crate::message::{QuestionParseError, DNSResponse}; use crate::net::{NetworkMessage, NetworkMessagePtr}; use crate::request_parser::{HeaderParseError, parse_request, RequestParseError}; pub struct RequestProcesor { - message_channel: Option> + message_channel: Option>, + domain_config: DomainConfig } impl RequestProcesor { - pub fn new() -> RequestProcesor { - RequestProcesor{ - message_channel: None + pub fn new(domain_config: DomainConfig) -> RequestProcesor { + RequestProcesor { + message_channel: None, + domain_config } } @@ -24,6 +27,10 @@ impl RequestProcesor { let (tx, rx): (Sender, Receiver) = mpsc::channel(); self.message_channel = Some(tx); + let mut base_domain_equality = self.domain_config.base_domain.clone(); + base_domain_equality.insert_str(0, "."); + let base_domain_len = base_domain_equality.len() + 1; + thread::spawn(move || { for m in rx @@ -34,14 +41,20 @@ impl RequestProcesor { Ok(r) => { info!("received dns message: {:?}", r); - let mut response = DNSResponse::a_from_request(&r, |q| Ipv4Addr::from([127, 0, 0, 1])); + if r.questions.iter().any(|q| q.qname.ends_with(&base_domain_equality)) + { - sending_channel.send(Box::from( - NetworkMessage { - buffer: Box::from(response.to_bytes()), - peer: response.peer - } - )); + } + else { + let mut response = DNSResponse::a_from_request(&r, |q| Ipv4Addr::from([127, 0, 0, 1])); + + sending_channel.send(Box::from( + NetworkMessage { + buffer: Box::from(response.to_bytes()), + peer: response.peer + } + )); + } } Err(e) => { match e {