keyfork: begin work on The Kitchen Sink

This commit is contained in:
Ryan Heywood 2023-09-12 00:58:30 -05:00
parent 8ac682531b
commit 90d2f46cda
Signed by: ryan
GPG Key ID: 8E401478A3FBEF72
6 changed files with 224 additions and 1 deletions

93
Cargo.lock generated
View File

@ -26,12 +26,54 @@ dependencies = [
"memchr",
]
[[package]]
name = "anstream"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46"
[[package]]
name = "anstyle-parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "anstyle-wincon"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd"
dependencies = [
"anstyle",
"windows-sys 0.48.0",
]
[[package]]
name = "backtrace"
version = "0.3.69"
@ -122,6 +164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6"
dependencies = [
"clap_builder",
"clap_derive",
]
[[package]]
@ -130,8 +173,22 @@ version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_derive"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
]
[[package]]
@ -140,6 +197,12 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
[[package]]
name = "colorchoice"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]]
name = "console"
version = "0.15.7"
@ -383,6 +446,12 @@ dependencies = [
"subtle",
]
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "hermit-abi"
version = "0.3.2"
@ -441,6 +510,16 @@ dependencies = [
"once_cell",
]
[[package]]
name = "keyfork"
version = "0.1.0"
dependencies = [
"clap",
"keyfork-mnemonic-generate",
"keyfork-seed",
"thiserror",
]
[[package]]
name = "keyfork-derive-util"
version = "0.1.0"
@ -470,7 +549,7 @@ dependencies = [
[[package]]
name = "keyfork-mnemonic-generate"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"keyfork-mnemonic-util",
]
@ -934,6 +1013,12 @@ dependencies = [
"der",
]
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "subtle"
version = "2.5.0"
@ -1158,6 +1243,12 @@ dependencies = [
"tinyvec",
]
[[package]]
name = "utf8parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
name = "valuable"
version = "0.1.0"

View File

@ -2,6 +2,7 @@
resolver = "2"
members = [
"keyfork",
"keyfork-mnemonic-generate",
"keyfork-mnemonic-util",
"keyfork-derive-util",

12
keyfork/Cargo.toml Normal file
View File

@ -0,0 +1,12 @@
[package]
name = "keyfork"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
clap = { version = "4.4.2", features = ["derive", "env"] }
keyfork-mnemonic-generate = { version = "0.2.0", path = "../keyfork-mnemonic-generate" }
keyfork-seed = { version = "0.1.0", path = "../keyfork-seed" }
thiserror = "1.0.48"

View File

@ -0,0 +1,68 @@
use super::{Keyfork, KeyforkCommands};
use clap::{Parser, Subcommand};
use keyfork_mnemonic_generate::generate_mnemonic;
#[derive(Clone, Debug)]
pub enum EntropySize {
Bits128,
Bits256,
}
#[derive(thiserror::Error, Debug, Clone)]
pub enum EntropySizeError {
#[error("Expected one of 128, 256")]
InvalidChoice,
}
impl std::str::FromStr for EntropySize {
type Err = EntropySizeError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"128" => EntropySize::Bits128,
"256" => EntropySize::Bits256,
_ => return Err(EntropySizeError::InvalidChoice),
})
}
}
impl From<&EntropySize> for usize {
fn from(value: &EntropySize) -> Self {
match value {
EntropySize::Bits128 => 128,
EntropySize::Bits256 => 256,
}
}
}
#[derive(Subcommand, Clone, Debug)]
pub enum MnemonicSubcommands {
/// Generate a mnemonic using OS entropy.
Generate {
/// The size in bits to generate entropy for.
entropy: EntropySize,
},
}
impl MnemonicSubcommands {
pub fn handle(
&self,
_m: &Mnemonic,
_p: &KeyforkCommands,
_keyfork: &Keyfork,
) -> Result<(), Box<dyn std::error::Error>> {
match self {
MnemonicSubcommands::Generate { entropy } => {
let mnemonic = generate_mnemonic(usize::from(entropy))?;
println!("{mnemonic}");
Ok(())
}
}
}
}
#[derive(Parser, Debug, Clone)]
pub struct Mnemonic {
#[command(subcommand)]
pub command: MnemonicSubcommands,
}

42
keyfork/src/cli/mod.rs Normal file
View File

@ -0,0 +1,42 @@
use clap::{Parser, Subcommand};
mod mnemonic;
/// The Kitchen Sink of Entropy.
#[derive(Parser, Clone, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Keyfork {
// Global options
#[command(subcommand)]
pub command: KeyforkCommands,
}
#[derive(Subcommand, Clone, Debug)]
pub enum KeyforkCommands {
/// Mnemonic generation and persistence utilities.
Mnemonic(mnemonic::Mnemonic),
/// Seeded data generation utility.
Seed(keyfork_seed::cli::Command),
/// Keyforkd background daemon to manage seed creation.
Daemon,
}
impl KeyforkCommands {
pub fn handle(&self, keyfork: &Keyfork) -> Result<(), Box<dyn std::error::Error>> {
match self {
KeyforkCommands::Mnemonic(m) => {
m.command.handle(m, self, keyfork)?;
}
KeyforkCommands::Seed(s) => {
let response = s.handle()?;
println!("{response:?}");
}
KeyforkCommands::Daemon => {
todo!()
}
}
Ok(())
}
}

9
keyfork/src/main.rs Normal file
View File

@ -0,0 +1,9 @@
use clap::Parser;
mod cli;
fn main() {
let opts = cli::Keyfork::parse();
opts.command.handle(&opts).unwrap();
}