adding asym crypto, fixing txt, appending logs
This commit is contained in:
parent
fdc8a7e338
commit
aa78441e5a
381
Cargo.lock
generated
381
Cargo.lock
generated
@ -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"
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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<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();
|
||||
|
||||
@ -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"));
|
||||
|
@ -8,3 +8,7 @@ edition = "2021"
|
||||
[dependencies]
|
||||
log = "0.4.20"
|
||||
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"
|
6
dnstp/src/config.rs
Normal file
6
dnstp/src/config.rs
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct DomainConfig {
|
||||
pub base_domain: String,
|
||||
pub key_endpoint: String,
|
||||
}
|
70
dnstp/src/crypto/mod.rs
Normal file
70
dnstp/src/crypto/mod.rs
Normal file
@ -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<SharedSecret<NistP256>, ()> {
|
||||
|
||||
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<NistP256>) -> Aes256GcmSiv
|
||||
{
|
||||
Aes256GcmSiv::new(secret.raw_secret_bytes())
|
||||
}
|
||||
|
||||
pub fn encrypt(key: &Aes256GcmSiv, nonce: &Nonce, bytes: &Vec<u8>) -> Result<Vec<u8>, ()>
|
||||
{
|
||||
match key.encrypt(nonce, bytes.as_ref()) {
|
||||
Ok(r) => {
|
||||
Ok(r)
|
||||
}
|
||||
Err(_) => {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn decrypt(key: &Aes256GcmSiv, nonce: &Nonce, bytes: &Vec<u8>) -> Result<Vec<u8>, ()>
|
||||
{
|
||||
match key.decrypt(nonce, bytes.as_ref()) {
|
||||
Ok(r) => {
|
||||
Ok(r)
|
||||
}
|
||||
Err(_) => {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
}
|
35
dnstp/src/crypto/tests.rs
Normal file
35
dnstp/src/crypto/tests.rs
Normal file
@ -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);
|
||||
}
|
@ -5,3 +5,7 @@ pub mod processor;
|
||||
pub mod message;
|
||||
pub mod net;
|
||||
mod string;
|
||||
pub mod config;
|
||||
mod crypto;
|
||||
|
||||
pub use config::DomainConfig;
|
@ -15,7 +15,7 @@ impl Debug for TXTRdata {
|
||||
|
||||
impl RData for TXTRdata {
|
||||
fn to_bytes(&self) -> Vec<u8> {
|
||||
self.rdata.into_bytes()
|
||||
self.rdata.clone().into_bytes()
|
||||
}
|
||||
}
|
||||
|
||||
|
0
dnstp/src/processor/encryption/mod.rs
Normal file
0
dnstp/src/processor/encryption/mod.rs
Normal file
@ -1,6 +1,7 @@
|
||||
|
||||
pub mod request;
|
||||
pub mod response;
|
||||
pub mod encryption;
|
||||
|
||||
pub use request::RequestProcesor;
|
||||
pub use response::ResponseProcesor;
|
||||
|
@ -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<Sender<NetworkMessagePtr>>
|
||||
message_channel: Option<Sender<NetworkMessagePtr>>,
|
||||
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<NetworkMessagePtr>, Receiver<NetworkMessagePtr>) = 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 {
|
||||
|
Loading…
Reference in New Issue
Block a user