From 5f47efbfd83a13844b62e86f45ce3e92157372d4 Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Sat, 3 Dec 2022 00:06:10 +0800
Subject: [PATCH] Add zeroize

embassy picow demo fails to compile probably due to recent async
changes.

switch to custom branch for salty
---
 Cargo.toml                              |  17 +-
 embassy/demos/picow/Cargo.lock          | 280 ++++------------
 embassy/demos/picow/rust-toolchain.toml |   2 +-
 embassy/demos/std/Cargo.lock            | 407 +++++++-----------------
 embassy/demos/std/rust-toolchain.toml   |   2 +-
 src/conn.rs                             |   9 +-
 src/encrypt.rs                          |  11 +-
 src/kex.rs                              |   8 +-
 src/packets.rs                          |   1 +
 src/sign.rs                             |   5 +-
 src/ssh_chapoly.rs                      |   3 +-
 11 files changed, 209 insertions(+), 536 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 06a629b..a5c48ae 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -39,18 +39,20 @@ ascii = { version = "1.0", default-features = false }
 rand = { version = "0.8", default-features = false }
 rand_core = { version = "0.6", default-features = false }
 
-ctr = "0.9"
-aes = "0.8"
+ctr = { version = "0.9", features = ["zeroize"] }
+aes = { version = "0.8", features = ["zeroize"] }
+chacha20 = { version = "0.9", features = ["zeroize"] }
 sha2 = { version = "0.10", default-features = false }
 hmac = "0.12"
+poly1305 = "0.7"
 digest = "0.10"
 signature = { version = "1.4", default-features = false }
-chacha20 = "0.9"
-poly1305 = "0.7"
+zeroize = { version = "1", default-features = false, features = ["derive"] }
+cipher = { version = "0.4", features = ["zeroize"] }
 # ed25519/x25519
-salty = { version = "0.2", git = "https://github.com/mkj/salty", branch = "parts" }
-# could be optional? though isn't linked if openssh keys aren't loaded
-ssh-key = { version = "0.4", default-features = false, features = ["ed25519", "ecdsa", "sha2"] }
+# fork allows hashing by parts (sign/verify from sshwire), and zeroize
+salty = { version = "0.2", git = "https://github.com/mkj/salty", branch = "sunset" }
+ssh-key = { version = "0.5", default-features = false, optional = true }
 
 # for debug printing
 pretty-hex = { version = "0.3", default-features = false }
@@ -61,6 +63,7 @@ async-trait = { version = "0.1", optional = true }
 default = [ "getrandom" ]
 std = ["async-trait", "snafu/std"]
 # tokio-queue = ["dep:tokio"]
+openssh-key = ["ssh-key"]
 
 getrandom = ["rand/getrandom"]
 
diff --git a/embassy/demos/picow/Cargo.lock b/embassy/demos/picow/Cargo.lock
index c9e083d..82d90c5 100644
--- a/embassy/demos/picow/Cargo.lock
+++ b/embassy/demos/picow/Cargo.lock
@@ -11,15 +11,7 @@ dependencies = [
  "cfg-if",
  "cipher",
  "cpufeatures",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "0.7.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
-dependencies = [
- "memchr",
+ "zeroize",
 ]
 
 [[package]]
@@ -51,11 +43,11 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
 
 [[package]]
 name = "atomic-polyfill"
-version = "0.1.10"
+version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c041a8d9751a520ee19656232a18971f18946a7900f1520ee4400002244dd89"
+checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28"
 dependencies = [
- "critical-section 0.2.7",
+ "critical-section 1.1.1",
 ]
 
 [[package]]
@@ -100,18 +92,6 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603"
 
-[[package]]
-name = "base64ct"
-version = "1.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf"
-
-[[package]]
-name = "bit_field"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
-
 [[package]]
 name = "bitfield"
 version = "0.13.2"
@@ -124,15 +104,6 @@ version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array 0.14.6",
-]
-
 [[package]]
 name = "block-buffer"
 version = "0.10.3"
@@ -151,16 +122,16 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 [[package]]
 name = "caprand"
 version = "0.1.0"
-source = "git+https://github.com/mkj/caprand#ddd00562d65a9750136dbde53d30773797906801"
+source = "git+https://github.com/mkj/caprand#648d3bfa9e563380dce0aeb780b91e7f2a70cbdc"
 dependencies = [
  "cortex-m",
  "critical-section 1.1.1",
  "embassy-rp",
- "embassy-time",
  "getrandom",
  "log",
+ "rand",
  "rand_chacha",
- "sha2 0.10.6",
+ "sha2",
 ]
 
 [[package]]
@@ -188,14 +159,9 @@ checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e"
 dependencies = [
  "crypto-common",
  "inout",
+ "zeroize",
 ]
 
-[[package]]
-name = "const-oid"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3"
-
 [[package]]
 name = "cortex-m"
 version = "0.7.6"
@@ -211,9 +177,9 @@ dependencies = [
 
 [[package]]
 name = "cortex-m-rt"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c433da385b720d5bb9f52362fa2782420798e68d40d67bfe4b0d992aba5dfe7"
+checksum = "d6d3328b8b5534f0c90acd66b68950f2763b37e0173cac4d8b4937c4a80761f9"
 dependencies = [
  "cortex-m-rt-macros",
 ]
@@ -240,14 +206,12 @@ dependencies = [
 
 [[package]]
 name = "critical-section"
-version = "0.2.7"
+version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95da181745b56d4bd339530ec393508910c909c784e8962d15d722bacf0bcbcd"
+checksum = "c1706d332edc22aef4d9f23a6bb1c92360a403013c291af51247a737472dcae6"
 dependencies = [
  "bare-metal 1.0.0",
- "cfg-if",
- "cortex-m",
- "riscv",
+ "critical-section 1.1.1",
 ]
 
 [[package]]
@@ -275,25 +239,12 @@ dependencies = [
  "cipher",
 ]
 
-[[package]]
-name = "curve25519-dalek"
-version = "3.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0"
-dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
- "subtle",
- "zeroize",
-]
-
 [[package]]
 name = "cyw43"
 version = "0.1.0"
-source = "git+https://github.com/embassy-rs/cyw43/#8a81114baf4ffe12ec54e80e342f098c596177d1"
+source = "git+https://github.com/embassy-rs/cyw43/#432240162ac4131aca8aa7de61d83492f2fe3d32"
 dependencies = [
- "atomic-polyfill 0.1.10",
+ "atomic-polyfill 0.1.11",
  "cortex-m",
  "cortex-m-rt",
  "defmt",
@@ -302,7 +253,7 @@ dependencies = [
  "embassy-sync",
  "embassy-time",
  "embedded-hal 1.0.0-alpha.9",
- "embedded-hal-async",
+ "embedded-hal-async 0.2.0-alpha.0",
  "futures",
  "num_enum",
 ]
@@ -377,35 +328,17 @@ version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1d2cbbbd58847d508d97629b32cd9730a2d28532f71e219714614406029f18b1"
 dependencies = [
- "critical-section 0.2.7",
+ "critical-section 0.2.8",
  "defmt",
 ]
 
-[[package]]
-name = "der"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c"
-dependencies = [
- "const-oid",
-]
-
 [[package]]
 name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array 0.14.6",
-]
-
-[[package]]
-name = "digest"
-version = "0.10.5"
+version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.3",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
@@ -425,18 +358,6 @@ dependencies = [
  "signature",
 ]
 
-[[package]]
-name = "ed25519-dalek"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
-dependencies = [
- "curve25519-dalek",
- "ed25519",
- "sha2 0.9.9",
- "zeroize",
-]
-
 [[package]]
 name = "embassy-cortex-m"
 version = "0.1.0"
@@ -460,7 +381,7 @@ dependencies = [
  "embassy-sync",
  "embedded-hal 0.2.7",
  "embedded-hal 1.0.0-alpha.9",
- "embedded-hal-async",
+ "embedded-hal-async 0.1.0-alpha.3",
  "embedded-storage",
  "embedded-storage-async",
  "nb 1.0.0",
@@ -545,7 +466,7 @@ dependencies = [
  "embassy-usb-driver",
  "embedded-hal 0.2.7",
  "embedded-hal 1.0.0-alpha.9",
- "embedded-hal-async",
+ "embedded-hal-async 0.1.0-alpha.3",
  "embedded-hal-nb",
  "embedded-io",
  "embedded-storage",
@@ -615,6 +536,15 @@ dependencies = [
  "embedded-hal 1.0.0-alpha.9",
 ]
 
+[[package]]
+name = "embedded-hal-async"
+version = "0.2.0-alpha.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "608a322808d65da06715e03109c0cb69f79a5459af756fba393ab83e875d4969"
+dependencies = [
+ "embedded-hal 1.0.0-alpha.9",
+]
+
 [[package]]
 name = "embedded-hal-nb"
 version = "1.0.0-alpha.1"
@@ -782,7 +712,7 @@ version = "0.7.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743"
 dependencies = [
- "atomic-polyfill 0.1.10",
+ "atomic-polyfill 0.1.11",
  "hash32",
  "rustc_version 0.4.0",
  "spin",
@@ -801,7 +731,7 @@ version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.5",
+ "digest",
 ]
 
 [[package]]
@@ -819,12 +749,6 @@ dependencies = [
  "generic-array 0.14.6",
 ]
 
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
 [[package]]
 name = "libc"
 version = "0.2.137"
@@ -856,12 +780,6 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
 
-[[package]]
-name = "memchr"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
-
 [[package]]
 name = "menu"
 version = "0.3.2"
@@ -939,15 +857,6 @@ dependencies = [
  "defmt",
 ]
 
-[[package]]
-name = "pem-rfc7468"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac"
-dependencies = [
- "base64ct",
-]
-
 [[package]]
 name = "pin-project-lite"
 version = "0.2.9"
@@ -973,9 +882,9 @@ dependencies = [
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.16"
+version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 
 [[package]]
 name = "pretty-hex"
@@ -1031,7 +940,7 @@ version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -1041,15 +950,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-
 [[package]]
 name = "rand_core"
 version = "0.6.4"
@@ -1059,44 +962,6 @@ dependencies = [
  "getrandom",
 ]
 
-[[package]]
-name = "regex"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
-
-[[package]]
-name = "riscv"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6907ccdd7a31012b70faf2af85cd9e5ba97657cc3987c4f13f8e4d2c2a088aba"
-dependencies = [
- "bare-metal 1.0.0",
- "bit_field",
- "riscv-target",
-]
-
-[[package]]
-name = "riscv-target"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88aa938cda42a0cf62a20cfe8d139ff1af20c2e681212b5b34adb5a58333f222"
-dependencies = [
- "lazy_static",
- "regex",
-]
-
 [[package]]
 name = "rp2040-pac2"
 version = "0.1.0"
@@ -1127,9 +992,9 @@ dependencies = [
 [[package]]
 name = "salty"
 version = "0.2.0"
-source = "git+https://github.com/mkj/salty?branch=parts#5005b15bf53785714d8e6114c105a8757107f824"
+source = "git+https://github.com/mkj/salty?branch=sunset#89ba100e03a6ffe7f95e7ac60cabfb9e535be03b"
 dependencies = [
- "digest 0.10.5",
+ "digest",
  "ed25519",
  "subtle",
  "zeroize",
@@ -1141,16 +1006,6 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
-[[package]]
-name = "sec1"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1"
-dependencies = [
- "der",
- "generic-array 0.14.6",
-]
-
 [[package]]
 name = "semver"
 version = "0.9.0"
@@ -1172,19 +1027,6 @@ version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
-[[package]]
-name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
 [[package]]
 name = "sha2"
 version = "0.10.6"
@@ -1193,7 +1035,7 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.5",
+ "digest",
 ]
 
 [[package]]
@@ -1246,21 +1088,6 @@ dependencies = [
  "lock_api",
 ]
 
-[[package]]
-name = "ssh-key"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f02d3730e8785e797a4552137d1acc0d7f7146dad3b5fe65ed83637711dfc6c5"
-dependencies = [
- "base64ct",
- "ed25519-dalek",
- "pem-rfc7468",
- "rand_core 0.6.4",
- "sec1",
- "sha2 0.10.6",
- "zeroize",
-]
-
 [[package]]
 name = "stable_deref_trait"
 version = "1.2.0"
@@ -1295,8 +1122,9 @@ dependencies = [
  "aes",
  "ascii",
  "chacha20",
+ "cipher",
  "ctr",
- "digest 0.10.5",
+ "digest",
  "heapless",
  "hmac",
  "log",
@@ -1304,20 +1132,20 @@ dependencies = [
  "poly1305",
  "pretty-hex",
  "rand",
- "rand_core 0.6.4",
+ "rand_core",
  "salty",
- "sha2 0.10.6",
+ "sha2",
  "signature",
  "snafu",
- "ssh-key",
  "sunset-sshwire-derive",
+ "zeroize",
 ]
 
 [[package]]
 name = "sunset-demo-embassy-picow"
 version = "0.1.0"
 dependencies = [
- "atomic-polyfill 0.1.10",
+ "atomic-polyfill 0.1.11",
  "caprand",
  "cortex-m",
  "cortex-m-rt",
@@ -1332,7 +1160,7 @@ dependencies = [
  "embassy-sync",
  "embassy-time",
  "embedded-hal 1.0.0-alpha.9",
- "embedded-hal-async",
+ "embedded-hal-async 0.1.0-alpha.3",
  "embedded-io",
  "futures",
  "getrandom",
@@ -1341,7 +1169,7 @@ dependencies = [
  "panic-probe",
  "pin-utils",
  "rand",
- "sha2 0.10.6",
+ "sha2",
  "static_cell",
  "sunset",
  "sunset-embassy",
@@ -1368,9 +1196,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "1.0.103"
+version = "1.0.105"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
+checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1458,18 +1286,18 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "zeroize"
-version = "1.3.0"
+version = "1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd"
+checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
 dependencies = [
  "zeroize_derive",
 ]
 
 [[package]]
 name = "zeroize_derive"
-version = "1.3.2"
+version = "1.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17"
+checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/embassy/demos/picow/rust-toolchain.toml b/embassy/demos/picow/rust-toolchain.toml
index a35a11b..ffbcbd6 100644
--- a/embassy/demos/picow/rust-toolchain.toml
+++ b/embassy/demos/picow/rust-toolchain.toml
@@ -1,7 +1,7 @@
 # Before upgrading check that everything is available on all tier1 targets here:
 # https://rust-lang.github.io/rustup-components-history
 [toolchain]
-channel = "nightly-2022-09-22"
+channel = "nightly-2022-11-22"
 components = [ "rust-src", "rustfmt" ]
 targets = [
     "thumbv6m-none-eabi",
diff --git a/embassy/demos/std/Cargo.lock b/embassy/demos/std/Cargo.lock
index 6f8387f..c21300f 100644
--- a/embassy/demos/std/Cargo.lock
+++ b/embassy/demos/std/Cargo.lock
@@ -11,13 +11,14 @@ dependencies = [
  "cfg-if",
  "cipher",
  "cpufeatures",
+ "zeroize",
 ]
 
 [[package]]
 name = "aho-corasick"
-version = "0.7.19"
+version = "0.7.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
 dependencies = [
  "memchr",
 ]
@@ -51,9 +52,9 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
 
 [[package]]
 name = "async-io"
-version = "1.10.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8121296a9f05be7f34aa4196b1747243b3b62e048bb7906f644f3fbfc490cf7"
+checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794"
 dependencies = [
  "async-lock",
  "autocfg",
@@ -66,7 +67,7 @@ dependencies = [
  "slab",
  "socket2",
  "waker-fn",
- "winapi",
+ "windows-sys",
 ]
 
 [[package]]
@@ -81,11 +82,11 @@ dependencies = [
 
 [[package]]
 name = "atomic-polyfill"
-version = "0.1.10"
+version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c041a8d9751a520ee19656232a18971f18946a7900f1520ee4400002244dd89"
+checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28"
 dependencies = [
- "critical-section 0.2.7",
+ "critical-section",
 ]
 
 [[package]]
@@ -94,7 +95,7 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d299f547288d6db8d5c3a2916f7b2f66134b15b8c1ac1c4357dd3b8752af7bb2"
 dependencies = [
- "critical-section 1.1.1",
+ "critical-section",
 ]
 
 [[package]]
@@ -126,54 +127,12 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
-[[package]]
-name = "bare-metal"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3"
-dependencies = [
- "rustc_version 0.2.3",
-]
-
-[[package]]
-name = "bare-metal"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603"
-
-[[package]]
-name = "base64ct"
-version = "1.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf"
-
-[[package]]
-name = "bit_field"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
-
-[[package]]
-name = "bitfield"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
-
 [[package]]
 name = "bitflags"
 version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array 0.14.6",
-]
-
 [[package]]
 name = "block-buffer"
 version = "0.10.3"
@@ -189,17 +148,11 @@ version = "1.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 
-[[package]]
-name = "cache-padded"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
-
 [[package]]
 name = "cc"
-version = "1.0.74"
+version = "1.0.77"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574"
+checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4"
 
 [[package]]
 name = "cfg-if"
@@ -226,33 +179,16 @@ checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e"
 dependencies = [
  "crypto-common",
  "inout",
+ "zeroize",
 ]
 
 [[package]]
 name = "concurrent-queue"
-version = "1.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c"
-dependencies = [
- "cache-padded",
-]
-
-[[package]]
-name = "const-oid"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3"
-
-[[package]]
-name = "cortex-m"
-version = "0.7.6"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70858629a458fdfd39f9675c4dc309411f2a3f83bede76988d81bf1a0ecee9e0"
+checksum = "bd7bef69dc86e3c610e4e7aed41035e2a7ed12e72dd7530f61327a6579a4390b"
 dependencies = [
- "bare-metal 0.2.5",
- "bitfield",
- "embedded-hal 0.2.7",
- "volatile-register",
+ "crossbeam-utils",
 ]
 
 [[package]]
@@ -266,21 +202,18 @@ dependencies = [
 
 [[package]]
 name = "critical-section"
-version = "0.2.7"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95da181745b56d4bd339530ec393508910c909c784e8962d15d722bacf0bcbcd"
-dependencies = [
- "bare-metal 1.0.0",
- "cfg-if",
- "cortex-m",
- "riscv",
-]
+checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52"
 
 [[package]]
-name = "critical-section"
-version = "1.1.1"
+name = "crossbeam-utils"
+version = "0.8.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52"
+checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+dependencies = [
+ "cfg-if",
+]
 
 [[package]]
 name = "crypto-common"
@@ -301,19 +234,6 @@ dependencies = [
  "cipher",
 ]
 
-[[package]]
-name = "curve25519-dalek"
-version = "3.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0"
-dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
- "subtle",
- "zeroize",
-]
-
 [[package]]
 name = "darling"
 version = "0.13.4"
@@ -378,31 +298,13 @@ version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0db23d29972d99baa3de2ee2ae3f104c10564a6d05a346eb3f4c4f2c0525a06e"
 
-[[package]]
-name = "der"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c"
-dependencies = [
- "const-oid",
-]
-
 [[package]]
 name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array 0.14.6",
-]
-
-[[package]]
-name = "digest"
-version = "0.10.5"
+version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.3",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
@@ -422,18 +324,6 @@ dependencies = [
  "signature",
 ]
 
-[[package]]
-name = "ed25519-dalek"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
-dependencies = [
- "curve25519-dalek",
- "ed25519",
- "sha2 0.9.9",
- "zeroize",
-]
-
 [[package]]
 name = "embassy-executor"
 version = "0.1.0"
@@ -441,7 +331,7 @@ source = "git+https://github.com/embassy-rs/embassy?rev=61be0e75c83961a42fc1d844
 dependencies = [
  "atomic-polyfill 1.0.1",
  "cfg-if",
- "critical-section 1.1.1",
+ "critical-section",
  "embassy-macros",
  "embassy-time",
  "futures-util",
@@ -491,7 +381,7 @@ source = "git+https://github.com/embassy-rs/embassy?rev=61be0e75c83961a42fc1d844
 dependencies = [
  "atomic-polyfill 1.0.1",
  "cfg-if",
- "critical-section 1.1.1",
+ "critical-section",
  "embedded-io",
  "futures-util",
  "heapless",
@@ -504,7 +394,7 @@ source = "git+https://github.com/embassy-rs/embassy?rev=61be0e75c83961a42fc1d844
 dependencies = [
  "atomic-polyfill 1.0.1",
  "cfg-if",
- "critical-section 1.1.1",
+ "critical-section",
  "embassy-sync",
  "embedded-hal 0.2.7",
  "futures-util",
@@ -548,9 +438,9 @@ dependencies = [
 
 [[package]]
 name = "env_logger"
-version = "0.9.1"
+version = "0.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272"
+checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
 dependencies = [
  "atty",
  "humantime",
@@ -722,9 +612,9 @@ version = "0.7.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743"
 dependencies = [
- "atomic-polyfill 0.1.10",
+ "atomic-polyfill 0.1.11",
  "hash32",
- "rustc_version 0.4.0",
+ "rustc_version",
  "spin",
  "stable_deref_trait",
 ]
@@ -750,7 +640,7 @@ version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.5",
+ "digest",
 ]
 
 [[package]]
@@ -783,12 +673,6 @@ dependencies = [
  "cfg-if",
 ]
 
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
 [[package]]
 name = "libc"
 version = "0.2.137"
@@ -870,15 +754,6 @@ version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
 
-[[package]]
-name = "pem-rfc7468"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac"
-dependencies = [
- "base64ct",
-]
-
 [[package]]
 name = "pin-project-lite"
 version = "0.2.9"
@@ -893,16 +768,16 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 [[package]]
 name = "polling"
-version = "2.4.0"
+version = "2.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab4609a838d88b73d8238967b60dd115cc08d38e2bbaf51ee1e4b695f89122e2"
+checksum = "166ca89eb77fd403230b9c156612965a81e094ec6ec3aa13663d4c8b113fa748"
 dependencies = [
  "autocfg",
  "cfg-if",
  "libc",
  "log",
  "wepoll-ffi",
- "winapi",
+ "windows-sys",
 ]
 
 [[package]]
@@ -970,15 +845,9 @@ version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-
 [[package]]
 name = "rand_core"
 version = "0.6.4"
@@ -990,9 +859,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.6.0"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
+checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1001,39 +870,9 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
-
-[[package]]
-name = "riscv"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6907ccdd7a31012b70faf2af85cd9e5ba97657cc3987c4f13f8e4d2c2a088aba"
-dependencies = [
- "bare-metal 1.0.0",
- "bit_field",
- "riscv-target",
-]
-
-[[package]]
-name = "riscv-target"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88aa938cda42a0cf62a20cfe8d139ff1af20c2e681212b5b34adb5a58333f222"
-dependencies = [
- "lazy_static",
- "regex",
-]
-
-[[package]]
-name = "rustc_version"
-version = "0.2.3"
+version = "0.6.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-dependencies = [
- "semver 0.9.0",
-]
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
 
 [[package]]
 name = "rustc_version"
@@ -1041,15 +880,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
 dependencies = [
- "semver 1.0.14",
+ "semver",
 ]
 
 [[package]]
 name = "salty"
 version = "0.2.0"
-source = "git+https://github.com/mkj/salty?branch=parts#5005b15bf53785714d8e6114c105a8757107f824"
+source = "git+https://github.com/mkj/salty?branch=sunset#89ba100e03a6ffe7f95e7ac60cabfb9e535be03b"
 dependencies = [
- "digest 0.10.5",
+ "digest",
  "ed25519",
  "subtle",
  "zeroize",
@@ -1061,50 +900,12 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
-[[package]]
-name = "sec1"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1"
-dependencies = [
- "der",
- "generic-array 0.14.6",
-]
-
-[[package]]
-name = "semver"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
-dependencies = [
- "semver-parser",
-]
-
 [[package]]
 name = "semver"
 version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4"
 
-[[package]]
-name = "semver-parser"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-
-[[package]]
-name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
 [[package]]
 name = "sha2"
 version = "0.10.6"
@@ -1113,7 +914,7 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.5",
+ "digest",
 ]
 
 [[package]]
@@ -1184,21 +985,6 @@ dependencies = [
  "lock_api",
 ]
 
-[[package]]
-name = "ssh-key"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f02d3730e8785e797a4552137d1acc0d7f7146dad3b5fe65ed83637711dfc6c5"
-dependencies = [
- "base64ct",
- "ed25519-dalek",
- "pem-rfc7468",
- "rand_core 0.6.4",
- "sec1",
- "sha2 0.10.6",
- "zeroize",
-]
-
 [[package]]
 name = "stable_deref_trait"
 version = "1.2.0"
@@ -1233,8 +1019,9 @@ dependencies = [
  "aes",
  "ascii",
  "chacha20",
+ "cipher",
  "ctr",
- "digest 0.10.5",
+ "digest",
  "heapless",
  "hmac",
  "log",
@@ -1242,13 +1029,13 @@ dependencies = [
  "poly1305",
  "pretty-hex",
  "rand",
- "rand_core 0.6.4",
+ "rand_core",
  "salty",
- "sha2 0.10.6",
+ "sha2",
  "signature",
  "snafu",
- "ssh-key",
  "sunset-sshwire-derive",
+ "zeroize",
 ]
 
 [[package]]
@@ -1256,8 +1043,8 @@ name = "sunset-demo-embassy-std"
 version = "0.1.0"
 dependencies = [
  "async-io",
- "atomic-polyfill 0.1.10",
- "critical-section 1.1.1",
+ "atomic-polyfill 0.1.11",
+ "critical-section",
  "embassy-executor",
  "embassy-futures",
  "embassy-net",
@@ -1273,7 +1060,7 @@ dependencies = [
  "log",
  "menu",
  "rand",
- "sha2 0.10.6",
+ "sha2",
  "static_cell",
  "sunset",
  "sunset-embassy",
@@ -1300,9 +1087,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "1.0.103"
+version = "1.0.105"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
+checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1358,12 +1145,6 @@ dependencies = [
  "subtle",
 ]
 
-[[package]]
-name = "vcell"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002"
-
 [[package]]
 name = "version_check"
 version = "0.9.4"
@@ -1382,15 +1163,6 @@ version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 
-[[package]]
-name = "volatile-register"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6"
-dependencies = [
- "vcell",
-]
-
 [[package]]
 name = "waker-fn"
 version = "1.1.0"
@@ -1443,20 +1215,77 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+
 [[package]]
 name = "zeroize"
-version = "1.3.0"
+version = "1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd"
+checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
 dependencies = [
  "zeroize_derive",
 ]
 
 [[package]]
 name = "zeroize_derive"
-version = "1.3.2"
+version = "1.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17"
+checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/embassy/demos/std/rust-toolchain.toml b/embassy/demos/std/rust-toolchain.toml
index a35a11b..ffbcbd6 100644
--- a/embassy/demos/std/rust-toolchain.toml
+++ b/embassy/demos/std/rust-toolchain.toml
@@ -1,7 +1,7 @@
 # Before upgrading check that everything is available on all tier1 targets here:
 # https://rust-lang.github.io/rustup-components-history
 [toolchain]
-channel = "nightly-2022-09-22"
+channel = "nightly-2022-11-22"
 components = [ "rust-src", "rustfmt" ]
 targets = [
     "thumbv6m-none-eabi",
diff --git a/src/conn.rs b/src/conn.rs
index 465a255..d63b346 100644
--- a/src/conn.rs
+++ b/src/conn.rs
@@ -8,7 +8,6 @@ use core::char::MAX;
 use core::task::{Waker,Poll};
 
 use pretty_hex::PrettyHex;
-
 use heapless::Vec;
 
 use crate::*;
@@ -288,9 +287,11 @@ impl Conn {
                 match self.state {
                     ConnState::InKex { done_auth, ref mut output } => {
                         // NewKeys shouldn't be received before kexdhinit/kexdhreply
-                        let output = output.take().ok_or(Error::PacketWrong)?;
-                        s.rekey(output.keys);
-                        self.sess_id.get_or_insert(output.h);
+                        let mut ko = output.take().ok_or(Error::PacketWrong)?;
+                        s.rekey(ko.keys.take().trap()?);
+                        self.sess_id.get_or_insert(ko.h.clone());
+                        // force ZeroizeOnDrop to run
+                        *output = Default::default();
                         self.state = if done_auth {
                             ConnState::Authed
                         } else {
diff --git a/src/encrypt.rs b/src/encrypt.rs
index fd73c50..fb0f197 100644
--- a/src/encrypt.rs
+++ b/src/encrypt.rs
@@ -6,12 +6,13 @@ use {
     log::{debug, error, info, log, trace, warn},
 };
 
-use aes::{cipher::{BlockSizeUser, KeyIvInit, KeySizeUser, StreamCipher}, Aes256};
 use core::num::Wrapping;
-use pretty_hex::PrettyHex;
 use core::fmt;
 use core::fmt::Debug;
 
+use aes::{cipher::{BlockSizeUser, KeyIvInit, KeySizeUser, StreamCipher}, Aes256};
+use pretty_hex::PrettyHex;
+use zeroize::ZeroizeOnDrop;
 use hmac::{Hmac, Mac};
 use sha2::Digest as Sha2DigestForTrait;
 
@@ -133,12 +134,14 @@ impl KeyState {
     }
 }
 
-#[derive(Debug)]
+#[derive(Debug, ZeroizeOnDrop)]
 pub(crate) struct Keys {
     pub(crate) enc: EncKey,
     pub(crate) dec: DecKey,
 
+    #[zeroize(skip)]
     pub(crate) integ_enc: IntegKey,
+    #[zeroize(skip)]
     pub(crate) integ_dec: IntegKey,
 }
 
@@ -529,6 +532,7 @@ impl Cipher {
     }
 }
 
+#[derive(ZeroizeOnDrop)]
 pub(crate) enum EncKey {
     ChaPoly(SSHChaPoly),
     Aes256Ctr(Aes256Ctr32BE),
@@ -581,6 +585,7 @@ impl EncKey {
     }
 }
 
+#[derive(ZeroizeOnDrop)]
 pub(crate) enum DecKey {
     ChaPoly(SSHChaPoly),
     Aes256Ctr(Aes256Ctr32BE),
diff --git a/src/kex.rs b/src/kex.rs
index c04770f..252c79e 100644
--- a/src/kex.rs
+++ b/src/kex.rs
@@ -10,6 +10,7 @@ use core::fmt;
 
 use sha2::Sha256;
 use digest::Digest;
+use zeroize::{Zeroize, ZeroizeOnDrop};
 
 use crate::*;
 use encrypt::{Cipher, Integ, Keys};
@@ -382,7 +383,7 @@ impl Kex {
     }
 }
 
-#[derive(Debug)]
+#[derive(Debug, ZeroizeOnDrop)]
 pub(crate) enum SharedSecret {
     KexCurve25519(KexCurve25519),
     // ECDH?
@@ -488,7 +489,7 @@ impl SharedSecret {
 
 pub(crate) struct KexOutput {
     pub h: SessId,
-    pub keys: Keys,
+    pub keys: Option<Keys>,
 }
 
 impl fmt::Debug for KexOutput {
@@ -505,13 +506,14 @@ impl<'a> KexOutput {
         let h = kex_hash.finish(k);
 
         let sess_id = sess_id.as_ref().unwrap_or(&h);
-        let keys = Keys::new_from(k, &h, &sess_id, algos)?;
+        let keys = Some(Keys::new_from(k, &h, &sess_id, algos)?);
 
         Ok(KexOutput { h, keys })
     }
 
 }
 
+#[derive(ZeroizeOnDrop)]
 pub(crate) struct KexCurve25519 {
     // Initialised in `new()`, cleared after deriving the secret
     ours: Option<salty::agreement::SecretKey>,
diff --git a/src/packets.rs b/src/packets.rs
index c469b31..2a46875 100644
--- a/src/packets.rs
+++ b/src/packets.rs
@@ -253,6 +253,7 @@ impl<'a> PubKey<'a> {
         }
     }
 
+    #[cfg(feature = "openssh-key")]
     pub fn matches_openssh(&self, k: &str) -> Result<bool> {
         let k = ssh_key::PublicKey::from_openssh(k)
             .map_err(|_| {
diff --git a/src/sign.rs b/src/sign.rs
index 3ddef7d..f0892d2 100644
--- a/src/sign.rs
+++ b/src/sign.rs
@@ -7,6 +7,7 @@ use {
 
 use salty::{SecretKey, PublicKey};
 use signature::Verifier;
+use zeroize::ZeroizeOnDrop;
 
 use crate::*;
 use packets::ParseContext;
@@ -125,6 +126,7 @@ pub enum KeyType {
 /// A SSH signing key. This may hold the private part locally
 /// or could potentially send the signing requests to a SSH agent
 /// or other entitiy.
+#[derive(ZeroizeOnDrop)]
 pub enum SignKey {
     Ed25519(salty::Keypair),
 }
@@ -148,6 +150,7 @@ impl SignKey {
         }
     }
 
+    #[cfg(feature = "openssh-key")]
     pub fn from_openssh(k: impl AsRef<[u8]>) -> Result<Self> {
         let k = ssh_key::PrivateKey::from_openssh(k)
             .map_err(|_| {
@@ -177,7 +180,7 @@ impl SignKey {
     }
 }
 
-// TODO: this might go behind a feature?
+#[cfg(feature = "openssh-key")]
 impl TryFrom<ssh_key::PrivateKey> for SignKey {
     type Error = Error;
     fn try_from(k: ssh_key::PrivateKey) -> Result<Self> {
diff --git a/src/ssh_chapoly.rs b/src/ssh_chapoly.rs
index d23e068..1e6ba76 100644
--- a/src/ssh_chapoly.rs
+++ b/src/ssh_chapoly.rs
@@ -9,11 +9,12 @@ use chacha20::cipher::{KeyIvInit, StreamCipher, StreamCipherSeek, StreamCipherSe
 use poly1305::Poly1305;
 use poly1305::universal_hash::{NewUniversalHash, UniversalHash};
 use poly1305::universal_hash::generic_array::GenericArray;
-
+use zeroize::{Zeroize, ZeroizeOnDrop};
 
 use crate::*;
 use encrypt::SSH_LENGTH_SIZE;
 
+#[derive(Zeroize, ZeroizeOnDrop)]
 pub struct SSHChaPoly {
     k1: [u8; 32],
     k2: [u8; 32],
-- 
GitLab