From d036997de340d41cf5ba6188fc86a5a81c1bdfd3 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Sat, 3 May 2025 17:30:01 -0700 Subject: [PATCH] Workspacify --- Cargo.lock | 335 +++++++++++------- Cargo.toml | 47 ++- LICENSE | 2 +- client/Cargo.toml | 14 + src/client.rs => client/src/lib.rs | 14 +- configuration/Cargo.toml | 24 ++ {src/config => configuration/src}/client.rs | 14 +- .../src}/command_line.rs | 6 +- .../src}/config_file.rs | 10 +- .../src}/connection.rs | 4 +- {src/config => configuration/src}/console.rs | 0 {src/config => configuration/src}/error.rs | 2 +- src/config.rs => configuration/src/lib.rs | 0 {src/config => configuration/src}/logging.rs | 0 {src/config => configuration/src}/resolver.rs | 3 +- {src/config => configuration/src}/runtime.rs | 2 +- {src/config => configuration/src}/server.rs | 10 +- crypto/Cargo.toml | 10 + .../crypto => crypto/src}/known_algorithms.rs | 0 src/crypto.rs => crypto/src/lib.rs | 0 {src/crypto => crypto/src}/rsa.rs | 0 host/Cargo.toml | 11 + src/network/host.rs => host/src/lib.rs | 4 +- src/bin/hush.rs => hush/src/main.rs | 0 src/bin/hushd.rs => hushd/src/main.rs | 0 keys/Cargo.toml | 23 ++ {src/encodings/ssh => keys/src}/buffer.rs | 0 src/encodings/ssh.rs => keys/src/lib.rs | 0 .../encodings/ssh => keys/src}/private_key.rs | 6 +- .../ssh => keys/src}/private_key_file.rs | 4 +- {src/encodings/ssh => keys/src}/public_key.rs | 4 +- .../ssh => keys/src}/public_key_file.rs | 2 +- resolver/Cargo.toml | 20 ++ .../resolver.rs => resolver/src/lib.rs | 6 +- .../network/resolver => resolver/src}/name.rs | 0 .../resolver => resolver/src}/protocol.rs | 0 .../src}/protocol/client.rs | 4 +- .../src}/protocol/header.rs | 0 .../src}/protocol/question.rs | 4 +- .../src}/protocol/request.rs | 6 +- .../src}/protocol/resource_record.rs | 4 +- .../src}/protocol/resource_record/raw.rs | 2 +- .../src}/protocol/response.rs | 6 +- .../src}/protocol/server.rs | 0 .../src}/resolution_table.rs | 2 +- server/Cargo.toml | 10 + src/server.rs => server/src/lib.rs | 2 +- {src/server => server/src}/socket.rs | 2 +- {src/server => server/src}/state.rs | 2 +- src/encodings.rs | 1 - src/lib.rs | 10 - src/network.rs | 2 - ssh/Cargo.toml | 18 + {src/ssh => ssh/src}/channel.rs | 0 src/ssh.rs => ssh/src/lib.rs | 2 + {src/ssh => ssh/src}/message_ids.rs | 0 {src => ssh/src}/operational_error.rs | 2 +- {src/ssh => ssh/src}/packets.rs | 0 {src/ssh => ssh/src}/packets/key_exchange.rs | 6 +- {src/ssh => ssh/src}/preamble.rs | 0 60 files changed, 450 insertions(+), 212 deletions(-) create mode 100644 client/Cargo.toml rename src/client.rs => client/src/lib.rs (96%) create mode 100644 configuration/Cargo.toml rename {src/config => configuration/src}/client.rs (86%) rename {src/config => configuration/src}/command_line.rs (97%) rename {src/config => configuration/src}/config_file.rs (98%) rename {src/config => configuration/src}/connection.rs (98%) rename {src/config => configuration/src}/console.rs (100%) rename {src/config => configuration/src}/error.rs (94%) rename src/config.rs => configuration/src/lib.rs (100%) rename {src/config => configuration/src}/logging.rs (100%) rename {src/config => configuration/src}/resolver.rs (99%) rename {src/config => configuration/src}/runtime.rs (88%) rename {src/config => configuration/src}/server.rs (90%) create mode 100644 crypto/Cargo.toml rename {src/crypto => crypto/src}/known_algorithms.rs (100%) rename src/crypto.rs => crypto/src/lib.rs (100%) rename {src/crypto => crypto/src}/rsa.rs (100%) create mode 100644 host/Cargo.toml rename src/network/host.rs => host/src/lib.rs (98%) rename src/bin/hush.rs => hush/src/main.rs (100%) rename src/bin/hushd.rs => hushd/src/main.rs (100%) create mode 100644 keys/Cargo.toml rename {src/encodings/ssh => keys/src}/buffer.rs (100%) rename src/encodings/ssh.rs => keys/src/lib.rs (100%) rename {src/encodings/ssh => keys/src}/private_key.rs (99%) rename {src/encodings/ssh => keys/src}/private_key_file.rs (99%) rename {src/encodings/ssh => keys/src}/public_key.rs (99%) rename {src/encodings/ssh => keys/src}/public_key_file.rs (99%) create mode 100644 resolver/Cargo.toml rename src/network/resolver.rs => resolver/src/lib.rs (98%) rename {src/network/resolver => resolver/src}/name.rs (100%) rename {src/network/resolver => resolver/src}/protocol.rs (100%) rename {src/network/resolver => resolver/src}/protocol/client.rs (98%) rename {src/network/resolver => resolver/src}/protocol/header.rs (100%) rename {src/network/resolver => resolver/src}/protocol/question.rs (95%) rename {src/network/resolver => resolver/src}/protocol/request.rs (96%) rename {src/network/resolver => resolver/src}/protocol/resource_record.rs (99%) rename {src/network/resolver => resolver/src}/protocol/resource_record/raw.rs (99%) rename {src/network/resolver => resolver/src}/protocol/response.rs (98%) rename {src/network/resolver => resolver/src}/protocol/server.rs (100%) rename {src/network/resolver => resolver/src}/resolution_table.rs (99%) create mode 100644 server/Cargo.toml rename src/server.rs => server/src/lib.rs (92%) rename {src/server => server/src}/socket.rs (98%) rename {src/server => server/src}/state.rs (96%) delete mode 100644 src/encodings.rs delete mode 100644 src/lib.rs delete mode 100644 src/network.rs create mode 100644 ssh/Cargo.toml rename {src/ssh => ssh/src}/channel.rs (100%) rename src/ssh.rs => ssh/src/lib.rs (76%) rename {src/ssh => ssh/src}/message_ids.rs (100%) rename {src => ssh/src}/operational_error.rs (96%) rename {src/ssh => ssh/src}/packets.rs (100%) rename {src/ssh => ssh/src}/packets/key_exchange.rs (98%) rename {src/ssh => ssh/src}/preamble.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index bb696b8..8a0edcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,7 +36,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", "zerocopy 0.7.35", @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arbitrary" @@ -337,9 +337,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" dependencies = [ "clap_builder", "clap_derive", @@ -347,9 +347,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" dependencies = [ "anstream", "anstyle", @@ -375,12 +375,49 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +[[package]] +name = "client" +version = "0.0.0" +dependencies = [ + "configuration", + "crypto", + "error-stack", + "host", + "resolver", + "ssh", + "thiserror", + "tracing", + "whoami", +] + [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "configuration" +version = "0.0.0" +dependencies = [ + "clap", + "console-subscriber", + "crypto", + "nix", + "proptest", + "rustix", + "serde", + "tempfile", + "thiserror", + "tokio", + "toml", + "tracing", + "tracing-core", + "tracing-subscriber", + "url", + "xdg", +] + [[package]] name = "console-api" version = "0.8.1" @@ -446,9 +483,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -459,6 +496,17 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto" +version = "0.0.0" +dependencies = [ + "num-bigint-dig", + "num-integer", + "num-traits", + "thiserror", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -532,9 +580,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "pem-rfc7468", @@ -639,9 +687,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -681,9 +729,9 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -812,9 +860,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -852,9 +900,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" dependencies = [ "atomic-waker", "bytes", @@ -862,7 +910,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.8.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -883,9 +931,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -941,6 +989,18 @@ dependencies = [ "digest", ] +[[package]] +name = "host" +version = "0.0.0" +dependencies = [ + "error-stack", + "futures", + "resolver", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "http" version = "1.3.1" @@ -993,53 +1053,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" -[[package]] -name = "hushd" -version = "0.1.0" -dependencies = [ - "aes", - "base64 0.22.1", - "bcrypt-pbkdf", - "bytes", - "clap", - "console-subscriber", - "ctr", - "ed25519-dalek", - "elliptic-curve", - "error-stack", - "futures", - "generic-array", - "getrandom 0.3.2", - "internment", - "itertools", - "nix", - "num-bigint-dig", - "num-integer", - "num-traits", - "num_enum", - "p256", - "p384", - "p521", - "proptest", - "proptest-derive", - "rand 0.9.0", - "rand_chacha 0.9.0", - "rustix", - "sec1", - "serde", - "tempfile", - "thiserror", - "tokio", - "toml", - "tracing", - "tracing-core", - "tracing-subscriber", - "url", - "whoami", - "xdg", - "zeroize", -] - [[package]] name = "hyper" version = "1.6.0" @@ -1076,9 +1089,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", @@ -1086,6 +1099,7 @@ dependencies = [ "http", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -1244,12 +1258,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -1269,7 +1283,7 @@ checksum = "636d4b0f6a39fd684effe2a73f5310df16a3fa7954c26d36833e98f44d1977a2" dependencies = [ "ahash", "dashmap", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "once_cell", ] @@ -1294,6 +1308,30 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "keys" +version = "0.0.0" +dependencies = [ + "aes", + "base64 0.22.1", + "bcrypt-pbkdf", + "bytes", + "crypto", + "ctr", + "ed25519-dalek", + "elliptic-curve", + "error-stack", + "generic-array", + "num-bigint-dig", + "p256", + "p384", + "p521", + "sec1", + "ssh", + "thiserror", + "tokio", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1305,21 +1343,21 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -1378,9 +1416,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -1657,7 +1695,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy 0.8.25", ] [[package]] @@ -1681,9 +1719,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1785,13 +1823,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.24", ] [[package]] @@ -1820,7 +1857,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -1843,9 +1880,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ "bitflags", ] @@ -1894,6 +1931,27 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "resolver" +version = "0.0.0" +dependencies = [ + "bytes", + "configuration", + "crypto", + "error-stack", + "futures", + "internment", + "num_enum", + "proptest", + "proptest-derive", + "serde", + "thiserror", + "tokio", + "toml", + "tracing", + "url", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -1921,9 +1979,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags", "errno", @@ -2034,11 +2092,22 @@ dependencies = [ "serde", ] +[[package]] +name = "server" +version = "0.0.0" +dependencies = [ + "configuration", + "error-stack", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2056,9 +2125,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -2084,9 +2153,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" @@ -2114,6 +2183,25 @@ dependencies = [ "der", ] +[[package]] +name = "ssh" +version = "0.0.0" +dependencies = [ + "bytes", + "configuration", + "error-stack", + "getrandom 0.3.2", + "itertools", + "num_enum", + "proptest", + "proptest-derive", + "rand 0.9.1", + "rand_chacha 0.9.0", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2134,9 +2222,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -2151,9 +2239,9 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -2256,9 +2344,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -2269,9 +2357,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -2281,26 +2369,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "tonic" version = "0.12.3" @@ -2671,9 +2766,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" dependencies = [ "memchr", ] @@ -2740,11 +2835,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive 0.8.25", ] [[package]] @@ -2760,9 +2855,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 3894527..881c42f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,17 +1,32 @@ -[package] -name = "hushd" -version = "0.1.0" +[workspace] +resolver = "3" +members = [ + "client", + "configuration", + "crypto", + "host", + "keys", + "resolver", + "server", + "ssh", +] + +[workspace.package] +authors = ["Adam Wick "] +categories = ["cryptography", "network-programming", "security"] +description = "A collection of privacy- and security-focused network protocol implementations." edition = "2021" -authors = ["awick"] +homepage = "https://github.com/acw/hushd" +keywords = ["hush", "security", "dns", "ssh", "ssl", "tor"] +license = "Apache-2.0" +publish = false +readme = "README.md" +repository = "https://github.com/acw/hushd" +rust-version = "1.85.0" +version = "0.1.0" -[lib] -name = "hush" -path = "src/lib.rs" -[lints.rust] -unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] } - -[dependencies] +[workspace.dependencies] aes = { version = "0.8.4", features = ["zeroize"] } base64 = "0.22.1" bcrypt-pbkdf = "0.10.0" @@ -53,3 +68,13 @@ url = "2.5.4" whoami = { version = "1.6.0", default-features = false } xdg = "2.5.2" zeroize = "1.8.1" + +client = { path = "./client" } +configuration = { path = "./configuration" } +crypto = { path = "./crypto" } +host = { path = "./host" } +keys = { path = "./keys" } +resolver = { path = "./resolver" } +server = { path = "./server" } +ssh = { path = "./ssh" } + diff --git a/LICENSE b/LICENSE index 261eeb9..5e5540b 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2025 Adam Wick Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/client/Cargo.toml b/client/Cargo.toml new file mode 100644 index 0000000..2f6a2c5 --- /dev/null +++ b/client/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "client" +edition = "2024" + +[dependencies] +configuration = { workspace = true } +crypto = { workspace = true } +error-stack = { workspace = true } +host = { workspace = true } +resolver = { workspace = true } +ssh = { workspace = true } +thiserror = { workspace = true } +tracing = { workspace = true } +whoami = { workspace = true } diff --git a/src/client.rs b/client/src/lib.rs similarity index 96% rename from src/client.rs rename to client/src/lib.rs index 4eda17a..68789d1 100644 --- a/src/client.rs +++ b/client/src/lib.rs @@ -1,11 +1,11 @@ -use crate::config::client::{ClientCommand, ClientConfiguration}; -use crate::crypto::{ +use configuration::client::{ClientCommand, ClientConfiguration}; +use crypto::{ CompressionAlgorithm, EncryptionAlgorithm, HostKeyAlgorithm, KeyExchangeAlgorithm, MacAlgorithm, }; -use crate::network::host::Host; -use crate::network::resolver::Resolver; -use crate::ssh::{self, SshKeyExchange}; -use crate::OperationalError; +use host::Host; +use resolver::Resolver; +use ssh::{self, SshKeyExchange}; +use ssh::OperationalError; use error_stack::{report, Report, ResultExt}; use std::fmt; use std::str::FromStr; @@ -51,7 +51,7 @@ pub enum TargetParseError { #[error("Invalid hostname '{hostname}': {error}")] InvalidHostname { hostname: String, - error: crate::network::host::HostParseError, + error: host::HostParseError, }, } diff --git a/configuration/Cargo.toml b/configuration/Cargo.toml new file mode 100644 index 0000000..5bb2eb3 --- /dev/null +++ b/configuration/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "configuration" +edition = "2024" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] } + +[dependencies] +clap = { workspace = true } +console-subscriber = { workspace = true } +crypto = { workspace = true } +nix = { workspace = true } +proptest = { workspace = true } +rustix = { workspace = true } +serde = { workspace = true, features = ["derive"] } +tempfile = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +toml = { workspace = true } +tracing = { workspace = true } +tracing-core = { workspace = true } +tracing-subscriber = { workspace = true } +url = { workspace = true } +xdg = { workspace = true } diff --git a/src/config/client.rs b/configuration/src/client.rs similarity index 86% rename from src/config/client.rs rename to configuration/src/client.rs index ba1ead2..5409e8b 100644 --- a/src/config/client.rs +++ b/configuration/src/client.rs @@ -1,10 +1,10 @@ -use crate::config::command_line::ClientArguments; -pub use crate::config::command_line::ClientCommand; -use crate::config::config_file::ConfigFile; -use crate::config::error::ConfigurationError; -use crate::config::logging::LoggingConfiguration; -use crate::config::resolver::DnsConfig; -use crate::config::runtime::RuntimeConfiguration; +use crate::command_line::ClientArguments; +pub use crate::command_line::ClientCommand; +use crate::config_file::ConfigFile; +use crate::error::ConfigurationError; +use crate::logging::LoggingConfiguration; +use crate::resolver::DnsConfig; +use crate::runtime::RuntimeConfiguration; use clap::Parser; use std::ffi::OsString; use tracing_core::LevelFilter; diff --git a/src/config/command_line.rs b/configuration/src/command_line.rs similarity index 97% rename from src/config/command_line.rs rename to configuration/src/command_line.rs index f9c67e6..1094ca6 100644 --- a/src/config/command_line.rs +++ b/configuration/src/command_line.rs @@ -1,6 +1,6 @@ -use crate::config::console::ConsoleConfiguration; -use crate::config::logging::{LogTarget, LoggingConfiguration}; -use crate::config::runtime::RuntimeConfiguration; +use crate::console::ConsoleConfiguration; +use crate::logging::{LogTarget, LoggingConfiguration}; +use crate::runtime::RuntimeConfiguration; use clap::{Args, Parser, Subcommand}; use std::net::SocketAddr; use std::path::PathBuf; diff --git a/src/config/config_file.rs b/configuration/src/config_file.rs similarity index 98% rename from src/config/config_file.rs rename to configuration/src/config_file.rs index 59f8aec..6c14f13 100644 --- a/src/config/config_file.rs +++ b/configuration/src/config_file.rs @@ -1,8 +1,8 @@ -use crate::config::error::ConfigurationError; -use crate::config::logging::{LogMode, LogTarget, LoggingConfiguration}; -use crate::config::resolver::DnsConfig; -use crate::config::runtime::RuntimeConfiguration; -use crate::crypto::known_algorithms::{ +use crate::error::ConfigurationError; +use crate::logging::{LogMode, LogTarget, LoggingConfiguration}; +use crate::resolver::DnsConfig; +use crate::runtime::RuntimeConfiguration; +use crypto::known_algorithms::{ ALLOWED_COMPRESSION_ALGORITHMS, ALLOWED_ENCRYPTION_ALGORITHMS, ALLOWED_HOST_KEY_ALGORITHMS, ALLOWED_KEY_EXCHANGE_ALGORITHMS, ALLOWED_MAC_ALGORITHMS, }; diff --git a/src/config/connection.rs b/configuration/src/connection.rs similarity index 98% rename from src/config/connection.rs rename to configuration/src/connection.rs index f8ec2f5..bb2fd86 100644 --- a/src/config/connection.rs +++ b/configuration/src/connection.rs @@ -1,8 +1,8 @@ -use crate::crypto::known_algorithms::{ +use crypto::known_algorithms::{ ALLOWED_COMPRESSION_ALGORITHMS, ALLOWED_ENCRYPTION_ALGORITHMS, ALLOWED_HOST_KEY_ALGORITHMS, ALLOWED_KEY_EXCHANGE_ALGORITHMS, ALLOWED_MAC_ALGORITHMS, }; -use crate::crypto::{ +use crypto::{ CompressionAlgorithm, EncryptionAlgorithm, HostKeyAlgorithm, KeyExchangeAlgorithm, MacAlgorithm, }; use proptest::arbitrary::Arbitrary; diff --git a/src/config/console.rs b/configuration/src/console.rs similarity index 100% rename from src/config/console.rs rename to configuration/src/console.rs diff --git a/src/config/error.rs b/configuration/src/error.rs similarity index 94% rename from src/config/error.rs rename to configuration/src/error.rs index 7b47a5f..3e6120e 100644 --- a/src/config/error.rs +++ b/configuration/src/error.rs @@ -1,4 +1,4 @@ -use crate::config::config_file::ConfigFileError; +use crate::config_file::ConfigFileError; use std::path::PathBuf; use thiserror::Error; diff --git a/src/config.rs b/configuration/src/lib.rs similarity index 100% rename from src/config.rs rename to configuration/src/lib.rs diff --git a/src/config/logging.rs b/configuration/src/logging.rs similarity index 100% rename from src/config/logging.rs rename to configuration/src/logging.rs diff --git a/src/config/resolver.rs b/configuration/src/resolver.rs similarity index 99% rename from src/config/resolver.rs rename to configuration/src/resolver.rs index 711a1a8..00dce14 100644 --- a/src/config/resolver.rs +++ b/configuration/src/resolver.rs @@ -1,4 +1,3 @@ -use crate::network::resolver::name::Name; use proptest::arbitrary::Arbitrary; use proptest::strategy::{BoxedStrategy, Just, Strategy}; use serde::{Deserialize, Serialize}; @@ -226,7 +225,7 @@ impl Arbitrary for NameServerConfig { Just("tcp".to_string()), Just("udp".to_string()), ]; - let domain = Name::arbitrary(); + let domain = proptest::string::string_regex("[A-Za-z0-9]{1,40}").unwrap(); let port = proptest::option::of(u16::arbitrary()); let user = proptest::option::of(proptest::string::string_regex("[A-Za-z]{1,30}").unwrap()); let password = diff --git a/src/config/runtime.rs b/configuration/src/runtime.rs similarity index 88% rename from src/config/runtime.rs rename to configuration/src/runtime.rs index 72be273..792740a 100644 --- a/src/config/runtime.rs +++ b/configuration/src/runtime.rs @@ -1,4 +1,4 @@ -use crate::config::console::ConsoleConfiguration; +use crate::console::ConsoleConfiguration; pub struct RuntimeConfiguration { pub tokio_worker_threads: usize, diff --git a/src/config/server.rs b/configuration/src/server.rs similarity index 90% rename from src/config/server.rs rename to configuration/src/server.rs index 9706cd7..a23aaa3 100644 --- a/src/config/server.rs +++ b/configuration/src/server.rs @@ -1,8 +1,8 @@ -use crate::config::command_line::ServerArguments; -use crate::config::config_file::{ConfigFile, SocketConfig}; -use crate::config::error::ConfigurationError; -use crate::config::logging::LoggingConfiguration; -use crate::config::runtime::RuntimeConfiguration; +use crate::command_line::ServerArguments; +use crate::config_file::{ConfigFile, SocketConfig}; +use crate::error::ConfigurationError; +use crate::logging::LoggingConfiguration; +use crate::runtime::RuntimeConfiguration; use clap::Parser; use std::collections::HashMap; use std::ffi::OsString; diff --git a/crypto/Cargo.toml b/crypto/Cargo.toml new file mode 100644 index 0000000..0578935 --- /dev/null +++ b/crypto/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "crypto" +edition = "2024" + +[dependencies] +num-bigint-dig = { workspace = true } +num-integer = { workspace = true } +num-traits = { workspace = true } +thiserror = { workspace = true } +zeroize = { workspace = true } diff --git a/src/crypto/known_algorithms.rs b/crypto/src/known_algorithms.rs similarity index 100% rename from src/crypto/known_algorithms.rs rename to crypto/src/known_algorithms.rs diff --git a/src/crypto.rs b/crypto/src/lib.rs similarity index 100% rename from src/crypto.rs rename to crypto/src/lib.rs diff --git a/src/crypto/rsa.rs b/crypto/src/rsa.rs similarity index 100% rename from src/crypto/rsa.rs rename to crypto/src/rsa.rs diff --git a/host/Cargo.toml b/host/Cargo.toml new file mode 100644 index 0000000..bf52fa9 --- /dev/null +++ b/host/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "host" +edition = "2024" + +[dependencies] +error-stack = { workspace = true } +futures = { workspace = true } +resolver = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/src/network/host.rs b/host/src/lib.rs similarity index 98% rename from src/network/host.rs rename to host/src/lib.rs index 64d4909..1e0d4de 100644 --- a/src/network/host.rs +++ b/host/src/lib.rs @@ -1,7 +1,7 @@ -use crate::network::resolver::name::Name; -use crate::network::resolver::{ResolveError, Resolver}; use error_stack::{report, ResultExt}; use futures::stream::{FuturesUnordered, StreamExt}; +use resolver::name::Name; +use resolver::{ResolveError, Resolver}; use std::collections::HashSet; use std::fmt; use std::net::{AddrParseError, IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; diff --git a/src/bin/hush.rs b/hush/src/main.rs similarity index 100% rename from src/bin/hush.rs rename to hush/src/main.rs diff --git a/src/bin/hushd.rs b/hushd/src/main.rs similarity index 100% rename from src/bin/hushd.rs rename to hushd/src/main.rs diff --git a/keys/Cargo.toml b/keys/Cargo.toml new file mode 100644 index 0000000..57a6a9e --- /dev/null +++ b/keys/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "keys" +edition = "2024" + +[dependencies] +aes = { workspace = true } +base64 = { workspace = true } +bcrypt-pbkdf = { workspace = true } +bytes = { workspace = true } +ctr = { workspace = true } +crypto = { workspace = true } +ed25519-dalek = { workspace = true } +elliptic-curve = { workspace = true } +error-stack = { workspace = true } +generic-array = { workspace = true } +num-bigint-dig = { workspace = true } +p256 = { workspace = true } +p384 = { workspace = true } +p521 = { workspace = true } +sec1 = { workspace = true } +ssh = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } diff --git a/src/encodings/ssh/buffer.rs b/keys/src/buffer.rs similarity index 100% rename from src/encodings/ssh/buffer.rs rename to keys/src/buffer.rs diff --git a/src/encodings/ssh.rs b/keys/src/lib.rs similarity index 100% rename from src/encodings/ssh.rs rename to keys/src/lib.rs diff --git a/src/encodings/ssh/private_key.rs b/keys/src/private_key.rs similarity index 99% rename from src/encodings/ssh/private_key.rs rename to keys/src/private_key.rs index 6dc557d..fa45568 100644 --- a/src/encodings/ssh/private_key.rs +++ b/keys/src/private_key.rs @@ -1,6 +1,6 @@ -use crate::crypto::rsa; -use crate::encodings::ssh::buffer::SshReadBuffer; -use crate::encodings::ssh::public_key::PublicKey; +use crypto::rsa; +use crate::buffer::SshReadBuffer; +use crate::public_key::PublicKey; use bytes::Buf; use elliptic_curve::scalar::ScalarPrimitive; use elliptic_curve::sec1::FromEncodedPoint; diff --git a/src/encodings/ssh/private_key_file.rs b/keys/src/private_key_file.rs similarity index 99% rename from src/encodings/ssh/private_key_file.rs rename to keys/src/private_key_file.rs index 5e34312..b2629d3 100644 --- a/src/encodings/ssh/private_key_file.rs +++ b/keys/src/private_key_file.rs @@ -1,6 +1,6 @@ use super::{PublicKey, PublicKeyLoadError}; -use crate::encodings::ssh::buffer::SshReadBuffer; -use crate::encodings::ssh::private_key::{read_private_key, PrivateKey}; +use crate::buffer::SshReadBuffer; +use crate::private_key::{read_private_key, PrivateKey}; use aes::cipher::{KeyIvInit, StreamCipher}; use base64::engine::{self, Engine}; use bytes::{Buf, Bytes}; diff --git a/src/encodings/ssh/public_key.rs b/keys/src/public_key.rs similarity index 99% rename from src/encodings/ssh/public_key.rs rename to keys/src/public_key.rs index d69f4bf..b4ca5fd 100644 --- a/src/encodings/ssh/public_key.rs +++ b/keys/src/public_key.rs @@ -1,5 +1,5 @@ -use crate::crypto::rsa; -use crate::encodings::ssh::buffer::SshReadBuffer; +use crypto::rsa; +use crate::buffer::SshReadBuffer; use bytes::Bytes; use elliptic_curve::sec1::FromEncodedPoint; use error_stack::{report, ResultExt}; diff --git a/src/encodings/ssh/public_key_file.rs b/keys/src/public_key_file.rs similarity index 99% rename from src/encodings/ssh/public_key_file.rs rename to keys/src/public_key_file.rs index 351de7a..47e1c80 100644 --- a/src/encodings/ssh/public_key_file.rs +++ b/keys/src/public_key_file.rs @@ -1,4 +1,4 @@ -use crate::encodings::ssh::public_key::PublicKey; +use crate::public_key::PublicKey; use base64::engine::{self, Engine}; use bytes::Bytes; use error_stack::{report, ResultExt}; diff --git a/resolver/Cargo.toml b/resolver/Cargo.toml new file mode 100644 index 0000000..571b202 --- /dev/null +++ b/resolver/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "resolver" +edition = "2024" + +[dependencies] +bytes = { workspace = true } +configuration = { workspace = true } +crypto = { workspace = true } +error-stack = { workspace = true } +futures = { workspace = true } +internment = { workspace = true } +num_enum = { workspace = true } +proptest = { workspace = true } +proptest-derive = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +toml = { workspace = true } +tracing = { workspace = true } +url = { workspace = true } diff --git a/src/network/resolver.rs b/resolver/src/lib.rs similarity index 98% rename from src/network/resolver.rs rename to resolver/src/lib.rs index 0a89242..14179ff 100644 --- a/src/network/resolver.rs +++ b/resolver/src/lib.rs @@ -2,9 +2,9 @@ pub mod name; mod protocol; mod resolution_table; -use crate::config::resolver::{DnsConfig, NameServerConfig}; -use crate::network::resolver::name::Name; -use crate::network::resolver::resolution_table::ResolutionTable; +use configuration::resolver::{DnsConfig, NameServerConfig}; +use crate::name::Name; +use crate::resolution_table::ResolutionTable; use error_stack::{report, ResultExt}; use std::collections::{HashMap, HashSet}; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; diff --git a/src/network/resolver/name.rs b/resolver/src/name.rs similarity index 100% rename from src/network/resolver/name.rs rename to resolver/src/name.rs diff --git a/src/network/resolver/protocol.rs b/resolver/src/protocol.rs similarity index 100% rename from src/network/resolver/protocol.rs rename to resolver/src/protocol.rs diff --git a/src/network/resolver/protocol/client.rs b/resolver/src/protocol/client.rs similarity index 98% rename from src/network/resolver/protocol/client.rs rename to resolver/src/protocol/client.rs index 7bb320e..e68c18d 100644 --- a/src/network/resolver/protocol/client.rs +++ b/resolver/src/protocol/client.rs @@ -1,5 +1,5 @@ -use crate::network::resolver::protocol::header::Header; -use crate::network::resolver::protocol::question::Question; +use crate::protocol::header::Header; +use crate::protocol::question::Question; use bytes::{Bytes, BytesMut}; use error_stack::ResultExt; use std::net::SocketAddr; diff --git a/src/network/resolver/protocol/header.rs b/resolver/src/protocol/header.rs similarity index 100% rename from src/network/resolver/protocol/header.rs rename to resolver/src/protocol/header.rs diff --git a/src/network/resolver/protocol/question.rs b/resolver/src/protocol/question.rs similarity index 95% rename from src/network/resolver/protocol/question.rs rename to resolver/src/protocol/question.rs index 675b305..5ca45a6 100644 --- a/src/network/resolver/protocol/question.rs +++ b/resolver/src/protocol/question.rs @@ -1,5 +1,5 @@ -use crate::network::resolver::name::Name; -use crate::network::resolver::protocol::resource_record::raw::{RecordClass, RecordType}; +use crate::name::Name; +use crate::protocol::resource_record::raw::{RecordClass, RecordType}; use bytes::{Buf, BufMut, TryGetError}; use error_stack::{report, ResultExt}; use std::fmt; diff --git a/src/network/resolver/protocol/request.rs b/resolver/src/protocol/request.rs similarity index 96% rename from src/network/resolver/protocol/request.rs rename to resolver/src/protocol/request.rs index bf848ae..a0b2201 100644 --- a/src/network/resolver/protocol/request.rs +++ b/resolver/src/protocol/request.rs @@ -1,8 +1,8 @@ use bytes::{Buf, BufMut}; use error_stack::{report, ResultExt}; -use crate::network::resolver::protocol::header::{Header, OpCode, ResponseCode}; -use crate::network::resolver::protocol::question::Question; -use crate::network::resolver::protocol::resource_record::ResourceRecord; +use crate::protocol::header::{Header, OpCode, ResponseCode}; +use crate::protocol::question::Question; +use crate::protocol::resource_record::ResourceRecord; #[derive(Clone, Debug, PartialEq, proptest_derive::Arbitrary)] pub struct Request { diff --git a/src/network/resolver/protocol/resource_record.rs b/resolver/src/protocol/resource_record.rs similarity index 99% rename from src/network/resolver/protocol/resource_record.rs rename to resolver/src/protocol/resource_record.rs index 6722c0b..b779927 100644 --- a/src/network/resolver/protocol/resource_record.rs +++ b/resolver/src/protocol/resource_record.rs @@ -1,7 +1,7 @@ pub mod raw; -use crate::network::resolver::name::Name; -use crate::network::resolver::protocol::resource_record::raw::RawResourceRecord; +use crate::name::Name; +use crate::protocol::resource_record::raw::RawResourceRecord; use bytes::{Buf, BufMut, Bytes, BytesMut}; use error_stack::{report, ResultExt}; use proptest::arbitrary::Arbitrary; diff --git a/src/network/resolver/protocol/resource_record/raw.rs b/resolver/src/protocol/resource_record/raw.rs similarity index 99% rename from src/network/resolver/protocol/resource_record/raw.rs rename to resolver/src/protocol/resource_record/raw.rs index 56fdaa1..275a935 100644 --- a/src/network/resolver/protocol/resource_record/raw.rs +++ b/resolver/src/protocol/resource_record/raw.rs @@ -1,4 +1,4 @@ -use crate::network::resolver::name::Name; +use crate::name::Name; use bytes::{Buf, BufMut, Bytes}; use error_stack::{report, ResultExt}; use num_enum::{FromPrimitive, IntoPrimitive}; diff --git a/src/network/resolver/protocol/response.rs b/resolver/src/protocol/response.rs similarity index 98% rename from src/network/resolver/protocol/response.rs rename to resolver/src/protocol/response.rs index e584344..b3f32c8 100644 --- a/src/network/resolver/protocol/response.rs +++ b/resolver/src/protocol/response.rs @@ -1,8 +1,8 @@ use bytes::{Buf, BufMut}; use error_stack::ResultExt; -use crate::network::resolver::protocol::header::{Header, ResponseCode}; -use crate::network::resolver::protocol::question::Question; -use crate::network::resolver::protocol::resource_record::ResourceRecord; +use crate::protocol::header::{Header, ResponseCode}; +use crate::protocol::question::Question; +use crate::protocol::resource_record::ResourceRecord; #[derive(Clone, Debug, PartialEq, proptest_derive::Arbitrary)] pub enum Response { diff --git a/src/network/resolver/protocol/server.rs b/resolver/src/protocol/server.rs similarity index 100% rename from src/network/resolver/protocol/server.rs rename to resolver/src/protocol/server.rs diff --git a/src/network/resolver/resolution_table.rs b/resolver/src/resolution_table.rs similarity index 99% rename from src/network/resolver/resolution_table.rs rename to resolver/src/resolution_table.rs index 1e7e99b..7f58630 100644 --- a/src/network/resolver/resolution_table.rs +++ b/resolver/src/resolution_table.rs @@ -1,4 +1,4 @@ -use crate::network::resolver::name::Name; +use crate::name::Name; use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use std::net::IpAddr; diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 0000000..d7ba466 --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "server" +edition = "2024" + +[dependencies] +configuration = { workspace = true } +error-stack = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/src/server.rs b/server/src/lib.rs similarity index 92% rename from src/server.rs rename to server/src/lib.rs index a4e0d09..4356243 100644 --- a/src/server.rs +++ b/server/src/lib.rs @@ -1,7 +1,7 @@ mod socket; mod state; -use crate::config::server::ServerConfiguration; +use configuration::server::ServerConfiguration; use error_stack::ResultExt; use thiserror::Error; diff --git a/src/server/socket.rs b/server/src/socket.rs similarity index 98% rename from src/server/socket.rs rename to server/src/socket.rs index faa5a13..7b1ecc1 100644 --- a/src/server/socket.rs +++ b/server/src/socket.rs @@ -1,4 +1,4 @@ -use crate::server::TopLevelError; +use crate::TopLevelError; use error_stack::ResultExt; use tokio::net::{UnixListener, UnixStream}; use tracing::Instrument; diff --git a/src/server/state.rs b/server/src/state.rs similarity index 96% rename from src/server/state.rs rename to server/src/state.rs index 1235cf9..4456d4d 100644 --- a/src/server/state.rs +++ b/server/src/state.rs @@ -1,4 +1,4 @@ -use crate::server::TopLevelError; +use crate::TopLevelError; use tokio::task::JoinSet; #[derive(Default)] diff --git a/src/encodings.rs b/src/encodings.rs deleted file mode 100644 index aa086fd..0000000 --- a/src/encodings.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod ssh; diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index f6a77a0..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub mod client; -pub mod config; -pub mod crypto; -pub mod encodings; -pub mod network; -mod operational_error; -pub mod server; -pub mod ssh; - -pub use operational_error::OperationalError; diff --git a/src/network.rs b/src/network.rs deleted file mode 100644 index 5e50823..0000000 --- a/src/network.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod host; -pub mod resolver; diff --git a/ssh/Cargo.toml b/ssh/Cargo.toml new file mode 100644 index 0000000..f85d03a --- /dev/null +++ b/ssh/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "ssh" +edition = "2024" + +[dependencies] +bytes = { workspace = true } +configuration = { workspace = true } +error-stack = { workspace = true } +getrandom = { workspace = true } +itertools = { workspace = true } +num_enum = { workspace = true } +proptest = { workspace = true } +proptest-derive = { workspace = true } +rand = { workspace = true } +rand_chacha = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/src/ssh/channel.rs b/ssh/src/channel.rs similarity index 100% rename from src/ssh/channel.rs rename to ssh/src/channel.rs diff --git a/src/ssh.rs b/ssh/src/lib.rs similarity index 76% rename from src/ssh.rs rename to ssh/src/lib.rs index 8565485..c67d8ec 100644 --- a/src/ssh.rs +++ b/ssh/src/lib.rs @@ -1,9 +1,11 @@ mod channel; mod message_ids; +mod operational_error; mod packets; mod preamble; pub use channel::SshChannel; pub use message_ids::SshMessageID; +pub use operational_error::OperationalError; pub use packets::{SshKeyExchange, SshKeyExchangeProcessingError}; pub use preamble::Preamble; diff --git a/src/ssh/message_ids.rs b/ssh/src/message_ids.rs similarity index 100% rename from src/ssh/message_ids.rs rename to ssh/src/message_ids.rs diff --git a/src/operational_error.rs b/ssh/src/operational_error.rs similarity index 96% rename from src/operational_error.rs rename to ssh/src/operational_error.rs index 297354e..35ba115 100644 --- a/src/operational_error.rs +++ b/ssh/src/operational_error.rs @@ -1,4 +1,4 @@ -use crate::ssh::{SshKeyExchangeProcessingError, SshMessageID}; +use crate::{SshKeyExchangeProcessingError, SshMessageID}; use thiserror::Error; #[derive(Debug, Error)] diff --git a/src/ssh/packets.rs b/ssh/src/packets.rs similarity index 100% rename from src/ssh/packets.rs rename to ssh/src/packets.rs diff --git a/src/ssh/packets/key_exchange.rs b/ssh/src/packets/key_exchange.rs similarity index 98% rename from src/ssh/packets/key_exchange.rs rename to ssh/src/packets/key_exchange.rs index fb41b4b..21c6656 100644 --- a/src/ssh/packets/key_exchange.rs +++ b/ssh/src/packets/key_exchange.rs @@ -1,6 +1,6 @@ -use crate::config::connection::ClientConnectionOpts; -use crate::ssh::channel::SshPacket; -use crate::ssh::message_ids::SshMessageID; +use configuration::connection::ClientConnectionOpts; +use crate::channel::SshPacket; +use crate::message_ids::SshMessageID; use bytes::{Buf, BufMut, Bytes, BytesMut}; use itertools::Itertools; use proptest::arbitrary::Arbitrary; diff --git a/src/ssh/preamble.rs b/ssh/src/preamble.rs similarity index 100% rename from src/ssh/preamble.rs rename to ssh/src/preamble.rs