diff --git a/.cargo/config.toml b/.cargo/config.toml index a6c171d..4631d84 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,19 +1,43 @@ -#[target.xtensa-esp32s3-none-elf] +[alias] +build-esp32 = "build --release --target xtensa-esp32-none-elf --features esp32" +build-esp32c2 = "build --release --target riscv32imc-unknown-none-elf --features esp32c2" +build-esp32c3 = "build --release --target riscv32imc-unknown-none-elf --features esp32c3" +# Available but not supported by esp-hal (yet). +#build-esp32c5 = "build --release --target riscv32imac-unknown-none-elf --features esp32c5" +build-esp32c6 = "build --release --target riscv32imac-unknown-none-elf --features esp32c6" +build-esp32s2 = "build --profile esp32s2 --target xtensa-esp32s2-none-elf --features esp32s2" +build-esp32s3 = "build --release --target xtensa-esp32s3-none-elf --features esp32s3" + +run-esp32 = "run --release --target xtensa-esp32-none-elf --features esp32" +run-esp32c2 = "run --release --target riscv32imc-unknown-none-elf --features esp32c2" +run-esp32c3 = "run --release --target riscv32imc-unknown-none-elf --features esp32c3" +# Available but not supported by esp-hal (yet). +#run-esp32c5 = "run --release --target riscv32imac-unknown-none-elf --features esp32c5" +run-esp32c6 = "run --release --target riscv32imac-unknown-none-elf --features esp32c6" +run-esp32s2 = "run --profile esp32s2 --target xtensa-esp32s2-none-elf --features esp32s2" +run-esp32s3 = "run --release --target xtensa-esp32s3-none-elf --features esp32s3" + +[target.xtensa-esp32-none-elf] +runner = "espflash flash --baud=921600 --monitor --chip esp32" +rustflags = ["-C", "link-arg=-nostartfiles", '--cfg=feature="esp32"'] +[target.riscv32imc-unknown-none-elf] +runner = "espflash flash --baud=921600 --monitor" +rustflags = [ "-C", "force-frame-pointers"] [target.riscv32imac-unknown-none-elf] runner = "espflash flash --baud=921600 --monitor" +rustflags = [ "-C", "force-frame-pointers"] +[target.xtensa-esp32s2-none-elf] +runner = "espflash flash --baud=921600 --monitor --chip esp32s2" +rustflags = ["-C", "link-arg=-nostartfiles", '--cfg=feature="esp32s2"'] +[target.xtensa-esp32s3-none-elf] +runner = "espflash flash --baud=921600 --monitor --chip esp32s3" +rustflags = ["-C", "link-arg=-nostartfiles", '--cfg=feature="esp32s3"'] [env] ESP_LOG="INFO" -[build] -rustflags = [ -# "-C", "link-arg=-nostartfiles", - "-C", "force-frame-pointers", -] - -#target = "xtensa-esp32s3-none-elf" target = "riscv32imac-unknown-none-elf" -#[unstable] -#build-std = ["core"] +[unstable] +build-std = ["core", "alloc"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0149809..c371860 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,22 +7,50 @@ on: pull_request: branches: - main + workflow_dispatch: jobs: build: + name: Build ${{ matrix.device.soc }} runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + device: [ + # RISC-V devices: + { soc: "esp32c2", toolchain: "stable" }, + { soc: "esp32c3", toolchain: "stable" }, +# { soc: "esp32c5", toolchain: "stable" }, + { soc: "esp32c6", toolchain: "stable" }, + # Xtensa devices: + { soc: "esp32", toolchain: "esp" }, + { soc: "esp32s2", toolchain: "esp" }, + { soc: "esp32s3", toolchain: "esp" }, + ] steps: - name: Cache uses: mozilla-actions/sccache-action@v0.0.7 - name: Checkout code uses: actions/checkout@v4 - - name: Setup Rust toolchain - uses: dtolnay/rust-toolchain@stable + - name: Setup Rust toolchain for RISC-V + if: ${{ !contains(fromJson('["esp32", "esp32s2", "esp32s3"]'), matrix.device.soc) }} + uses: dtolnay/rust-toolchain@v1 with: - toolchain: 1.84.0 - - name: Install RISCV toolchain (ESP32-C6) - run: | - rustup toolchain install stable --component rust-src - rustup target add riscv32imac-unknown-none-elf + target: riscv32imc-unknown-none-elf,riscv32imac-unknown-none-elf + toolchain: stable + components: rust-src + - name: Setup Rust toolchain for Xtensa + if: ${{ contains(fromJson('["esp32", "esp32s2", "esp32s3"]'), matrix.device.soc) }} + uses: esp-rs/xtensa-toolchain@v1.5 + with: + ldproxy: false + version: 1.86.0.0 + - name: Build project - run: cargo build --release + run: cargo +${{ matrix.device.toolchain }} build-${{ matrix.device.soc }} + + - name: Check lints and format + if: ${{ contains(fromJson('["esp32c6"]'), matrix.device.soc) }} + run: | + cargo +${{ matrix.device.toolchain }} clippy --features ${{ matrix.device.soc }} --target riscv32imac-unknown-none-elf -- -D warnings + cargo +${{ matrix.device.toolchain }} fmt -- --check diff --git a/.gitignore b/.gitignore index a35be69..0dd24c9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # will have compiled files and executables debug/ target/ +.DS_Store # These are backup files generated by rustfmt **/*.rs.bk @@ -12,3 +13,6 @@ target/ # MSVC Windows builds of rustc generate these, which store debugging information *.pdb + +# VSCode workspace(s) +*.code-workspace diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..9aa42d3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: local + hooks: + - id: rustfmt + name: rustfmt + description: Check if all files follow the rustfmt style + entry: cargo fmt --all -- --check --color always + language: system + pass_filenames: false diff --git a/.vscode/launch.json b/.vscode/launch.json index 8037e9f..387de43 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,8 +18,8 @@ "coreConfigs": [ { "coreIndex": 0, - "programBinary": "target/riscv32imac-unknown-none-elf/debug/esp-ssh-rs", - "svdFile": "${workspaceFolder}/esp32c6.svd" + "programBinary": "target/riscv32imac-unknown-none-elf/debug/ssh-stamp", + "svdFile": "${workspaceFolder}/docs/svd/esp32c6.svd" } ] }, @@ -33,10 +33,10 @@ "coreConfigs": [ { "coreIndex": 0, - "programBinary": "target/riscv32imac-unknown-none-elf/debug/esp-ssh-rs", - "svdFile": "${workspaceFolder}/esp32c6.svd" + "programBinary": "target/riscv32imac-unknown-none-elf/debug/ssh-stamp", + "svdFile": "${workspaceFolder}/docs/svd/esp32c6.svd" } ] } ] -} \ No newline at end of file +} diff --git a/Cargo.lock b/Cargo.lock index 233806e..5076662 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,85 +3,90 @@ version = 4 [[package]] -name = "anyhow" -version = "1.0.93" +name = "aes" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "zeroize", +] [[package]] -name = "as-slice" -version = "0.1.5" +name = "allocator-api2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" -dependencies = [ - "generic-array 0.12.4", - "generic-array 0.13.3", - "generic-array 0.14.7", - "stable_deref_trait", -] +checksum = "78200ac3468a57d333cd0ea5dd398e25111194dcacd49208afca95c629a6311d" [[package]] -name = "as-slice" -version = "0.2.1" +name = "android-tzdata" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] -name = "atomic-polyfill" -version = "1.0.3" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "critical-section", + "libc", ] [[package]] -name = "atomic-pool" -version = "1.0.1" +name = "anyhow" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c5fc22e05ec2884db458bf307dc7b278c9428888d2b6e6fad9c0ae7804f5f6" -dependencies = [ - "as-slice 0.1.5", - "as-slice 0.2.1", - "atomic-polyfill", - "stable_deref_trait", -] +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] -name = "autocfg" -version = "1.3.0" +name = "ascii" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" [[package]] -name = "bare-metal" -version = "1.0.0" +name = "autocfg" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "basic-toml" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" dependencies = [ "serde", ] [[package]] name = "bitfield" -version = "0.17.0" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db1bcd90f88eabbf0cadbfb87a45bceeaebcd3b4bc9e43da379cd2ef0162590d" +dependencies = [ + "bitfield-macros", +] + +[[package]] +name = "bitfield-macros" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f798d2d157e547aa99aab0967df39edd0b70307312b6f8bd2848e6abe40896e0" +checksum = "3787a07661997bfc05dd3431e379c0188573f78857080cf682e1393ab8e4d64c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "bitflags" @@ -91,9 +96,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -101,14 +106,20 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "byteorder" @@ -116,6 +127,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "cc" +version = "1.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -135,11 +155,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ + "android-tzdata", + "iana-time-zone", "num-traits", + "windows-link", ] [[package]] @@ -150,19 +173,20 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", + "zeroize", ] [[package]] -name = "constant_time_eq" -version = "0.3.1" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -179,10 +203,19 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -196,6 +229,7 @@ dependencies = [ "fiat-crypto", "rustc_version", "subtle", + "zeroize", ] [[package]] @@ -211,9 +245,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -221,9 +255,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", @@ -235,9 +269,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", @@ -246,9 +280,9 @@ dependencies = [ [[package]] name = "delegate" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2323e10c92e1cf4d86e11538512e6dc03ceb586842970b6332af3d4046a046" +checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" dependencies = [ "proc-macro2", "quote", @@ -263,13 +297,14 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] name = "document-features" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" dependencies = [ "litrs", ] @@ -291,18 +326,64 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", + "rand_core 0.6.4", "sha2", "subtle", + "zeroize", +] + +[[package]] +name = "edge-dhcp" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ccd3a181a33c710e07c3f04623d7a11e9969b1e44a7276ead7873b049720cb" +dependencies = [ + "edge-nal", + "edge-raw", + "embassy-futures", + "embassy-time", + "heapless", + "num_enum", + "rand_core 0.6.4", +] + +[[package]] +name = "edge-nal" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac19c3edcdad839c71cb919cd09a632d9915d630760b37f0b74290188c08f248" +dependencies = [ + "embassy-time", + "embedded-io-async", +] + +[[package]] +name = "edge-nal-embassy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252f89adf4f0016631977bec3ba50d768263a3a9fa9f023b4087088a619568ce" +dependencies = [ + "edge-nal", + "embassy-futures", + "embassy-net", + "embedded-io-async", + "heapless", ] +[[package]] +name = "edge-raw" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6207c84e9bc8df8ef3c155196df290f2a51f010bd60c2e78366e51979988bdb5" + [[package]] name = "embassy-embedded-hal" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5794414bc20e0d750f145bc0e82366b19dd078e9e075e8331fb8dd069a1cb6a2" +checksum = "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" dependencies = [ "embassy-futures", - "embassy-sync 0.6.1", + "embassy-sync 0.6.2", "embassy-time", "embedded-hal 0.2.7", "embedded-hal 1.0.0", @@ -314,15 +395,13 @@ dependencies = [ [[package]] name = "embassy-executor" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64f84599b0f4296b92a4b6ac2109bc02340094bda47b9766c5f9ec6a318ebf8" +checksum = "90327bcc66333a507f89ecc4e2d911b265c45f5c9bc241f98eee076752d35ac6" dependencies = [ "critical-section", "document-features", "embassy-executor-macros", - "embassy-time-driver", - "embassy-time-queue-driver", ] [[package]] @@ -345,24 +424,19 @@ checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" [[package]] name = "embassy-net" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cf91dd36dfd623de32242af711fd294d41159f02130052fc93c5c5ba93febe" +checksum = "940c4b9fe5c1375b09a0c6722c0100d6b2ed46a717a34f632f26e8d7327c4383" dependencies = [ - "as-slice 0.2.1", - "atomic-pool", "document-features", "embassy-net-driver", - "embassy-sync 0.5.0", + "embassy-sync 0.6.2", "embassy-time", "embedded-io-async", "embedded-nal-async", - "futures", - "generic-array 0.14.7", "heapless", "managed", "smoltcp", - "stable_deref_trait", ] [[package]] @@ -373,22 +447,23 @@ checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" [[package]] name = "embassy-sync" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec" +checksum = "8d2c8cdff05a7a51ba0087489ea44b0b1d97a296ca6b1d6d1a33ea7423d34049" dependencies = [ "cfg-if", "critical-section", "embedded-io-async", + "futures-sink", "futures-util", "heapless", ] [[package]] name = "embassy-sync" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3899a6e39fa3f54bf8aaf00979f9f9c0145a522f7244810533abbb748be6ce82" +checksum = "cef1a8a1ea892f9b656de0295532ac5d8067e9830d49ec75076291fd6066b136" dependencies = [ "cfg-if", "critical-section", @@ -400,36 +475,55 @@ dependencies = [ [[package]] name = "embassy-time" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158080d48f824fad101d7b2fae2d83ac39e3f7a6fa01811034f7ab8ffc6e7309" +checksum = "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8" dependencies = [ "cfg-if", "critical-section", "document-features", "embassy-time-driver", - "embassy-time-queue-driver", "embedded-hal 0.2.7", "embedded-hal 1.0.0", "embedded-hal-async", "futures-util", - "heapless", ] [[package]] name = "embassy-time-driver" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c214077aaa9206958b16411c157961fb7990d4ea628120a78d1a5a28aed24" +checksum = "8d45f5d833b6d98bd2aab0c2de70b18bfaa10faf661a1578fd8e5dfb15eb7eba" dependencies = [ "document-features", ] [[package]] -name = "embassy-time-queue-driver" +name = "embassy-time-queue-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc55c748d16908a65b166d09ce976575fb8852cf60ccd06174092b41064d8f83" +dependencies = [ + "embassy-executor", + "heapless", +] + +[[package]] +name = "embassy-usb-driver" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1177859559ebf42cd24ae7ba8fe6ee707489b01d0bf471f8827b7b12dcb0bc0" +checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970" + +[[package]] +name = "embassy-usb-synopsys-otg" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e753b23799329780c7ac434264026d0422044d6649ed70a73441b14a6436d7" +dependencies = [ + "critical-section", + "embassy-sync 0.6.2", + "embassy-usb-driver", +] [[package]] name = "embedded-can" @@ -465,16 +559,6 @@ dependencies = [ "embedded-hal 1.0.0", ] -[[package]] -name = "embedded-hal-nb" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605" -dependencies = [ - "embedded-hal 1.0.0", - "nb 1.1.0", -] - [[package]] name = "embedded-io" version = "0.6.1" @@ -492,23 +576,21 @@ dependencies = [ [[package]] name = "embedded-nal" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a943fad5ed3d3f8a00f1e80f6bba371f1e7f0df28ec38477535eb318dc19cc" +checksum = "c56a28be191a992f28f178ec338a0bf02f63d7803244add736d026a471e6ed77" dependencies = [ "nb 1.1.0", - "no-std-net", ] [[package]] name = "embedded-nal-async" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72229137a4fc12d239b0b7f50f04b30790678da6d782a0f3f1909bf57ec4b759" +checksum = "76959917cd2b86f40a98c28dd5624eddd1fa69d746241c8257eac428d83cb211" dependencies = [ "embedded-io-async", "embedded-nal", - "no-std-net", ] [[package]] @@ -540,18 +622,18 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" +checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" +checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" dependencies = [ "darling", "proc-macro2", @@ -561,36 +643,58 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "esp-alloc" -version = "0.5.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5162b6e9cd99cc974ec2742da3cf8433e7332853ae10fec922d174ff20fa4c5f" +checksum = "7e95f1de57ce5a6600368f3d3c931b0dfe00501661e96f5ab83bc5cdee031784" dependencies = [ + "allocator-api2", + "cfg-if", "critical-section", + "document-features", "enumset", "linked_list_allocator", ] [[package]] name = "esp-backtrace" -version = "0.14.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7660d85e3e7b0e113aaeeffb1a155e64a09a5035d4104031875acdba4cb68e" +checksum = "7c304bbe17df32db8bc0027a9da989aa3efebbd4e7a79d58850deb29e2af577f" dependencies = [ + "cfg-if", "esp-build", + "esp-config", + "esp-metadata", "esp-println", + "heapless", + "semihosting", ] [[package]] -name = "esp-build" +name = "esp-bootloader-esp-idf" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94a4b8d74e7cc7baabcca5b2277b41877e039ad9cd49959d48ef94dac7eab4b" +checksum = "d3cb352a8df9c459d0bdf06957cb8293b8bc574138e8c546949955b29c485769" +dependencies = [ + "chrono", + "document-features", + "embedded-storage", + "esp-config", + "md-5", + "strum", +] + +[[package]] +name = "esp-build" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "837020ff95fbf4c15c206541dda7994f1bbe6e1505e36a6a5ecb51fdb61656d7" dependencies = [ "quote", "syn", @@ -599,36 +703,38 @@ dependencies = [ [[package]] name = "esp-config" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7584e4cd1dac06201fd92fff1c84b396be5458ac4d93e9457e7a89b1b42c60e" +checksum = "2c8c4c95d8d6243ddb39efe1fcf2524c9becd0f86bb3e24048ed30b4f553609f" dependencies = [ "document-features", + "serde", + "serde_json", ] [[package]] name = "esp-hal" -version = "0.22.0" +version = "1.0.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5605e1518d63f7bf9fbd9885e61d2896060d2e4f28954736bdd74da911b676" +checksum = "0d973697621cd3eef9c3f260fa8c1af77d8547cfc92734255d8e8ddf05c7d331" dependencies = [ "basic-toml", "bitfield", - "bitflags 2.6.0", + "bitflags 2.9.0", "bytemuck", "cfg-if", - "chrono", "critical-section", "delegate", + "digest", "document-features", "embassy-embedded-hal", "embassy-futures", - "embassy-sync 0.6.1", + "embassy-sync 0.6.2", + "embassy-usb-driver", + "embassy-usb-synopsys-otg", "embedded-can", - "embedded-hal 0.2.7", "embedded-hal 1.0.0", "embedded-hal-async", - "embedded-hal-nb", "embedded-io", "embedded-io-async", "enumset", @@ -637,30 +743,42 @@ dependencies = [ "esp-hal-procmacros", "esp-metadata", "esp-riscv-rt", + "esp-synopsys-usb-otg", + "esp32", + "esp32c2", + "esp32c3", "esp32c6", + "esp32s2", + "esp32s3", "fugit", + "instability", "nb 1.1.0", "paste", "portable-atomic", - "rand_core", + "rand_core 0.6.4", + "rand_core 0.9.3", "riscv", "serde", "strum", "ufmt-write", - "void", + "xtensa-lx", "xtensa-lx-rt", ] [[package]] name = "esp-hal-embassy" -version = "0.5.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d0f2537ea2ff9bea26a1c8bfe43ad580d4c89febf27189653a9cf95f1f7961" +checksum = "87807cdf22124ba46dbac7d7f6d3ee2e7f06c4e461f3783443464d868101647d" dependencies = [ + "cfg-if", "critical-section", "document-features", "embassy-executor", + "embassy-sync 0.6.2", + "embassy-time", "embassy-time-driver", + "embassy-time-queue-utils", "esp-build", "esp-config", "esp-hal", @@ -672,9 +790,9 @@ dependencies = [ [[package]] name = "esp-hal-procmacros" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a9a8706b7d1182b56335d196e70eeb04e2b70f4b8db96432898bd3c2bdb91e" +checksum = "73164008cb2eada2ef85e6b0e459001d851f9b8e65e96e0d594bdfa8cf1b813b" dependencies = [ "darling", "document-features", @@ -689,9 +807,9 @@ dependencies = [ [[package]] name = "esp-metadata" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9972bbb21dcafe430b87f92efc7a788978a2d17cf8f572d104beeb48602482a" +checksum = "0154d59933c2419ef25a01938517cc6969f47b6af53ebb34c279393aa20d9654" dependencies = [ "anyhow", "basic-toml", @@ -701,21 +819,23 @@ dependencies = [ [[package]] name = "esp-println" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee38e87bc7e303c299047c0e9bcd0f8ccca7c7e70d1fd78bbb565db14f33beb6" +checksum = "fae8b38d5fdc1d29d823c4737f18edfb0ccf0406985cf893f87c0cfc26a6ab33" dependencies = [ "critical-section", + "document-features", "esp-build", + "esp-metadata", "log", "portable-atomic", ] [[package]] name = "esp-riscv-rt" -version = "0.9.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94aca65db6157aa5f42d9df6595b21462f28207ca4230b799aa3620352ef6a72" +checksum = "c05c2badd16cbd6307d463090615332b77c17a6766b41ba5fe5bb783310e8af6" dependencies = [ "document-features", "riscv", @@ -723,40 +843,29 @@ dependencies = [ ] [[package]] -name = "esp-ssh-rs" -version = "0.1.0" +name = "esp-synopsys-usb-otg" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8938451cb19032f13365328ea66ab38c8d16deecdf322067442297110eb74468" dependencies = [ - "cfg-if", - "ed25519-dalek", - "embassy-executor", - "embassy-net", - "embassy-time", - "embedded-io-async", - "esp-alloc", - "esp-backtrace", - "esp-hal", - "esp-hal-embassy", - "esp-println", - "esp-wifi", - "hex", - "log", - "smoltcp", - "ssh-key", - "static_cell", - "zssh", + "critical-section", + "embedded-hal 0.2.7", + "ral-registers", + "usb-device", + "vcell", ] [[package]] name = "esp-wifi" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d36018303cd60a30184c6f605a921038c08ff34afc870e22070ea08a6280a2" +checksum = "3700028d3d2ee57e6d2a5c5f60544711052f8d394e73a6f534b538fbfb9d058c" dependencies = [ + "allocator-api2", "cfg-if", "critical-section", "document-features", "embassy-net-driver", - "embassy-sync 0.6.1", "embedded-io", "embedded-io-async", "enumset", @@ -766,125 +875,129 @@ dependencies = [ "esp-hal", "esp-metadata", "esp-wifi-sys", - "fugit", - "heapless", - "libm", "num-derive", "num-traits", "portable-atomic", "portable_atomic_enum", - "rand_core", - "smoltcp", + "rand_core 0.9.3", + "xtensa-lx-rt", ] [[package]] name = "esp-wifi-sys" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7730d6093853119088bbb793e3383801965ebe8fcf91e0817781d94628aaf718" +checksum = "c6b5438361891c431970194a733415006fb3d00b6eb70b3dcb66fd58f04d9b39" dependencies = [ "anyhow", ] [[package]] -name = "esp32c6" -version = "0.17.0" +name = "esp32" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b98fcf7ae90ee4d55f06170dfeaaebbf2a1619bb38b4e14b9009b4d636b87e7" +checksum = "83ddfdb413ef0739d84bd3fce771e6e0feb6457ac1bcdd7a1dcd6326061e919d" dependencies = [ "critical-section", "vcell", ] [[package]] -name = "fiat-crypto" -version = "0.2.9" +name = "esp32c2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "14ec669dc34787e73c8a7d99059fcdbd800cb0699c2ea9cd0a3d99cb5e9caefb" +dependencies = [ + "critical-section", + "vcell", +] [[package]] -name = "fnv" -version = "1.0.7" +name = "esp32c3" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "24c0b2a8e8efa1755a28ca3ef54c85436f76531ba93dc79b55d5330349d067d7" +dependencies = [ + "critical-section", + "vcell", +] [[package]] -name = "fugit" -version = "0.3.7" +name = "esp32c6" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" +checksum = "c8009092b2a8f41532ce836ea7403b657eca7cd396c4513c650ade648831ed76" dependencies = [ - "gcd", + "critical-section", + "vcell", ] [[package]] -name = "futures" -version = "0.3.30" +name = "esp32s2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "d4391e38b14eb59a675e816598bde7d9b8c8f43a695a284bd97bcd0cf3092404" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "critical-section", + "vcell", ] [[package]] -name = "futures-channel" -version = "0.3.30" +name = "esp32s3" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "27a4c6fd31207a297fc29d2b8f4da27facf45f8c83041f7c0f978aa65ab367c9" dependencies = [ - "futures-core", - "futures-sink", + "critical-section", + "vcell", ] [[package]] -name = "futures-core" -version = "0.3.30" +name = "fiat-crypto" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "futures-io" -version = "0.3.31" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "futures-macro" -version = "0.3.30" +name = "fugit" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" dependencies = [ - "proc-macro2", - "quote", - "syn", + "gcd", ] [[package]] -name = "futures-sink" -version = "0.3.30" +name = "futures-core" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", - "futures-macro", - "futures-sink", "futures-task", "pin-project-lite", "pin-utils", @@ -898,30 +1011,23 @@ checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" [[package]] name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.13.3" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", + "version_check", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "getrandom" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "typenum", - "version_check", + "cfg-if", + "libc", + "wasi", ] [[package]] @@ -935,9 +1041,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heapless" @@ -946,7 +1052,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ "hash32", - "portable-atomic", "stable_deref_trait", ] @@ -962,6 +1067,39 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -970,34 +1108,63 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "2.5.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] -name = "libc" -version = "0.2.158" +name = "instability" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "libm" -version = "0.2.11" +name = "itoa" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "linked_list_allocator" @@ -1016,9 +1183,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "managed" @@ -1026,6 +1193,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.4" @@ -1034,19 +1211,13 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "minijinja" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c37e1b517d1dcd0e51dc36c4567b9d5a29262b3ec8da6cb5d35e27a8fb529b5" +checksum = "98642a6dfca91122779a307b77cd07a4aa951fbe32232aaf5bad9febc66be754" dependencies = [ "serde", ] -[[package]] -name = "mutex-trait" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4bb1638d419e12f8b1c43d9e639abd0d1424285bdea2f76aa231e233c63cd3a" - [[package]] name = "nb" version = "0.1.3" @@ -1062,12 +1233,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" -[[package]] -name = "no-std-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" - [[package]] name = "num-derive" version = "0.4.2" @@ -1088,15 +1253,41 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -1120,9 +1311,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1143,9 +1334,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "portable_atomic_enum" @@ -1168,11 +1359,17 @@ dependencies = [ "syn", ] +[[package]] +name = "pretty-hex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc83ee4a840062f368f9096d80077a9841ec117e17e7f700df81958f1451254" + [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] @@ -1201,18 +1398,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -1224,19 +1421,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd7a31eed1591dcbc95d92ad7161908e72f4677f8fabf2a32ca49b4237cbf211" [[package]] -name = "rand" -version = "0.8.5" +name = "ral-registers" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_core", -] +checksum = "46b71a9d9206e8b46714c74255adcaea8b11e0350c1d8456165073c3f75fc81a" [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" [[package]] name = "riscv" @@ -1270,9 +1473,9 @@ checksum = "8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436" [[package]] name = "riscv-rt-macros" -version = "0.2.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30f19a85fe107b65031e0ba8ec60c34c2494069fe910d6c297f5e7cb5a6f76d0" +checksum = "fc71814687c45ba4cd1e47a54e03a2dbc62ca3667098fbae9cc6b423956758fa" dependencies = [ "proc-macro2", "quote", @@ -1290,41 +1493,65 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semihosting" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "c3e1c7d2b77d80283c750a39c52f1ab4d17234e8f30bca43550f5b2375f41d5f" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -1340,6 +1567,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" version = "2.2.0" @@ -1348,9 +1581,9 @@ checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "smoltcp" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a1a996951e50b5971a2c8c0fa05a381480d70a933064245c4a223ddc87ccc97" +checksum = "dad095989c1533c1c266d9b1e8d70a1329dd3723c3edac6d03bbd67e7bf6f4bb" dependencies = [ "bitflags 1.3.2", "byteorder", @@ -1359,6 +1592,27 @@ dependencies = [ "managed", ] +[[package]] +name = "snafu" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ssh-cipher" version = "0.2.0" @@ -1387,7 +1641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" dependencies = [ "ed25519-dalek", - "rand_core", + "rand_core 0.6.4", "sha2", "signature", "ssh-cipher", @@ -1396,6 +1650,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ssh-stamp" +version = "0.1.0" +dependencies = [ + "cfg-if", + "ed25519-dalek", + "edge-dhcp", + "edge-nal", + "edge-nal-embassy", + "embassy-executor", + "embassy-futures", + "embassy-net", + "embassy-sync 0.7.0", + "embassy-time", + "embedded-io-async", + "esp-alloc", + "esp-backtrace", + "esp-bootloader-esp-idf", + "esp-hal", + "esp-hal-embassy", + "esp-println", + "esp-wifi", + "getrandom", + "heapless", + "hex", + "log", + "portable-atomic", + "smoltcp", + "ssh-key", + "static_cell", + "sunset", + "sunset-async", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1419,18 +1707,18 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ "heck", "proc-macro2", @@ -1445,11 +1733,64 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "sunset" +version = "0.2.0" +source = "git+https://github.com/mkj/sunset?rev=cb6c720#cb6c72008d332d6a066dbcc0b1712bacfb07ab0e" +dependencies = [ + "aes", + "ascii", + "chacha20", + "cipher", + "ctr", + "curve25519-dalek", + "digest", + "ed25519-dalek", + "embedded-io", + "getrandom", + "heapless", + "hmac", + "log", + "poly1305", + "pretty-hex", + "rand_core 0.6.4", + "sha2", + "signature", + "snafu", + "ssh-key", + "subtle", + "sunset-sshwire-derive", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "sunset-async" +version = "0.2.0" +source = "git+https://github.com/mkj/sunset?rev=cb6c720#cb6c72008d332d6a066dbcc0b1712bacfb07ab0e" +dependencies = [ + "embassy-futures", + "embassy-sync 0.7.0", + "embedded-io-async", + "log", + "pin-utils", + "portable-atomic", + "sunset", +] + +[[package]] +name = "sunset-sshwire-derive" +version = "0.2.0" +source = "git+https://github.com/mkj/sunset?rev=cb6c720#cb6c72008d332d6a066dbcc0b1712bacfb07ab0e" +dependencies = [ + "virtue", +] + [[package]] name = "syn" -version = "2.0.87" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -1467,9 +1808,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -1488,9 +1829,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", @@ -1501,9 +1842,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ufmt-write" @@ -1513,9 +1854,9 @@ checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "universal-hash" @@ -1527,6 +1868,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "usb-device" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" +dependencies = [ + "heapless", + "portable-atomic", +] + [[package]] name = "vcell" version = "0.1.3" @@ -1539,12 +1890,82 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7302ac74a033bf17b6e609ceec0f891ca9200d502d31f02dc7908d3d98767c9d" + [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + [[package]] name = "winapi-util" version = "0.1.9" @@ -1554,6 +1975,65 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -1629,9 +2109,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] @@ -1643,27 +2123,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", - "rand_core", + "rand_core 0.6.4", + "zeroize", ] [[package]] name = "xtensa-lx" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e758f94e1a1f71758f94052a2766dcb12604998eb372b8b2e30576e3ab1ba1e6" +checksum = "68737a6c8f32ddcd97476acf68ddc6d411697fd94f64a601af16854b74967dff" dependencies = [ - "bare-metal", - "mutex-trait", + "critical-section", + "document-features", ] [[package]] name = "xtensa-lx-rt" -version = "0.17.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0307d03dadbf95633942e13901984f2059df4c963367348168cbd21c962669" +checksum = "235815f34d1bf9c2f9c07917e2b63efbcab5ca5ce9d8faddb97b7105eed1ade3" dependencies = [ "anyhow", - "bare-metal", "document-features", "enum-as-inner", "minijinja", @@ -1677,9 +2157,9 @@ dependencies = [ [[package]] name = "xtensa-lx-rt-proc-macros" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11277b1e4cbb7ffe44678c668518b249c843c81df249b8f096701757bc50d7ee" +checksum = "6c1ab67b22f0576b953a25c43bdfed0ff84af2e01ced85e95c29e7bac6bf2180" dependencies = [ "darling", "proc-macro2", @@ -1692,19 +2172,17 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] [[package]] -name = "zssh" -version = "0.4.2" +name = "zeroize_derive" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19463c1944842efd88582d606f9ea1060a80a233b76b94924a48e0324f0d434c" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "chacha20", - "constant_time_eq", - "ed25519-dalek", - "embedded-io-async", - "poly1305", - "rand", - "sha2", - "x25519-dalek", + "proc-macro2", + "quote", + "syn", ] diff --git a/Cargo.toml b/Cargo.toml index f5b62fa..57c0d22 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,41 +2,45 @@ # https://github.com/card-io-ecg/card-io-fw/blob/main/Cargo.toml [package] -name = "esp-ssh-rs" +name = "ssh-stamp" version = "0.1.0" -authors = ["Roman Valls Guimera "] +authors = ["Roman Valls Guimera "] edition = "2021" license = "MIT OR Apache-2.0" [dependencies] -cfg-if = "1.0.0" -ed25519-dalek = { version = "2.1.1", default-features = false } -embassy-executor = { version = "0.6.3", features = ["integrated-timers", "task-arena-size-81920"]} -embassy-net = { version = "0.4.0", features = ["tcp", "udp", "dhcpv4", "medium-ethernet"] } -smoltcp = { version = "0.11.0", default-features = false, features = ["medium-ethernet", "socket-raw"]} -embassy-time = { version = "0.3.2" } -embedded-io-async = "0.6.0" -esp-alloc = "0.5.0" -esp-backtrace = { version = "0.14.2", features = [ -# "esp32s3", - "esp32c6", +cfg-if = "1" +ed25519-dalek = { version = "2", default-features = false } +embassy-executor = { version = "0.7"} +embassy-net = { version = "0.7", features = ["tcp", "udp", "dhcpv4", "medium-ethernet"] } +smoltcp = { version = "0.12", default-features = false, features = ["medium-ethernet", "socket-raw"]} +embassy-time = { version = "0.4" } +embedded-io-async = "0.6" +esp-alloc = "0.8" +esp-backtrace = { version = "0.16", features = [ "exception-handler", "panic-handler", "println", ] } -# esp-hal = { version = "0.20", features = [ "esp32s3", "async" ] } -# esp-hal-embassy = { version = "0.3", features = ["esp32s3"] } -# esp-println = { version = "0.11", features = ["esp32s3", "log"] } -# esp-wifi = { version = "0.8.0", features = ["esp32s3", "wifi", "wifi-default", "utils", "smoltcp", "async", "embassy-net"] } -esp-hal = { version = "0.22.0", features = [ "esp32c6" ] } -esp-hal-embassy = { version = "0.5.0", features = ["esp32c6"] } -esp-println = { version = "0.12.0", features = ["esp32c6", "log"] } -esp-wifi = { version = "0.11.0", features = ["esp32c6", "wifi", "utils", "esp-alloc"] } +esp-hal = { version = "1.0.0-beta.1", features = [ "unstable" ] } +esp-hal-embassy = { version = "0.8"} +esp-println = { version = "0.14", features = ["log-04"]} +esp-wifi = { version = "0.14", features = ["wifi", "esp-alloc"] } hex = { version = "0.4", default-features = false } log = { version = "0.4" } -static_cell = { version = "2.1.0", features = ["nightly"] } -zssh = "0.4" -ssh-key = { version = "0.6.7", default-features = false, features = ["ed25519"] } +static_cell = { version = "2", features = ["nightly"] } +ssh-key = { version = "0.6", default-features = false, features = ["ed25519"] } +getrandom = { version = "0.2.10", features = ["custom"] } +sunset = { git="https://github.com/mkj/sunset", rev = "cb6c720", default-features = false, features = ["openssh-key", "embedded-io"]} +sunset-async = { git = "https://github.com/mkj/sunset", rev = "cb6c720", default-features = false} +embassy-sync = "0.7" +heapless = "0.8" +embassy-futures = "0.1" +edge-dhcp = "0.6" +edge-nal = "0.5" +edge-nal-embassy = "0.6" +portable-atomic = "1" +esp-bootloader-esp-idf = "0.1" [profile.dev] # Rust debug is too slow. @@ -52,5 +56,69 @@ lto = 'fat' opt-level = 3 overflow-checks = false +[profile.esp32s2] +inherits = "release" +opt-level = "s" # Optimize for size. +overflow-checks = false +lto = 'fat' + [features] -esp32 = [] +#default = ["esp32c6"] + +# MCU options +esp32 = [ + "esp-hal/esp32", + "esp-backtrace/esp32", + "esp-wifi/esp32", + "esp-hal-embassy/esp32", + "esp-println/esp32", + "embassy-executor/task-arena-size-40960", +] +esp32c2 = [ + "esp-hal/esp32c2", + "esp-backtrace/esp32c2", + "esp-wifi/esp32c2", + "esp-hal-embassy/esp32c2", + "esp-println/esp32c2", + "embassy-executor/task-arena-size-40960", +] +esp32c3 = [ + "esp-hal/esp32c3", + "esp-backtrace/esp32c3", + "esp-wifi/esp32c3", + "esp-hal-embassy/esp32c3", + "esp-println/esp32c3", + "embassy-executor/task-arena-size-40960", +] +#esp32c5 = [ +# "esp-hal/esp32c5", +# "esp-backtrace/esp32c5", +# "esp-wifi/esp32c5", +# "esp-hal-embassy/esp32c5", +# "esp-println/esp32c5", +# "embassy-executor/task-arena-size-40960", +#] +esp32c6 = [ + "esp-hal/esp32c6", + "esp-backtrace/esp32c6", + "esp-wifi/esp32c6", + "esp-hal-embassy/esp32c6", + "esp-println/esp32c6", + "embassy-executor/task-arena-size-40960", +] +esp32s2 = [ + "esp-hal/esp32s2", + "esp-backtrace/esp32s2", + "esp-wifi/esp32s2", + "esp-hal-embassy/esp32s2", + "esp-println/esp32s2", + "embassy-executor/task-arena-size-32768", +] +esp32s3 = [ + "esp-hal/esp32s3", + "esp-backtrace/esp32s3", + "esp-wifi/esp32s3", + "esp-hal-embassy/esp32s3", + "esp-println/esp32s3", + "embassy-executor/task-arena-size-40960", +] diff --git a/README.md b/README.md index 21aa59f..e2fab5d 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,113 @@ -# esp_hosted_ssh -Your everyday SSH secured serial access +# SSH Stamp + +Sponsored by: + +![nlnet_zero_commons][nlnet_zero_commons] + +# ⚠️ WARNING: Pre-alpha PoC quality, DO NOT use in production. Currently contains highly unsafe business logic auth issues (both password and key management handlers need to be fixed). + +# ⚠️ WARNING: Do not file CVEs reports since deficiencies are very much known at this point in time and they'll be worked on soon as part of [this NLNet SSH-Stamp research and development grant][nlnet-grant] ;) + +Expect panics, lost bytes on the UART and other tricky UX issues, we are working on it, pull-requests are accepted too! + +## Description + +Your everyday SSH secured serial access. + +The **SSH Stamp** is a secure wireless to UART bridge +implemented in Rust (no_std, no_alloc and no_unsafe whenever possible) +with simplicity and robustness as its main design tenets. + +The firmware runs on a microcontroller running Secure SHell Protocol +(RFC 4253 and related IETF standards series). This firmware can be +used for multiple purposes, conveniently avoiding physical +tethering and securely tunneling traffic via SSH by default: easily +add telemetry to a (moving) robot, monitor and operate any (domestic) +appliance remotely, conduct remote cybersecurity audits on +network gear of a company, reverse engineer hardware and software for +right to repair purposes, just to name a few examples. + +A "low level to SSH Swiss army knife". # Building Rust versions are controlled via `rust-toolchain.toml` and the equivalent defined on the CI workflow. -On a fresh system the following should be enough to build and run on an ESP32-C6 dev board. - +Required for all targets: ``` rustup toolchain install stable --component rust-src +cargo install espflash +``` + +On a fresh system the following should be enough to build and run on an ESP32-C6 dev board. +``` rustup target add riscv32imac-unknown-none-elf -cargo build --release +cargo build-esp32c6 +cargo run-esp32c6 +``` + +Build and run for ESP32-C2 / ESP32-C3: +``` +rustup target add riscv32imc-unknown-none-elf +cargo build-esp32c2 +cargo build-esp32c3 +cargo run-esp32c2 +cargo run-esp32c3 +``` + +Build for ESP32 / ESP32-S2 / ESP32-S3 (Xtensa Cores) - +Install esp toolchain first: https://github.com/esp-rs/espup +``` +cargo install espup +espup install +$HOME/export-esp.sh +rustup override set esp +cargo build-esp32 +cargo build-esp32s2 +cargo build-esp32s3 +``` +Running on the target: +``` +cargo run-esp32 +cargo run-esp32s2 +cargo run-esp32s3 +``` + +Alternatively to not use rustup override: +``` +cargo +esp build-esp32 +cargo +esp build-esp32s2 +cargo +esp build-esp32s3 ``` Running on the target: +``` +cargo +esp run-esp32 +cargo +esp run-esp32s2 +cargo +esp run-esp32s3 +``` + +# Example usecases + +The following depicts a typical OpenWrt router with a (prototype) SSH Stamp connected to its UART. After ssh-ing into the SSH Stamp, one can interact with the router's UART "off band", to i.e: + +1. Recover from OpenWrt not booting without needing to open up the case and connect a wired TTL2USB converter. A simple SSH-based BMC. +2. Capture kernel panics during your router's (ab)normal operation. I.e: [to debug a buggy wireless driver][openwrt_mediatek_no_monitor]. +3. Re-provision the whole OpenWrt installation without having to physically unmount the device from its place, all from your wireless SSH shell comfort. + +Here are some PoC shots: + +![physical_setup](./docs/img/ssh_stamp_openwrt_setup.png) +![connection](./docs/img/connecting_to_ssh_stamp.png) +![openwrt_hello](./docs/img/openwrt_ssh_helloworld.png) + +# Generate SBOM ``` -cargo install cargo-espflash -cargo run --release +cargo install cargo-cyclonedx +cargo cyclonedx -f json --manifest-path ./docs/ ``` + +[nlnet-grant]: https://nlnet.nl/project/SSH-Stamp/ +[openwrt_mediatek_no_monitor]: https://github.com/openwrt/openwrt/issues/16279 +[nlnet_zero_commons]: ./docs/nlnet/zero_commons_logo.svg diff --git a/docs/esp-ssh-rs.cdx.json b/docs/esp-ssh-rs.cdx.json new file mode 100644 index 0000000..c6ad801 --- /dev/null +++ b/docs/esp-ssh-rs.cdx.json @@ -0,0 +1,6110 @@ +{ + "bomFormat": "CycloneDX", + "specVersion": "1.3", + "version": 1, + "serialNumber": "urn:uuid:e4fd1f91-06aa-410b-92ce-a9751747c55d", + "metadata": { + "timestamp": "2025-04-22T06:02:24.083109000Z", + "tools": [ + { + "vendor": "CycloneDX", + "name": "cargo-cyclonedx", + "version": "0.5.7" + } + ], + "authors": [ + { + "name": "Roman Valls Guimera", + "email": "brainstorm@users.noreply.github.com" + } + ], + "component": { + "type": "application", + "bom-ref": "path+file:///Users/rvalls/dev/personal/ssh-stamp#esp-ssh-rs@0.1.0", + "author": "Roman Valls Guimera ", + "name": "esp-ssh-rs", + "version": "0.1.0", + "scope": "required", + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-ssh-rs@0.1.0?download_url=file://.", + "components": [ + { + "type": "library", + "bom-ref": "path+file:///Users/rvalls/dev/personal/ssh-stamp#esp-ssh-rs@0.1.0 bin-target-0", + "name": "esp_ssh_rs", + "version": "0.1.0", + "purl": "pkg:cargo/esp-ssh-rs@0.1.0?download_url=file://.#src/lib.rs" + }, + { + "type": "application", + "bom-ref": "path+file:///Users/rvalls/dev/personal/ssh-stamp#esp-ssh-rs@0.1.0 bin-target-1", + "name": "esp-ssh-rs", + "version": "0.1.0", + "purl": "pkg:cargo/esp-ssh-rs@0.1.0?download_url=file://.#src/main.rs" + } + ] + }, + "properties": [ + { + "name": "cdx:rustc:sbom:target:triple", + "value": "aarch64-apple-darwin" + } + ] + }, + "components": [ + { + "type": "library", + "bom-ref": "git+https://github.com/mkj/sunset#0.2.0", + "name": "sunset", + "version": "0.2.0", + "description": "A SSH library suitable for embedded and larger programs", + "scope": "required", + "licenses": [ + { + "expression": "0BSD" + } + ], + "purl": "pkg:cargo/sunset@0.2.0?vcs_url=git%2Bhttps://github.com/mkj/sunset%40b1d2c836f1893a7b880937a3fbe1313fb7978f5c", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/mkj/sunset" + } + ] + }, + { + "type": "library", + "bom-ref": "git+https://github.com/mkj/sunset#sunset-embassy@0.2.0", + "name": "sunset-embassy", + "version": "0.2.0", + "description": "async wrapper for Sunset SSH", + "scope": "required", + "licenses": [ + { + "expression": "0BSD" + } + ], + "purl": "pkg:cargo/sunset-embassy@0.2.0?vcs_url=git%2Bhttps://github.com/mkj/sunset%40b1d2c836f1893a7b880937a3fbe1313fb7978f5c", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/mkj/sunset" + } + ] + }, + { + "type": "library", + "bom-ref": "git+https://github.com/mkj/sunset#sunset-sshwire-derive@0.2.0", + "name": "sunset-sshwire-derive", + "version": "0.2.0", + "description": "Derive macros for Sunset SSH packet encoder/decoder", + "scope": "required", + "licenses": [ + { + "expression": "0BSD" + } + ], + "purl": "pkg:cargo/sunset-sshwire-derive@0.2.0?vcs_url=git%2Bhttps://github.com/mkj/sunset%40b1d2c836f1893a7b880937a3fbe1313fb7978f5c", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/mkj/sunset" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#aes@0.8.4", + "author": "RustCrypto Developers", + "name": "aes", + "version": "0.8.4", + "description": "Pure Rust implementation of the Advanced Encryption Standard (a.k.a. Rijndael)", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/aes@0.8.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/aes" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/block-ciphers" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#anyhow@1.0.96", + "author": "David Tolnay ", + "name": "anyhow", + "version": "1.0.96", + "description": "Flexible concrete Error type built on std::error::Error", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/anyhow@1.0.96", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/anyhow" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/anyhow" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ascii@1.1.0", + "author": "Thomas Bahn , Torbjørn Birch Moltu , Simon Sapin ", + "name": "ascii", + "version": "1.1.0", + "description": "ASCII-only equivalents to `char`, `str` and `String`.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/ascii@1.1.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/ascii" + }, + { + "type": "vcs", + "url": "https://github.com/tomprogrammer/rust-ascii" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#atomic-polyfill@1.0.3", + "author": "Dario Nieuwenhuis ", + "name": "atomic-polyfill", + "version": "1.0.3", + "description": "Atomic polyfills, for targets where they're not available.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/atomic-polyfill@1.0.3", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/embassy-rs/atomic-polyfill" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#autocfg@1.4.0", + "author": "Josh Stone ", + "name": "autocfg", + "version": "1.4.0", + "description": "Automatic cfg for Rust compiler features", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/autocfg@1.4.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/autocfg/" + }, + { + "type": "vcs", + "url": "https://github.com/cuviper/autocfg" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#base64ct@1.6.0", + "author": "RustCrypto Developers", + "name": "base64ct", + "version": "1.6.0", + "description": "Pure Rust implementation of Base64 (RFC 4648) which avoids any usages of data-dependent branches/LUTs and thereby provides portable \"best effort\" constant-time operation and embedded-friendly no_std support ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/base64ct@1.6.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/base64ct" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/formats/tree/master/base64ct" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#basic-toml@0.1.9", + "author": "Alex Crichton , David Tolnay ", + "name": "basic-toml", + "version": "0.1.9", + "description": "Minimal TOML library with few dependencies", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/basic-toml@0.1.9", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/basic-toml" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/basic-toml" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#bitfield-macros@0.18.1", + "author": "Loïc Damien ", + "name": "bitfield-macros", + "version": "0.18.1", + "description": "Internal crate for the bitfield crate.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "331afbb18ce7b644c0b428726d369c5dd37ca0b815d72a459fcc2896c3c8ad32" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/bitfield-macros@0.18.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/bitfield-macros" + }, + { + "type": "vcs", + "url": "https://github.com/dzamlo/rust-bitfield" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#bitfield@0.18.1", + "author": "Loïc Damien ", + "name": "bitfield", + "version": "0.18.1", + "description": "This crate provides macros to generate bitfield-like struct.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "4c7e6caee68becd795bfd65f1a026e4d00d8f0c2bc9be5eb568e1015f9ce3c34" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/bitfield@0.18.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/bitfield" + }, + { + "type": "vcs", + "url": "https://github.com/dzamlo/rust-bitfield" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#bitflags@1.3.2", + "author": "The Rust Project Developers", + "name": "bitflags", + "version": "1.3.2", + "description": "A macro to generate structures which behave like bitflags. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/bitflags@1.3.2", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/bitflags" + }, + { + "type": "website", + "url": "https://github.com/bitflags/bitflags" + }, + { + "type": "vcs", + "url": "https://github.com/bitflags/bitflags" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#bitflags@2.8.0", + "author": "The Rust Project Developers", + "name": "bitflags", + "version": "2.8.0", + "description": "A macro to generate structures which behave like bitflags. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/bitflags@2.8.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/bitflags" + }, + { + "type": "website", + "url": "https://github.com/bitflags/bitflags" + }, + { + "type": "vcs", + "url": "https://github.com/bitflags/bitflags" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#block-buffer@0.10.4", + "author": "RustCrypto Developers", + "name": "block-buffer", + "version": "0.10.4", + "description": "Buffer type for block processing of data", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/block-buffer@0.10.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/block-buffer" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/utils" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#bytemuck@1.21.0", + "author": "Lokathor ", + "name": "bytemuck", + "version": "1.21.0", + "description": "A crate for mucking around with piles of bytes.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" + } + ], + "licenses": [ + { + "expression": "Zlib OR Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/bytemuck@1.21.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/Lokathor/bytemuck" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#byteorder@1.5.0", + "author": "Andrew Gallant ", + "name": "byteorder", + "version": "1.5.0", + "description": "Library for reading/writing numbers in big-endian and little-endian.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + } + ], + "licenses": [ + { + "expression": "Unlicense OR MIT" + } + ], + "purl": "pkg:cargo/byteorder@1.5.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/byteorder" + }, + { + "type": "website", + "url": "https://github.com/BurntSushi/byteorder" + }, + { + "type": "vcs", + "url": "https://github.com/BurntSushi/byteorder" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "author": "Alex Crichton ", + "name": "cfg-if", + "version": "1.0.0", + "description": "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/cfg-if@1.0.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/cfg-if" + }, + { + "type": "website", + "url": "https://github.com/alexcrichton/cfg-if" + }, + { + "type": "vcs", + "url": "https://github.com/alexcrichton/cfg-if" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#chacha20@0.9.1", + "author": "RustCrypto Developers", + "name": "chacha20", + "version": "0.9.1", + "description": "The ChaCha20 stream cipher (RFC 8439) implemented in pure Rust using traits from the RustCrypto `cipher` crate, with optional architecture-specific hardware acceleration (AVX2, SSE2). Additionally provides the ChaCha8, ChaCha12, XChaCha20, XChaCha12 and XChaCha8 stream ciphers, and also optional rand_core-compatible RNGs based on those ciphers. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/chacha20@0.9.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/chacha20" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/stream-ciphers" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#chrono@0.4.40", + "name": "chrono", + "version": "0.4.40", + "description": "Date and time library for Rust", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/chrono@0.4.40", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/chrono/" + }, + { + "type": "website", + "url": "https://github.com/chronotope/chrono" + }, + { + "type": "vcs", + "url": "https://github.com/chronotope/chrono" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4", + "author": "RustCrypto Developers", + "name": "cipher", + "version": "0.4.4", + "description": "Traits for describing block ciphers and stream ciphers", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/cipher@0.4.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/cipher" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/traits" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#cpufeatures@0.2.17", + "author": "RustCrypto Developers", + "name": "cpufeatures", + "version": "0.2.17", + "description": "Lightweight runtime CPU feature detection for aarch64, loongarch64, and x86/x86_64 targets, with no_std support and support for mobile targets including Android and iOS ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/cpufeatures@0.2.17", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/cpufeatures" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/utils" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "name": "critical-section", + "version": "1.2.0", + "description": "Cross-platform critical section", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/critical-section@1.2.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/rust-embedded/critical-section" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#crypto-common@0.1.6", + "author": "RustCrypto Developers", + "name": "crypto-common", + "version": "0.1.6", + "description": "Common cryptographic traits", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/crypto-common@0.1.6", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/crypto-common" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/traits" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ctr@0.9.2", + "author": "RustCrypto Developers", + "name": "ctr", + "version": "0.9.2", + "description": "CTR block modes of operation", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/ctr@0.9.2", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/ctr" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/block-modes" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#curve25519-dalek@4.1.3", + "author": "Isis Lovecruft , Henry de Valence ", + "name": "curve25519-dalek", + "version": "4.1.3", + "description": "A pure-Rust implementation of group operations on ristretto255 and Curve25519", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" + } + ], + "licenses": [ + { + "expression": "BSD-3-Clause" + } + ], + "purl": "pkg:cargo/curve25519-dalek@4.1.3", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/curve25519-dalek" + }, + { + "type": "website", + "url": "https://github.com/dalek-cryptography/curve25519-dalek" + }, + { + "type": "vcs", + "url": "https://github.com/dalek-cryptography/curve25519-dalek/tree/main/curve25519-dalek" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#darling@0.20.10", + "author": "Ted Driggs ", + "name": "darling", + "version": "0.20.10", + "description": "A proc-macro library for reading attributes into structs when implementing custom derives. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/darling@0.20.10", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/darling/0.20.10" + }, + { + "type": "vcs", + "url": "https://github.com/TedDriggs/darling" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#darling_core@0.20.10", + "author": "Ted Driggs ", + "name": "darling_core", + "version": "0.20.10", + "description": "Helper crate for proc-macro library for reading attributes into structs when implementing custom derives. Use https://crates.io/crates/darling in your code. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/darling_core@0.20.10", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/TedDriggs/darling" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#darling_macro@0.20.10", + "author": "Ted Driggs ", + "name": "darling_macro", + "version": "0.20.10", + "description": "Internal support for a proc-macro library for reading attributes into structs when implementing custom derives. Use https://crates.io/crates/darling in your code. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/darling_macro@0.20.10", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/TedDriggs/darling" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#delegate@0.13.2", + "author": "Godfrey Chan , Jakub Beránek ", + "name": "delegate", + "version": "0.13.2", + "description": "Method delegation with less boilerplate", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "297806318ef30ad066b15792a8372858020ae3ca2e414ee6c2133b1eb9e9e945" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/delegate@0.13.2", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/kobzol/rust-delegate" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#digest@0.10.7", + "author": "RustCrypto Developers", + "name": "digest", + "version": "0.10.7", + "description": "Traits for cryptographic hash functions and message authentication codes", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/digest@0.10.7", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/digest" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/traits" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "author": "Slint Developers ", + "name": "document-features", + "version": "0.2.11", + "description": "Extract documentation for the feature flags from comments in Cargo.toml", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/document-features@0.2.11", + "externalReferences": [ + { + "type": "website", + "url": "https://slint.rs/" + }, + { + "type": "vcs", + "url": "https://github.com/slint-ui/document-features" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ed25519-dalek@2.1.1", + "author": "isis lovecruft , Tony Arcieri , Michael Rosenberg ", + "name": "ed25519-dalek", + "version": "2.1.1", + "description": "Fast and efficient ed25519 EdDSA key generations, signing, and verification in pure Rust.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" + } + ], + "licenses": [ + { + "expression": "BSD-3-Clause" + } + ], + "purl": "pkg:cargo/ed25519-dalek@2.1.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/ed25519-dalek" + }, + { + "type": "website", + "url": "https://github.com/dalek-cryptography/curve25519-dalek" + }, + { + "type": "vcs", + "url": "https://github.com/dalek-cryptography/curve25519-dalek/tree/main/ed25519-dalek" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ed25519@2.2.3", + "author": "RustCrypto Developers", + "name": "ed25519", + "version": "2.2.3", + "description": "Edwards Digital Signature Algorithm (EdDSA) over Curve25519 (as specified in RFC 8032) support library providing signature type definitions and PKCS#8 private key decoding/encoding support ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/ed25519@2.2.3", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/ed25519" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/signatures/tree/master/ed25519" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#edge-dhcp@0.5.0", + "name": "edge-dhcp", + "version": "0.5.0", + "description": "Async + `no_std` + no-alloc implementation of the DHCP protocol", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "b6c14e92b3e72e93428f87e64f14e2b868b8adcd2e38e0ebf72baa158fe0f930" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/edge-dhcp@0.5.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/ivmarkov/edge-net" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#edge-nal-embassy@0.5.0", + "name": "edge-nal-embassy", + "version": "0.5.0", + "description": "An implementation of edge-nal based on `embassy-net`", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8aacee123b1a4df16dfba7b46ea0912e9d99bc099fe81bd2a564013510471e41" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/edge-nal-embassy@0.5.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/ivmarkov/edge-net" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#edge-nal@0.5.0", + "name": "edge-nal", + "version": "0.5.0", + "description": "Hosts a bunch of traits which are not yet available in the embedded-nal-async crate", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ac19c3edcdad839c71cb919cd09a632d9915d630760b37f0b74290188c08f248" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/edge-nal@0.5.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/ivmarkov/edge-net" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#edge-raw@0.5.0", + "name": "edge-raw", + "version": "0.5.0", + "description": "Async + `no_std` + no-alloc implementation of IP and UDP packet creation and parsing", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1d80a91a0c4abb68a9bc4c0df607135b5d9b6885b49acfe2d2c881e3f9623324" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/edge-raw@0.5.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/ivmarkov/edge-net" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-embedded-hal@0.3.0", + "name": "embassy-embedded-hal", + "version": "0.3.0", + "description": "Collection of utilities to use `embedded-hal` and `embedded-storage` traits with Embassy.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-embedded-hal@0.3.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-embedded-hal" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-executor-macros@0.6.2", + "name": "embassy-executor-macros", + "version": "0.6.2", + "description": "macros for creating the entry point and tasks for embassy-executor", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3577b1e9446f61381179a330fc5324b01d511624c55f25e3c66c9e3c626dbecf" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-executor-macros@0.6.2", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-executor-macros" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-executor@0.7.0", + "name": "embassy-executor", + "version": "0.7.0", + "description": "async/await executor designed for embedded usage", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "90327bcc66333a507f89ecc4e2d911b265c45f5c9bc241f98eee076752d35ac6" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-executor@0.7.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-executor" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "name": "embassy-futures", + "version": "0.1.1", + "description": "no-std, no-alloc utilities for working with futures", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-futures@0.1.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-net-driver@0.2.0", + "name": "embassy-net-driver", + "version": "0.2.0", + "description": "Driver trait for the `embassy-net` async TCP/IP network stack.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-net-driver@0.2.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-net@0.6.0", + "name": "embassy-net", + "version": "0.6.0", + "description": "Async TCP/IP network stack for embedded systems", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ed041cc19a603d657124fddefdcbe5ef8bd60e77d972793ebb57de93394f5949" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-net@0.6.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-net" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.5.0", + "name": "embassy-sync", + "version": "0.5.0", + "description": "no-std, no-alloc synchronization primitives with async support", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-sync@0.5.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "name": "embassy-sync", + "version": "0.6.2", + "description": "no-std, no-alloc synchronization primitives with async support", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8d2c8cdff05a7a51ba0087489ea44b0b1d97a296ca6b1d6d1a33ea7423d34049" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-sync@0.6.2", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-sync" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-time-driver@0.2.0", + "name": "embassy-time-driver", + "version": "0.2.0", + "description": "Driver trait for embassy-time", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8d45f5d833b6d98bd2aab0c2de70b18bfaa10faf661a1578fd8e5dfb15eb7eba" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-time-driver@0.2.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-time-driver" + }, + { + "type": "other", + "url": "embassy-time" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-time-queue-utils@0.1.0", + "name": "embassy-time-queue-utils", + "version": "0.1.0", + "description": "Timer queue driver trait for embassy-time", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "dc55c748d16908a65b166d09ce976575fb8852cf60ccd06174092b41064d8f83" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-time-queue-utils@0.1.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-time-queue-utils" + }, + { + "type": "other", + "url": "embassy-time-queue" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "name": "embassy-time", + "version": "0.4.0", + "description": "Instant and Duration for embedded no-std systems, with async timer support", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embassy-time@0.4.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.embassy.dev/embassy-time" + }, + { + "type": "vcs", + "url": "https://github.com/embassy-rs/embassy" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-can@0.4.1", + "name": "embedded-can", + "version": "0.4.1", + "description": "HAL traits for Controller Area Network (CAN) devices.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e9d2e857f87ac832df68fa498d18ddc679175cf3d2e4aa893988e5601baf9438" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-can@0.4.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-can" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/embedded-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-hal-async@1.0.0", + "author": "The Embedded HAL Team and Contributors ", + "name": "embedded-hal-async", + "version": "1.0.0", + "description": "An asynchronous Hardware Abstraction Layer (HAL) for embedded systems", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-hal-async@1.0.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-hal-async" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/embedded-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@0.2.7", + "author": "The Embedded HAL Team , Jorge Aparicio , Jonathan 'theJPster' Pallant ", + "name": "embedded-hal", + "version": "0.2.7", + "description": " A Hardware Abstraction Layer (HAL) for embedded systems ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-hal@0.2.7", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-hal" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/embedded-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@1.0.0", + "author": "The Embedded HAL Team , Jorge Aparicio , Jonathan 'theJPster' Pallant ", + "name": "embedded-hal", + "version": "1.0.0", + "description": " A Hardware Abstraction Layer (HAL) for embedded systems ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-hal@1.0.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-hal" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/embedded-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "name": "embedded-io-async", + "version": "0.6.1", + "description": "Async embedded IO traits", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-io-async@0.6.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/rust-embedded/embedded-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-io@0.6.1", + "name": "embedded-io", + "version": "0.6.1", + "description": "Embedded IO traits", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-io@0.6.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/rust-embedded/embedded-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-nal-async@0.8.0", + "name": "embedded-nal-async", + "version": "0.8.0", + "description": "An Async Network Abstraction Layer (NAL) for Embedded Systems", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "76959917cd2b86f40a98c28dd5624eddd1fa69d746241c8257eac428d83cb211" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-nal-async@0.8.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-nal-async" + }, + { + "type": "website", + "url": "https://github.com/rust-embedded-community/embedded-nal" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded-community/embedded-nal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-nal@0.9.0", + "author": "Jonathan 'theJPster' Pallant , Mathias Koch , Diego Barrios Romero , Ryan Summers ", + "name": "embedded-nal", + "version": "0.9.0", + "description": "A Network Abstraction Layer (NAL) for Embedded Systems", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c56a28be191a992f28f178ec338a0bf02f63d7803244add736d026a471e6ed77" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-nal@0.9.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-nal" + }, + { + "type": "website", + "url": "https://github.com/rust-embedded-community/embedded-nal" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded-community/embedded-nal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-storage-async@0.4.1", + "author": "Mathias Koch , Ulf Lilleengen , Dario Nieuwenhuis , Diego Barrios Romero ", + "name": "embedded-storage-async", + "version": "0.4.1", + "description": "A Storage Abstraction Layer for Embedded Systems", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-storage-async@0.4.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-storage" + }, + { + "type": "website", + "url": "https://github.com/rust-embedded-community/embedded-storage" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded-community/embedded-storage" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-storage@0.3.1", + "author": "Mathias Koch ", + "name": "embedded-storage", + "version": "0.3.1", + "description": "A Storage Abstraction Layer for Embedded Systems", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/embedded-storage@0.3.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/embedded-storage" + }, + { + "type": "website", + "url": "https://github.com/rust-embedded-community/embedded-storage" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded-community/embedded-storage" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#enumset@1.1.5", + "author": "Alissa Rao ", + "name": "enumset", + "version": "1.1.5", + "description": "A library for creating compact sets of enums.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/enumset@1.1.5", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/enumset/" + }, + { + "type": "vcs", + "url": "https://github.com/Lymia/enumset" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#enumset_derive@0.10.0", + "author": "Alissa Rao ", + "name": "enumset_derive", + "version": "0.10.0", + "description": "An internal helper crate for enumset. Not public API.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/enumset_derive@0.10.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://lymia.moe/doc/enumset/enumset/" + }, + { + "type": "vcs", + "url": "https://github.com/Lymia/enumset" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#equivalent@1.0.2", + "name": "equivalent", + "version": "1.0.2", + "description": "Traits for key comparison in maps.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/equivalent@1.0.2", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/indexmap-rs/equivalent" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-alloc@0.7.0", + "name": "esp-alloc", + "version": "0.7.0", + "description": "A heap allocator for Espressif devices", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "a78132d362cbf62ce22a1466eb9e98424f6b2d1e476e7a3cb46ca9063c5833f7" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-alloc@0.7.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-backtrace@0.15.1", + "name": "esp-backtrace", + "version": "0.15.1", + "description": "Bare-metal backtrace support for Espressif devices", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e4cd70abe47945c9116972781b5c05277ad855a5f5569fe2afd3e2e61a103cc0" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-backtrace@0.15.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "name": "esp-build", + "version": "0.2.0", + "description": "Build utilities for esp-hal", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8aa1c8f9954c9506699cf1ca10a2adcc226ff10b6ae3cb9e875cf2c6a0b9a372" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-build@0.2.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-config@0.3.1", + "name": "esp-config", + "version": "0.3.1", + "description": "Configure projects using esp-hal and related packages", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "158dba334d3a2acd8d93873c0ae723ca1037cc78eefe5d6b4c5919b0ca28e38e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-config@0.3.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-hal-embassy@0.7.0", + "name": "esp-hal-embassy", + "version": "0.7.0", + "description": "Embassy support for esp-hal", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "b27f41110117a9bf2be385b42535c686b301c8ce3b5ea0a07567e200a63a2239" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-hal-embassy@0.7.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-hal-procmacros@0.17.0", + "name": "esp-hal-procmacros", + "version": "0.17.0", + "description": "Procedural macros for esp-hal", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1bd340a20a7d546570af58fd9e2aae17466a42572680d8e70d35fc7c475c4ed8" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-hal-procmacros@0.17.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-hal@1.0.0-beta.0", + "name": "esp-hal", + "version": "1.0.0-beta.0", + "description": "Bare-metal HAL for Espressif devices", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e9efaa9c1324ca20a22086aba2ce47a9bdc5bd65969af8b0cd5e879603b57bef" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-hal@1.0.0-beta.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.esp-rs.org/esp-hal/" + }, + { + "type": "other", + "url": "esp-hal" + }, + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-metadata@0.6.0", + "name": "esp-metadata", + "version": "0.6.0", + "description": "Metadata for Espressif devices", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "30b4bffc22b7b1222c9467f0cb90eb49dcb63de810ecb3300e4b3bbc4ac2423e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-metadata@0.6.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-println@0.13.1", + "name": "esp-println", + "version": "0.13.1", + "description": "Provides `print!` and `println!` implementations various Espressif devices", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "960703930f9f3c899ddedd122ea27a09d6a612c22323157e524af5b18876448e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-println@0.13.1", + "externalReferences": [ + { + "type": "other", + "url": "esp-println" + }, + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-wifi-sys@0.7.1", + "author": "The ESP-RS team", + "name": "esp-wifi-sys", + "version": "0.7.1", + "description": "Bindings to Espressif's WiFi and Bluetooth low-level drivers", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c6b5438361891c431970194a733415006fb3d00b6eb70b3dcb66fd58f04d9b39" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-wifi-sys@0.7.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-wifi" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp-wifi@0.13.0", + "name": "esp-wifi", + "version": "0.13.0", + "description": "A WiFi, Bluetooth and ESP-NOW driver for use with Espressif chips and bare-metal Rust", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "cd7d7ea0e2c374343a375758861e13cf618db619436bcb386dfe5529ef31e9d5" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp-wifi@0.13.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.esp-rs.org/esp-hal/" + }, + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-hal" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#esp32c6@0.19.0", + "name": "esp32c6", + "version": "0.19.0", + "description": "Peripheral access crate for the ESP32-C6", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "9ff2a4e1d1b0cb2517af20766004b8e8fb4612043f0b0569703cc90d1880ede4" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/esp32c6@0.19.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/esp-rs/esp-pacs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#fnv@1.0.7", + "author": "Alex Crichton ", + "name": "fnv", + "version": "1.0.7", + "description": "Fowler–Noll–Vo hash function", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/fnv@1.0.7", + "externalReferences": [ + { + "type": "documentation", + "url": "https://doc.servo.org/fnv/" + }, + { + "type": "vcs", + "url": "https://github.com/servo/rust-fnv" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#fugit@0.3.7", + "author": "Emil Fresk ", + "name": "fugit", + "version": "0.3.7", + "description": "Time library for embedded targets with ease-of-use and performance first.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/fugit@0.3.7", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/korken89/fugit" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#futures-core@0.3.31", + "name": "futures-core", + "version": "0.3.31", + "description": "The core traits and types in for the `futures` library. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/futures-core@0.3.31", + "externalReferences": [ + { + "type": "website", + "url": "https://rust-lang.github.io/futures-rs" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/futures-rs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#futures-sink@0.3.31", + "name": "futures-sink", + "version": "0.3.31", + "description": "The asynchronous `Sink` trait for the futures-rs library. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/futures-sink@0.3.31", + "externalReferences": [ + { + "type": "website", + "url": "https://rust-lang.github.io/futures-rs" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/futures-rs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#futures-task@0.3.31", + "name": "futures-task", + "version": "0.3.31", + "description": "Tools for working with tasks. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/futures-task@0.3.31", + "externalReferences": [ + { + "type": "website", + "url": "https://rust-lang.github.io/futures-rs" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/futures-rs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#futures-util@0.3.31", + "name": "futures-util", + "version": "0.3.31", + "description": "Common utilities and extension traits for the futures-rs library. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/futures-util@0.3.31", + "externalReferences": [ + { + "type": "website", + "url": "https://rust-lang.github.io/futures-rs" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/futures-rs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#gcd@2.3.0", + "author": "Corey Farwell ", + "name": "gcd", + "version": "2.3.0", + "description": "Calculate the greatest common divisor", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/gcd@2.3.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/gcd/" + }, + { + "type": "vcs", + "url": "https://github.com/frewsxcv/rust-gcd" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#generic-array@0.14.7", + "author": "Bartłomiej Kamiński , Aaron Trent ", + "name": "generic-array", + "version": "0.14.7", + "description": "Generic types implementing functionality of arrays", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/generic-array@0.14.7", + "externalReferences": [ + { + "type": "documentation", + "url": "http://fizyk20.github.io/generic-array/generic_array/" + }, + { + "type": "vcs", + "url": "https://github.com/fizyk20/generic-array.git" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.15", + "author": "The Rand Project Developers", + "name": "getrandom", + "version": "0.2.15", + "description": "A small cross-platform library for retrieving random data from system source", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/getrandom@0.2.15", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/getrandom" + }, + { + "type": "vcs", + "url": "https://github.com/rust-random/getrandom" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#hash32@0.3.1", + "author": "Jorge Aparicio ", + "name": "hash32", + "version": "0.3.1", + "description": "32-bit hashing algorithms", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/hash32@0.3.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/japaric/hash32" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#hashbrown@0.15.2", + "author": "Amanieu d'Antras ", + "name": "hashbrown", + "version": "0.15.2", + "description": "A Rust port of Google's SwissTable hash map", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/hashbrown@0.15.2", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/rust-lang/hashbrown" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "author": "Jorge Aparicio , Per Lindgren , Emil Fresk ", + "name": "heapless", + "version": "0.8.0", + "description": "`static` friendly data structures that don't require dynamic memory allocation", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/heapless@0.8.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/heapless" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/heapless" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#heck@0.5.0", + "name": "heck", + "version": "0.5.0", + "description": "heck is a case conversion library.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/heck@0.5.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/withoutboats/heck" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#hex@0.4.3", + "author": "KokaKiwi ", + "name": "hex", + "version": "0.4.3", + "description": "Encoding and decoding data into/from hexadecimal representation.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/hex@0.4.3", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/hex/" + }, + { + "type": "vcs", + "url": "https://github.com/KokaKiwi/rust-hex" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#hmac@0.12.1", + "author": "RustCrypto Developers", + "name": "hmac", + "version": "0.12.1", + "description": "Generic implementation of Hash-based Message Authentication Code (HMAC)", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/hmac@0.12.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/hmac" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/MACs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ident_case@1.0.1", + "author": "Ted Driggs ", + "name": "ident_case", + "version": "1.0.1", + "description": "Utility for applying case rules to Rust identifiers.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/ident_case@1.0.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/ident_case/1.0.1" + }, + { + "type": "vcs", + "url": "https://github.com/TedDriggs/ident_case" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#indexmap@2.7.1", + "name": "indexmap", + "version": "2.7.1", + "description": "A hash table with consistent order and fast iteration.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/indexmap@2.7.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/indexmap/" + }, + { + "type": "vcs", + "url": "https://github.com/indexmap-rs/indexmap" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#indoc@2.0.5", + "author": "David Tolnay ", + "name": "indoc", + "version": "2.0.5", + "description": "Indented document literals", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/indoc@2.0.5", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/indoc" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/indoc" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#inout@0.1.4", + "author": "RustCrypto Developers", + "name": "inout", + "version": "0.1.4", + "description": "Custom reference types for code generic over in-place and buffer-to-buffer modes of operation.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/inout@0.1.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/inout" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/utils" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#instability@0.3.7", + "author": "Stephen M. Coakley , The Ratatui Developers", + "name": "instability", + "version": "0.3.7", + "description": "Rust API stability attributes for the rest of us. A fork of the `stability` crate.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/instability@0.3.7", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/instability/" + }, + { + "type": "vcs", + "url": "https://github.com/ratatui-org/instability" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#libc@0.2.170", + "author": "The Rust Project Developers", + "name": "libc", + "version": "0.2.170", + "description": "Raw FFI bindings to platform libraries like libc. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/libc@0.2.170", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/libc/" + }, + { + "type": "website", + "url": "https://github.com/rust-lang/libc" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/libc" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#libm@0.2.11", + "author": "Jorge Aparicio ", + "name": "libm", + "version": "0.2.11", + "description": "libm in pure Rust", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + } + ], + "licenses": [ + { + "expression": "MIT AND (MIT OR Apache-2.0)" + } + ], + "purl": "pkg:cargo/libm@0.2.11", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/libm" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/libm" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#linked_list_allocator@0.10.5", + "author": "Philipp Oppermann ", + "name": "linked_list_allocator", + "version": "0.10.5", + "description": "Simple allocator usable for no_std systems. It builds a linked list from the freed blocks and thus needs no additional data structures.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/linked_list_allocator@0.10.5", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/crate/linked_list_allocator" + }, + { + "type": "website", + "url": "http://os.phil-opp.com/kernel-heap.html#a-better-allocator" + }, + { + "type": "vcs", + "url": "https://github.com/phil-opp/linked-list-allocator" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#litrs@0.4.1", + "author": "Lukas Kalbertodt ", + "name": "litrs", + "version": "0.4.1", + "description": "Parse and inspect Rust literals (i.e. tokens in the Rust programming language representing fixed values). Particularly useful for proc macros, but can also be used outside of a proc-macro context. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/litrs@0.4.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/litrs/" + }, + { + "type": "vcs", + "url": "https://github.com/LukasKalbertodt/litrs/" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "author": "The Rust Project Developers", + "name": "log", + "version": "0.4.26", + "description": "A lightweight logging facade for Rust ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/log@0.4.26", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/log" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang/log" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#managed@0.8.0", + "author": "whitequark ", + "name": "managed", + "version": "0.8.0", + "description": "An interface for logically owning objects, whether or not heap allocation is available.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" + } + ], + "licenses": [ + { + "expression": "0BSD" + } + ], + "purl": "pkg:cargo/managed@0.8.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/managed/" + }, + { + "type": "website", + "url": "https://github.com/m-labs/rust-managed" + }, + { + "type": "vcs", + "url": "https://github.com/m-labs/rust-managed.git" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#memchr@2.7.4", + "author": "Andrew Gallant , bluss", + "name": "memchr", + "version": "2.7.4", + "description": "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for 1, 2 or 3 byte search and single substring search. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + } + ], + "licenses": [ + { + "expression": "Unlicense OR MIT" + } + ], + "purl": "pkg:cargo/memchr@2.7.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/memchr/" + }, + { + "type": "website", + "url": "https://github.com/BurntSushi/memchr" + }, + { + "type": "vcs", + "url": "https://github.com/BurntSushi/memchr" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#nb@0.1.3", + "author": "Jorge Aparicio ", + "name": "nb", + "version": "0.1.3", + "description": "Minimal non-blocking I/O layer", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/nb@0.1.3", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/nb" + }, + { + "type": "website", + "url": "https://github.com/rust-embedded/nb" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/nb" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0", + "author": "Jorge Aparicio ", + "name": "nb", + "version": "1.1.0", + "description": "Minimal non-blocking I/O layer", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/nb@1.1.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/nb" + }, + { + "type": "website", + "url": "https://github.com/rust-embedded/nb" + }, + { + "type": "vcs", + "url": "https://github.com/rust-embedded/nb" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#num-derive@0.4.2", + "author": "The Rust Project Developers", + "name": "num-derive", + "version": "0.4.2", + "description": "Numeric syntax extensions", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/num-derive@0.4.2", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/num-derive" + }, + { + "type": "website", + "url": "https://github.com/rust-num/num-derive" + }, + { + "type": "vcs", + "url": "https://github.com/rust-num/num-derive" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19", + "author": "The Rust Project Developers", + "name": "num-traits", + "version": "0.2.19", + "description": "Numeric traits for generic mathematics", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/num-traits@0.2.19", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/num-traits" + }, + { + "type": "website", + "url": "https://github.com/rust-num/num-traits" + }, + { + "type": "vcs", + "url": "https://github.com/rust-num/num-traits" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#num_enum@0.7.3", + "author": "Daniel Wagner-Hall , Daniel Henry-Mantilla , Vincent Esche ", + "name": "num_enum", + "version": "0.7.3", + "description": "Procedural macros to make inter-operation between primitives and enums easier.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" + } + ], + "licenses": [ + { + "expression": "BSD-3-Clause OR MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/num_enum@0.7.3", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/illicitonion/num_enum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#num_enum_derive@0.7.3", + "author": "Daniel Wagner-Hall , Daniel Henry-Mantilla , Vincent Esche ", + "name": "num_enum_derive", + "version": "0.7.3", + "description": "Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" + } + ], + "licenses": [ + { + "expression": "BSD-3-Clause OR MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/num_enum_derive@0.7.3", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/illicitonion/num_enum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#object@0.36.7", + "name": "object", + "version": "0.36.7", + "description": "A unified interface for reading and writing object file formats.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/object@0.36.7", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/gimli-rs/object" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#opaque-debug@0.3.1", + "author": "RustCrypto Developers", + "name": "opaque-debug", + "version": "0.3.1", + "description": "Macro for opaque Debug trait implementation", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/opaque-debug@0.3.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/opaque-debug" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/utils" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#paste@1.0.15", + "author": "David Tolnay ", + "name": "paste", + "version": "1.0.15", + "description": "Macros for all your token pasting needs", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/paste@1.0.15", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/paste" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/paste" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#pem-rfc7468@0.7.0", + "author": "RustCrypto Developers", + "name": "pem-rfc7468", + "version": "0.7.0", + "description": "PEM Encoding (RFC 7468) for PKIX, PKCS, and CMS Structures, implementing a strict subset of the original Privacy-Enhanced Mail encoding intended specifically for use with cryptographic keys, certificates, and other messages. Provides a no_std-friendly, constant-time implementation suitable for use with cryptographic private keys. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/pem-rfc7468@0.7.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/RustCrypto/formats/tree/master/pem-rfc7468" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#pin-project-lite@0.2.16", + "name": "pin-project-lite", + "version": "0.2.16", + "description": "A lightweight version of pin-project written with declarative macros. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/pin-project-lite@0.2.16", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/taiki-e/pin-project-lite" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#pin-utils@0.1.0", + "author": "Josef Brandl ", + "name": "pin-utils", + "version": "0.1.0", + "description": "Utilities for pinning ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/pin-utils@0.1.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/pin-utils" + }, + { + "type": "vcs", + "url": "https://github.com/rust-lang-nursery/pin-utils" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#poly1305@0.8.0", + "author": "RustCrypto Developers", + "name": "poly1305", + "version": "0.8.0", + "description": "The Poly1305 universal hash function and message authentication code", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/poly1305@0.8.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/poly1305" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/universal-hashes" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "name": "portable-atomic", + "version": "1.11.0", + "description": "Portable atomic types including support for 128-bit atomics, atomic float, etc. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/portable-atomic@1.11.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/taiki-e/portable-atomic" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#portable_atomic_enum@0.3.1", + "author": "Thomas Bächler , Dániel Buga ", + "name": "portable_atomic_enum", + "version": "0.3.1", + "description": "An attribute to create an portable atomic wrapper around a C-style enum", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "30d48f60c43e0120bb2bb48589a16d4bed2f4b911be41e299f2d0fc0e0e20885" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/portable_atomic_enum@0.3.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/bugadani/portable_atomic_enum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#portable_atomic_enum_macros@0.2.1", + "author": "Thomas Bächler , Dániel Buga ", + "name": "portable_atomic_enum_macros", + "version": "0.2.1", + "description": "An attribute to create an portable atomic wrapper around a C-style enum", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "a33fa6ec7f2047f572d49317cca19c87195de99c6e5b6ee492da701cfe02b053" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/portable_atomic_enum_macros@0.2.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/bugadani/portable_atomic_enum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#pretty-hex@0.4.1", + "author": "Andrei Volnin ", + "name": "pretty-hex", + "version": "0.4.1", + "description": "Pretty hex dump of bytes slice in the common style.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "bbc83ee4a840062f368f9096d80077a9841ec117e17e7f700df81958f1451254" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/pretty-hex@0.4.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/pretty-hex" + }, + { + "type": "website", + "url": "https://github.com/wolandr/pretty-hex" + }, + { + "type": "vcs", + "url": "https://github.com/wolandr/pretty-hex" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro-crate@3.2.0", + "author": "Bastian Köcher ", + "name": "proc-macro-crate", + "version": "3.2.0", + "description": "Replacement for crate (macro_rules keyword) in proc-macros ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/proc-macro-crate@3.2.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/proc-macro-crate" + }, + { + "type": "vcs", + "url": "https://github.com/bkchr/proc-macro-crate" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro-error-attr2@2.0.0", + "author": "CreepySkeleton , GnomedDev ", + "name": "proc-macro-error-attr2", + "version": "2.0.0", + "description": "Attribute macro for the proc-macro-error2 crate", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/proc-macro-error-attr2@2.0.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/GnomedDev/proc-macro-error-2" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro-error2@2.0.1", + "author": "CreepySkeleton , GnomedDev ", + "name": "proc-macro-error2", + "version": "2.0.1", + "description": "Almost drop-in replacement to panics in proc-macros", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/proc-macro-error2@2.0.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/GnomedDev/proc-macro-error-2" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "author": "David Tolnay , Alex Crichton ", + "name": "proc-macro2", + "version": "1.0.93", + "description": "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/proc-macro2@1.0.93", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/proc-macro2" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/proc-macro2" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "author": "David Tolnay ", + "name": "quote", + "version": "1.0.38", + "description": "Quasi-quoting macro quote!(...)", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/quote@1.0.38", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/quote/" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/quote" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "author": "The Rand Project Developers, The Rust Project Developers", + "name": "rand_core", + "version": "0.6.4", + "description": "Core random number generator traits and tools for implementation. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/rand_core@0.6.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/rand_core" + }, + { + "type": "website", + "url": "https://rust-random.github.io/book" + }, + { + "type": "vcs", + "url": "https://github.com/rust-random/rand" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#rustc_version@0.4.1", + "name": "rustc_version", + "version": "0.4.1", + "description": "A library for querying the version of a installed rustc compiler", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/rustc_version@0.4.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/rustc_version/" + }, + { + "type": "vcs", + "url": "https://github.com/djc/rustc-version-rs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#rustversion@1.0.19", + "author": "David Tolnay ", + "name": "rustversion", + "version": "1.0.19", + "description": "Conditional compilation according to rustc compiler version", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/rustversion@1.0.19", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/rustversion" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/rustversion" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#semver@1.0.25", + "author": "David Tolnay ", + "name": "semver", + "version": "1.0.25", + "description": "Parser and evaluator for Cargo's flavor of Semantic Versioning", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/semver@1.0.25", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/semver" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/semver" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218", + "author": "Erick Tryzelaar , David Tolnay ", + "name": "serde", + "version": "1.0.218", + "description": "A generic serialization/deserialization framework", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/serde@1.0.218", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/serde" + }, + { + "type": "website", + "url": "https://serde.rs/" + }, + { + "type": "vcs", + "url": "https://github.com/serde-rs/serde" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#serde_derive@1.0.218", + "author": "Erick Tryzelaar , David Tolnay ", + "name": "serde_derive", + "version": "1.0.218", + "description": "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/serde_derive@1.0.218", + "externalReferences": [ + { + "type": "documentation", + "url": "https://serde.rs/derive.html" + }, + { + "type": "website", + "url": "https://serde.rs/" + }, + { + "type": "vcs", + "url": "https://github.com/serde-rs/serde" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#serde_spanned@0.6.8", + "name": "serde_spanned", + "version": "0.6.8", + "description": "Serde-compatible spanned Value", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/serde_spanned@0.6.8", + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/toml-rs/toml" + }, + { + "type": "vcs", + "url": "https://github.com/toml-rs/toml" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#sha2@0.10.8", + "author": "RustCrypto Developers", + "name": "sha2", + "version": "0.10.8", + "description": "Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/sha2@0.10.8", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/sha2" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/hashes" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#signature@2.2.0", + "author": "RustCrypto Developers", + "name": "signature", + "version": "2.2.0", + "description": "Traits for cryptographic signature algorithms (e.g. ECDSA, Ed25519)", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/signature@2.2.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/signature" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/traits/tree/master/signature" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#smoltcp@0.12.0", + "author": "whitequark ", + "name": "smoltcp", + "version": "0.12.0", + "description": "A TCP/IP stack designed for bare-metal, real-time systems without a heap.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "dad095989c1533c1c266d9b1e8d70a1329dd3723c3edac6d03bbd67e7bf6f4bb" + } + ], + "licenses": [ + { + "expression": "0BSD" + } + ], + "purl": "pkg:cargo/smoltcp@0.12.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/smoltcp/" + }, + { + "type": "website", + "url": "https://github.com/smoltcp-rs/smoltcp" + }, + { + "type": "vcs", + "url": "https://github.com/smoltcp-rs/smoltcp.git" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#snafu-derive@0.8.5", + "author": "Jake Goulding ", + "name": "snafu-derive", + "version": "0.8.5", + "description": "An ergonomic error handling library", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/snafu-derive@0.8.5", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/snafu" + }, + { + "type": "vcs", + "url": "https://github.com/shepmaster/snafu" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#snafu@0.8.5", + "author": "Jake Goulding ", + "name": "snafu", + "version": "0.8.5", + "description": "An ergonomic error handling library", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/snafu@0.8.5", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/snafu" + }, + { + "type": "vcs", + "url": "https://github.com/shepmaster/snafu" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ssh-cipher@0.2.0", + "author": "RustCrypto Developers", + "name": "ssh-cipher", + "version": "0.2.0", + "description": "Pure Rust implementation of SSH symmetric encryption including support for the modern aes128-gcm@openssh.com/aes256-gcm@openssh.com and chacha20-poly1305@openssh.com algorithms as well as legacy support for older ciphers. Built on the pure Rust cryptography implementations maintained by the RustCrypto organization. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/ssh-cipher@0.2.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/RustCrypto/SSH/tree/master/ssh-cipher" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ssh-encoding@0.2.0", + "author": "RustCrypto Developers", + "name": "ssh-encoding", + "version": "0.2.0", + "description": "Pure Rust implementation of SSH data type decoders/encoders as described in RFC4251 ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/ssh-encoding@0.2.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/RustCrypto/SSH/tree/master/ssh-encoding" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ssh-key@0.6.7", + "author": "RustCrypto Developers", + "name": "ssh-key", + "version": "0.6.7", + "description": "Pure Rust implementation of SSH key file format decoders/encoders as described in RFC4251/RFC4253 and OpenSSH key formats, as well as \"sshsig\" signatures and certificates (including certificate validation and certificate authority support), with further support for the `authorized_keys` and `known_hosts` file formats. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/ssh-key@0.6.7", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/RustCrypto/SSH/tree/master/ssh-key" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#stable_deref_trait@1.2.0", + "author": "Robert Grosse ", + "name": "stable_deref_trait", + "version": "1.2.0", + "description": "An unsafe marker trait for types like Box and Rc that dereference to a stable address even when moved, and hence can be used with libraries such as owning_ref and rental. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/stable_deref_trait@1.2.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/stable_deref_trait/1.2.0/stable_deref_trait" + }, + { + "type": "vcs", + "url": "https://github.com/storyyeller/stable_deref_trait" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#static_cell@2.1.0", + "name": "static_cell", + "version": "2.1.0", + "description": "Statically allocated, initialized at runtime cell.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "d89b0684884a883431282db1e4343f34afc2ff6996fe1f4a1664519b66e14c1e" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/static_cell@2.1.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/embassy-rs/static-cell" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#strsim@0.11.1", + "author": "Danny Guo , maxbachmann ", + "name": "strsim", + "version": "0.11.1", + "description": "Implementations of string similarity metrics. Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and Sørensen-Dice. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/strsim@0.11.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/strsim/" + }, + { + "type": "website", + "url": "https://github.com/rapidfuzz/strsim-rs" + }, + { + "type": "vcs", + "url": "https://github.com/rapidfuzz/strsim-rs" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#strum@0.26.3", + "author": "Peter Glotfelty ", + "name": "strum", + "version": "0.26.3", + "description": "Helpful macros for working with enums and strings", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/strum@0.26.3", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/strum" + }, + { + "type": "website", + "url": "https://github.com/Peternator7/strum" + }, + { + "type": "vcs", + "url": "https://github.com/Peternator7/strum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#strum@0.27.1", + "author": "Peter Glotfelty ", + "name": "strum", + "version": "0.27.1", + "description": "Helpful macros for working with enums and strings", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/strum@0.27.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/strum" + }, + { + "type": "website", + "url": "https://github.com/Peternator7/strum" + }, + { + "type": "vcs", + "url": "https://github.com/Peternator7/strum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#strum_macros@0.26.4", + "author": "Peter Glotfelty ", + "name": "strum_macros", + "version": "0.26.4", + "description": "Helpful macros for working with enums and strings", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/strum_macros@0.26.4", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/strum" + }, + { + "type": "website", + "url": "https://github.com/Peternator7/strum" + }, + { + "type": "vcs", + "url": "https://github.com/Peternator7/strum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#strum_macros@0.27.1", + "author": "Peter Glotfelty ", + "name": "strum_macros", + "version": "0.27.1", + "description": "Helpful macros for working with enums and strings", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/strum_macros@0.27.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/strum" + }, + { + "type": "website", + "url": "https://github.com/Peternator7/strum" + }, + { + "type": "vcs", + "url": "https://github.com/Peternator7/strum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1", + "author": "Isis Lovecruft , Henry de Valence ", + "name": "subtle", + "version": "2.6.1", + "description": "Pure-Rust traits and utilities for constant-time cryptographic implementations.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + } + ], + "licenses": [ + { + "expression": "BSD-3-Clause" + } + ], + "purl": "pkg:cargo/subtle@2.6.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/subtle" + }, + { + "type": "website", + "url": "https://dalek.rs/" + }, + { + "type": "vcs", + "url": "https://github.com/dalek-cryptography/subtle" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98", + "author": "David Tolnay ", + "name": "syn", + "version": "2.0.98", + "description": "Parser for Rust source code", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/syn@2.0.98", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/syn" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/syn" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#termcolor@1.4.1", + "author": "Andrew Gallant ", + "name": "termcolor", + "version": "1.4.1", + "description": "A simple cross platform library for writing colored text to a terminal. ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" + } + ], + "licenses": [ + { + "expression": "Unlicense OR MIT" + } + ], + "purl": "pkg:cargo/termcolor@1.4.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/termcolor" + }, + { + "type": "website", + "url": "https://github.com/BurntSushi/termcolor" + }, + { + "type": "vcs", + "url": "https://github.com/BurntSushi/termcolor" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#toml_datetime@0.6.8", + "author": "Alex Crichton ", + "name": "toml_datetime", + "version": "0.6.8", + "description": "A TOML-compatible datetime type", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/toml_datetime@0.6.8", + "externalReferences": [ + { + "type": "website", + "url": "https://github.com/toml-rs/toml" + }, + { + "type": "vcs", + "url": "https://github.com/toml-rs/toml" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#toml_edit@0.22.24", + "author": "Andronik Ordian , Ed Page ", + "name": "toml_edit", + "version": "0.22.24", + "description": "Yet another format-preserving TOML parser.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/toml_edit@0.22.24", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/toml-rs/toml" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#typenum@1.18.0", + "author": "Paho Lurie-Gregg , Andre Bogus ", + "name": "typenum", + "version": "1.18.0", + "description": "Typenum is a Rust library for type-level numbers evaluated at compile time. It currently supports bits, unsigned integers, and signed integers. It also provides a type-level array of type-level numbers, but its implementation is incomplete.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/typenum@1.18.0", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/typenum" + }, + { + "type": "vcs", + "url": "https://github.com/paholg/typenum" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#ufmt-write@0.1.0", + "author": "Jorge Aparicio ", + "name": "ufmt-write", + "version": "0.1.0", + "description": "`μfmt`'s `uWrite` trait", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/ufmt-write@0.1.0", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/japaric/ufmt" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.17", + "author": "David Tolnay ", + "name": "unicode-ident", + "version": "1.0.17", + "description": "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" + } + ], + "licenses": [ + { + "expression": "(MIT OR Apache-2.0) AND Unicode-3.0" + } + ], + "purl": "pkg:cargo/unicode-ident@1.0.17", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/unicode-ident" + }, + { + "type": "vcs", + "url": "https://github.com/dtolnay/unicode-ident" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#universal-hash@0.5.1", + "author": "RustCrypto Developers", + "name": "universal-hash", + "version": "0.5.1", + "description": "Traits which describe the functionality of universal hash functions (UHFs)", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/universal-hash@0.5.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/universal-hash" + }, + { + "type": "vcs", + "url": "https://github.com/RustCrypto/traits" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#vcell@0.1.3", + "author": "Jorge Aparicio ", + "name": "vcell", + "version": "0.1.3", + "description": "`Cell` with volatile read / write operations", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/vcell@0.1.3", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/vcell" + }, + { + "type": "vcs", + "url": "https://github.com/japaric/vcell" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5", + "author": "Sergio Benitez ", + "name": "version_check", + "version": "0.9.5", + "description": "Tiny crate to check the version of the installed/running rustc.", + "scope": "excluded", + "hashes": [ + { + "alg": "SHA-256", + "content": "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + } + ], + "licenses": [ + { + "expression": "MIT OR Apache-2.0" + } + ], + "purl": "pkg:cargo/version_check@0.9.5", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/version_check/" + }, + { + "type": "vcs", + "url": "https://github.com/SergioBenitez/version_check" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#virtue@0.0.16", + "name": "virtue", + "version": "0.0.16", + "description": "A sinless derive macro helper", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "3b6826a786a78cf1bb0937507b5551fb6f827d66269a24b00af0de247b19bbc7" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/virtue@0.0.16", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/virtue" + }, + { + "type": "vcs", + "url": "https://github.com/bincode-org/virtue" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#void@1.0.2", + "author": "Jonathan Reem ", + "name": "void", + "version": "1.0.2", + "description": "The uninhabited void type for use in statically impossible cases.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/void@1.0.2", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/reem/rust-void.git" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#winnow@0.7.3", + "name": "winnow", + "version": "0.7.3", + "description": "A byte-oriented, zero-copy, parser combinators library", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" + } + ], + "licenses": [ + { + "expression": "MIT" + } + ], + "purl": "pkg:cargo/winnow@0.7.3", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/winnow-rs/winnow" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#x25519-dalek@2.0.1", + "author": "Isis Lovecruft , DebugSteven , Henry de Valence ", + "name": "x25519-dalek", + "version": "2.0.1", + "description": "X25519 elliptic curve Diffie-Hellman key exchange in pure-Rust, using curve25519-dalek.", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" + } + ], + "licenses": [ + { + "expression": "BSD-3-Clause" + } + ], + "purl": "pkg:cargo/x25519-dalek@2.0.1", + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.rs/x25519-dalek" + }, + { + "type": "website", + "url": "https://github.com/dalek-cryptography/curve25519-dalek" + }, + { + "type": "vcs", + "url": "https://github.com/dalek-cryptography/curve25519-dalek/tree/main/x25519-dalek" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1", + "author": "The RustCrypto Project Developers", + "name": "zeroize", + "version": "1.8.1", + "description": "Securely clear secrets from memory with a simple trait built on stable Rust primitives which guarantee memory is zeroed using an operation will not be 'optimized away' by the compiler. Uses a portable pure Rust implementation that works everywhere, even WASM! ", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/zeroize@1.8.1", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/RustCrypto/utils/tree/master/zeroize" + } + ] + }, + { + "type": "library", + "bom-ref": "registry+https://github.com/rust-lang/crates.io-index#zeroize_derive@1.4.2", + "author": "The RustCrypto Project Developers", + "name": "zeroize_derive", + "version": "1.4.2", + "description": "Custom derive support for zeroize", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" + } + ], + "licenses": [ + { + "expression": "Apache-2.0 OR MIT" + } + ], + "purl": "pkg:cargo/zeroize_derive@1.4.2", + "externalReferences": [ + { + "type": "vcs", + "url": "https://github.com/RustCrypto/utils/tree/master/zeroize/derive" + } + ] + } + ], + "dependencies": [ + { + "ref": "git+https://github.com/mkj/sunset#0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#aes@0.8.4", + "registry+https://github.com/rust-lang/crates.io-index#ascii@1.1.0", + "registry+https://github.com/rust-lang/crates.io-index#chacha20@0.9.1", + "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4", + "registry+https://github.com/rust-lang/crates.io-index#ctr@0.9.2", + "registry+https://github.com/rust-lang/crates.io-index#curve25519-dalek@4.1.3", + "registry+https://github.com/rust-lang/crates.io-index#digest@0.10.7", + "registry+https://github.com/rust-lang/crates.io-index#ed25519-dalek@2.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.15", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#hmac@0.12.1", + "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "registry+https://github.com/rust-lang/crates.io-index#poly1305@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#pretty-hex@0.4.1", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "registry+https://github.com/rust-lang/crates.io-index#sha2@0.10.8", + "registry+https://github.com/rust-lang/crates.io-index#signature@2.2.0", + "registry+https://github.com/rust-lang/crates.io-index#snafu@0.8.5", + "registry+https://github.com/rust-lang/crates.io-index#ssh-key@0.6.7", + "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1", + "git+https://github.com/mkj/sunset#sunset-sshwire-derive@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#x25519-dalek@2.0.1", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "git+https://github.com/mkj/sunset#sunset-embassy@0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#atomic-polyfill@1.0.3", + "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "registry+https://github.com/rust-lang/crates.io-index#pin-utils@0.1.0", + "git+https://github.com/mkj/sunset#0.2.0" + ] + }, + { + "ref": "git+https://github.com/mkj/sunset#sunset-sshwire-derive@0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#virtue@0.0.16" + ] + }, + { + "ref": "path+file:///Users/rvalls/dev/personal/ssh-stamp#esp-ssh-rs@0.1.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#ed25519-dalek@2.1.1", + "registry+https://github.com/rust-lang/crates.io-index#edge-dhcp@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#edge-nal@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#edge-nal-embassy@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-executor@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embassy-net@0.6.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#esp-alloc@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-backtrace@0.15.1", + "registry+https://github.com/rust-lang/crates.io-index#esp-hal@1.0.0-beta.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-hal-embassy@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-println@0.13.1", + "registry+https://github.com/rust-lang/crates.io-index#esp-wifi@0.13.0", + "registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.15", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#hex@0.4.3", + "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "registry+https://github.com/rust-lang/crates.io-index#smoltcp@0.12.0", + "registry+https://github.com/rust-lang/crates.io-index#ssh-key@0.6.7", + "registry+https://github.com/rust-lang/crates.io-index#static_cell@2.1.0", + "git+https://github.com/mkj/sunset#0.2.0", + "git+https://github.com/mkj/sunset#sunset-embassy@0.2.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#aes@0.8.4", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4", + "registry+https://github.com/rust-lang/crates.io-index#cpufeatures@0.2.17", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#anyhow@1.0.96", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ascii@1.1.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#atomic-polyfill@1.0.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#autocfg@1.4.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#base64ct@1.6.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#basic-toml@0.1.9", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#bitfield-macros@0.18.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#bitfield@0.18.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#bitfield-macros@0.18.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#bitflags@1.3.2", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#bitflags@2.8.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#block-buffer@0.10.4", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#generic-array@0.14.7" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#bytemuck@1.21.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#byteorder@1.5.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#chacha20@0.9.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#chrono@0.4.40", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#crypto-common@0.1.6", + "registry+https://github.com/rust-lang/crates.io-index#inout@0.1.4", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#cpufeatures@0.2.17", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#libc@0.2.170" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#crypto-common@0.1.6", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#generic-array@0.14.7", + "registry+https://github.com/rust-lang/crates.io-index#typenum@1.18.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ctr@0.9.2", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#curve25519-dalek@4.1.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#digest@0.10.7", + "registry+https://github.com/rust-lang/crates.io-index#rustc_version@0.4.1", + "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#darling@0.20.10", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#darling_core@0.20.10", + "registry+https://github.com/rust-lang/crates.io-index#darling_macro@0.20.10" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#darling_core@0.20.10", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#fnv@1.0.7", + "registry+https://github.com/rust-lang/crates.io-index#ident_case@1.0.1", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#strsim@0.11.1", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#darling_macro@0.20.10", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#darling_core@0.20.10", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#delegate@0.13.2", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#digest@0.10.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#block-buffer@0.10.4", + "registry+https://github.com/rust-lang/crates.io-index#crypto-common@0.1.6", + "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#litrs@0.4.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ed25519-dalek@2.1.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#curve25519-dalek@4.1.3", + "registry+https://github.com/rust-lang/crates.io-index#ed25519@2.2.3", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "registry+https://github.com/rust-lang/crates.io-index#sha2@0.10.8", + "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ed25519@2.2.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#signature@2.2.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#edge-dhcp@0.5.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#edge-nal@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#edge-raw@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "registry+https://github.com/rust-lang/crates.io-index#num_enum@0.7.3", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#edge-nal-embassy@0.5.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#edge-nal@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embassy-net@0.6.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#edge-nal@0.5.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#edge-raw@0.5.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-embedded-hal@0.3.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@0.2.7", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal-async@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-storage@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-storage-async@0.4.1", + "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-executor-macros@0.6.2", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#darling@0.20.10", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-executor@0.7.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#embassy-executor-macros@0.6.2" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-net-driver@0.2.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-net@0.6.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#embassy-net-driver@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-nal-async@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#managed@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#smoltcp@0.12.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.5.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#futures-util@0.3.31", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#futures-sink@0.3.31", + "registry+https://github.com/rust-lang/crates.io-index#futures-util@0.3.31", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-time-driver@0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-time-queue-utils@0.1.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embassy-executor@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time-driver@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@0.2.7", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal-async@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#futures-util@0.3.31" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-can@0.4.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-hal-async@1.0.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@1.0.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@0.2.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#nb@0.1.3", + "registry+https://github.com/rust-lang/crates.io-index#void@1.0.2" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@1.0.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embedded-io@0.6.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-io@0.6.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-nal-async@0.8.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-nal@0.9.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-nal@0.9.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-storage-async@0.4.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#embedded-storage@0.3.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#embedded-storage@0.3.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#enumset@1.1.5", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#enumset_derive@0.10.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#enumset_derive@0.10.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#darling@0.20.10", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#equivalent@1.0.2", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-alloc@0.7.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#enumset@1.1.5", + "registry+https://github.com/rust-lang/crates.io-index#linked_list_allocator@0.10.5" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-backtrace@0.15.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-println@0.13.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98", + "registry+https://github.com/rust-lang/crates.io-index#termcolor@1.4.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-config@0.3.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-hal-embassy@0.7.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#embassy-executor@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time@0.4.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time-driver@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-time-queue-utils@0.1.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-config@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#esp-hal@1.0.0-beta.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-hal-procmacros@0.17.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-metadata@0.6.0", + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "registry+https://github.com/rust-lang/crates.io-index#static_cell@2.1.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-hal-procmacros@0.17.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#darling@0.20.10", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#litrs@0.4.1", + "registry+https://github.com/rust-lang/crates.io-index#object@0.36.7", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro-crate@3.2.0", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro-error2@2.0.1", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-hal@1.0.0-beta.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#basic-toml@0.1.9", + "registry+https://github.com/rust-lang/crates.io-index#bitfield@0.18.1", + "registry+https://github.com/rust-lang/crates.io-index#bitflags@2.8.0", + "registry+https://github.com/rust-lang/crates.io-index#bytemuck@1.21.0", + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#chrono@0.4.40", + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#delegate@0.13.2", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#embassy-embedded-hal@0.3.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-futures@0.1.1", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "registry+https://github.com/rust-lang/crates.io-index#embedded-can@0.4.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-hal-async@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#enumset@1.1.5", + "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-config@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#esp-hal-procmacros@0.17.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-metadata@0.6.0", + "registry+https://github.com/rust-lang/crates.io-index#esp32c6@0.19.0", + "registry+https://github.com/rust-lang/crates.io-index#fugit@0.3.7", + "registry+https://github.com/rust-lang/crates.io-index#instability@0.3.7", + "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0", + "registry+https://github.com/rust-lang/crates.io-index#paste@1.0.15", + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218", + "registry+https://github.com/rust-lang/crates.io-index#strum@0.27.1", + "registry+https://github.com/rust-lang/crates.io-index#ufmt-write@0.1.0", + "registry+https://github.com/rust-lang/crates.io-index#void@1.0.2" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-metadata@0.6.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#anyhow@1.0.96", + "registry+https://github.com/rust-lang/crates.io-index#basic-toml@0.1.9", + "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218", + "registry+https://github.com/rust-lang/crates.io-index#strum@0.26.3" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-println@0.13.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-wifi-sys@0.7.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#anyhow@1.0.96" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp-wifi@0.13.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#document-features@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#embassy-net-driver@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#embassy-sync@0.6.2", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#embedded-io-async@0.6.1", + "registry+https://github.com/rust-lang/crates.io-index#enumset@1.1.5", + "registry+https://github.com/rust-lang/crates.io-index#esp-alloc@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-build@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-config@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#esp-hal@1.0.0-beta.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-metadata@0.6.0", + "registry+https://github.com/rust-lang/crates.io-index#esp-wifi-sys@0.7.1", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#libm@0.2.11", + "registry+https://github.com/rust-lang/crates.io-index#num-derive@0.4.2", + "registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19", + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "registry+https://github.com/rust-lang/crates.io-index#portable_atomic_enum@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#esp32c6@0.19.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#critical-section@1.2.0", + "registry+https://github.com/rust-lang/crates.io-index#vcell@0.1.3" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#fnv@1.0.7", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#fugit@0.3.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#gcd@2.3.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#futures-core@0.3.31", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#futures-sink@0.3.31", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#futures-task@0.3.31", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#futures-util@0.3.31", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#futures-core@0.3.31", + "registry+https://github.com/rust-lang/crates.io-index#futures-task@0.3.31", + "registry+https://github.com/rust-lang/crates.io-index#pin-project-lite@0.2.16", + "registry+https://github.com/rust-lang/crates.io-index#pin-utils@0.1.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#gcd@2.3.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#generic-array@0.14.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#typenum@1.18.0", + "registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.15", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#libc@0.2.170" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#hash32@0.3.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#byteorder@1.5.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#hashbrown@0.15.2", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#hash32@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "registry+https://github.com/rust-lang/crates.io-index#stable_deref_trait@1.2.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#heck@0.5.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#hex@0.4.3", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#hmac@0.12.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#digest@0.10.7" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ident_case@1.0.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#indexmap@2.7.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#equivalent@1.0.2", + "registry+https://github.com/rust-lang/crates.io-index#hashbrown@0.15.2" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#indoc@2.0.5", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#inout@0.1.4", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#generic-array@0.14.7" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#instability@0.3.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#darling@0.20.10", + "registry+https://github.com/rust-lang/crates.io-index#indoc@2.0.5", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#libc@0.2.170", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#libm@0.2.11", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#linked_list_allocator@0.10.5", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#litrs@0.4.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#log@0.4.26", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#managed@0.8.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#memchr@2.7.4", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#nb@0.1.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#nb@1.1.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#num-derive@0.4.2", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#num-traits@0.2.19", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#autocfg@1.4.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#num_enum@0.7.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#num_enum_derive@0.7.3" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#num_enum_derive@0.7.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#object@0.36.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#memchr@2.7.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#opaque-debug@0.3.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#paste@1.0.15", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#pem-rfc7468@0.7.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#base64ct@1.6.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#pin-project-lite@0.2.16", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#pin-utils@0.1.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#poly1305@0.8.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#opaque-debug@0.3.1", + "registry+https://github.com/rust-lang/crates.io-index#universal-hash@0.5.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#portable_atomic_enum@0.3.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0", + "registry+https://github.com/rust-lang/crates.io-index#portable_atomic_enum_macros@0.2.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#portable_atomic_enum_macros@0.2.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#pretty-hex@0.4.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro-crate@3.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#toml_edit@0.22.24" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro-error-attr2@2.0.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro-error2@2.0.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro-error-attr2@2.0.0", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.17" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.15" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#rustc_version@0.4.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#semver@1.0.25" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#rustversion@1.0.19", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#semver@1.0.25", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#serde_derive@1.0.218" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#serde_derive@1.0.218", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#serde_spanned@0.6.8", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#sha2@0.10.8", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#cpufeatures@0.2.17", + "registry+https://github.com/rust-lang/crates.io-index#digest@0.10.7" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#signature@2.2.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#smoltcp@0.12.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#bitflags@1.3.2", + "registry+https://github.com/rust-lang/crates.io-index#byteorder@1.5.0", + "registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0", + "registry+https://github.com/rust-lang/crates.io-index#heapless@0.8.0", + "registry+https://github.com/rust-lang/crates.io-index#managed@0.8.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#snafu-derive@0.8.5", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#heck@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#snafu@0.8.5", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#snafu-derive@0.8.5" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ssh-cipher@0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#cipher@0.4.4", + "registry+https://github.com/rust-lang/crates.io-index#ssh-encoding@0.2.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ssh-encoding@0.2.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#base64ct@1.6.0", + "registry+https://github.com/rust-lang/crates.io-index#pem-rfc7468@0.7.0", + "registry+https://github.com/rust-lang/crates.io-index#sha2@0.10.8" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ssh-key@0.6.7", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#ed25519-dalek@2.1.1", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "registry+https://github.com/rust-lang/crates.io-index#sha2@0.10.8", + "registry+https://github.com/rust-lang/crates.io-index#signature@2.2.0", + "registry+https://github.com/rust-lang/crates.io-index#ssh-cipher@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#ssh-encoding@0.2.0", + "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#stable_deref_trait@1.2.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#static_cell@2.1.0", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#portable-atomic@1.11.0" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#strsim@0.11.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#strum@0.26.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#strum_macros@0.26.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#strum@0.27.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#strum_macros@0.27.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#strum_macros@0.26.4", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#heck@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#rustversion@1.0.19", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#strum_macros@0.27.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#heck@0.5.0", + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#rustversion@1.0.19", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.17" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#termcolor@1.4.1", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#toml_datetime@0.6.8", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#toml_edit@0.22.24", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#indexmap@2.7.1", + "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.218", + "registry+https://github.com/rust-lang/crates.io-index#serde_spanned@0.6.8", + "registry+https://github.com/rust-lang/crates.io-index#toml_datetime@0.6.8", + "registry+https://github.com/rust-lang/crates.io-index#winnow@0.7.3" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#typenum@1.18.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#ufmt-write@0.1.0", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.17", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#universal-hash@0.5.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#crypto-common@0.1.6", + "registry+https://github.com/rust-lang/crates.io-index#subtle@2.6.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#vcell@0.1.3", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#virtue@0.0.16", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#void@1.0.2", + "dependsOn": [] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#winnow@0.7.3", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#memchr@2.7.4" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#x25519-dalek@2.0.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#curve25519-dalek@4.1.3", + "registry+https://github.com/rust-lang/crates.io-index#rand_core@0.6.4", + "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#zeroize@1.8.1", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#zeroize_derive@1.4.2" + ] + }, + { + "ref": "registry+https://github.com/rust-lang/crates.io-index#zeroize_derive@1.4.2", + "dependsOn": [ + "registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.93", + "registry+https://github.com/rust-lang/crates.io-index#quote@1.0.38", + "registry+https://github.com/rust-lang/crates.io-index#syn@2.0.98" + ] + } + ] +} \ No newline at end of file diff --git a/docs/img/connecting_to_ssh_stamp.png b/docs/img/connecting_to_ssh_stamp.png new file mode 100644 index 0000000..767fd53 Binary files /dev/null and b/docs/img/connecting_to_ssh_stamp.png differ diff --git a/docs/img/openwrt_ssh_helloworld.png b/docs/img/openwrt_ssh_helloworld.png new file mode 100644 index 0000000..46e1e57 Binary files /dev/null and b/docs/img/openwrt_ssh_helloworld.png differ diff --git a/docs/img/ssh_stamp_openwrt_setup.png b/docs/img/ssh_stamp_openwrt_setup.png new file mode 100644 index 0000000..4c7bdcf Binary files /dev/null and b/docs/img/ssh_stamp_openwrt_setup.png differ diff --git a/docs/nlnet_grant_application.md b/docs/nlnet/grant_proposal.md similarity index 100% rename from docs/nlnet_grant_application.md rename to docs/nlnet/grant_proposal.md diff --git a/docs/nlnet/grant_second_round.md b/docs/nlnet/grant_second_round.md new file mode 100644 index 0000000..cb13417 --- /dev/null +++ b/docs/nlnet/grant_second_round.md @@ -0,0 +1,78 @@ +Dear Michiel, NLNet team, + +I hope this (unasked for?) email finds you and your team well amid the tsunami of proposals and requests you are tackling right now. Please, bear with me with this one. + +Since before submitting this grant request, I've been writing and testing a proof of concept for this project, as a hobby. + +But only recently I've started to appreciate the potential and profound impact that this project can have on many ways, +here's just three of them I'd like to hightlight: + +1. Hobbyists, makers and hackers tooling. +2. Consumer electronics "augmentation". +3. Right to repair. + +At least once a day after work, I frequent a so-called "Hackerspace" where I share common interests with other folks about hardware and software. +I've lost count on the times that me and my colleages have struggled to add robust access and/or telemetry to a new project: SDCards on RaspberryPi +boards get corrupted, too much power consumption means the device has to be tethered (thus robots have limited mobility), custom protocols and servers +mean that time that was meant to be spent on the main project sinks elsewhere, etc... So, having a ROBUST and dependable device that one can SSH into +and customise it to be a UART log capture (even connected to a logic analyser!) would be a game changer in those scenarios. + +For (Linux) embedded systems, having such a "supervisor SSH board" could mean the difference between missing the occasional kernel panic dumped on the +serial console (and reporting it) versus "we're just rebooting the router because it hangs sometimes" and carry on with limping, broken, potentially vulnerable software. + +I have a [keen interest in reverse engineering][stm8_reverse_engineering] and understanding how things work. I believe that adding out of band access to (proprietary) +consumer electronics should be easier and can unlock many current blackboxes present in our lives. Adding the SSH Stamp PCB on a domestic treadmill, like the +one I linked above and presented in r2con, means that hackers around the world could band together and decipher complex devices and interfaces as long as a SSH client is available. + +Understanding the two exhibits above, one can see how big the appeal is for the Right to Repair situation worldwide: placing a relatively low power PCB +on any device can help greatly in repairing efforts. Gathering data from John Deere tractors to your everyday dishwasher finite state machine **over a SSH connection that you own** +means that you can, with skill, regain control of your devices and keep IoT enshittification at bay... and relay those learnings to the world. + +While working on this project I've been indirectly preparing myself for your software "breakdown of the main tasks" ([which I personally find challenging][washing_machine_software_estimation]). + +I've already spent a fair amount of hours and occasional embedded consulting fees (gladly!) and reached an early prototype that partially matches two points from my original proposal: + +- Wireless AP that bridges UART with SSH **AND** written in memory-safe, `no_alloc` and `no_std` Rust. + +In my last few months journey, I encountered many challenges and strange HAL (Hardware Abstraction Layer) limitations while debugging issues that didn't occur to me they'd pose a serious challenge before +(see [washing_machine_software_estimation][washing_machine_software_estimation] for a good real world analogy). + +So with this knowledge, here goes a more precise breakdown of tasks (as of March 2025): + +1. To have a WiFi AP/STA device that a user can SSH into and securely manage any other device with an UART. + 1. Prototype costed me (out of pocket) around 500€, needs more refinement, so probably should cost no more than 900€ at this point. + +2. The device should be relatively effortless to deploy and provision with the required secret key material. + 1. Challenging as there are as many ways to onboard devices as opinions about it. But applyting simplicity and involving third parties in testing, I'd budget this at an additional 800€. + +3. Written in embedded Rust (ideally no_std and no alloc to reduce memory fragmentation and allow long runtimes without memory issues). + 1. Many of the unsafe issues have been circumvented, but way more work is needed to make this robust. + 2. Espressif UART-DMA serial driver vs Interrupt driver: Implementing the most suitable solution that does not overrun or glitch the UART (has happened), ~700€ + 3. Porting to as many Espressif targets as possible, taking care of memory requirements and setting up HIL (Hardware In the Loop) testing jigs: ~800€ + 4. [Sans-IO refactor][sans-io]: The current prototype needs a cleaner decoupling of finite state machines and IO, but a careful focus on performance, ~1500€ + 5. Run SSH audit with specialised tools such as SSHambles by HDmoore et al: 300€ + + +This breakdown doesn't include designing and producing the PCB, only developing and testing the software on its target hardware and fixing the bugs and challenges found. +It doesn't reach the asked-for 8000€ either from the original submission since I'm fully aware that the rest of the cost will be spent in-between those tasks (unknown unknowns). **Hardware IS hard. Software on constrained hardware is ALSO hard(er?)**. + +Last but not least, I'm very open to adjusting my proposed grant amount to another one that NLnet considers best suited for this project's "urgency, relevance and value for money". I believe in this project and I'm commited to push it into existence. +For now I'm keeping this project under wraps (private repository) until it matures a bit more, in the hopes of at least economically breaking even with it and learning more about the realities of the manufacturing business side of it. + +Full disclosure, my current model is "closed-then-open" depending on gauged public interest (for lack of a better name), [as I proposed a few months ago to NanoKVM authors (seems to have worked well for them so far?)][closed-then-open]. + +To be frank, I don't particulary like my own proposed "closed-then-source" model to Sipeed's NanoKVM, but I think it can play well with the realities of OSS developers and in particular hardware open source developers. I've never managed to +monetise hardware myself independently, so my highest hope here is NLNet enabling me to change that statement and going forward? + +And to be consistent with my remarks, if and when I get accepted in this grant, I'll publish all current source code in a permissive OSS license immediately, from day 1. + +Best regards, + +Roman Valls Guimera (a.k.a brainstorm) + + +[washing_machine_software_estimation]: https://www.cosive.com/blog/my-washing-machine-refreshed-my-thinking-on-software-effort-estimation +[stm8_reverse_engineering]: https://github.com/brainstorm/treadmill-re +[sans-io]: https://www.firezone.dev/blog/sans-io +[closed-then-open]: https://github.com/sipeed/NanoKVM/issues/1#issuecomment-2246900903 +[sshamble]: https://www.runzero.com/sshamble/ diff --git a/docs/nlnet/zero_commons_logo.svg b/docs/nlnet/zero_commons_logo.svg new file mode 100644 index 0000000..bba96d2 --- /dev/null +++ b/docs/nlnet/zero_commons_logo.svg @@ -0,0 +1,14 @@ + + +image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/esp32c6.svd b/docs/svd/esp32c6.svd similarity index 100% rename from esp32c6.svd rename to docs/svd/esp32c6.svd diff --git a/keys/zssh.priv b/keys/zssh.priv deleted file mode 100644 index ab3a78a..0000000 --- a/keys/zssh.priv +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACClNLCoNpVFItJ1RrprF9zJGPud6+LVNl4b28oytb2QtAAAAIhlzibzZc4m -8wAAAAtzc2gtZWQyNTUxOQAAACClNLCoNpVFItJ1RrprF9zJGPud6+LVNl4b28oytb2QtA -AAAEA7DzaKE8Vr14rPzLUm+rHYdGDVZSaewrnUPRiSvYR5n6U0sKg2lUUi0nVGumsX3MkY -+53r4tU2XhvbyjK1vZC0AAAAAAECAwQF ------END OPENSSH PRIVATE KEY----- diff --git a/logs/ssh_vvvv.log b/logs/ssh_vvvv.log deleted file mode 100644 index 75d88bc..0000000 --- a/logs/ssh_vvvv.log +++ /dev/null @@ -1,226 +0,0 @@ -OpenSSH_9.6p1 Ubuntu-3ubuntu13.5, OpenSSL 3.0.13 30 Jan 2024 -debug1: Reading configuration data /home/rvalls/.ssh/config -debug1: Reading configuration data /etc/ssh/ssh_config -debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files -debug1: /etc/ssh/ssh_config line 21: Applying options for * -debug2: resolve_canonicalize: hostname 192.168.2.1 is address -debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '/home/rvalls/.ssh/known_hosts' -debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> '/home/rvalls/.ssh/known_hosts2' -debug3: channel_clear_timeouts: clearing -debug3: ssh_connect_direct: entering -debug1: Connecting to 192.168.2.1 [192.168.2.1] port 22. -debug3: set_sock_tos: set socket 3 IP_TOS 0x10 -debug1: Connection established. -debug1: identity file /home/rvalls/.ssh/id_ed25519 type 3 -debug1: identity file /home/rvalls/.ssh/id_ed25519-cert type -1 -debug1: Local version string SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.5 -debug1: Remote protocol version 2.0, remote software version esp-ssh-rs-0.1 -debug1: compat_banner: no match: esp-ssh-rs-0.1 -debug2: fd 3 setting O_NONBLOCK -debug1: Authenticating to 192.168.2.1:22 as 'zssh' -debug3: record_hostkey: found key type ED25519 in file /home/rvalls/.ssh/known_hosts:125 -debug3: load_hostkeys_file: loaded 1 keys from 192.168.2.1 -debug1: load_hostkeys: fopen /home/rvalls/.ssh/known_hosts2: No such file or directory -debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory -debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory -debug3: order_hostkeyalgs: have matching best-preference key type ssh-ed25519-cert-v01@openssh.com, using HostkeyAlgorithms verbatim -debug3: send packet: type 20 -debug1: SSH2_MSG_KEXINIT sent -debug3: receive packet: type 20 -debug1: SSH2_MSG_KEXINIT received -debug2: local client KEXINIT proposal -debug2: KEX algorithms: sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,ext-info-c,kex-strict-c-v00@openssh.com -debug2: host key algorithms: ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256 -debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com -debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com -debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1 -debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1 -debug2: compression ctos: none,zlib@openssh.com,zlib -debug2: compression stoc: none,zlib@openssh.com,zlib -debug2: languages ctos: -debug2: languages stoc: -debug2: first_kex_follows 0 -debug2: reserved 0 -debug2: peer server KEXINIT proposal -debug2: KEX algorithms: curve25519-sha256,kex-strict-s-v00@openssh.com -debug2: host key algorithms: ssh-ed25519 -debug2: ciphers ctos: chacha20-poly1305@openssh.com -debug2: ciphers stoc: chacha20-poly1305@openssh.com -debug2: MACs ctos: -debug2: MACs stoc: -debug2: compression ctos: none -debug2: compression stoc: none -debug2: languages ctos: -debug2: languages stoc: -debug2: first_kex_follows 0 -debug2: reserved 0 -debug3: kex_choose_conf: will use strict KEX ordering -debug1: kex: algorithm: curve25519-sha256 -debug1: kex: host key algorithm: ssh-ed25519 -debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: compression: none -debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: compression: none -debug3: send packet: type 30 -debug1: expecting SSH2_MSG_KEX_ECDH_REPLY -debug3: receive packet: type 31 -debug1: SSH2_MSG_KEX_ECDH_REPLY received -debug1: Server host key: ssh-ed25519 SHA256:vSe9D8R3MAI+w14kSYr60EVIGg+ySWGWFvo8XsSqboI -debug3: record_hostkey: found key type ED25519 in file /home/rvalls/.ssh/known_hosts:125 -debug3: load_hostkeys_file: loaded 1 keys from 192.168.2.1 -debug1: load_hostkeys: fopen /home/rvalls/.ssh/known_hosts2: No such file or directory -debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory -debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory -debug1: Host '192.168.2.1' is known and matches the ED25519 host key. -debug1: Found key in /home/rvalls/.ssh/known_hosts:125 -debug3: send packet: type 21 -debug1: ssh_packet_send2_wrapped: resetting send seqnr 3 -debug2: ssh_set_newkeys: mode 1 -debug1: rekey out after 134217728 blocks -debug1: SSH2_MSG_NEWKEYS sent -debug1: expecting SSH2_MSG_NEWKEYS -debug3: receive packet: type 21 -debug1: ssh_packet_read_poll2: resetting read seqnr 3 -debug1: SSH2_MSG_NEWKEYS received -debug2: ssh_set_newkeys: mode 0 -debug1: rekey in after 134217728 blocks -debug3: send packet: type 5 -debug3: receive packet: type 6 -debug2: service_accept: ssh-userauth -debug1: SSH2_MSG_SERVICE_ACCEPT received -debug3: send packet: type 50 -debug3: receive packet: type 51 -debug1: Authentications that can continue: publickey -debug3: start over, passed a different list publickey -debug3: preferred gssapi-with-mic,publickey,keyboard-interactive,password -debug3: authmethod_lookup publickey -debug3: remaining preferred: keyboard-interactive,password -debug3: authmethod_is_enabled publickey -debug1: Next authentication method: publickey -debug3: ssh_get_authentication_socket_path: path '/run/user/1000/keyring/ssh' -debug1: get_agent_identities: bound agent to hostkey -debug1: get_agent_identities: agent returned 2 keys -debug1: Will attempt key: /home/rvalls/.ssh/id_ed25519 ED25519 SHA256:9OQiM+YGtGhuxTQGIykizJ2t9q3BrGsDtpNZsZitn00 explicit agent -debug1: Will attempt key: rvalls@Romans-MBP.lan RSA SHA256:ZwuMnYg64tbhPSMmOL2PhcU7wRJPS/4uaX79hMz+1v0 agent -debug2: pubkey_prepare: done -debug1: Offering public key: /home/rvalls/.ssh/id_ed25519 ED25519 SHA256:9OQiM+YGtGhuxTQGIykizJ2t9q3BrGsDtpNZsZitn00 explicit agent -debug3: send packet: type 50 -debug2: we sent a publickey packet, wait for reply -debug3: receive packet: type 60 -debug1: Server accepts key: /home/rvalls/.ssh/id_ed25519 ED25519 SHA256:9OQiM+YGtGhuxTQGIykizJ2t9q3BrGsDtpNZsZitn00 explicit agent -debug3: sign_and_send_pubkey: using publickey with ED25519 SHA256:9OQiM+YGtGhuxTQGIykizJ2t9q3BrGsDtpNZsZitn00 -debug3: sign_and_send_pubkey: signing using ssh-ed25519 SHA256:9OQiM+YGtGhuxTQGIykizJ2t9q3BrGsDtpNZsZitn00 -debug3: send packet: type 50 -debug3: receive packet: type 52 -Authenticated to 192.168.2.1 ([192.168.2.1]:22) using "publickey". -debug2: fd 5 setting O_NONBLOCK -debug1: channel 0: new session [client-session] (inactive timeout: 0) -debug3: ssh_session2_open: channel_new: 0 -debug2: channel 0: send open -debug3: send packet: type 90 -debug1: Entering interactive session. -debug1: pledge: filesystem -debug3: client_repledge: enter -debug3: receive packet: type 91 -debug2: channel_input_open_confirmation: channel 0: callback start -debug2: fd 3 setting TCP_NODELAY -debug3: set_sock_tos: set socket 3 IP_TOS 0x10 -debug2: client_session2_setup: id 0 -debug2: channel 0: request pty-req confirm 1 -debug3: send packet: type 98 -debug1: Sending environment. -debug3: Ignored env SHELL -debug3: Ignored env SESSION_MANAGER -debug3: Ignored env QT_ACCESSIBILITY -debug3: Ignored env COLORTERM -debug3: Ignored env XDG_CONFIG_DIRS -debug3: Ignored env XDG_MENU_PREFIX -debug3: Ignored env TERM_PROGRAM_VERSION -debug3: Ignored env XDG_CONFIG_DIRS_VSCODE_SNAP_ORIG -debug3: Ignored env GNOME_DESKTOP_SESSION_ID -debug3: Ignored env GDK_BACKEND_VSCODE_SNAP_ORIG -debug3: Ignored env JAVA_HOME -debug3: Ignored env GIO_MODULE_DIR_VSCODE_SNAP_ORIG -debug3: Ignored env GNOME_SHELL_SESSION_MODE -debug3: Ignored env SSH_AUTH_SOCK -debug3: Ignored env XDG_DATA_HOME -debug3: Ignored env MEMORY_PRESSURE_WRITE -debug3: Ignored env XMODIFIERS -debug3: Ignored env DESKTOP_SESSION -debug3: Ignored env BAMF_DESKTOP_FILE_HINT -debug3: Ignored env EDITOR -debug3: Ignored env GTK_MODULES -debug3: Ignored env PWD -debug3: Ignored env GSETTINGS_SCHEMA_DIR -debug3: Ignored env XDG_SESSION_DESKTOP -debug3: Ignored env LOGNAME -debug3: Ignored env GTK_EXE_PREFIX -debug3: Ignored env XDG_SESSION_TYPE -debug3: Ignored env SYSTEMD_EXEC_PID -debug3: Ignored env XAUTHORITY -debug3: Ignored env VSCODE_GIT_ASKPASS_NODE -debug3: Ignored env GJS_DEBUG_TOPICS -debug3: Ignored env HOME -debug3: Ignored env USERNAME -debug3: Ignored env IM_CONFIG_PHASE -debug1: channel 0: setting env LANG = "en_US.UTF-8" -debug2: channel 0: request env confirm 0 -debug3: send packet: type 98 -debug3: Ignored env LS_COLORS -debug3: Ignored env XDG_CURRENT_DESKTOP -debug3: Ignored env MEMORY_PRESSURE_WATCH -debug3: Ignored env WAYLAND_DISPLAY -debug3: Ignored env GIT_ASKPASS -debug3: Ignored env INVOCATION_ID -debug3: Ignored env MANAGERPID -debug3: Ignored env CHROME_DESKTOP -debug3: Ignored env GJS_DEBUG_OUTPUT -debug3: Ignored env VSCODE_GIT_ASKPASS_EXTRA_ARGS -debug3: Ignored env GNOME_SETUP_DISPLAY -debug3: Ignored env GSETTINGS_SCHEMA_DIR_VSCODE_SNAP_ORIG -debug3: Ignored env GTK_IM_MODULE_FILE_VSCODE_SNAP_ORIG -debug3: Ignored env LESSCLOSE -debug3: Ignored env XDG_SESSION_CLASS -debug3: Ignored env TERM -debug3: Ignored env GTK_PATH -debug3: Ignored env LESSOPEN -debug3: Ignored env USER -debug3: Ignored env GTK_PATH_VSCODE_SNAP_ORIG -debug3: Ignored env VSCODE_GIT_IPC_HANDLE -debug3: Ignored env DISPLAY -debug3: Ignored env SHLVL -debug3: Ignored env LOCPATH -debug3: Ignored env GSM_SKIP_SSH_AGENT_WORKAROUND -debug3: Ignored env QT_IM_MODULE -debug3: Ignored env GTK_EXE_PREFIX_VSCODE_SNAP_ORIG -debug3: Ignored env XDG_RUNTIME_DIR -debug3: Ignored env XDG_DATA_DIRS_VSCODE_SNAP_ORIG -debug3: Ignored env DEBUGINFOD_URLS -debug3: Ignored env VSCODE_GIT_ASKPASS_MAIN -debug3: Ignored env JOURNAL_STREAM -debug3: Ignored env XDG_DATA_DIRS -debug3: Ignored env GDK_BACKEND -debug3: Ignored env PATH -debug3: Ignored env GDMSESSION -debug3: Ignored env ORIGINAL_XDG_CURRENT_DESKTOP -debug3: Ignored env DBUS_SESSION_BUS_ADDRESS -debug3: Ignored env GTK_IM_MODULE_FILE -debug3: Ignored env LOCPATH_VSCODE_SNAP_ORIG -debug3: Ignored env GIO_MODULE_DIR -debug3: Ignored env GIO_LAUNCHED_DESKTOP_FILE_PID -debug3: Ignored env GIO_LAUNCHED_DESKTOP_FILE -debug3: Ignored env TERM_PROGRAM -debug3: Ignored env _ -debug3: Ignored env OLDPWD -debug2: channel 0: request shell confirm 1 -debug3: send packet: type 98 -debug3: client_repledge: enter -debug2: channel_input_open_confirmation: channel 0: callback done -debug2: channel 0: open confirm rwindow 0 rmax 3811 -debug2: client_check_window_change: changed -debug2: channel 0: request window-change confirm 0 -debug3: send packet: type 98 -debug3: send packet: type 1 -debug1: channel 0: free: client-session, nchannels 1 -debug3: channel 0: status: The following connections are open: - #0 client-session (t4 [session] r0 i0/0 o0/0 e[write]/0 fd 4/5/6 sock -1 cc -1 io 0x00/0x00) - -Killed by signal 15. diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f9f66ed..17c702b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,4 @@ [toolchain] -channel = "stable-2025-01-09" +channel = "stable-2025-04-03" +components = ["rust-src"] +targets = ["riscv32imac-unknown-none-elf"] diff --git a/scripts/client.sh b/scripts/client.sh deleted file mode 100755 index 268c838..0000000 --- a/scripts/client.sh +++ /dev/null @@ -1 +0,0 @@ -ssh -i ~/.ssh/id_ed25519 -vvvvvv zssh@192.168.2.1 >& logs/ssh_vvvv.log diff --git a/src/errors.rs b/src/errors.rs deleted file mode 100644 index ee4e696..0000000 --- a/src/errors.rs +++ /dev/null @@ -1,49 +0,0 @@ -use core::fmt::Display; - -#[derive(Debug)] -pub enum EspSshError { - ClientError(zssh::Error), - CertificateError(), -} - -impl From> for EspSshError { - fn from(inner: zssh::Error) -> Self { - EspSshError::ClientError(inner) - } -} - -impl From for EspSshError { - fn from(_: ed25519_dalek::ed25519::Error) -> Self { - // The inner error type here deliberately doesn't contain any context - EspSshError::CertificateError() - } -} - -// NOTE: This is a pretty bare-bones implementation of Display, but Debug is -// derived and should contain all available detail. It may be better to remove -// this and nudge anyone printing the error to Debug, as the designated audience -// is probably Debug-level... -impl Display for EspSshError { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - let (variant, inner) = match self { - EspSshError::ClientError(e) => ( - "SSH Client Error", - Some(match e { - zssh::Error::UnexpectedEof => "Unexpected EOF", - zssh::Error::IO(_) => "I/O Error", - zssh::Error::Protocol(_protocol_error) => "SSH Protocol error", - zssh::Error::ServerDisconnect(_disconnect_reason) => "Server Disconnect", - zssh::Error::ClientDisconnect(_disconnect_reason) => "Client Disconnect", - }), - ), - EspSshError::CertificateError() => ("Certificate Error", None), - }; - write!( - f, - "Fatal Error: {}{}{}", - variant, - if inner.is_some() { ": " } else { "" }, - inner.unwrap_or("") - ) - } -} diff --git a/src/esp_net.rs b/src/esp_net.rs deleted file mode 100644 index 949e574..0000000 --- a/src/esp_net.rs +++ /dev/null @@ -1,171 +0,0 @@ -// https://github.com/esp-rs/esp-hal/blob/main/examples/src/bin/wifi_embassy_access_point.rs -// https://github.com/embassy-rs/embassy/blob/main/examples/nrf52840/src/bin/wifi_esp_hosted.rs -use embassy_executor::Spawner; -use embassy_net::{ - tcp::TcpSocket, - Config, - IpListenEndpoint, - Ipv4Address, - Ipv4Cidr, - Stack, - StaticConfigV4, - StackResources, -}; -use embassy_time::{Duration, Timer}; -use esp_backtrace as _; - -use esp_hal::clock::CpuClock; -use esp_hal::rng::Rng; - -use esp_hal::timer::systimer::Target; -use esp_hal::timer::timg::TimerGroup; -use esp_hal::uart::Uart; -use esp_hal::Async; -use esp_println::println; - -use esp_wifi::{init, EspWifiController}; -use esp_wifi::wifi::{WifiEvent, WifiState}; -use esp_wifi:: - wifi::{ - AccessPointConfiguration, - Configuration, - WifiApDevice, - WifiController, - WifiDevice, - }; - -use crate::errors::EspSshError; - -// When you are okay with using a nightly compiler it's better to use https://docs.rs/static_cell/2.1.0/static_cell/macro.make_static.html -macro_rules! mk_static { - ($t:ty,$val:expr) => {{ - static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); - #[deny(unused_attributes)] - let x = STATIC_CELL.uninit().write(($val)); - x - }}; -} - -pub async fn if_up(spawner: Spawner) -> Result<&'static Stack>, EspSshError> -{ - let peripherals = esp_hal::init({ - let mut config = esp_hal::Config::default(); - config.cpu_clock = CpuClock::max(); - config - }); - let rng = Rng::new(peripherals.RNG); - let timg0 = TimerGroup::new(peripherals.TIMG0); - - let init = &*mk_static!( - EspWifiController<'static>, - init( - timg0.timer0, - rng.clone(), - peripherals.RADIO_CLK, - ).unwrap() - ); - - let wifi = peripherals.WIFI; - let (wifi_ap_interface, _wifi_sta_interface, controller) = esp_wifi::wifi::new_ap_sta(&init, wifi).unwrap(); - - //let systimer = SystemTimer::new(peripherals.SYSTIMER).split_async::(); - - cfg_if::cfg_if! { - if #[cfg(feature = "esp32")] { - let timg1 = TimerGroup::new(peripherals.TIMG1); - esp_hal_embassy::init(timg1.timer0); - } else { - use esp_hal::timer::systimer::SystemTimer; - let systimer = SystemTimer::new(peripherals.SYSTIMER).split::(); - esp_hal_embassy::init(systimer.alarm0); - } - } - - let config = Config::ipv4_static(StaticConfigV4 { - address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 2, 1), 24), - gateway: Some(Ipv4Address::from_bytes(&[192, 168, 2, 1])), - dns_servers: Default::default(), - }); - - let seed = 1234; // very random, very secure seed - - // Init network stack - let ap_stack = &*mk_static!( - Stack>, - Stack::new( - wifi_ap_interface, - config, - mk_static!(StackResources<3>, StackResources::<3>::new()), - seed - ) - ); - - spawner.spawn(wifi_up(controller)).unwrap(); - spawner.spawn(net_up(ap_stack)).unwrap(); - - loop { - println!("Checking if link is up...\n"); - if ap_stack.is_link_up() { - break; - } - Timer::after(Duration::from_millis(500)).await; - } - - // TODO: Offer options for DHCP and static IP, WifiManager-like (minimal) functionality - println!("Connect to the AP `esp-ssh-rs` and point your ssh client to 192.168.2.1"); - println!("Use a static IP in the range 192.168.2.2 .. 192.168.2.255, use gateway 192.168.2.1"); - - Ok(&ap_stack) -} - -pub async fn accept_requests(stack: &'static Stack>, uart: Uart<'static, Async>) -> Result<(), EspSshError> { - - let rx_buffer = mk_static!([u8; 1536], [0; 1536]); - let tx_buffer = mk_static!([u8; 1536], [0; 1536]); - - //loop { - let mut socket = TcpSocket::new(stack, rx_buffer, tx_buffer); - - if let Err(e) = socket.accept(IpListenEndpoint { - addr: None, - port: 22, - }).await { - println!("connect error: {:?}", e); - //continue; - } - - println!("Connected, port 22"); - crate::serve::handle_ssh_client(socket, uart).await?; - //} - Ok(()) // FIXME: All is fine but not really if we lose connection only once... removed loop to deal with uart copy issues later - // Probably best handled by some kind of supervisor task and signals instead of a loop anyway? -} - -#[embassy_executor::task] -async fn wifi_up(mut controller: WifiController<'static>) { - println!("Device capabilities: {:?}", controller.capabilities()); - //loop { - if esp_wifi::wifi::wifi_state() == WifiState::ApStarted { - // wait until we're no longer connected - controller.wait_for_event(WifiEvent::ApStop).await; - Timer::after(Duration::from_millis(5000)).await - } - if !matches!(controller.is_started(), Ok(true)) { - let client_config = Configuration::AccessPoint(AccessPointConfiguration { - ssid: "esp-ssh-rs".try_into().unwrap(), - ..Default::default() - }); - controller.set_configuration(&client_config).unwrap(); - println!("Starting wifi"); - controller.start_async().await.unwrap(); - println!("Wifi started!"); - } - Timer::after(Duration::from_millis(10)).await; - //} -} - -#[embassy_executor::task] -async fn net_up(stack: &'static Stack>) { - println!("Bringing up network stack...\n"); - stack.run().await -} diff --git a/src/esp_rng.rs b/src/esp_rng.rs deleted file mode 100644 index 8f241cf..0000000 --- a/src/esp_rng.rs +++ /dev/null @@ -1,7 +0,0 @@ -use esp_hal::peripherals::Peripherals; -use esp_hal::rng::Trng; - -pub fn esp_random(peripherals: &mut Peripherals) -> Trng { - let adc1 = &mut peripherals.ADC1; - Trng::new(&mut peripherals.RNG, adc1) -} \ No newline at end of file diff --git a/src/esp_serial.rs b/src/esp_serial.rs deleted file mode 100644 index a9ee8da..0000000 --- a/src/esp_serial.rs +++ /dev/null @@ -1,51 +0,0 @@ -use esp_backtrace as _; -use esp_hal::{ - peripherals::{self, Peripherals}, uart::{Uart, UartRx, UartTx}, Async -}; -use esp_println::println; - -use crate::errors::EspSshError; - -#[embassy_executor::task] -async fn writer(mut tx: UartTx<'static, Async>, serial_tx_ring_buf: &'static mut [u8]) { - let tx_writer = tx.write_async(serial_tx_ring_buf).await; - - match tx_writer { - Ok(len) => { - esp_println::println!("Wrote: {len}, data: {:?}", serial_tx_ring_buf); - } - Err(e) => esp_println::println!("TX Error: {:?}", e), - } -} - -#[embassy_executor::task] -async fn reader(mut rx: UartRx<'static, Async>, serial_rx_ring_buf: &'static mut [u8]) { - loop { - let rx_reader = rx.read_async(serial_rx_ring_buf).await; - match rx_reader { - Ok(len) => { - esp_println::println!("Read: {len}, data: {:?}", serial_rx_ring_buf); - } - Err(e) => esp_println::println!("RX Error: {:?}", e), - } - } -} - -pub(crate) async fn uart_up() -> Result, EspSshError> { - esp_println::println!("UART init!"); - - // SAFETY: No concurrent peripheral operations are happening at this point??? - // FIXME: Concerning since we steal it in handle_ssh_client() as well - let peripherals: Peripherals = unsafe { - peripherals::Peripherals::steal() - }; - - println!("Peripherals stolen at uart_up()..."); - - let (tx_pin, rx_pin) = (peripherals.GPIO10, peripherals.GPIO11); - let uart0 = Uart::new(peripherals.UART1, rx_pin, tx_pin) - .unwrap() - .into_async(); - - Ok(uart0) -} \ No newline at end of file diff --git a/src/espressif/buffered_uart.rs b/src/espressif/buffered_uart.rs new file mode 100644 index 0000000..71b48d4 --- /dev/null +++ b/src/espressif/buffered_uart.rs @@ -0,0 +1,114 @@ +use portable_atomic::{AtomicUsize, Ordering}; + +use embassy_futures::select::select; +use embassy_sync::pipe::TryWriteError; +/// Wrapper around bidirectional embassy-sync Pipes, in order to handle UART +/// RX/RX happening in an InterruptExecutor at higher priority. +/// +/// Doesn't implement the InterruptExecutor, in the task in the app should await +/// the 'run' async function. +use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, pipe::Pipe}; +use esp_hal::uart::Uart; +use esp_hal::Async; + +// Sizes of the software buffers. Inward is more +// important as an overrun here drops bytes. A full outward +// buffer will only block the executor. +const INWARD_BUF_SZ: usize = 512; +const OUTWARD_BUF_SZ: usize = 256; + +// Size of the buffer for hardware read/write ops. +const UART_BUF_SZ: usize = 64; + +/// Bidirectional pipe buffer for UART communications +pub struct BufferedUart { + outward: Pipe, + inward: Pipe, + dropped_rx_bytes: AtomicUsize, +} + +pub struct Config {} + +impl BufferedUart { + pub fn new() -> Self { + BufferedUart { + outward: Pipe::new(), + inward: Pipe::new(), + dropped_rx_bytes: AtomicUsize::from(0), + } + } + + /// Transfer data between the UART and the buffer struct. + /// + /// This should be awaited from an Embassy task that's run + /// in an InterruptExecutor for lower latency. + pub async fn run(&self, uart: Uart<'_, Async>) { + let (mut uart_rx, mut uart_tx) = uart.split(); + let mut uart_rx_buf = [0u8; UART_BUF_SZ]; + let mut uart_tx_buf = [0u8; UART_BUF_SZ]; + + loop { + let rd_from = async { + loop { + let n = uart_rx.read_async(&mut uart_rx_buf).await.unwrap(); + let mut rx_slice = &uart_rx_buf[..n]; + + // Write rx_slice to 'inward' pipe, dropping bytes rather than blocking if + // the pipe is full + while !rx_slice.is_empty() { + rx_slice = match self.inward.try_write(rx_slice) { + Ok(w) => &rx_slice[w..], + Err(TryWriteError::Full) => { + // If the receive buffer is full (no SSH client, or network congestion) then + // drop the oldest bytes from the pipe so we can still write the newest ones. + let mut drop_buf = [0u8; UART_BUF_SZ]; + let dropped = self + .inward + .try_read(&mut drop_buf[..rx_slice.len()]) + .unwrap_or_default(); + let _ = self.dropped_rx_bytes.fetch_update( + Ordering::Relaxed, + Ordering::Relaxed, + |d| Some(d.saturating_add(dropped)), + ); + rx_slice + } + }; + } + } + }; + let rd_to = async { + loop { + let n = self.outward.read(&mut uart_tx_buf).await; + // TODO: handle write errors + let _ = uart_tx.write_async(&uart_tx_buf[..n]).await; + } + }; + select(rd_from, rd_to).await; + } + } + + pub async fn read(&self, buf: &mut [u8]) -> usize { + self.inward.read(buf).await + } + + pub async fn write(&self, buf: &[u8]) { + self.outward.write_all(buf).await; + } + + /// Return the number of dropped bytes (if any) since the last check, + /// and reset the internal count to 0. + pub fn check_dropped_bytes(&self) -> usize { + self.dropped_rx_bytes.swap(0, Ordering::Relaxed) + } + + pub fn reconfigure(&self, _config: Config) { + todo!(); + } +} + +impl Default for BufferedUart { + fn default() -> Self { + Self::new() + } +} diff --git a/src/espressif/mod.rs b/src/espressif/mod.rs new file mode 100644 index 0000000..88fc177 --- /dev/null +++ b/src/espressif/mod.rs @@ -0,0 +1,3 @@ +pub mod buffered_uart; +pub mod net; +pub mod rng; diff --git a/src/espressif/net.rs b/src/espressif/net.rs new file mode 100644 index 0000000..1a79792 --- /dev/null +++ b/src/espressif/net.rs @@ -0,0 +1,179 @@ +use core::net::Ipv4Addr; +use core::str::FromStr; + +use embassy_executor::Spawner; +use embassy_net::{tcp::TcpSocket, Stack, StackResources}; +use embassy_net::{IpListenEndpoint, Ipv4Cidr, Runner, StaticConfigV4}; +use embassy_time::{Duration, Timer}; + +use esp_hal::peripherals::WIFI; + +use esp_hal::rng::Rng; +use esp_println::{dbg, println}; + +use esp_wifi::wifi::{AccessPointConfiguration, Configuration, WifiController, WifiDevice}; +use esp_wifi::wifi::{WifiEvent, WifiState}; +use esp_wifi::EspWifiController; + +use core::net::SocketAddrV4; +use edge_dhcp; + +use edge_dhcp::{ + io::{self, DEFAULT_SERVER_PORT}, + server::{Server, ServerOptions}, +}; +use edge_nal::UdpBind; +use edge_nal_embassy::{Udp, UdpBuffers}; + +use super::buffered_uart::BufferedUart; + +const GW_IP_ADDR_ENV: Option<&'static str> = option_env!("GATEWAY_IP"); + +// When you are okay with using a nightly compiler it's better to use https://docs.rs/static_cell/2.1.0/static_cell/macro.make_static.html +macro_rules! mk_static { + ($t:ty,$val:expr) => {{ + static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); + #[deny(unused_attributes)] + let x = STATIC_CELL.uninit().write(($val)); + x + }}; +} + +pub async fn if_up( + spawner: Spawner, + wifi_controller: EspWifiController<'static>, + wifi: WIFI<'static>, + rng: &mut Rng, +) -> Result, sunset::Error> { + let wifi_init = &*mk_static!(EspWifiController<'static>, wifi_controller); + let (controller, interfaces) = esp_wifi::wifi::new(wifi_init, wifi).unwrap(); + + let gw_ip_addr_str = GW_IP_ADDR_ENV.unwrap_or("192.168.0.1"); + let gw_ip_addr = Ipv4Addr::from_str(gw_ip_addr_str).expect("failed to parse gateway ip"); + + let config = embassy_net::Config::ipv4_static(StaticConfigV4 { + address: Ipv4Cidr::new(gw_ip_addr, 24), + gateway: Some(gw_ip_addr), + dns_servers: Default::default(), + }); + + let seed = (rng.random() as u64) << 32 | rng.random() as u64; + + // Init network stack + let (ap_stack, runner) = embassy_net::new( + interfaces.ap, + config, + mk_static!(StackResources<3>, StackResources::<3>::new()), + seed, + ); + + spawner.spawn(wifi_up(controller)).ok(); + spawner.spawn(net_up(runner)).ok(); + spawner.spawn(dhcp_server(ap_stack, gw_ip_addr)).ok(); + + loop { + println!("Checking if link is up...\n"); + if ap_stack.is_link_up() { + break; + } + Timer::after(Duration::from_millis(500)).await; + } + + // TODO: Use wifi_manager instead? + println!( + "Connect to the AP `ssh-stamp` as a DHCP client with IP: {}", + gw_ip_addr_str + ); + + Ok(ap_stack) +} + +pub async fn accept_requests(stack: Stack<'static>, uart: &BufferedUart) -> ! { + let rx_buffer = mk_static!([u8; 1536], [0; 1536]); + let tx_buffer = mk_static!([u8; 1536], [0; 1536]); + + loop { + let mut socket = TcpSocket::new(stack, rx_buffer, tx_buffer); + + println!("Waiting for SSH client..."); + + if let Err(e) = socket + .accept(IpListenEndpoint { + addr: None, + port: 22, + }) + .await + { + println!("connect error: {:?}", e); + continue; + } + + println!("Connected, port 22"); + match crate::serve::handle_ssh_client(&mut socket, uart).await { + Ok(_) => (), + Err(e) => { + println!("SSH client fatal error: {}", e); + } + }; + } +} + +#[embassy_executor::task] +async fn wifi_up(mut controller: WifiController<'static>) { + println!("Device capabilities: {:?}", controller.capabilities()); + loop { + if esp_wifi::wifi::wifi_state() == WifiState::ApStarted { + // wait until we're no longer connected + controller.wait_for_event(WifiEvent::ApStop).await; + Timer::after(Duration::from_millis(5000)).await + } + if !matches!(controller.is_started(), Ok(true)) { + let client_config = Configuration::AccessPoint(AccessPointConfiguration { + ssid: "ssh-stamp".into(), + ..Default::default() + }); + controller.set_configuration(&client_config).unwrap(); + println!("Starting wifi"); + controller.start_async().await.unwrap(); + println!("Wifi started!"); + } + Timer::after(Duration::from_millis(10)).await; + } +} + +#[embassy_executor::task] +async fn net_up(mut runner: Runner<'static, WifiDevice<'static>>) { + println!("Bringing up network stack...\n"); + runner.run().await +} + +#[embassy_executor::task] +async fn dhcp_server(stack: Stack<'static>, ip: Ipv4Addr) { + let mut buf = [0u8; 1500]; + + let mut gw_buf = [Ipv4Addr::UNSPECIFIED]; + + let buffers = UdpBuffers::<3, 1024, 1024, 10>::new(); + let unbound_socket = Udp::new(stack, &buffers); + let mut bound_socket = unbound_socket + .bind(core::net::SocketAddr::V4(SocketAddrV4::new( + Ipv4Addr::UNSPECIFIED, + DEFAULT_SERVER_PORT, + ))) + .await + .unwrap(); + + loop { + let res = io::server::run( + &mut Server::<_, 64>::new_with_et(ip), + &ServerOptions::new(ip, Some(&mut gw_buf)), + &mut bound_socket, + &mut buf, + ) + .await + .inspect_err(|e| log::warn!("DHCP server error: {e:?}")); + Timer::after(Duration::from_millis(500)).await; + + dbg!(res.unwrap()); + } +} diff --git a/src/espressif/rng.rs b/src/espressif/rng.rs new file mode 100644 index 0000000..735ef36 --- /dev/null +++ b/src/espressif/rng.rs @@ -0,0 +1,30 @@ +use core::cell::RefCell; + +use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; +use embassy_sync::blocking_mutex::Mutex; +use esp_hal::rng::Rng; +use getrandom::register_custom_getrandom; +use static_cell::StaticCell; + +static RNG: StaticCell = StaticCell::new(); +static RNG_MUTEX: Mutex>> = + Mutex::new(RefCell::new(None)); + +pub fn register_custom_rng(rng: Rng) { + let rng = RNG.init(rng); + RNG_MUTEX.lock(|t| t.borrow_mut().replace(rng)); + register_custom_getrandom!(esp_getrandom_custom_func); +} + +// esp-hal specific variation of getrandom custom function as seen in: +// https://github.com/rust-random/getrandom/issues/340 +pub fn esp_getrandom_custom_func(buf: &mut [u8]) -> Result<(), getrandom::Error> { + RNG_MUTEX.lock(|t| { + let mut rng = t.borrow_mut(); + let rng = rng + .as_mut() + .expect("register_custom_rng should have set this"); + rng.read(buf); + }); + Ok(()) +} diff --git a/src/io.rs b/src/io.rs deleted file mode 100644 index 7bd945e..0000000 --- a/src/io.rs +++ /dev/null @@ -1,29 +0,0 @@ -use core::fmt::Debug; - -use embassy_net::tcp::TcpSocket; -use embedded_io_async::{ErrorType, Read, Write}; - -// Newtype because TcpSocket does not derive Debug -pub struct DebuggableTcpSocket<'a>(pub TcpSocket<'a>); -pub struct AsyncTcpStream<'a>(pub TcpSocket<'a>); - -impl<'a> Debug for DebuggableTcpSocket<'a> { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "TcpSocket> ") - } -} - -impl<'a> ErrorType for AsyncTcpStream<'a> { - type Error = embassy_net::tcp::Error; -} -impl<'a> Read for AsyncTcpStream<'a> { - async fn read(&mut self, buf: &mut [u8]) -> Result { - self.0.read(buf).await - } -} - -impl<'a> Write for AsyncTcpStream<'a> { - async fn write(&mut self, buf: &[u8]) -> Result { - self.0.write(buf).await - } -} \ No newline at end of file diff --git a/src/keys.rs b/src/keys.rs index 8af8adb..5681c1d 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,19 +1,10 @@ -use ssh_key::{public::Ed25519PublicKey, PublicKey}; // FIXME: For demo purposes, there should be a key handler/generator on first connection. - -// Randomly created host identity. -pub(crate) const HOST_SECRET_KEY: [u8; 32] = [ - 0xdf, 0x77, 0xbb, 0xf9, 0xf6, 0x42, 0x04, 0x40, 0x4c, 0x69, 0xe7, 0x1c, 0x7c, 0x6c, 0xda, 0x71, - 0x6c, 0xdc, 0x20, 0xa3, 0xe1, 0x2f, 0x78, 0x4a, 0x6d, 0xaa, 0x96, 0x3a, 0x1a, 0x51, 0xea, 0x4f, -]; - -// const USER_FULL_PUBLIC_KEY: [u8; 103] = include_data!("/home/rvalls/.ssh/id_ed25519.pub"); -// TODO: Handle errors in key parsing, i.e: changing a single character in the key results in esp-rs's "Overflow" -pub(crate) fn get_user_public_key() -> Ed25519PublicKey { - *PublicKey::from_openssh("ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICWwC2CWtve93K0BubV0gf74kvzDG9WM5SfXAAcr+5dy rvalls@Romans-MBP.lan") - .unwrap() - .key_data() - .ed25519() - .unwrap() -} - +pub(crate) const HOST_SECRET_KEY: &[u8; 400] = b" +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACD/HyNyMDvZkVWgMRzpbK6VgVk+/b627AamAjoO8T4uSAAAAJCzAcYdswHG +HQAAAAtzc2gtZWQyNTUxOQAAACD/HyNyMDvZkVWgMRzpbK6VgVk+/b627AamAjoO8T4uSA +AAAEAZYxnkyw7+ehro8oDJ2PBAO8OpJrBAezD3PLOw9CdLCP8fI3IwO9mRVaAxHOlsrpWB +WT79vrbsBqYCOg7xPi5IAAAAC2d1c0B0aGVzZXVzAQI= +-----END OPENSSH PRIVATE KEY----- +"; diff --git a/src/lib.rs b/src/lib.rs index 1ca2ad8..f32497f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,9 @@ #![no_std] #![no_main] -//#![forbid(unsafe_code)] -//#![feature(type_alias_impl_trait)] +#![forbid(unsafe_code)] -pub mod settings; -pub mod io; -pub mod serve; -pub mod esp_rng; -pub mod esp_net; -pub mod esp_serial; +pub mod espressif; pub mod keys; -pub mod errors; +pub mod serial; +pub mod serve; +pub mod settings; diff --git a/src/main.rs b/src/main.rs index 0ff75d9..9ab48dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,112 @@ #![no_std] #![no_main] +use core::marker::Sized; use esp_alloc as _; use esp_backtrace as _; -use esp_println::println; -use core::marker::Sized; +use esp_hal::{ + gpio::AnyPin, + interrupt::{software::SoftwareInterruptControl, Priority}, + peripherals::UART1, + rng::Rng, + timer::timg::TimerGroup, + uart::{Config, RxConfig, Uart}, +}; +use esp_hal_embassy::InterruptExecutor; use embassy_executor::Spawner; -use esp_ssh_rs::serve::start; +use ssh_stamp::espressif::{ + buffered_uart::BufferedUart, + net::{accept_requests, if_up}, + rng, +}; +use static_cell::StaticCell; #[esp_hal_embassy::main] async fn main(spawner: Spawner) -> ! { - esp_alloc::heap_allocator!(72 * 1024); + cfg_if::cfg_if!( + if #[cfg(feature = "esp32s2")] { + // TODO: This heap size will crash at runtime, we need to fix this + // applying ideas from https://github.com/brainstorm/ssh-stamp/pull/41#issuecomment-2964775170 + esp_alloc::heap_allocator!(size: 69 * 1024); + } else { + esp_alloc::heap_allocator!(size: 72 * 1024); + } + ); + esp_bootloader_esp_idf::esp_app_desc!(); esp_println::logger::init_logger_from_env(); - let res = start(spawner).await; - if let Err(e) = res { - println!("Giving up: {:?}", e); + // System init + let peripherals = esp_hal::init(esp_hal::Config::default()); + let mut rng = Rng::new(peripherals.RNG); + let timg0 = TimerGroup::new(peripherals.TIMG0); + + rng::register_custom_rng(rng); + + cfg_if::cfg_if! { + if #[cfg(feature = "esp32")] { + let timg1 = TimerGroup::new(peripherals.TIMG1); + esp_hal_embassy::init(timg1.timer0); + } else { + use esp_hal::timer::systimer::SystemTimer; + let systimer = SystemTimer::new(peripherals.SYSTIMER); + esp_hal_embassy::init(systimer.alarm0); + } + } + + let wifi_controller = esp_wifi::init(timg0.timer0, rng, peripherals.RADIO_CLK).unwrap(); + + // Bring up the network interface and start accepting SSH connections. + let tcp_stack = if_up(spawner, wifi_controller, peripherals.WIFI, &mut rng) + .await + .unwrap(); + + // Set up software buffered UART to run in a higher priority InterruptExecutor + let uart_buf = UART_BUF.init_with(BufferedUart::new); + let software_interrupts = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT); + let interrupt_executor = + INT_EXECUTOR.init_with(|| InterruptExecutor::new(software_interrupts.software_interrupt0)); + cfg_if::cfg_if! { + if #[cfg(any(feature = "esp32", feature = "esp32s2", feature = "esp32s3"))] { + let interrupt_spawner = interrupt_executor.start(Priority::Priority1); + } else { + let interrupt_spawner = interrupt_executor.start(Priority::Priority10); + } } - todo!(); // try again somehow + cfg_if::cfg_if! { + if #[cfg(not(feature = "esp32c2"))] { + interrupt_spawner.spawn(uart_task(uart_buf, peripherals.UART1, peripherals.GPIO11.into(), peripherals.GPIO10.into())).unwrap(); + } else { + interrupt_spawner.spawn(uart_task(uart_buf, peripherals.UART1, peripherals.GPIO9.into(), peripherals.GPIO10.into())).unwrap(); + } + } + accept_requests(tcp_stack, uart_buf).await; +} + +static UART_BUF: StaticCell = StaticCell::new(); + +static INT_EXECUTOR: StaticCell> = StaticCell::new(); + +#[embassy_executor::task] +async fn uart_task( + buffer: &'static BufferedUart, + uart_periph: UART1<'static>, + rx_pin: AnyPin<'static>, + tx_pin: AnyPin<'static>, +) { + // Hardware UART setup + let uart_config = Config::default().with_rx( + RxConfig::default() + .with_fifo_full_threshold(16) + .with_timeout(1), + ); + + let uart = Uart::new(uart_periph, uart_config) + .unwrap() + .with_rx(rx_pin) + .with_tx(tx_pin) + .into_async(); + + // Run the main buffered TX/RX loop + buffer.run(uart).await; } diff --git a/src/serial.rs b/src/serial.rs new file mode 100644 index 0000000..4533719 --- /dev/null +++ b/src/serial.rs @@ -0,0 +1,51 @@ +use embassy_futures::select::select; +use embedded_io_async::{Read, Write}; + +// Espressif specific crates +use crate::espressif::buffered_uart::BufferedUart; +use esp_println::println; + +/// Forwards an incoming SSH connection to/from the local UART, until +/// the connection drops +pub(crate) async fn serial_bridge( + chanr: impl Read, + chanw: impl Write, + uart: &BufferedUart, +) -> Result<(), sunset::Error> { + println!("Starting serial <--> SSH bridge"); + + select(uart_to_ssh(uart, chanw), ssh_to_uart(chanr, uart)).await; + println!("Stopping serial <--> SSH bridge"); + Ok(()) +} + +async fn uart_to_ssh( + uart_buf: &BufferedUart, + mut chanw: impl Write, +) -> Result<(), sunset::Error> { + let mut ssh_tx_buf = [0u8; 512]; + loop { + let dropped = uart_buf.check_dropped_bytes(); + if dropped > 0 { + // TODO: should this also go to the SSH client? + println!("UART RX dropped {} bytes", dropped); + } + + let n = uart_buf.read(&mut ssh_tx_buf).await; + chanw.write_all(&ssh_tx_buf[..n]).await?; + } +} + +async fn ssh_to_uart( + mut chanr: impl Read, + uart_buf: &BufferedUart, +) -> Result<(), sunset::Error> { + let mut uart_tx_buf = [0u8; 64]; + loop { + let n = chanr.read(&mut uart_tx_buf).await?; + if n == 0 { + return Err(sunset::Error::ChannelEOF); + } + uart_buf.write(&uart_tx_buf[..n]).await; + } +} diff --git a/src/serve.rs b/src/serve.rs index 4428c06..bc5eb0f 100644 --- a/src/serve.rs +++ b/src/serve.rs @@ -1,194 +1,123 @@ -use core::writeln; +use core::option::Option::{self, None, Some}; use core::result::Result; -use core::option::Option::{ self, Some, None }; - -use crate::errors::EspSshError; +use core::writeln; -use crate::esp_net::{accept_requests, if_up}; -use crate::io::AsyncTcpStream; -use crate::keys::{HOST_SECRET_KEY, get_user_public_key}; +use crate::espressif::buffered_uart::BufferedUart; +use crate::keys; +use crate::serial::serial_bridge; // Embassy -use embassy_executor::Spawner; +use embassy_futures::select::{select3, Either3}; use embassy_net::tcp::TcpSocket; -use embassy_time::{Duration, Timer}; -use esp_hal::rtc_cntl::sleep; -use esp_hal::uart::Uart; -use esp_hal::{peripherals, time, Async}; -use esp_hal::peripherals::Peripherals; - -// ESP specific -use crate::esp_rng::esp_random; -use esp_println::{dbg, println}; -use esp_hal::rng::Trng; -use crate::esp_serial::uart_up; - -// Crypto and SSH -use ed25519_dalek::{SigningKey, VerifyingKey}; -use zssh::{AuthMethod, Behavior, Pipe, PublicKey, Request, SecretKey, Transport}; - -pub(crate) struct SshServer<'a> { - stream: AsyncTcpStream<'a>, - random: Trng<'a>, - host_secret_key: SecretKey, - user_public_key: PublicKey, -} - -#[derive(Debug, Clone)] -pub(crate) enum ExampleCommand { - Echo, - Invalid, -} - -impl<'a> Behavior for SshServer<'a> { - type Stream = AsyncTcpStream<'a>; - type Command = ExampleCommand; - type User = &'static str; - type Random = Trng<'a>; - - fn stream(&mut self) -> &mut Self::Stream { - &mut self.stream - } - - fn random(&mut self) -> &mut Self::Random { - &mut self.random - } - - fn host_secret_key(&self) -> &SecretKey { - &self.host_secret_key - } - - fn allow_user(&mut self, username: &str, auth_method: &AuthMethod) -> Option<&'static str> { - match (username, auth_method) { - ("zssh", AuthMethod::PublicKey(public_key)) if *public_key == self.user_public_key => { - Some("zssh") - } - ("guest", AuthMethod::None) => Some("guest"), - _ => None, - } - } - - fn parse_command(&mut self, command: &str) -> Self::Command { - match command { - "echo" => ExampleCommand::Echo, - _ => ExampleCommand::Invalid, - } - } - - fn server_id(&self) -> &'static str { - crate::settings::SERVER_ID - } - - fn allow_shell(&self) -> bool { - true - } -} +use embassy_sync::blocking_mutex::raw::NoopRawMutex; +use embassy_sync::channel::Channel; +use embassy_sync::mutex::Mutex; -pub(crate) async fn handle_ssh_client<'a>(stream: TcpSocket<'a>, uart: Uart<'static, Async>) -> Result<(), EspSshError> { - // SAFETY: No further (nor concurrent) peripheral operations are happening - // This will be removed once Trng is cloneable: https://github.com/esp-rs/esp-hal/issues/2372 - let mut peripherals: Peripherals = unsafe { - peripherals::Peripherals::steal() - }; +use heapless::String; +use sunset::{error, ChanHandle, ServEvent, SignKey}; +use sunset_async::{ProgressHolder, SSHServer}; - println!("Peripherals stolen at handle_ssh_client()..."); +use esp_println::{dbg, println}; - let behavior = SshServer { - stream: AsyncTcpStream(stream), - random: esp_random(&mut peripherals), - host_secret_key: SecretKey::Ed25519 { - secret_key: SigningKey::from_bytes(&HOST_SECRET_KEY), - }, - user_public_key: PublicKey::Ed25519 { - public_key: VerifyingKey::from_bytes(&get_user_public_key().0)?, - }, - }; +async fn connection_loop( + serv: &SSHServer<'_>, + chan_pipe: &Channel, +) -> Result<(), sunset::Error> { + let username = Mutex::::new(String::<20>::new()); + let mut session: Option = None; - let mut packet_buffer = [0u8; 4096]; // the borrowed byte buffer - let mut transport = Transport::new(&mut packet_buffer, behavior); - let (mut uart_tx, mut uart_rx) = uart.split(); + println!("Entering connection_loop and prog_loop is next..."); loop { - let channel = transport.accept().await; - let mut channel = match channel { - Err(e) => { - println!("Error accepting request: {:?}", e); - return Ok(()); // TODO: Handy for quick iteration, not ideal for production. - // in any case, it shouldn't panic when client disconnects and - // there's a unexpected EOF. + let mut ph = ProgressHolder::new(); + let ev = serv.progress(&mut ph).await?; + dbg!(&ev); + #[allow(unreachable_patterns)] + match ev { + ServEvent::SessionShell(a) => { + if let Some(ch) = session.take() { + a.succeed()?; + dbg!("We got shell"); + let _ = chan_pipe.try_send(ch); + } else { + a.fail()?; + } } - Ok(channel) => channel, - }; - - println!( - "Request {:?} by user {:?} from client {:?}", - channel.request(), - channel.user(), - channel.client_ssh_id_string() - ); - - match channel.request() { - Request::Exec(ExampleCommand::Echo) => { - // This shows how you need to buffer yourself if you need to interleave - // reads and writes to the channel because the packet buffer is shared. - - let mut buffer = [0u8; 4096]; - - loop { - let read_len = channel.read_exact_stdin(&mut buffer).await?; - - if read_len == 0 { - break; - } - - channel.write_all_stdout(&buffer[..read_len]).await?; + ServEvent::FirstAuth(ref a) => { + // record the username + if username.lock().await.push_str(a.username()?).is_err() { + println!("Too long username") } - - channel.exit(0).await?; } - - Request::Exec(ExampleCommand::Invalid) => { - channel - .write_all_stderr(b"Sorry, your command was not recognized!\n") - .await?; - channel.exit(1).await?; + ServEvent::Hostkeys(h) => { + let signkey: SignKey = SignKey::from_openssh(keys::HOST_SECRET_KEY)?; + h.hostkeys(&[&signkey])?; } - - Request::Shell => { - // TODO: Adjust arbitrary buffer length to a more reasoned value? - let mut ssh_reader = channel.reader(Some(4096)).await?; - // TODO: How to borrow the channel on r/w *and* mutable? - let mut ssh_writer = channel.writer(Pipe::Stdout); - - loop { - let ssh_data = ssh_reader.read().await?.unwrap(); - let ssh_data_w = ssh_writer.buffer(); - dbg!(ssh_data); - - let bytes_written_rx = uart_rx.write_async(&ssh_data).await.unwrap(); - dbg!(bytes_written_rx); - - let bytes_read_tx = uart_tx.read_async(ssh_data_w).await.unwrap(); - dbg!(bytes_read_tx); + ServEvent::PasswordAuth(a) => { + a.allow()?; + } + ServEvent::PubkeyAuth(a) => { + a.allow()?; + } + ServEvent::OpenSession(a) => { + match session { + Some(_) => { + todo!("Can't have two sessions"); + } + None => { + // Track the session + session = Some(a.accept()?); + } } } + ServEvent::SessionPty(a) => { + a.succeed()?; + } + ServEvent::SessionExec(a) => { + a.fail()?; + } + ServEvent::Defunct | ServEvent::SessionShell(_) => { + println!("Expected caller to handle event"); + error::BadUsage.fail()? + } + ServEvent::PollAgain => (), + ServEvent::SessionSubsystem(_) => (), } } } -pub async fn start(spawner: Spawner) -> Result<(), EspSshError> { - // Bring up the network interface and start accepting SSH connections. - let tcp_stack = if_up(spawner).await?; +pub(crate) async fn handle_ssh_client( + stream: &mut TcpSocket<'_>, + uart: &BufferedUart, +) -> Result<(), sunset::Error> { + // Spawn network tasks to handle incoming connections with demo_common::session() + let mut inbuf = [0u8; 4096]; + let mut outbuf = [0u8; 4096]; + + let ssh_server = SSHServer::new(&mut inbuf, &mut outbuf); + let (mut rsock, mut wsock) = stream.split(); + + let chan_pipe = Channel::::new(); + + println!("Calling connection_loop from handle_ssh_client"); + let conn_loop = connection_loop(&ssh_server, &chan_pipe); + println!("Running server from handle_ssh_client()"); + let server = ssh_server.run(&mut rsock, &mut wsock); + + println!("Setting up serial bridge"); + let bridge = async { + let ch = chan_pipe.receive().await; + let stdio = ssh_server.stdio(ch).await?; + let stdio2 = stdio.clone(); + serial_bridge(stdio, stdio2, uart).await + }; - // Connect to the serial port - // TODO: Revisit Result/error.rs wrapping here... - // TODO: Detection and/or resonable defaults for UART settings... or: - // - Make it configurable via settings.rs for now, but ideally... - // - ... do what https://keypub.sh does via alternative commands - // - let uart = uart_up().await?; + println!("Main select() in handle_ssh_client()"); + match select3(conn_loop, server, bridge).await { + Either3::First(r) => r, + Either3::Second(r) => r, + Either3::Third(r) => r, + }?; - accept_requests(tcp_stack, uart).await?; - // All is fine :) Ok(()) } diff --git a/src/settings.rs b/src/settings.rs index 412ffa3..098e322 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -3,8 +3,8 @@ // SSH server settings //pub(crate) const MTU: usize = 1536; //pub(crate) const PORT: u16 = 22; -pub(crate) const SERVER_ID: &str = "SSH-2.0-esp-ssh-rs-0.1"; +pub(crate) const _SERVER_ID: &str = "SSH-2.0-ssh-stamp-0.1"; // UART settings //pub(crate) const BAUD_RATE: u32 = 115200; -//pub(crate) const UART_SETTINGS: &str = "8N1"; \ No newline at end of file +//pub(crate) const UART_SETTINGS: &str = "8N1";