From 6ad41320d4a3e40a47c76f894c8efeea67b07d8c Mon Sep 17 00:00:00 2001 From: Sachymetsu Date: Mon, 23 Mar 2026 15:15:40 +0100 Subject: [PATCH] Yeet Noise and roll my own crypto lmao --- .cargo/config.toml | 13 +- Cargo.lock | 649 ++++++++++++++++++++++++++++++++++++--------- Cargo.toml | 21 +- src/errors.rs | 15 +- src/net.rs | 10 +- src/net/crypto.rs | 97 +++++++ src/net/noise.rs | 164 ------------ src/net/rpc.rs | 11 +- 8 files changed, 663 insertions(+), 317 deletions(-) create mode 100644 src/net/crypto.rs delete mode 100644 src/net/noise.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 3054f14..8cdc107 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -2,8 +2,17 @@ runner = "probe-rs run --chip RP2040 --preverify" [build] -target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ -rustflags = ["-Z", "unstable-options", "-C", "panic=immediate-abort", "--cfg", "getrandom_backend=\"custom\""] +target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ +rustflags = [ + "-Z", + "unstable-options", + "-C", + "panic=immediate-abort", + "--cfg", + "getrandom_backend=\"custom\"", + "--cfg", + "sha2_backend=\"soft-compact\"", +] [env] DEFMT_LOG = "info" diff --git a/Cargo.lock b/Cargo.lock index b59d302..ce2186c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,12 +19,12 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" -version = "0.5.2" +version = "0.6.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +checksum = "6b657e772794c6b04730ea897b66a058ccd866c16d1967da05eeeecec39043fe" dependencies = [ - "crypto-common", - "generic-array", + "crypto-common 0.2.1", + "inout", ] [[package]] @@ -36,6 +36,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + [[package]] name = "arrayvec" version = "0.7.6" @@ -93,9 +99,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" dependencies = [ - "rustc_version 0.2.3", + "rustc_version", ] +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + [[package]] name = "base64" version = "0.13.1" @@ -142,21 +154,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] -name = "blake2" -version = "0.10.6" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "digest", + "generic-array", ] [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -203,39 +215,44 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chacha20" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.3.0", ] [[package]] name = "chacha20poly1305" -version = "0.10.1" +version = "0.11.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +checksum = "1c9ed179664f12fd6f155f6dd632edf5f3806d48c228c67ff78366f2a0eb6b5e" dependencies = [ "aead", "chacha20", "cipher", "poly1305", - "zeroize", ] [[package]] name = "cipher" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "e34d8227fe1ba289043aeb13792056ff80fd6de1a9f49137a5f499de8e8c78ea" dependencies = [ - "crypto-common", + "block-buffer 0.12.0", + "crypto-common 0.2.1", "inout", - "zeroize", ] +[[package]] +name = "cmov" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0758edba32d61d1fd9f4d69491b47604b91ee2f7e6b33de7e54ca4ebe55dc3" + [[package]] name = "cobs" version = "0.3.0" @@ -261,6 +278,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "cortex-m" version = "0.7.7" @@ -293,6 +316,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "cpubits" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef0c543070d296ea414df2dd7625d1b24866ce206709d8a4a424f28377f5861" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -302,6 +331,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc-any" version = "2.5.0" @@ -323,6 +361,22 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-bigint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9b6a7421484856c90cb2e996b91068d608539bb4e6f0a111b16d70678824d09" +dependencies = [ + "cpubits", + "ctutils", + "getrandom", + "hybrid-array", + "num-traits", + "rand_core 0.10.0", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -334,28 +388,24 @@ dependencies = [ ] [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "crypto-common" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "fiat-crypto", - "rustc_version 0.4.1", - "subtle", + "getrandom", + "hybrid-array", + "rand_core 0.10.0", ] [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "ctutils" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +checksum = "1005a6d4446f5120ef475ad3d2af2b30c49c2c9c6904258e3bb30219bebed5e4" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "cmov", + "subtle", ] [[package]] @@ -483,15 +533,48 @@ dependencies = [ "defmt 1.0.1", ] +[[package]] +name = "der" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "dhkem" +version = "0.1.0-rc.0" +source = "git+https://github.com/RustCrypto/KEMs?rev=2d277162e0c5ed1c53bb315d0c0dace394cba70a#2d277162e0c5ed1c53bb315d0c0dace394cba70a" +dependencies = [ + "elliptic-curve", + "hkdf", + "k256", + "kem", + "rand_core 0.10.0", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", - "subtle", + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +dependencies = [ + "block-buffer 0.12.0", + "crypto-common 0.2.1", + "ctutils", ] [[package]] @@ -503,12 +586,44 @@ dependencies = [ "litrs", ] +[[package]] +name = "ecdsa" +version = "0.17.0-rc.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91bbdd377139884fafcad8dc43a760a3e1e681aa26db910257fa6535b70e1829" +dependencies = [ + "der", + "elliptic-curve", + "signature", + "zeroize", +] + [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "elliptic-curve" +version = "0.14.0-rc.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e84043d573efd4ac9d2d125817979a379204bf7e328b25a4a30487e8d100e618" +dependencies = [ + "base16ct", + "crypto-bigint", + "crypto-common 0.2.1", + "digest 0.11.2", + "hkdf", + "hybrid-array", + "rand_core 0.10.0", + "rustcrypto-ff", + "rustcrypto-group", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "embassy-embedded-hal" version = "0.5.0" @@ -682,9 +797,9 @@ dependencies = [ [[package]] name = "embassy-time" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa65b9284d974dad7a23bb72835c4ec85c0b540d86af7fc4098c88cff51d65" +checksum = "592b0c143ec626e821d4d90da51a2bd91d559d6c442b7c74a47d368c9e23d97a" dependencies = [ "cfg-if", "critical-section", @@ -699,9 +814,9 @@ dependencies = [ [[package]] name = "embassy-time-driver" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a244c7dc22c8d0289379c8d8830cae06bb93d8f990194d0de5efb3b5ae7ba6" +checksum = "6ee71af1b3a0deaa53eaf2d39252f83504c853646e472400b763060389b9fcc9" dependencies = [ "document-features", ] @@ -845,17 +960,11 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - [[package]] name = "fixed" -version = "1.30.0" +version = "1.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c566da967934c6c7ee0458a9773de9b2a685bd2ce26a3b28ddfc740e640182f5" +checksum = "9af2cbf772fa6d1c11358f92ef554cb6b386201210bcf0e91fb7fba8a907fb40" dependencies = [ "az", "bytemuck", @@ -875,6 +984,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "futures" version = "0.3.32" @@ -969,14 +1084,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", "r-efi", + "rand_core 0.10.0", "wasip2", + "wasip3", ] [[package]] @@ -1005,6 +1122,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -1032,6 +1158,47 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hkdf" +version = "0.13.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb55385998ae66b8d2d5143c05c94b9025ab863966f0c94ce7a5fde30105092" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.13.0-rc.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60017b071c523c9e5a55dd1253582bff6150c5e96a7e8511e419de1ab5ee97f9" +dependencies = [ + "digest 0.11.2", +] + +[[package]] +name = "hybrid-array" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8655f91cd07f2b9d0c24137bd650fe69617773435ee5ec83022377777ce65ef1" +dependencies = [ + "subtle", + "typenum", + "zeroize", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -1045,16 +1212,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] name = "inout" -version = "0.1.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -1072,6 +1241,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + [[package]] name = "jiff" version = "0.2.23" @@ -1094,13 +1269,34 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "k256" +version = "0.14.0-rc.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2c6c227649d5ec80eaae541f1736232641a0bcdb3062a52b34edb42054158" +dependencies = [ + "cpubits", + "ecdsa", + "elliptic-curve", +] + [[package]] name = "keccak" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "kem" +version = "0.3.0-rc.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ae2c3347ff4a7af4f679a9e397c2c7e6034a00b773dd2dd3c001d7f40897c9" +dependencies = [ + "crypto-common 0.2.1", + "rand_core 0.10.0", ] [[package]] @@ -1135,6 +1331,12 @@ dependencies = [ "rustversion", ] +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.183" @@ -1260,11 +1462,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ - "num_enum_derive 0.7.5", + "num_enum_derive 0.7.6", "rustversion", ] @@ -1281,9 +1483,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro2", "quote", @@ -1299,12 +1501,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "owo-colors" version = "4.3.0" @@ -1386,6 +1582,7 @@ dependencies = [ "cyw43-pio", "defmt 1.0.1", "defmt-rtt", + "dhkem", "embassy-embedded-hal", "embassy-executor", "embassy-futures", @@ -1402,11 +1599,11 @@ dependencies = [ "postcard", "rlsf", "sachy-config", + "sachy-crypto", "sachy-fmt", "sachy-mdns", "sachy-sntp", "serde", - "snow", "static_cell", "striker-proto", ] @@ -1434,7 +1631,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61d90fddc3d67f21bbf93683bc461b05d6a29c708caf3ffb79947d7ff7095406" dependencies = [ "arrayvec", - "num_enum 0.7.5", + "num_enum 0.7.6", "paste", ] @@ -1467,12 +1664,11 @@ dependencies = [ [[package]] name = "poly1305" -version = "0.8.0" +version = "0.9.0-rc.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "19feddcbdf17fad33f40041c7f9e768faf19455f32a6d52ba1b8b65ffc7b1cae" dependencies = [ - "cpufeatures", - "opaque-debug", + "cpufeatures 0.3.0", "universal-hash", ] @@ -1487,9 +1683,9 @@ dependencies = [ [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] @@ -1513,6 +1709,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -1555,9 +1761,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.3.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand_core" @@ -1571,6 +1777,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1663,12 +1875,24 @@ dependencies = [ ] [[package]] -name = "rustc_version" -version = "0.4.1" +name = "rustcrypto-ff" +version = "0.14.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +checksum = "c5db129183b2c139d7d87d08be57cba626c715789db17aec65c8866bfd767d1f" dependencies = [ - "semver 1.0.27", + "rand_core 0.10.0", + "subtle", +] + +[[package]] +name = "rustcrypto-group" +version = "0.14.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c4b1463f274a3ff6fb2f44da43e576cb9424367bd96f185ead87b52fe00523" +dependencies = [ + "rand_core 0.10.0", + "rustcrypto-ff", + "subtle", ] [[package]] @@ -1693,17 +1917,28 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "sachy-config" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0b6253d886280bbbd2e55b6cd5787ec8d7d27fcb" dependencies = [ "base64ct", "miette", "toml_edit", ] +[[package]] +name = "sachy-crypto" +version = "0.1.0" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0b6253d886280bbbd2e55b6cd5787ec8d7d27fcb" +dependencies = [ + "chacha20poly1305", + "dhkem", + "k256", + "sha2", +] + [[package]] name = "sachy-fmt" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0b6253d886280bbbd2e55b6cd5787ec8d7d27fcb" dependencies = [ "defmt 1.0.1", ] @@ -1711,18 +1946,18 @@ dependencies = [ [[package]] name = "sachy-mdns" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0b6253d886280bbbd2e55b6cd5787ec8d7d27fcb" dependencies = [ "defmt 1.0.1", "embassy-time", "sachy-fmt", - "winnow", + "winnow 0.7.15", ] [[package]] name = "sachy-sntp" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0b6253d886280bbbd2e55b6cd5787ec8d7d27fcb" dependencies = [ "defmt 1.0.1", "embassy-net", @@ -1746,6 +1981,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46b9a5ab87780a3189a1d704766579517a04ad59de653b7aad7d38e8a15f7dc" +dependencies = [ + "base16ct", + "ctutils", + "der", + "hybrid-array", + "subtle", + "zeroize", +] + [[package]] name = "semver" version = "0.9.0" @@ -1797,6 +2046,30 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.11.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c5f3b1e2dc8aad28310d8410bd4d7e180eca65fca176c52ab00d364475d0024" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.11.2", +] + [[package]] name = "sha2-const-stable" version = "0.1.0" @@ -1809,10 +2082,19 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] +[[package]] +name = "signature" +version = "3.0.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" +dependencies = [ + "rand_core 0.10.0", +] + [[package]] name = "siphasher" version = "1.0.2" @@ -1857,20 +2139,6 @@ dependencies = [ "managed", ] -[[package]] -name = "snow" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599b506ccc4aff8cf7844bc42cf783009a434c1e26c964432560fb6d6ad02d82" -dependencies = [ - "blake2", - "chacha20poly1305", - "curve25519-dalek", - "getrandom", - "rustc_version 0.4.1", - "subtle", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -2035,40 +2303,40 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.0.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap", "toml_datetime", "toml_parser", "toml_writer", - "winnow", + "winnow 1.0.0", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.0.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" dependencies = [ - "winnow", + "winnow 1.0.0", ] [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" [[package]] name = "typenum" @@ -2108,12 +2376,12 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96" dependencies = [ - "crypto-common", - "subtle", + "crypto-common 0.2.1", + "ctutils", ] [[package]] @@ -2162,6 +2430,49 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap", + "semver 1.0.27", +] + [[package]] name = "winapi-util" version = "0.1.11" @@ -2265,6 +2576,12 @@ name = "winnow" version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] @@ -2274,21 +2591,103 @@ name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", @@ -2300,3 +2699,9 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index fd9fd2c..5e9663d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,11 +46,12 @@ rlsf = { version = "0.2.1", default-features = false } sachy-sntp = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-sntp", default-features = false, features = [ "embassy-net", "jiff", -] } +], branch = "sachy-crypto" } sachy-mdns = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-mdns", features = [ "server", -] } -sachy-fmt = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-fmt" } +], branch = "sachy-crypto" } +sachy-fmt = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-fmt", branch = "sachy-crypto" } +sachy-crypto = { git = "https://tangled.org/sachy.dev/sachy-embed-core", branch = "sachy-crypto" } striker-proto = { git = "https://tangled.org/sachy.dev/striker", package = "striker-proto" } embassy-strike-driver = { git = "https://tangled.org/sachy.dev/strike-sensor", package = "embassy-strike-driver", features = [ "rp2040", @@ -91,16 +92,14 @@ embassy-net = { version = "0.7.1", features = [ ] } cyw43 = { version = "0.6.0", features = ["firmware-logs"] } cyw43-pio = { version = "0.9.0" } -snow = { version = "0.10", default-features = false, features = [ - "use-curve25519", - "use-chacha20poly1305", - "use-blake2", - "use-getrandom", -] } -getrandom = { version = "0.3.4", default-features = false } +getrandom = { version = "0.4", default-features = false } +dhkem = { version = "0.1.0-rc.0", features = ["getrandom", "k256"] } + +[patch.crates-io] +dhkem = { git = "https://github.com/RustCrypto/KEMs", rev = "2d277162e0c5ed1c53bb315d0c0dace394cba70a" } [build-dependencies] -sachy-config = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-config" } +sachy-config = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-config", branch = "sachy-crypto" } [profile.dev] debug = true diff --git a/src/errors.rs b/src/errors.rs index 5d4dfb9..743fe0a 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -12,7 +12,7 @@ pub enum PicoError { AllocationError, NoisePayloadTooBig, TcpError(embassy_net::tcp::Error), - NoiseProtoError, + CryptoProtoError, } impl core::fmt::Display for PicoError { @@ -23,7 +23,7 @@ impl core::fmt::Display for PicoError { Self::AllocationError => write!(f, "Failed to allocate memory"), Self::NoisePayloadTooBig => write!(f, "Invalid payload size"), Self::TcpError(error) => write!(f, "Network error: {error:?}"), - Self::NoiseProtoError => write!(f, "Noise protocol failure"), + Self::CryptoProtoError => write!(f, "Crypto protocol failure"), } } } @@ -60,9 +60,14 @@ impl From for PicoError { } } -impl From for PicoError { - fn from(_value: snow::Error) -> Self { - Self::NoiseProtoError +impl From for PicoError { + fn from(_value: sachy_crypto::AeadError) -> Self { + Self::CryptoProtoError } } +impl From for PicoError { + fn from(_value: sachy_crypto::HandshakeError) -> Self { + Self::CryptoProtoError + } +} diff --git a/src/net.rs b/src/net.rs index beee2ce..9a43178 100644 --- a/src/net.rs +++ b/src/net.rs @@ -1,5 +1,5 @@ +mod crypto; mod mdns; -mod noise; mod rpc; mod sntp; @@ -17,7 +17,6 @@ use sachy_mdns::{ use crate::{ constants::{HOST_NAME, HOST_PORT}, - net::noise::NOISE_PROTO, rtc::GlobalRtc, updates::UpdateConnection, utils::try_static_buffer_with, @@ -44,7 +43,7 @@ pub async fn udp_stack(stack: embassy_net::Stack<'static>, rtc: GlobalRtc<'stati .config_v4() .map(|config| config.address.address().into()), HOST_PORT, - [NOISE_PROTO], + [], )); loop { @@ -70,7 +69,6 @@ pub async fn tcp_stack(stack: embassy_net::Stack<'static>) { let rx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); let tx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); let mut tcp = TcpSocket::new(stack, rx_buffer, tx_buffer); - let net_data = UpdateConnection::get_receiver(); tcp.set_keep_alive(Some(Duration::from_secs(1))); tcp.set_timeout(Some(Duration::from_secs(10))); @@ -78,9 +76,9 @@ pub async fn tcp_stack(stack: embassy_net::Stack<'static>) { loop { stack.wait_config_up().await; - select(stack.wait_link_down(), rpc::rpc_loop(&mut tcp, &net_data)).await; + select(stack.wait_link_down(), rpc::rpc_loop(&mut tcp)).await; - net_data.clear(); + UpdateConnection::get_receiver().clear(); UpdateConnection::disconnect(); } diff --git a/src/net/crypto.rs b/src/net/crypto.rs new file mode 100644 index 0000000..01a10b0 --- /dev/null +++ b/src/net/crypto.rs @@ -0,0 +1,97 @@ +use alloc::vec::Vec; +use embassy_futures::select::select; +use embassy_net::tcp::{TcpReader, TcpSocket, TcpWriter}; +use embassy_sync::{blocking_mutex::raw::NoopRawMutex, mutex::Mutex}; +use sachy_crypto::{ServerHandshake, TransportState}; +use sachy_fmt::unwrap; + +use crate::{ + constants::NOISE_PSK, errors::PicoError, rpc::RpcServer, updates::UpdateConnection, + utils::try_buffer, +}; + +pub struct CryptoSession { + transport: Mutex, +} + +impl CryptoSession { + pub fn new(transport: TransportState) -> Self { + Self { + transport: Mutex::new(transport), + } + } + + async fn decrypt(&self, buf: &mut Vec) -> Result<(), PicoError> { + self.transport.lock().await.decrypt(buf)?; + Ok(()) + } + + async fn encrypt(&self, buf: &mut Vec) -> Result<(), PicoError> { + self.transport.lock().await.encrypt(buf)?; + Ok(()) + } + + async fn read_loop<'device>(&self, mut reader: TcpReader<'device>) -> Result<(), PicoError> { + let mut msg_buf: Vec = try_buffer(4096)?; + + loop { + let read = reader.read(&mut msg_buf).await?; + + msg_buf.truncate(read); + + if self.decrypt(&mut msg_buf).await.is_ok() + && let Ok(req) = striker_proto::receive_request(&mut msg_buf) + { + let Some((resp, resp_tx)) = RpcServer::handle_request(req) + .await + .zip(UpdateConnection::can_update()) + else { + break; + }; + resp_tx.try_send(resp).ok(); + } + + msg_buf.resize_with(4096, Default::default); + } + + Ok(()) + } + + async fn write_loop<'device>(&self, mut writer: TcpWriter<'device>) -> Result<(), PicoError> { + let mut msg_buf: Vec = try_buffer(4096)?; + let outgoing = UpdateConnection::get_receiver(); + + loop { + let data = outgoing.receive().await; + + let packet = unwrap!(striker_proto::send_response(data, &mut msg_buf)).len(); + + msg_buf.truncate(packet); + + self.encrypt(&mut msg_buf).await?; + + writer.write(&msg_buf).await?; + writer.flush().await?; + msg_buf.resize_with(4096, Default::default); + } + } + + pub async fn run<'device>(self, tcp: &mut TcpSocket<'device>) { + let (reader, writer) = tcp.split(); + + select(self.read_loop(reader), self.write_loop(writer)).await; + } +} + +pub async fn initialise<'device>(tcp: &mut TcpSocket<'device>) -> Result { + let mut buf = try_buffer(1024)?; + + let read = tcp.read(buf.as_mut_slice()).await?; + + let (ciphertext, handshake) = ServerHandshake::receive(&buf[..read])?; + + tcp.write(&ciphertext).await?; + tcp.flush().await?; + + Ok(CryptoSession::new(handshake.finish(&NOISE_PSK)?)) +} diff --git a/src/net/noise.rs b/src/net/noise.rs deleted file mode 100644 index 17370df..0000000 --- a/src/net/noise.rs +++ /dev/null @@ -1,164 +0,0 @@ -use embassy_futures::select::select; -use embassy_net::tcp::{TcpReader, TcpSocket, TcpWriter}; -use embassy_sync::{ - blocking_mutex::raw::NoopRawMutex, lazy_lock::LazyLock, mutex::Mutex, once_lock::OnceLock, -}; -use sachy_fmt::unwrap; -use snow::{Builder, Keypair, TransportState, params::NoiseParams}; - -use crate::{ - constants::NOISE_PSK, errors::PicoError, rpc::RpcServer, updates::UpdateConnection, - utils::try_buffer, -}; - -pub static NOISE_PROTO: &str = "Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s"; - -static PARAMS: LazyLock = - LazyLock::new(|| unwrap!(NOISE_PROTO.parse(), "Unable to parse Noise proto schema")); - -static LOCAL_PRIVATE_KEY: OnceLock = OnceLock::new(); - -pub struct NoiseSession { - transport: Mutex, -} - -impl NoiseSession { - pub async fn initialize<'device>(tcp: &mut TcpSocket<'device>) -> Result { - let state = noise_handshake(tcp).await?; - - Ok(Self { - transport: Mutex::new(state), - }) - } - - pub async fn run<'device>(self, tcp: &mut TcpSocket<'device>) { - let (reader, writer) = tcp.split(); - - select(self.read_loop(reader), self.write_loop(writer)).await; - } - - async fn read_loop<'device>(&self, mut reader: TcpReader<'device>) { - let mut buffer = unwrap!(try_buffer(8192)); - - let (packet_buf, msg_buf) = buffer.split_at_mut(4096); - - loop { - let Ok(received) = noise_recv(&mut reader, packet_buf).await else { - break; - }; - - if let Ok(msg) = self.transport.lock().await.read_message(received, msg_buf) - && let Ok(req) = striker_proto::receive_request(&mut msg_buf[..msg]) - { - let Some((resp, resp_tx)) = RpcServer::handle_request(req) - .await - .zip(UpdateConnection::can_update()) - else { - break; - }; - resp_tx.try_send(resp).ok(); - } - } - } - - async fn write_loop<'device>(&self, mut writer: TcpWriter<'device>) { - let outgoing = UpdateConnection::get_receiver(); - - let mut buffer = unwrap!(try_buffer(8192)); - - let (msg_buf, enc_buf) = buffer.split_at_mut(4096); - - loop { - let data = outgoing.receive().await; - - let packet = unwrap!(striker_proto::send_response(data, msg_buf)); - let written = unwrap!( - self.transport.lock().await.write_message(packet, enc_buf), - "Payload too big" - ); - - if noise_send(&mut writer, &enc_buf[..written]).await.is_err() { - break; - } - - if writer.flush().await.is_err() { - break; - } - } - } -} - -async fn noise_handshake<'device>( - tcp: &mut TcpSocket<'device>, -) -> Result { - let builder = Builder::new(PARAMS.get().clone()); - let static_key = LOCAL_PRIVATE_KEY - .get_or_init(|| unwrap!(builder.generate_keypair(), "Failed to generate key pair")); - - let mut noise = builder - .local_private_key(&static_key.private)? - .psk(3, &NOISE_PSK)? - .build_responder()?; - - let (mut reader, mut writer) = tcp.split(); - - let mut buffer = try_buffer(4096)?; - - let (payload, packet) = buffer.split_at_mut(2048); - - noise.read_message(noise_recv(&mut reader, packet).await?, payload)?; - - let len = noise.write_message(&[], payload)?; - - noise_send(&mut writer, &payload[..len]).await?; - - noise.read_message(noise_recv(&mut reader, packet).await?, payload)?; - - let transport = noise.into_transport_mode()?; - - Ok(transport) -} - -/// Hyper-basic stream transport receiver. 16-bit BE size followed by payload. -async fn noise_recv<'device, 'buffer>( - stream: &mut TcpReader<'device>, - packet: &'buffer mut [u8], -) -> Result<&'buffer [u8], PicoError> { - loop { - if let Some(written) = stream - .read_with(|buf| { - buf.split_at_checked(2).map_or((0, None), |(size, rest)| { - let mut msg_len_buf = [0u8; 2]; - msg_len_buf.copy_from_slice(size); - let buf_size = usize::from(u16::from_be_bytes(msg_len_buf)); - packet[..buf_size].copy_from_slice(&rest[..buf_size]); - - (2 + buf_size, Some(buf_size)) - }) - }) - .await? - { - return Ok(&packet[..written]); - } - } -} - -async fn noise_send<'device>( - stream: &mut TcpWriter<'device>, - payload: &[u8], -) -> Result<(), PicoError> { - let len = u16::try_from(payload.len())?; - while !stream - .write_with(|buf| { - buf.split_at_mut_checked(2) - .map_or((0, false), |(msg_size, rest)| { - msg_size.copy_from_slice(&len.to_be_bytes()); - rest[..payload.len()].copy_from_slice(payload); - (2 + payload.len(), true) - }) - }) - .await? - {} - stream.flush().await?; - Ok(()) -} diff --git a/src/net/rpc.rs b/src/net/rpc.rs index d18c580..4c95fc4 100644 --- a/src/net/rpc.rs +++ b/src/net/rpc.rs @@ -1,12 +1,9 @@ use embassy_net::tcp::TcpSocket; use sachy_fmt::{error, info}; -use crate::{ - constants::HOST_PORT, - updates::{NetDataReceiver, UpdateConnection}, -}; +use crate::{constants::HOST_PORT, updates::UpdateConnection}; -pub async fn rpc_loop<'device>(tcp: &mut TcpSocket<'device>, net_data: &NetDataReceiver) { +pub async fn rpc_loop<'device>(tcp: &mut TcpSocket<'device>) { loop { UpdateConnection::disconnect(); @@ -14,14 +11,14 @@ pub async fn rpc_loop<'device>(tcp: &mut TcpSocket<'device>, net_data: &NetDataR continue; } - match super::noise::NoiseSession::initialize(tcp).await { + match super::crypto::initialise(tcp).await { Ok(session) => { info!("Connected!"); UpdateConnection::connect(); session.run(tcp).await; - net_data.clear(); + UpdateConnection::get_receiver().clear(); info!("DISCONNECT"); } -- 2.51.2