From e4b63a421dd17569c491f996bc11c69a762497a1 Mon Sep 17 00:00:00 2001 From: Sachymetsu Date: Sun, 29 Mar 2026 08:32:35 +0200 Subject: [PATCH] Encrypted RPC comms --- Cargo.lock | 410 ++++++++++++++++++++++++++++++-------- Cargo.toml | 27 +-- firmware/nvram_rp2040.bin | Bin 0 -> 742 bytes src/allocator.rs | 6 +- src/detector.rs | 3 +- src/locks.rs | 1 - src/main.rs | 12 +- src/net.rs | 13 +- src/net/crypto.rs | 59 ++++-- src/utils.rs | 19 +- src/wifi.rs | 33 ++- 11 files changed, 440 insertions(+), 143 deletions(-) create mode 100644 firmware/nvram_rp2040.bin diff --git a/Cargo.lock b/Cargo.lock index add2cf3..84f66be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,6 +36,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + [[package]] name = "anyhow" version = "1.0.102" @@ -48,6 +57,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ascii-canvas" version = "4.0.0" @@ -173,15 +191,15 @@ dependencies = [ [[package]] name = "bt-hci" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb938a3b4c5cc6c2409275bad789c0346a0495fa071a0acc5d72b9bd3175a2f7" +checksum = "40f2166cc54c410ddc0d0dafb3cf8dd536bcbae6bddfcc12c020c5ee4de518de" dependencies = [ "btuuid", "defmt 1.0.1", - "embassy-sync", - "embedded-io 0.6.1", - "embedded-io-async", + "embassy-sync 0.7.2", + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", "futures-intrusive", "heapless 0.9.2", ] @@ -207,6 +225,16 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "cc" +version = "1.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -236,6 +264,17 @@ dependencies = [ "poly1305", ] +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "defmt 1.0.1", + "num-traits", + "pure-rust-locales", +] + [[package]] name = "cipher" version = "0.5.1" @@ -284,6 +323,16 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + [[package]] name = "cortex-m" version = "0.7.7" @@ -363,9 +412,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9b6a7421484856c90cb2e996b91068d608539bb4e6f0a111b16d70678824d09" +checksum = "42a0d26b245348befa0c121944541476763dcc46ede886c88f9d12e1697d27c3" dependencies = [ "cpubits", "ctutils", @@ -410,30 +459,31 @@ dependencies = [ [[package]] name = "cyw43" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff28275bda1b427b4cc6fb23c22505fef8ace0ccfadc9bffe3fdd6120ff1513" +checksum = "033e856bf6f38c96fee3e3f398cceff0ca2c2fae5db255bcd23495216c7047da" dependencies = [ + "aligned", "bt-hci", "cortex-m", "cortex-m-rt", "defmt 1.0.1", "embassy-futures", "embassy-net-driver-channel", - "embassy-sync", + "embassy-sync 0.8.0", "embassy-time", "embedded-hal 1.0.0", - "embedded-io-async", + "embedded-hal-async", + "embedded-io-async 0.7.0", "futures", - "heapless 0.8.0", - "num_enum 0.5.11", + "heapless 0.9.2", ] [[package]] name = "cyw43-pio" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1504988186aca75ebe6f0b8450c309baf342bc73b988844983ad6ba97291efe" +checksum = "768b74f36be804f7b1020938e711d91c0ab5a847cf620d3756245ae7e641e1e2" dependencies = [ "cyw43", "defmt 1.0.1", @@ -626,14 +676,14 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "554e3e840696f54b4c9afcf28a0f24da431c927f4151040020416e7393d6d0d8" +checksum = "b0641612053b2f34fc250bb63f6630ae75de46e02ade7f457268447081d709ce" dependencies = [ "defmt 1.0.1", "embassy-futures", - "embassy-hal-internal", - "embassy-sync", + "embassy-hal-internal 0.4.0", + "embassy-sync 0.8.0", "embedded-hal 0.2.7", "embedded-hal 1.0.0", "embedded-hal-async", @@ -644,10 +694,11 @@ dependencies = [ [[package]] name = "embassy-executor" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06070468370195e0e86f241c8e5004356d696590a678d47d6676795b2e439c6b" +checksum = "5d0d3b15c9d7dc4fec1d8cb77112472fb008b3b28c51ad23838d83587a6d2f1e" dependencies = [ + "cordyceps", "cortex-m", "critical-section", "defmt 1.0.1", @@ -658,9 +709,9 @@ dependencies = [ [[package]] name = "embassy-executor-macros" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfdddc3a04226828316bf31393b6903ee162238576b1584ee2669af215d55472" +checksum = "d11a246f53de5f97a387f40ac24726817cd0b6f833e7603baac784f29d6ff276" dependencies = [ "darling", "proc-macro2", @@ -682,9 +733,18 @@ checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" [[package]] name = "embassy-hal-internal" -version = "0.3.0" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f10ce10a4dfdf6402d8e9bd63128986b96a736b1a0a6680547ed2ac55d55dba" +dependencies = [ + "num-traits", +] + +[[package]] +name = "embassy-hal-internal" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +checksum = "568659fc53866d3d85c60fa33723fb751aa69e71507634fc2c19e7649432fb75" dependencies = [ "cortex-m", "critical-section", @@ -694,18 +754,18 @@ dependencies = [ [[package]] name = "embassy-net" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0558a231a47e7d4a06a28b5278c92e860f1200f24821d2f365a2f40fe3f3c7b2" +checksum = "97a788d93a10705db3350e81dc743c323e3e40371c5e52024afe7816d3ff05cf" dependencies = [ "defmt 1.0.1", "document-features", "embassy-net-driver", - "embassy-sync", + "embassy-sync 0.8.0", "embassy-time", - "embedded-io-async", + "embedded-io-async 0.7.0", "embedded-nal-async", - "heapless 0.8.0", + "heapless 0.9.2", "managed", "smoltcp", ] @@ -721,22 +781,23 @@ dependencies = [ [[package]] name = "embassy-net-driver-channel" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b2739fbcf6cd206ae08779c7d709087b16577d255f2ea4a45bc4bbbf305b3f" +checksum = "a07d2eb9f05a6fc876500949856ea1be40773d866d8cb99384f72d0ae4568c16" dependencies = [ "embassy-futures", "embassy-net-driver", - "embassy-sync", + "embassy-sync 0.8.0", ] [[package]] name = "embassy-rp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8d5ac11a8bc209d359ad98bb10a10f786471dd474790f3a4f991c77ae94f6f" +checksum = "5d98f472894c1ecffac5596c657af5305c57282d29e8746d7fec033951931bc8" dependencies = [ "cfg-if", + "chrono", "cortex-m", "cortex-m-rt", "critical-section", @@ -744,8 +805,8 @@ dependencies = [ "document-features", "embassy-embedded-hal", "embassy-futures", - "embassy-hal-internal", - "embassy-sync", + "embassy-hal-internal 0.5.0", + "embassy-sync 0.8.0", "embassy-time", "embassy-time-driver", "embassy-time-queue-utils", @@ -754,8 +815,8 @@ dependencies = [ "embedded-hal 1.0.0", "embedded-hal-async", "embedded-hal-nb", - "embedded-io 0.6.1", - "embedded-io-async", + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", "embedded-storage", "embedded-storage-async", "fixed", @@ -772,11 +833,11 @@ dependencies = [ [[package]] name = "embassy-strike-driver" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/strike-sensor#20f871621244db023615d50c3a1be42470e7c73a" +source = "git+https://tangled.org/sachy.dev/strike-sensor#2a519b4582211924f94fcd6c58fd79f186caa247" dependencies = [ "defmt 1.0.1", "embassy-rp", - "embassy-sync", + "embassy-sync 0.8.0", "embassy-time", ] @@ -788,13 +849,27 @@ checksum = "73974a3edbd0bd286759b3d483540f0ebef705919a5f56f4fc7709066f71689b" dependencies = [ "cfg-if", "critical-section", - "defmt 1.0.1", - "embedded-io-async", + "embedded-io-async 0.6.1", "futures-core", "futures-sink", "heapless 0.8.0", ] +[[package]] +name = "embassy-sync" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbd85cf5a5ae56bdf26f618364af642d1d0a4e245cdd75cd9aabda382f65a81" +dependencies = [ + "cfg-if", + "critical-section", + "defmt 1.0.1", + "embedded-io-async 0.7.0", + "futures-core", + "futures-sink", + "heapless 0.9.2", +] + [[package]] name = "embassy-time" version = "0.5.1" @@ -838,7 +913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17119855ccc2d1f7470a39756b12068454ae27a3eabb037d940b5c03d9c77b7a" dependencies = [ "defmt 1.0.1", - "embedded-io-async", + "embedded-io-async 0.6.1", ] [[package]] @@ -887,8 +962,14 @@ name = "embedded-io" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eb1aa714776b75c7e67e1da744b81a129b3ff919c8712b5e1b32252c1f07cc7" dependencies = [ - "defmt 0.3.100", + "defmt 1.0.1", ] [[package]] @@ -897,10 +978,19 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" dependencies = [ - "defmt 0.3.100", "embedded-io 0.6.1", ] +[[package]] +name = "embedded-io-async" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564b9f813c544241430e147d8bc454815ef9ac998878d30cc3055449f7fd4c0" +dependencies = [ + "defmt 1.0.1", + "embedded-io 0.7.1", +] + [[package]] name = "embedded-nal" version = "0.9.0" @@ -912,11 +1002,11 @@ dependencies = [ [[package]] name = "embedded-nal-async" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76959917cd2b86f40a98c28dd5624eddd1fa69d746241c8257eac428d83cb211" +checksum = "eb5a1bd585135d302f8f6d7de329310938093da6271b37a6c94b8798795c0c6d" dependencies = [ - "embedded-io-async", + "embedded-io-async 0.7.0", "embedded-nal", ] @@ -960,6 +1050,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "fixed" version = "1.31.0" @@ -1072,6 +1168,21 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1143,7 +1254,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ - "defmt 0.3.100", "hash32", "stable_deref_trait", ] @@ -1154,6 +1264,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" dependencies = [ + "defmt 1.0.1", "hash32", "stable_deref_trait", ] @@ -1331,6 +1442,12 @@ dependencies = [ "rustversion", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -1370,12 +1487,34 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + [[package]] name = "managed" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "memchr" version = "2.8.0" @@ -1443,21 +1582,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] -name = "num-traits" -version = "0.2.19" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "autocfg", + "windows-sys", ] [[package]] -name = "num_enum" -version = "0.5.11" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "num_enum_derive 0.5.11", + "autocfg", ] [[package]] @@ -1466,21 +1605,10 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ - "num_enum_derive 0.7.6", + "num_enum_derive", "rustversion", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.7.6" @@ -1501,6 +1629,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + [[package]] name = "owo-colors" version = "4.3.0" @@ -1589,8 +1723,9 @@ dependencies = [ "embassy-net", "embassy-rp", "embassy-strike-driver", - "embassy-sync", + "embassy-sync 0.8.0", "embassy-time", + "embedded-io-async 0.7.0", "getrandom", "heapless 0.8.0", "jiff", @@ -1631,7 +1766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61d90fddc3d67f21bbf93683bc461b05d6a29c708caf3ffb79947d7ff7095406" dependencies = [ "arrayvec", - "num_enum 0.7.6", + "num_enum", "paste", ] @@ -1750,6 +1885,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pure-rust-locales" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "869675ad2d7541aea90c6d88c81f46a7f4ea9af8cd0395d38f11a95126998a0d" +dependencies = [ + "defmt 1.0.1", +] + [[package]] name = "quote" version = "1.0.45" @@ -1917,7 +2061,7 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "sachy-config" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0d71132b89a23005c8cfcb69d918b5b0443d224f" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#f470f071b84599d7c2a5a6b88f4fa7605e2e32c3" dependencies = [ "base64ct", "miette", @@ -1927,7 +2071,7 @@ dependencies = [ [[package]] name = "sachy-crypto" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0d71132b89a23005c8cfcb69d918b5b0443d224f" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#00bd55bcd7e7534f6d44dcef02d42b3a1badf962" dependencies = [ "chacha20poly1305", "dhkem", @@ -1939,7 +2083,7 @@ dependencies = [ [[package]] name = "sachy-fmt" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0d71132b89a23005c8cfcb69d918b5b0443d224f" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#00bd55bcd7e7534f6d44dcef02d42b3a1badf962" dependencies = [ "defmt 1.0.1", ] @@ -1947,7 +2091,7 @@ dependencies = [ [[package]] name = "sachy-mdns" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0d71132b89a23005c8cfcb69d918b5b0443d224f" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#00bd55bcd7e7534f6d44dcef02d42b3a1badf962" dependencies = [ "defmt 1.0.1", "embassy-time", @@ -1958,7 +2102,7 @@ dependencies = [ [[package]] name = "sachy-sntp" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core?branch=sachy-crypto#0d71132b89a23005c8cfcb69d918b5b0443d224f" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#00bd55bcd7e7534f6d44dcef02d42b3a1badf962" dependencies = [ "defmt 1.0.1", "embassy-net", @@ -1976,6 +2120,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -2087,6 +2237,21 @@ dependencies = [ "keccak", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" version = "3.0.0-rc.10" @@ -2128,15 +2293,15 @@ dependencies = [ [[package]] name = "smoltcp" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad095989c1533c1c266d9b1e8d70a1329dd3723c3edac6d03bbd67e7bf6f4bb" +checksum = "ac729b0a77bd092a3f06ddaddc59fe0d67f48ba0de45a9abe707c2842c7f8767" dependencies = [ "bitflags 1.3.2", "byteorder", "cfg-if", "defmt 0.3.100", - "heapless 0.8.0", + "heapless 0.9.2", "managed", ] @@ -2302,6 +2467,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "toml_datetime" version = "1.1.0+spec-1.1.0" @@ -2339,6 +2513,67 @@ version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + [[package]] name = "typenum" version = "1.19.0" @@ -2385,6 +2620,12 @@ dependencies = [ "ctutils", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "vcell" version = "0.1.3" @@ -2489,6 +2730,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.61.2" diff --git a/Cargo.toml b/Cargo.toml index 5e9663d..d7859cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,27 +46,27 @@ 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", -], 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" } +] } +sachy-fmt = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-fmt" } +sachy-crypto = { git = "https://tangled.org/sachy.dev/sachy-embed-core" } 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", "alloc", "debug", ] } -embassy-embedded-hal = { version = "0.5.0" } -embassy-sync = { version = "0.7.2" } -embassy-executor = { version = "0.9.0", features = [ - "arch-cortex-m", +embassy-embedded-hal = { version = "0.6.0" } +embassy-sync = { version = "0.8" } +embassy-executor = { version = "0.10.0", features = [ + "platform-cortex-m", "executor-thread", "executor-interrupt", ] } -embassy-time = { version = "0.5.0" } -embassy-rp = { version = "0.9.0", features = [ +embassy-time = { version = "0.5.1" } +embassy-rp = { version = "0.10.0", features = [ "unstable-pac", "time-driver", "critical-section-impl", @@ -76,7 +76,7 @@ embassy-rp = { version = "0.9.0", features = [ "rom-v2-intrinsics", ] } embassy-futures = { version = "0.1.2" } -embassy-net = { version = "0.7.1", features = [ +embassy-net = { version = "0.9", features = [ "icmp", "udp", "tcp", @@ -90,10 +90,11 @@ embassy-net = { version = "0.7.1", features = [ "medium-ip", "medium-ethernet", ] } -cyw43 = { version = "0.6.0", features = ["firmware-logs"] } -cyw43-pio = { version = "0.9.0" } +cyw43 = { version = "0.7.0", features = ["firmware-logs"] } +cyw43-pio = { version = "0.10.0" } getrandom = { version = "0.4", default-features = false } dhkem = { version = "0.1.0-rc.0", features = ["getrandom", "k256"] } +embedded-io-async = "0.7.0" [patch.crates-io] dhkem = { git = "https://github.com/RustCrypto/KEMs", rev = "2d277162e0c5ed1c53bb315d0c0dace394cba70a" } diff --git a/firmware/nvram_rp2040.bin b/firmware/nvram_rp2040.bin new file mode 100644 index 0000000000000000000000000000000000000000..7a24de5ec16c277bb0ec68b4665683d7c4cd1683 GIT binary patch literal 742 zcmeYZ3v%=gN-eWh2}&(fVaQF)OUq2LHK;I3F<>Yt%1;4v49tzp8Ol=gAUs2pR1=1j z)H1M?iE*kCLsEWXQA$Z=L8`4mg@J{IIYgi+wanI_!qCvb0K(5J&9yZ$V#rNQPE1KD zvNbTUax}0qHLyxDwKBD|GEHSDF3QgZX)-i~Xh_RROfLo*X<%YtVqkzQY77!KF#rRG ziju^fw4&5PTVrz*0|SP<{N$o!TSJD#bOT!>Q&Wb-M5AKIfcTQDRiXBU(g<)@_;rT9`1DR1}mKB_(I)r`ei;6eg7$ z85pG(Abv84S7DTHYhntPO)V&fc*a)O z7!(WzDc}gNur;+{$SFxpuE;H|0J$H;EJ#cN#il`pfuVsBL^dt2I5o%Cpu)ri!cR}m zOfSgH2Zfg*LuQTvQnXtdSeYbSC7W6q8d(`zFqG#QK$DVT5<^OAVoGjeUVI5iXBreR zT4uVfL4`3xdQN6Zaz=boVsUCpd~#87Zf2gXAwyD0 Kay-=U3=9AS73; struct HeapInner { @@ -16,7 +14,7 @@ struct HeapInner { } pub struct PicoHeap { - inner: Mutex, + inner: Mutex, block: ConstStaticCell<[u8; MEMORY_SIZE]>, } diff --git a/src/detector.rs b/src/detector.rs index 835e2ea..a20b8b6 100644 --- a/src/detector.rs +++ b/src/detector.rs @@ -2,7 +2,6 @@ use alloc::vec::Vec; use sachy_fmt::{info, unwrap}; use embassy_futures::select::select4; -use embassy_rp::peripherals::DMA_CH1; use embassy_strike_driver::{ DetectorDriver, ZeroCopyChannel, drivers::rp::{AdcDriver, PwmDriver}, @@ -20,7 +19,7 @@ use crate::{ #[embassy_executor::task] pub async fn detector_task( - adc: AdcDriver<'static, NoopRawMutex, DMA_CH1>, + adc: AdcDriver<'static, NoopRawMutex>, pwm: PwmDriver<'static>, rtc: GlobalRtc<'static>, ) { diff --git a/src/locks.rs b/src/locks.rs index 4ac69be..895c7b4 100644 --- a/src/locks.rs +++ b/src/locks.rs @@ -1,6 +1,5 @@ use embassy_rp::spinlock_mutex::SpinlockRawMutex; -pub type AllocatorLock = SpinlockRawMutex<0>; pub type RtcLock = SpinlockRawMutex<1>; pub type ConnectionStatusLock = SpinlockRawMutex<2>; pub type DataTransferLock = SpinlockRawMutex<3>; diff --git a/src/main.rs b/src/main.rs index 415055b..53eb9ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,9 +23,10 @@ use embassy_executor::Executor; use embassy_rp::{ adc as rp_adc, bind_interrupts, clocks::RoscRng, + dma, gpio::{Level, Output}, multicore::{Stack, spawn_core1}, - peripherals::PIO0, + peripherals::{DMA_CH0, DMA_CH1, PIO0}, pio::{InterruptHandler, Pio}, rtc::{self as rp_rtc, Rtc}, }; @@ -50,6 +51,7 @@ bind_interrupts!(struct Irqs { ADC_IRQ_FIFO => rp_adc::InterruptHandler; PIO0_IRQ_0 => InterruptHandler; RTC_IRQ => rp_rtc::InterruptHandler, rtc::GlobalRtcHandler; + DMA_IRQ_0 => dma::InterruptHandler, dma::InterruptHandler; }); #[unsafe(no_mangle)] @@ -62,7 +64,7 @@ unsafe extern "Rust" fn __getrandom_v03_custom( // a mutable slice core::ptr::write_bytes(dest, 0, len); core::slice::from_raw_parts_mut(dest, len) - }; + }; RoscRng.fill_bytes(slice); @@ -92,7 +94,7 @@ fn main() -> ! { cs, p.PIN_24, p.PIN_29, - p.DMA_CH0, + dma::Channel::new(p.DMA_CH0, Irqs), ); info!("Initialising RTC"); @@ -106,7 +108,7 @@ fn main() -> ! { EXECUTOR1.init_with(Executor::new).run(|spawner| { info!("Spawning Detector task on Core 1"); - spawner.must_spawn(detector::detector_task(adc, pwm, rtc)); + spawner.spawn(unwrap!(detector::detector_task(adc, pwm, rtc))); }) }); @@ -114,6 +116,6 @@ fn main() -> ! { EXECUTOR0.init_with(Executor::new).run(|spawner| { info!("Spawning Network tasks on Core 0"); - spawner.must_spawn(wifi::main_loop(spawner, rtc, spi, pwr)); + spawner.spawn(unwrap!(wifi::main_loop(spawner, rtc, spi, pwr))); }); } diff --git a/src/net.rs b/src/net.rs index 9a43178..04f9b1f 100644 --- a/src/net.rs +++ b/src/net.rs @@ -19,7 +19,7 @@ use crate::{ constants::{HOST_NAME, HOST_PORT}, rtc::GlobalRtc, updates::UpdateConnection, - utils::try_static_buffer_with, + utils::{try_box_future_within, try_static_buffer_with}, }; #[embassy_executor::task] @@ -66,8 +66,8 @@ pub async fn udp_stack(stack: embassy_net::Stack<'static>, rtc: GlobalRtc<'stati #[embassy_executor::task] 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 rx_buffer = unwrap!(try_static_buffer_with(8192, Default::default)); + let tx_buffer = unwrap!(try_static_buffer_with(8192, Default::default)); let mut tcp = TcpSocket::new(stack, rx_buffer, tx_buffer); tcp.set_keep_alive(Some(Duration::from_secs(1))); @@ -76,7 +76,12 @@ 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)).await; + let rpc_fut = unwrap!( + try_box_future_within(|| select(stack.wait_link_down(), rpc::rpc_loop(&mut tcp))), + "Failed to alloc RPC LOOP" + ); + + rpc_fut.await; UpdateConnection::get_receiver().clear(); diff --git a/src/net/crypto.rs b/src/net/crypto.rs index 39c0630..8dcfbd1 100644 --- a/src/net/crypto.rs +++ b/src/net/crypto.rs @@ -1,12 +1,16 @@ use alloc::vec::Vec; -use embassy_futures::select::select; +use embassy_futures::select::{Either, select}; use embassy_net::tcp::{TcpReader, TcpSocket, TcpWriter}; +use embedded_io_async::{Read, Write}; use sachy_crypto::{ReceivingState, SendingState, ServerHandshake, TransportState}; -use sachy_fmt::unwrap; +use sachy_fmt::{error, unwrap, warn}; use crate::{ - constants::NOISE_PSK, errors::PicoError, rpc::RpcServer, updates::UpdateConnection, - utils::try_buffer, + constants::NOISE_PSK, + errors::PicoError, + rpc::RpcServer, + updates::UpdateConnection, + utils::{try_box_future_within, try_buffer}, }; pub struct CryptoSession { @@ -24,19 +28,30 @@ impl CryptoSession { mut recv_state: ReceivingState<'s>, ) -> Result<(), PicoError> { let mut msg_buf: Vec = try_buffer(4096)?; + let mut len_buf = [0u8; 2]; loop { - let read = reader.read(&mut msg_buf).await?; + if reader.read_exact(&mut len_buf).await.is_err() { + break; + } + let msg_size = usize::from(u16::from_be_bytes(len_buf)); + + msg_buf.truncate(msg_size); - msg_buf.truncate(read); + reader + .read_exact(&mut msg_buf) + .await + .map_err(|_| PicoError::CryptoProtoError)?; - if recv_state.decrypt(&mut msg_buf).is_ok() + if msg_size > 0 + && recv_state.decrypt(&mut msg_buf, b"pico-strike").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 { + warn!("Connection dropped before response"); break; }; resp_tx.try_send(resp).ok(); @@ -58,15 +73,20 @@ impl CryptoSession { loop { let data = outgoing.receive().await; + writer.wait_write_ready().await; let packet = unwrap!(striker_proto::send_response(data, &mut msg_buf)).len(); msg_buf.truncate(packet); - send_state.encrypt(&mut msg_buf)?; + send_state.encrypt(&mut msg_buf, b"pico-strike")?; + + let len = unwrap!(u16::try_from(msg_buf.len())); - writer.write(&msg_buf).await?; + writer.write_all(&len.to_be_bytes()).await?; + writer.write_all(&msg_buf).await?; writer.flush().await?; + msg_buf.resize_with(4096, Default::default); } } @@ -75,11 +95,20 @@ impl CryptoSession { let (reader, writer) = tcp.split(); let (send_state, recv_state) = self.transport.split(); - select( - self.read_loop(reader, recv_state), - self.write_loop(writer, send_state), - ) - .await; + let selected = unwrap!( + try_box_future_within(|| { + select( + self.read_loop(reader, recv_state), + self.write_loop(writer, send_state), + ) + }), + "Failed to allocate Session Loop" + ); + + match selected.await { + Either::First(Err(e)) | Either::Second(Err(e)) => error!("NET: {}", e), + _ => {} + } } } @@ -90,7 +119,7 @@ pub async fn initialise<'device>(tcp: &mut TcpSocket<'device>) -> Result(fut: F) -> Result>, AllocError> +where + Fut: Future + 'a, + F: FnOnce() -> Fut, +{ + let mut boxed = Box::try_new_uninit()?; + + boxed.write(fut()); + + // SAFETY: We have initialised the Box correctly by writing to + // the memory in the line above. + Ok(unsafe { Box::into_pin(boxed.assume_init()) }) +} + pub fn static_alloc(value: T) -> &'static mut T { Box::leak(Box::new(value)) } diff --git a/src/wifi.rs b/src/wifi.rs index b86d816..0d0b2db 100644 --- a/src/wifi.rs +++ b/src/wifi.rs @@ -1,13 +1,11 @@ #![allow(clippy::too_many_arguments)] -use core::str::FromStr; - -use cyw43::JoinOptions; +use cyw43::{JoinOptions, aligned_bytes}; use cyw43_pio::PioSpi; use embassy_executor::Spawner; use embassy_net::{Config, DhcpConfig, StackResources}; use embassy_rp::clocks::RoscRng; use embassy_rp::gpio::Output; -use embassy_rp::peripherals::{DMA_CH0, PIO0}; +use embassy_rp::peripherals::PIO0; use embassy_time::{Duration, WithTimeout}; use sachy_fmt::{info, unwrap}; use static_cell::StaticCell; @@ -17,7 +15,7 @@ use crate::rtc::GlobalRtc; #[embassy_executor::task] async fn cyw43_task( - runner: cyw43::Runner<'static, Output<'static>, PioSpi<'static, PIO0, 0, DMA_CH0>>, + runner: cyw43::Runner<'static, cyw43::SpiBus, PioSpi<'static, PIO0, 0>>>, ) -> ! { runner.run().await } @@ -31,19 +29,20 @@ async fn net_runner(mut runner: embassy_net::Runner<'static, cyw43::NetDriver<'s pub async fn main_loop( spawner: Spawner, rtc: GlobalRtc<'static>, - spi: PioSpi<'static, PIO0, 0, embassy_rp::peripherals::DMA_CH0>, + spi: PioSpi<'static, PIO0, 0>, pwr: Output<'static>, ) { - let fw = include_bytes!("../firmware/43439A0.bin"); - let clm = include_bytes!("../firmware/43439A0_clm.bin"); + let fw = aligned_bytes!("../firmware/43439A0.bin"); + let clm = aligned_bytes!("../firmware/43439A0_clm.bin"); + let nvrm = aligned_bytes!("../firmware/nvram_rp2040.bin"); info!("Initialising WIFI chip"); static STATE: StaticCell = StaticCell::new(); static RESOURCES: StaticCell> = StaticCell::new(); let state = STATE.init_with(cyw43::State::new); - let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; - spawner.must_spawn(cyw43_task(runner)); + let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw, nvrm).await; + spawner.spawn(unwrap!(cyw43_task(runner))); control.init(clm).await; control @@ -59,9 +58,7 @@ pub async fn main_loop( let seed = RoscRng.next_u64(); - let mut dhcp: DhcpConfig = Default::default(); - - dhcp.hostname = heapless::String::from_str("pico-strike").ok(); + let dhcp: DhcpConfig = Default::default(); info!("Init Net stack"); @@ -74,22 +71,22 @@ pub async fn main_loop( info!("WIFI chip enabled successfully"); - spawner.must_spawn(net_runner(runner)); + spawner.spawn(unwrap!(net_runner(runner))); - spawner.must_spawn(net::udp_stack(stack, rtc)); - spawner.must_spawn(net::tcp_stack(stack)); + spawner.spawn(unwrap!(net::udp_stack(stack, rtc))); + spawner.spawn(unwrap!(net::tcp_stack(stack))); loop { info!("Joining WIFI!"); control.gpio_set(0, true).await; - if control + if let Err(_) | Ok(Err(_)) = control .join( crate::constants::SSID, JoinOptions::new(crate::constants::PASSWORD.as_bytes()), ) + .with_timeout(Duration::from_secs(10)) .await - .is_err() { continue; } -- 2.51.2