From 4109f7cb240be4c78bf20db915908a898bee5302 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Wed, 20 Nov 2024 12:47:50 -0600 Subject: [PATCH 01/18] Adding gen_priv_key function --- Cargo.lock | 14 ++++++++- packages/cosmos/Cargo.toml | 1 + packages/cosmos/src/crypto.rs | 54 +++++++++++++++++++++++++++++++++++ packages/cosmos/src/lib.rs | 1 + 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 packages/cosmos/src/crypto.rs diff --git a/Cargo.lock b/Cargo.lock index 897eab2..6468e33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -442,7 +442,7 @@ dependencies = [ "bitcoin_hashes 0.14.0", "hex-conservative 0.2.1", "hex_lit", - "secp256k1", + "secp256k1 0.29.1", ] [[package]] @@ -699,6 +699,7 @@ dependencies = [ "quickcheck", "rand", "reqwest", + "secp256k1 0.30.0", "serde", "serde_json", "sha2", @@ -2840,6 +2841,17 @@ dependencies = [ "secp256k1-sys", ] +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes 0.14.0", + "rand", + "secp256k1-sys", +] + [[package]] name = "secp256k1-sys" version = "0.10.1" diff --git a/packages/cosmos/Cargo.toml b/packages/cosmos/Cargo.toml index 8a2b6f5..a886503 100644 --- a/packages/cosmos/Cargo.toml +++ b/packages/cosmos/Cargo.toml @@ -42,6 +42,7 @@ tendermint-proto = "0.40.0" figment = { version = "0.10.19", features = ["env", "toml"], optional = true } directories = { version = "5.0.1", optional = true } toml = { version = "0.8.19", optional = true } +secp256k1 = { version = "0.30", features = ["hashes"] } [features] clap = ["dep:clap"] diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs new file mode 100644 index 0000000..e7b2749 --- /dev/null +++ b/packages/cosmos/src/crypto.rs @@ -0,0 +1,54 @@ +extern crate secp256k1; +extern crate rand; +extern crate base64; + +use secp256k1::SecretKey; +use rand::rngs::OsRng; +use rand::RngCore; + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] +pub struct CosmosSecp256k1; + +impl CosmosSecp256k1 { + /// Generates a private key using secp256k1 elliptic curve. + #[allow(dead_code)] + pub fn gen_priv_key() -> SecretKey { + // Create a random number generator + let mut rng = OsRng::default(); + + // Generate a random 32-byte array + let mut secret_key_bytes = [0u8; 32]; + rng.fill_bytes(&mut secret_key_bytes); + + // Create the secret key from the random bytes + let secret_key = SecretKey::from_byte_array(&secret_key_bytes).expect("32 bytes, within curve order"); + + secret_key + } +} + +#[cfg(test)] +mod tests { + use secp256k1::{PublicKey, Secp256k1}; + + use super::*; + + #[test] + fn test_gen_priv_key() { + // Create a new secp256k1 context + let secp = Secp256k1::new(); + + // Generate a new private key + let private_key = CosmosSecp256k1::gen_priv_key(); + + // Generate the corresponding public key + let public_key = PublicKey::from_secret_key(&secp, &private_key); + + // Convert secret and public keys to hexadecimal + let private_key_hex = hex::encode(private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); + + assert_eq!(private_key_hex.len(), 64); + assert_eq!(public_key_hex.len(), 66); + } +} \ No newline at end of file diff --git a/packages/cosmos/src/lib.rs b/packages/cosmos/src/lib.rs index f7b3e22..19eea6e 100644 --- a/packages/cosmos/src/lib.rs +++ b/packages/cosmos/src/lib.rs @@ -34,6 +34,7 @@ mod parsed_coin; mod tokenfactory; mod txbuilder; mod wallet; +mod crypto; #[cfg(feature = "clap")] pub mod clap; From 243a30df73bca94949900fc9860365bf7dcad3d7 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Wed, 20 Nov 2024 13:04:00 -0600 Subject: [PATCH 02/18] Minor tweaks --- packages/cosmos/src/crypto.rs | 2 +- packages/cosmos/src/lib.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs index e7b2749..dfa7dc7 100644 --- a/packages/cosmos/src/crypto.rs +++ b/packages/cosmos/src/crypto.rs @@ -6,12 +6,12 @@ use secp256k1::SecretKey; use rand::rngs::OsRng; use rand::RngCore; +/// Represents the secp256k1 crypto algorithm elliptic curve. #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] pub struct CosmosSecp256k1; impl CosmosSecp256k1 { /// Generates a private key using secp256k1 elliptic curve. - #[allow(dead_code)] pub fn gen_priv_key() -> SecretKey { // Create a random number generator let mut rng = OsRng::default(); diff --git a/packages/cosmos/src/lib.rs b/packages/cosmos/src/lib.rs index 19eea6e..d430113 100644 --- a/packages/cosmos/src/lib.rs +++ b/packages/cosmos/src/lib.rs @@ -17,6 +17,7 @@ pub use parsed_coin::ParsedCoin; pub use tokenfactory::TokenFactory; pub use txbuilder::{TxBuilder, TxMessage}; pub use wallet::{SeedPhrase, Wallet}; +pub use crypto::CosmosSecp256k1; mod address; mod authz; From 69079aecb1b46b766617efa5e2216c2878902503 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Wed, 20 Nov 2024 22:55:16 -0600 Subject: [PATCH 03/18] Using existing dependency instead of a new one --- Cargo.lock | 14 +------------- packages/cosmos/Cargo.toml | 1 - packages/cosmos/src/crypto.rs | 7 +++---- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6468e33..897eab2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -442,7 +442,7 @@ dependencies = [ "bitcoin_hashes 0.14.0", "hex-conservative 0.2.1", "hex_lit", - "secp256k1 0.29.1", + "secp256k1", ] [[package]] @@ -699,7 +699,6 @@ dependencies = [ "quickcheck", "rand", "reqwest", - "secp256k1 0.30.0", "serde", "serde_json", "sha2", @@ -2841,17 +2840,6 @@ dependencies = [ "secp256k1-sys", ] -[[package]] -name = "secp256k1" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" -dependencies = [ - "bitcoin_hashes 0.14.0", - "rand", - "secp256k1-sys", -] - [[package]] name = "secp256k1-sys" version = "0.10.1" diff --git a/packages/cosmos/Cargo.toml b/packages/cosmos/Cargo.toml index a886503..8a2b6f5 100644 --- a/packages/cosmos/Cargo.toml +++ b/packages/cosmos/Cargo.toml @@ -42,7 +42,6 @@ tendermint-proto = "0.40.0" figment = { version = "0.10.19", features = ["env", "toml"], optional = true } directories = { version = "5.0.1", optional = true } toml = { version = "0.8.19", optional = true } -secp256k1 = { version = "0.30", features = ["hashes"] } [features] clap = ["dep:clap"] diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs index dfa7dc7..84ba5e0 100644 --- a/packages/cosmos/src/crypto.rs +++ b/packages/cosmos/src/crypto.rs @@ -1,10 +1,9 @@ -extern crate secp256k1; extern crate rand; extern crate base64; -use secp256k1::SecretKey; use rand::rngs::OsRng; use rand::RngCore; +use bitcoin::secp256k1::SecretKey; /// Represents the secp256k1 crypto algorithm elliptic curve. #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] @@ -21,7 +20,7 @@ impl CosmosSecp256k1 { rng.fill_bytes(&mut secret_key_bytes); // Create the secret key from the random bytes - let secret_key = SecretKey::from_byte_array(&secret_key_bytes).expect("32 bytes, within curve order"); + let secret_key = SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order"); secret_key } @@ -29,7 +28,7 @@ impl CosmosSecp256k1 { #[cfg(test)] mod tests { - use secp256k1::{PublicKey, Secp256k1}; + use bitcoin::secp256k1::{PublicKey, Secp256k1}; use super::*; From e7619cdbe27266f4536bd850f44e336a78651770 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Wed, 20 Nov 2024 23:41:18 -0600 Subject: [PATCH 04/18] Adding CLI option for generating private key --- Cargo.lock | 1 + packages/cosmos-bin/Cargo.toml | 1 + packages/cosmos-bin/src/cli.rs | 5 +++++ packages/cosmos-bin/src/crypto.rs | 25 +++++++++++++++++++++++++ packages/cosmos-bin/src/main.rs | 4 ++++ packages/cosmos/src/crypto.rs | 6 ++---- 6 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 packages/cosmos-bin/src/crypto.rs diff --git a/Cargo.lock b/Cargo.lock index 897eab2..e505e39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -732,6 +732,7 @@ dependencies = [ "cw4-group", "fs-err", "futures", + "hex", "once_cell", "quickcheck", "regex", diff --git a/packages/cosmos-bin/Cargo.toml b/packages/cosmos-bin/Cargo.toml index f8445a6..d88e6b6 100644 --- a/packages/cosmos-bin/Cargo.toml +++ b/packages/cosmos-bin/Cargo.toml @@ -28,6 +28,7 @@ cw4-group = "2.0.0" cw-utils = "2.0.0" cosmwasm-std = "2.1.4" csv = "1.3.0" +hex = "0.4" [dev-dependencies] quickcheck = "1" diff --git a/packages/cosmos-bin/src/cli.rs b/packages/cosmos-bin/src/cli.rs index eb065d7..3aa726a 100644 --- a/packages/cosmos-bin/src/cli.rs +++ b/packages/cosmos-bin/src/cli.rs @@ -119,4 +119,9 @@ pub(crate) enum Subcommand { #[clap(subcommand)] opt: crate::config::Opt, }, + /// Management of cryptographic operations + Crypto { + #[clap(flatten)] + opt: crate::crypto::Opt, + }, } diff --git a/packages/cosmos-bin/src/crypto.rs b/packages/cosmos-bin/src/crypto.rs new file mode 100644 index 0000000..4a55b5c --- /dev/null +++ b/packages/cosmos-bin/src/crypto.rs @@ -0,0 +1,25 @@ +use anyhow::Result; +use cosmos::CosmosSecp256k1; + +#[derive(clap::Parser)] +pub(crate) struct Opt { + #[clap(subcommand)] + sub: Subcommand, +} + +#[derive(clap::Parser)] +enum Subcommand { + /// Generate a Secp256k1 Private key + GenSecp256k1PrivKey {}, +} + +pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { + match sub { + Subcommand::GenSecp256k1PrivKey {} => { + let private_key = CosmosSecp256k1::gen_priv_key(); + let private_key_hex = hex::encode(private_key.secret_bytes()).to_uppercase(); + println!("Private Key: {}", private_key_hex); + } + } + Ok(()) +} \ No newline at end of file diff --git a/packages/cosmos-bin/src/main.rs b/packages/cosmos-bin/src/main.rs index fb14f5f..6e551dc 100644 --- a/packages/cosmos-bin/src/main.rs +++ b/packages/cosmos-bin/src/main.rs @@ -9,6 +9,7 @@ mod my_duration; mod nft; mod tokenfactory; mod wallet; +mod crypto; use anyhow::Result; use clap::{CommandFactory, Parser}; @@ -70,6 +71,9 @@ impl Subcommand { cw3::go(cosmos, inner).await?; } Subcommand::Config { opt: inner } => config::go(opt, inner)?, + Subcommand::Crypto { opt } => { + crypto::go(opt).await?; + } } Ok(()) diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs index 84ba5e0..176a9e7 100644 --- a/packages/cosmos/src/crypto.rs +++ b/packages/cosmos/src/crypto.rs @@ -13,16 +13,14 @@ impl CosmosSecp256k1 { /// Generates a private key using secp256k1 elliptic curve. pub fn gen_priv_key() -> SecretKey { // Create a random number generator - let mut rng = OsRng::default(); + let mut rng = OsRng; // Generate a random 32-byte array let mut secret_key_bytes = [0u8; 32]; rng.fill_bytes(&mut secret_key_bytes); // Create the secret key from the random bytes - let secret_key = SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order"); - - secret_key + SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order") } } From a0147281b52a790e1c537e4ae9719ad34bee178b Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Wed, 20 Nov 2024 23:51:07 -0600 Subject: [PATCH 05/18] Addressing cargo fmt issues --- packages/cosmos-bin/src/crypto.rs | 2 +- packages/cosmos-bin/src/main.rs | 2 +- packages/cosmos/src/crypto.rs | 11 +++-------- packages/cosmos/src/lib.rs | 4 ++-- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/cosmos-bin/src/crypto.rs b/packages/cosmos-bin/src/crypto.rs index 4a55b5c..d4c5f75 100644 --- a/packages/cosmos-bin/src/crypto.rs +++ b/packages/cosmos-bin/src/crypto.rs @@ -22,4 +22,4 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } } Ok(()) -} \ No newline at end of file +} diff --git a/packages/cosmos-bin/src/main.rs b/packages/cosmos-bin/src/main.rs index 6e551dc..5ba2036 100644 --- a/packages/cosmos-bin/src/main.rs +++ b/packages/cosmos-bin/src/main.rs @@ -4,12 +4,12 @@ mod chain; mod cli; mod config; mod contract; +mod crypto; mod cw3; mod my_duration; mod nft; mod tokenfactory; mod wallet; -mod crypto; use anyhow::Result; use clap::{CommandFactory, Parser}; diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs index 176a9e7..d0ce887 100644 --- a/packages/cosmos/src/crypto.rs +++ b/packages/cosmos/src/crypto.rs @@ -1,9 +1,9 @@ -extern crate rand; extern crate base64; +extern crate rand; +use bitcoin::secp256k1::SecretKey; use rand::rngs::OsRng; use rand::RngCore; -use bitcoin::secp256k1::SecretKey; /// Represents the secp256k1 crypto algorithm elliptic curve. #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] @@ -12,14 +12,9 @@ pub struct CosmosSecp256k1; impl CosmosSecp256k1 { /// Generates a private key using secp256k1 elliptic curve. pub fn gen_priv_key() -> SecretKey { - // Create a random number generator let mut rng = OsRng; - - // Generate a random 32-byte array let mut secret_key_bytes = [0u8; 32]; rng.fill_bytes(&mut secret_key_bytes); - - // Create the secret key from the random bytes SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order") } } @@ -48,4 +43,4 @@ mod tests { assert_eq!(private_key_hex.len(), 64); assert_eq!(public_key_hex.len(), 66); } -} \ No newline at end of file +} diff --git a/packages/cosmos/src/lib.rs b/packages/cosmos/src/lib.rs index d430113..3e2713c 100644 --- a/packages/cosmos/src/lib.rs +++ b/packages/cosmos/src/lib.rs @@ -10,6 +10,7 @@ pub use cosmos_builder::CosmosBuilder; pub use cosmos_network::CosmosNetwork; pub use cosmos_sdk_proto as proto; pub use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; +pub use crypto::CosmosSecp256k1; pub use error::Error; pub use ext::TxResponseExt; pub use gas_multiplier::DynamicGasMultiplier; @@ -17,7 +18,6 @@ pub use parsed_coin::ParsedCoin; pub use tokenfactory::TokenFactory; pub use txbuilder::{TxBuilder, TxMessage}; pub use wallet::{SeedPhrase, Wallet}; -pub use crypto::CosmosSecp256k1; mod address; mod authz; @@ -28,6 +28,7 @@ mod config; mod contract; mod cosmos_builder; mod cosmos_network; +mod crypto; mod ext; mod gas_multiplier; mod injective; @@ -35,7 +36,6 @@ mod parsed_coin; mod tokenfactory; mod txbuilder; mod wallet; -mod crypto; #[cfg(feature = "clap")] pub mod clap; From d8a857ad0471000f6de5ba5fdd0082cc4f7107ab Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Thu, 21 Nov 2024 06:55:39 -0600 Subject: [PATCH 06/18] Renaming feature to a more appropriate way --- packages/cosmos-bin/src/crypto.rs | 8 ++++---- packages/cosmos/src/crypto.rs | 6 +++--- packages/cosmos/src/lib.rs | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/cosmos-bin/src/crypto.rs b/packages/cosmos-bin/src/crypto.rs index d4c5f75..8159c5b 100644 --- a/packages/cosmos-bin/src/crypto.rs +++ b/packages/cosmos-bin/src/crypto.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use cosmos::CosmosSecp256k1; +use cosmos::K256; #[derive(clap::Parser)] pub(crate) struct Opt { @@ -10,13 +10,13 @@ pub(crate) struct Opt { #[derive(clap::Parser)] enum Subcommand { /// Generate a Secp256k1 Private key - GenSecp256k1PrivKey {}, + GenK256PrivKey {}, } pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { match sub { - Subcommand::GenSecp256k1PrivKey {} => { - let private_key = CosmosSecp256k1::gen_priv_key(); + Subcommand::GenK256PrivKey {} => { + let private_key = K256::gen_priv_key(); let private_key_hex = hex::encode(private_key.secret_bytes()).to_uppercase(); println!("Private Key: {}", private_key_hex); } diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs index d0ce887..4ff44ec 100644 --- a/packages/cosmos/src/crypto.rs +++ b/packages/cosmos/src/crypto.rs @@ -7,9 +7,9 @@ use rand::RngCore; /// Represents the secp256k1 crypto algorithm elliptic curve. #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] -pub struct CosmosSecp256k1; +pub struct K256; -impl CosmosSecp256k1 { +impl K256 { /// Generates a private key using secp256k1 elliptic curve. pub fn gen_priv_key() -> SecretKey { let mut rng = OsRng; @@ -31,7 +31,7 @@ mod tests { let secp = Secp256k1::new(); // Generate a new private key - let private_key = CosmosSecp256k1::gen_priv_key(); + let private_key = K256::gen_priv_key(); // Generate the corresponding public key let public_key = PublicKey::from_secret_key(&secp, &private_key); diff --git a/packages/cosmos/src/lib.rs b/packages/cosmos/src/lib.rs index 3e2713c..34d9c42 100644 --- a/packages/cosmos/src/lib.rs +++ b/packages/cosmos/src/lib.rs @@ -10,7 +10,7 @@ pub use cosmos_builder::CosmosBuilder; pub use cosmos_network::CosmosNetwork; pub use cosmos_sdk_proto as proto; pub use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; -pub use crypto::CosmosSecp256k1; +pub use crypto::K256; pub use error::Error; pub use ext::TxResponseExt; pub use gas_multiplier::DynamicGasMultiplier; From 5cffdb7cdd17f26461f17ecb6c8df0172727e0c0 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Fri, 22 Nov 2024 00:20:36 -0600 Subject: [PATCH 07/18] Including public key in response --- packages/cosmos-bin/src/crypto.rs | 12 ++++++----- packages/cosmos/src/crypto.rs | 34 ++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/packages/cosmos-bin/src/crypto.rs b/packages/cosmos-bin/src/crypto.rs index 8159c5b..9b76e73 100644 --- a/packages/cosmos-bin/src/crypto.rs +++ b/packages/cosmos-bin/src/crypto.rs @@ -9,16 +9,18 @@ pub(crate) struct Opt { #[derive(clap::Parser)] enum Subcommand { - /// Generate a Secp256k1 Private key - GenK256PrivKey {}, + /// Generate a Secp256k1 Private/Public key pair + GenK256KeyPair {}, } pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { match sub { - Subcommand::GenK256PrivKey {} => { - let private_key = K256::gen_priv_key(); - let private_key_hex = hex::encode(private_key.secret_bytes()).to_uppercase(); + Subcommand::GenK256KeyPair {} => { + let key_pair = K256::gen_key_pair(); + let private_key_hex = hex::encode(key_pair.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(key_pair.public_key.serialize()).to_uppercase(); println!("Private Key: {}", private_key_hex); + println!("Public Key : {}", public_key_hex); } } Ok(()) diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs index 4ff44ec..382dd74 100644 --- a/packages/cosmos/src/crypto.rs +++ b/packages/cosmos/src/crypto.rs @@ -1,10 +1,18 @@ extern crate base64; extern crate rand; -use bitcoin::secp256k1::SecretKey; +use bitcoin::key::Secp256k1; +use bitcoin::secp256k1::{PublicKey, SecretKey}; use rand::rngs::OsRng; use rand::RngCore; +/// Represents the secp256k1 crypto algorithm elliptic curve. +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub struct KeyPair { + pub private_key: SecretKey, + pub public_key: PublicKey, +} + /// Represents the secp256k1 crypto algorithm elliptic curve. #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] pub struct K256; @@ -17,6 +25,17 @@ impl K256 { rng.fill_bytes(&mut secret_key_bytes); SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order") } + + /// Generates a private/public key pair using secp256k1 elliptic curve. + pub fn gen_key_pair() -> KeyPair { + let private_key = Self::gen_priv_key(); + let secp = Secp256k1::new(); + let public_key = PublicKey::from_secret_key(&secp, &private_key); + KeyPair { + private_key, + public_key, + } + } } #[cfg(test)] @@ -43,4 +62,17 @@ mod tests { assert_eq!(private_key_hex.len(), 64); assert_eq!(public_key_hex.len(), 66); } + + #[test] + fn test_gen_key_pair() { + // Generate a new private key + let key_pair = K256::gen_key_pair(); + + // Convert secret and public keys to hexadecimal + let private_key_hex = hex::encode(key_pair.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(key_pair.public_key.serialize()).to_uppercase(); + + assert_eq!(private_key_hex.len(), 64); + assert_eq!(public_key_hex.len(), 66); + } } From b0992f66e0d0ab606b39d26d483bebc742d54a04 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Fri, 22 Nov 2024 07:41:09 -0600 Subject: [PATCH 08/18] Migrating changes to Wallet --- packages/cosmos-bin/src/cli.rs | 5 -- packages/cosmos-bin/src/crypto.rs | 27 ----------- packages/cosmos-bin/src/main.rs | 4 -- packages/cosmos-bin/src/wallet.rs | 15 +++++- packages/cosmos/src/crypto.rs | 78 ------------------------------- packages/cosmos/src/lib.rs | 2 - packages/cosmos/src/wallet.rs | 42 ++++++++++++++++- 7 files changed, 54 insertions(+), 119 deletions(-) delete mode 100644 packages/cosmos-bin/src/crypto.rs delete mode 100644 packages/cosmos/src/crypto.rs diff --git a/packages/cosmos-bin/src/cli.rs b/packages/cosmos-bin/src/cli.rs index 3aa726a..eb065d7 100644 --- a/packages/cosmos-bin/src/cli.rs +++ b/packages/cosmos-bin/src/cli.rs @@ -119,9 +119,4 @@ pub(crate) enum Subcommand { #[clap(subcommand)] opt: crate::config::Opt, }, - /// Management of cryptographic operations - Crypto { - #[clap(flatten)] - opt: crate::crypto::Opt, - }, } diff --git a/packages/cosmos-bin/src/crypto.rs b/packages/cosmos-bin/src/crypto.rs deleted file mode 100644 index 9b76e73..0000000 --- a/packages/cosmos-bin/src/crypto.rs +++ /dev/null @@ -1,27 +0,0 @@ -use anyhow::Result; -use cosmos::K256; - -#[derive(clap::Parser)] -pub(crate) struct Opt { - #[clap(subcommand)] - sub: Subcommand, -} - -#[derive(clap::Parser)] -enum Subcommand { - /// Generate a Secp256k1 Private/Public key pair - GenK256KeyPair {}, -} - -pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { - match sub { - Subcommand::GenK256KeyPair {} => { - let key_pair = K256::gen_key_pair(); - let private_key_hex = hex::encode(key_pair.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(key_pair.public_key.serialize()).to_uppercase(); - println!("Private Key: {}", private_key_hex); - println!("Public Key : {}", public_key_hex); - } - } - Ok(()) -} diff --git a/packages/cosmos-bin/src/main.rs b/packages/cosmos-bin/src/main.rs index 5ba2036..fb14f5f 100644 --- a/packages/cosmos-bin/src/main.rs +++ b/packages/cosmos-bin/src/main.rs @@ -4,7 +4,6 @@ mod chain; mod cli; mod config; mod contract; -mod crypto; mod cw3; mod my_duration; mod nft; @@ -71,9 +70,6 @@ impl Subcommand { cw3::go(cosmos, inner).await?; } Subcommand::Config { opt: inner } => config::go(opt, inner)?, - Subcommand::Crypto { opt } => { - crypto::go(opt).await?; - } } Ok(()) diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index 21ae1a6..5373f34 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use cosmos::{AddressHrp, RawAddress, SeedPhrase}; +use cosmos::{proto::tendermint::crypto::public_key, AddressHrp, RawAddress, SeedPhrase}; use crate::gen_wallet; @@ -30,6 +30,8 @@ enum Subcommand { /// Destination address HRP (human-readable part) hrp: AddressHrp, }, + /// Generate a Secp256k1 Private/Public key pair + GenKeyPair {}, } pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { @@ -44,6 +46,17 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } => { println!("{}", orig.with_hrp(address_type)); } + Subcommand::GenKeyPair {} => gen_key_pair()? } Ok(()) } + +fn gen_key_pair() -> Result<()> { + let xpriv = cosmos::Wallet::gen_priv_key(); + let public_key = cosmos::Wallet::gen_public_key(xpriv); + let private_key_hex = hex::encode(xpriv.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); + println!("Private Key: {}", private_key_hex); + println!("Public Key : {}", public_key_hex); + Ok(()) +} diff --git a/packages/cosmos/src/crypto.rs b/packages/cosmos/src/crypto.rs deleted file mode 100644 index 382dd74..0000000 --- a/packages/cosmos/src/crypto.rs +++ /dev/null @@ -1,78 +0,0 @@ -extern crate base64; -extern crate rand; - -use bitcoin::key::Secp256k1; -use bitcoin::secp256k1::{PublicKey, SecretKey}; -use rand::rngs::OsRng; -use rand::RngCore; - -/// Represents the secp256k1 crypto algorithm elliptic curve. -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -pub struct KeyPair { - pub private_key: SecretKey, - pub public_key: PublicKey, -} - -/// Represents the secp256k1 crypto algorithm elliptic curve. -#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)] -pub struct K256; - -impl K256 { - /// Generates a private key using secp256k1 elliptic curve. - pub fn gen_priv_key() -> SecretKey { - let mut rng = OsRng; - let mut secret_key_bytes = [0u8; 32]; - rng.fill_bytes(&mut secret_key_bytes); - SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order") - } - - /// Generates a private/public key pair using secp256k1 elliptic curve. - pub fn gen_key_pair() -> KeyPair { - let private_key = Self::gen_priv_key(); - let secp = Secp256k1::new(); - let public_key = PublicKey::from_secret_key(&secp, &private_key); - KeyPair { - private_key, - public_key, - } - } -} - -#[cfg(test)] -mod tests { - use bitcoin::secp256k1::{PublicKey, Secp256k1}; - - use super::*; - - #[test] - fn test_gen_priv_key() { - // Create a new secp256k1 context - let secp = Secp256k1::new(); - - // Generate a new private key - let private_key = K256::gen_priv_key(); - - // Generate the corresponding public key - let public_key = PublicKey::from_secret_key(&secp, &private_key); - - // Convert secret and public keys to hexadecimal - let private_key_hex = hex::encode(private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); - - assert_eq!(private_key_hex.len(), 64); - assert_eq!(public_key_hex.len(), 66); - } - - #[test] - fn test_gen_key_pair() { - // Generate a new private key - let key_pair = K256::gen_key_pair(); - - // Convert secret and public keys to hexadecimal - let private_key_hex = hex::encode(key_pair.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(key_pair.public_key.serialize()).to_uppercase(); - - assert_eq!(private_key_hex.len(), 64); - assert_eq!(public_key_hex.len(), 66); - } -} diff --git a/packages/cosmos/src/lib.rs b/packages/cosmos/src/lib.rs index 34d9c42..f7b3e22 100644 --- a/packages/cosmos/src/lib.rs +++ b/packages/cosmos/src/lib.rs @@ -10,7 +10,6 @@ pub use cosmos_builder::CosmosBuilder; pub use cosmos_network::CosmosNetwork; pub use cosmos_sdk_proto as proto; pub use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; -pub use crypto::K256; pub use error::Error; pub use ext::TxResponseExt; pub use gas_multiplier::DynamicGasMultiplier; @@ -28,7 +27,6 @@ mod config; mod contract; mod cosmos_builder; mod cosmos_network; -mod crypto; mod ext; mod gas_multiplier; mod injective; diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index 07882af..3350aac 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -3,16 +3,19 @@ use std::fmt::Display; use std::str::FromStr; use std::sync::Arc; -use bitcoin::bip32::{DerivationPath, Xpriv, Xpub}; +use bitcoin::bip32::{ChildNumber, DerivationPath, Xpriv, Xpub}; use bitcoin::hashes::{ripemd160, sha256, Hash}; use bitcoin::secp256k1::ecdsa::Signature; -use bitcoin::secp256k1::{All, Message, Secp256k1}; +use bitcoin::secp256k1::{All, Message, PublicKey, Secp256k1, SecretKey}; +use bitcoin::NetworkKind; use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; use cosmos_sdk_proto::cosmos::base::abci::v1beta1::TxResponse; use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; use once_cell::sync::{Lazy, OnceCell}; use parking_lot::Mutex; +use rand::rngs::OsRng; use rand::Rng; +use rand::RngCore; use tiny_keccak::{Hasher, Keccak}; use crate::address::{AddressHrp, HasAddressHrp, PublicKeyMethod, RawAddress}; @@ -396,6 +399,28 @@ impl Wallet { ) .await } + + /// Generates a private key using secp256k1 elliptic curve. + pub fn gen_priv_key() -> Xpriv { + let mut rng = OsRng; + let mut secret_key_bytes = [0u8; 32]; + rng.fill_bytes(&mut secret_key_bytes); + let private_key = SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order"); + Xpriv { + private_key: private_key, + chain_code: [0u8; 32].into(), + child_number: ChildNumber::Normal { index: 0 }, + depth: 0, + parent_fingerprint: [0u8; 4].into(), + network: NetworkKind::Main, + } + } + + /// Gets the corresponding secp256k1 public key pair from the provided private key. + pub fn gen_public_key(xpriv: Xpriv) -> PublicKey { + let secp = Secp256k1::new(); + PublicKey::from_secret_key(&secp, &xpriv.private_key) + } } fn cosmos_address_from_public_key(public_key: &[u8]) -> [u8; 20] { @@ -545,4 +570,17 @@ mod tests { hex::encode(hash) ); } + + #[test] + fn test_gen_key_pair() { + // Generate a new private key + let xpriv = Wallet::gen_priv_key(); + // Generate the corresponding public key + let public_key = Wallet::gen_public_key(xpriv); + // Convert secret and public keys to hexadecimal + let private_key_hex = hex::encode(xpriv.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); + assert_eq!(private_key_hex.len(), 64); + assert_eq!(public_key_hex.len(), 66); + } } From 7fcc02c826d2b6098b07510d78ede4dcbca6b37c Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Fri, 22 Nov 2024 07:44:45 -0600 Subject: [PATCH 09/18] Minor updates --- packages/cosmos-bin/src/wallet.rs | 4 ++-- packages/cosmos/src/wallet.rs | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index 5373f34..80de039 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use cosmos::{proto::tendermint::crypto::public_key, AddressHrp, RawAddress, SeedPhrase}; +use cosmos::{AddressHrp, RawAddress, SeedPhrase}; use crate::gen_wallet; @@ -46,7 +46,7 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } => { println!("{}", orig.with_hrp(address_type)); } - Subcommand::GenKeyPair {} => gen_key_pair()? + Subcommand::GenKeyPair {} => gen_key_pair()?, } Ok(()) } diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index 3350aac..58cf300 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -405,9 +405,10 @@ impl Wallet { let mut rng = OsRng; let mut secret_key_bytes = [0u8; 32]; rng.fill_bytes(&mut secret_key_bytes); - let private_key = SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order"); + let private_key = + SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order"); Xpriv { - private_key: private_key, + private_key, chain_code: [0u8; 32].into(), child_number: ChildNumber::Normal { index: 0 }, depth: 0, @@ -573,11 +574,8 @@ mod tests { #[test] fn test_gen_key_pair() { - // Generate a new private key let xpriv = Wallet::gen_priv_key(); - // Generate the corresponding public key let public_key = Wallet::gen_public_key(xpriv); - // Convert secret and public keys to hexadecimal let private_key_hex = hex::encode(xpriv.private_key.secret_bytes()).to_uppercase(); let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); assert_eq!(private_key_hex.len(), 64); From 66be2651b49034dce32f9c1c4cf1cc97e17b8f3d Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Sun, 24 Nov 2024 22:50:20 -0600 Subject: [PATCH 10/18] Removing custom private key generation code --- packages/cosmos-bin/src/wallet.rs | 8 +++---- packages/cosmos/src/wallet.rs | 40 +++++++------------------------ 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index 80de039..b3f9e6c 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -52,10 +52,10 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } fn gen_key_pair() -> Result<()> { - let xpriv = cosmos::Wallet::gen_priv_key(); - let public_key = cosmos::Wallet::gen_public_key(xpriv); - let private_key_hex = hex::encode(xpriv.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); + let address_hrp = AddressHrp::from_static("cosmos"); + let wallet = cosmos::Wallet::generate(address_hrp)?; + let private_key_hex = hex::encode(wallet.privkey.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(wallet.public_key_bytes()).to_uppercase(); println!("Private Key: {}", private_key_hex); println!("Public Key : {}", public_key_hex); Ok(()) diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index 58cf300..cbf32d0 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -3,19 +3,16 @@ use std::fmt::Display; use std::str::FromStr; use std::sync::Arc; -use bitcoin::bip32::{ChildNumber, DerivationPath, Xpriv, Xpub}; +use bitcoin::bip32::{DerivationPath, Xpriv, Xpub}; use bitcoin::hashes::{ripemd160, sha256, Hash}; use bitcoin::secp256k1::ecdsa::Signature; -use bitcoin::secp256k1::{All, Message, PublicKey, Secp256k1, SecretKey}; -use bitcoin::NetworkKind; +use bitcoin::secp256k1::{All, Message, Secp256k1}; use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; use cosmos_sdk_proto::cosmos::base::abci::v1beta1::TxResponse; use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; use once_cell::sync::{Lazy, OnceCell}; use parking_lot::Mutex; -use rand::rngs::OsRng; use rand::Rng; -use rand::RngCore; use tiny_keccak::{Hasher, Keccak}; use crate::address::{AddressHrp, HasAddressHrp, PublicKeyMethod, RawAddress}; @@ -294,12 +291,16 @@ const OSMO_LOCAL_PHRASE: &str = "notice oak worry limit wrap speak medal online // Not deriving Copy since this is a pretty large data structure. pub struct Wallet { address: Address, - privkey: Xpriv, - pub(crate) public_key: WalletPublicKey, + /// The private key associated with the wallet. + /// This key is used for signing transactions and should be kept secure. + pub privkey: Xpriv, + /// The public key derived from the private key. + /// This key can be shared publicly and is used to receive funds. + pub public_key: WalletPublicKey, } #[derive(Clone)] -pub(crate) enum WalletPublicKey { +pub enum WalletPublicKey { Cosmos([u8; 33]), Ethereum([u8; 65]), } @@ -399,29 +400,6 @@ impl Wallet { ) .await } - - /// Generates a private key using secp256k1 elliptic curve. - pub fn gen_priv_key() -> Xpriv { - let mut rng = OsRng; - let mut secret_key_bytes = [0u8; 32]; - rng.fill_bytes(&mut secret_key_bytes); - let private_key = - SecretKey::from_slice(&secret_key_bytes).expect("32 bytes, within curve order"); - Xpriv { - private_key, - chain_code: [0u8; 32].into(), - child_number: ChildNumber::Normal { index: 0 }, - depth: 0, - parent_fingerprint: [0u8; 4].into(), - network: NetworkKind::Main, - } - } - - /// Gets the corresponding secp256k1 public key pair from the provided private key. - pub fn gen_public_key(xpriv: Xpriv) -> PublicKey { - let secp = Secp256k1::new(); - PublicKey::from_secret_key(&secp, &xpriv.private_key) - } } fn cosmos_address_from_public_key(public_key: &[u8]) -> [u8; 20] { From 044ccf1008fe82d115496bfa8721a6a734d10d92 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Sun, 24 Nov 2024 22:53:47 -0600 Subject: [PATCH 11/18] Adjusting test --- packages/cosmos/src/wallet.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index cbf32d0..c1e4f3e 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -552,10 +552,10 @@ mod tests { #[test] fn test_gen_key_pair() { - let xpriv = Wallet::gen_priv_key(); - let public_key = Wallet::gen_public_key(xpriv); - let private_key_hex = hex::encode(xpriv.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); + let address_hrp = AddressHrp::from_static("cosmos"); + let wallet = Wallet::generate(address_hrp).unwrap(); + let private_key_hex = hex::encode(wallet.privkey.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(wallet.public_key_bytes()).to_uppercase(); assert_eq!(private_key_hex.len(), 64); assert_eq!(public_key_hex.len(), 66); } From 13f20c1eb075668320c43a6e4b696f4728cd0eb1 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Sun, 24 Nov 2024 23:06:42 -0600 Subject: [PATCH 12/18] Adding a few more changes --- packages/cosmos-bin/src/wallet.rs | 8 ++++---- packages/cosmos/src/wallet.rs | 21 ++++++++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index b3f9e6c..8f7ff04 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -52,10 +52,10 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } fn gen_key_pair() -> Result<()> { - let address_hrp = AddressHrp::from_static("cosmos"); - let wallet = cosmos::Wallet::generate(address_hrp)?; - let private_key_hex = hex::encode(wallet.privkey.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(wallet.public_key_bytes()).to_uppercase(); + let privkey = cosmos::Wallet::gen_priv_key()?; + let public_key = cosmos::Wallet::gen_public_key(privkey); + let private_key_hex = hex::encode(privkey.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); println!("Private Key: {}", private_key_hex); println!("Public Key : {}", public_key_hex); Ok(()) diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index c1e4f3e..8969982 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -6,7 +6,7 @@ use std::sync::Arc; use bitcoin::bip32::{DerivationPath, Xpriv, Xpub}; use bitcoin::hashes::{ripemd160, sha256, Hash}; use bitcoin::secp256k1::ecdsa::Signature; -use bitcoin::secp256k1::{All, Message, Secp256k1}; +use bitcoin::secp256k1::{All, Message, PublicKey, Secp256k1}; use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; use cosmos_sdk_proto::cosmos::base::abci::v1beta1::TxResponse; use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; @@ -400,6 +400,17 @@ impl Wallet { ) .await } + + /// Generates a private key using secp256k1 elliptic curve. + pub fn gen_priv_key() -> Result { + Ok(Wallet::generate(AddressHrp::from_static("cosmos"))?.privkey) + } + + /// Gets the corresponding secp256k1 public key pair from the provided private key. + pub fn gen_public_key(xpriv: Xpriv) -> PublicKey { + let secp = Secp256k1::new(); + PublicKey::from_secret_key(&secp, &xpriv.private_key) + } } fn cosmos_address_from_public_key(public_key: &[u8]) -> [u8; 20] { @@ -552,10 +563,10 @@ mod tests { #[test] fn test_gen_key_pair() { - let address_hrp = AddressHrp::from_static("cosmos"); - let wallet = Wallet::generate(address_hrp).unwrap(); - let private_key_hex = hex::encode(wallet.privkey.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(wallet.public_key_bytes()).to_uppercase(); + let privkey = Wallet::gen_priv_key().unwrap(); + let public_key = Wallet::gen_public_key(privkey); + let private_key_hex = hex::encode(privkey.private_key.secret_bytes()).to_uppercase(); + let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); assert_eq!(private_key_hex.len(), 64); assert_eq!(public_key_hex.len(), 66); } From 5939743fc8a97955ec364a6c492a185c71dabb5c Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Sun, 24 Nov 2024 23:08:44 -0600 Subject: [PATCH 13/18] Making Wallet fields back to private --- packages/cosmos/src/wallet.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index 8969982..cdc14eb 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -291,16 +291,12 @@ const OSMO_LOCAL_PHRASE: &str = "notice oak worry limit wrap speak medal online // Not deriving Copy since this is a pretty large data structure. pub struct Wallet { address: Address, - /// The private key associated with the wallet. - /// This key is used for signing transactions and should be kept secure. - pub privkey: Xpriv, - /// The public key derived from the private key. - /// This key can be shared publicly and is used to receive funds. - pub public_key: WalletPublicKey, + privkey: Xpriv, + pub(crate) public_key: WalletPublicKey, } #[derive(Clone)] -pub enum WalletPublicKey { +pub(crate) enum WalletPublicKey { Cosmos([u8; 33]), Ethereum([u8; 65]), } From 8d5104e75f382972309678a645578702155a67cb Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Mon, 25 Nov 2024 10:58:58 -0600 Subject: [PATCH 14/18] Removing hex crate and integrating into genwallet --- packages/cosmos-bin/Cargo.toml | 1 - packages/cosmos-bin/src/main.rs | 7 +++++++ packages/cosmos-bin/src/wallet.rs | 15 +++++++++------ packages/cosmos/src/wallet.rs | 32 +++++++++++++++---------------- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/packages/cosmos-bin/Cargo.toml b/packages/cosmos-bin/Cargo.toml index d88e6b6..f8445a6 100644 --- a/packages/cosmos-bin/Cargo.toml +++ b/packages/cosmos-bin/Cargo.toml @@ -28,7 +28,6 @@ cw4-group = "2.0.0" cw-utils = "2.0.0" cosmwasm-std = "2.1.4" csv = "1.3.0" -hex = "0.4" [dev-dependencies] quickcheck = "1" diff --git a/packages/cosmos-bin/src/main.rs b/packages/cosmos-bin/src/main.rs index fb14f5f..be3888a 100644 --- a/packages/cosmos-bin/src/main.rs +++ b/packages/cosmos-bin/src/main.rs @@ -79,7 +79,14 @@ impl Subcommand { fn gen_wallet(hrp: AddressHrp) -> Result<()> { let phrase = cosmos::SeedPhrase::random(); let wallet = phrase.with_hrp(hrp)?; + let private_key = wallet.get_privkey().private_key.display_secret(); + let mut public_key = String::new(); + for byte in wallet.public_key_bytes() { + public_key.push_str(&format!("{:02x}", byte)); + } println!("Mnemonic: {}", phrase.phrase()); println!("Address: {wallet}"); + println!("Private Key: {}", private_key); + println!("Public Key : {}", public_key); Ok(()) } diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index 8f7ff04..f386680 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -52,11 +52,14 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } fn gen_key_pair() -> Result<()> { - let privkey = cosmos::Wallet::gen_priv_key()?; - let public_key = cosmos::Wallet::gen_public_key(privkey); - let private_key_hex = hex::encode(privkey.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); - println!("Private Key: {}", private_key_hex); - println!("Public Key : {}", public_key_hex); + let address_hrp = AddressHrp::from_static("cosmos"); + let wallet = cosmos::Wallet::generate(address_hrp).unwrap(); + let private_key = wallet.get_privkey().private_key.display_secret(); + let mut public_key = String::new(); + for byte in wallet.public_key_bytes() { + public_key.push_str(&format!("{:02x}", byte)); + } + println!("Private Key: {}", private_key); + println!("Public Key: {}", public_key); Ok(()) } diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index cdc14eb..8c0985f 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -6,7 +6,7 @@ use std::sync::Arc; use bitcoin::bip32::{DerivationPath, Xpriv, Xpub}; use bitcoin::hashes::{ripemd160, sha256, Hash}; use bitcoin::secp256k1::ecdsa::Signature; -use bitcoin::secp256k1::{All, Message, PublicKey, Secp256k1}; +use bitcoin::secp256k1::{All, Message, Secp256k1}; use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; use cosmos_sdk_proto::cosmos::base::abci::v1beta1::TxResponse; use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; @@ -397,15 +397,12 @@ impl Wallet { .await } - /// Generates a private key using secp256k1 elliptic curve. - pub fn gen_priv_key() -> Result { - Ok(Wallet::generate(AddressHrp::from_static("cosmos"))?.privkey) - } - - /// Gets the corresponding secp256k1 public key pair from the provided private key. - pub fn gen_public_key(xpriv: Xpriv) -> PublicKey { - let secp = Secp256k1::new(); - PublicKey::from_secret_key(&secp, &xpriv.private_key) + /// Retrieves the private key associated with the wallet. + /// + /// This function returns the private key (`Xpriv`) of the wallet. + /// The private key is crucial for signing transactions and should be kept secure. + pub fn get_privkey(&self) -> Xpriv { + self.privkey } } @@ -559,11 +556,14 @@ mod tests { #[test] fn test_gen_key_pair() { - let privkey = Wallet::gen_priv_key().unwrap(); - let public_key = Wallet::gen_public_key(privkey); - let private_key_hex = hex::encode(privkey.private_key.secret_bytes()).to_uppercase(); - let public_key_hex = hex::encode(public_key.serialize()).to_uppercase(); - assert_eq!(private_key_hex.len(), 64); - assert_eq!(public_key_hex.len(), 66); + let address_hrp = AddressHrp::from_static("cosmos"); + let wallet = Wallet::generate(address_hrp).unwrap(); + let private_key = wallet.get_privkey().private_key.display_secret(); + let mut public_key = String::new(); + for byte in wallet.public_key_bytes() { + public_key.push_str(&format!("{:02x}", byte)); + } + assert_eq!(private_key.to_string().len(), 64); + assert_eq!(public_key.to_string().len(), 66); } } From 82ae535086e66807bf1d0dd2f1b822e9159453fd Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Mon, 25 Nov 2024 11:08:40 -0600 Subject: [PATCH 15/18] Updating cargo.lock --- Cargo.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e505e39..897eab2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -732,7 +732,6 @@ dependencies = [ "cw4-group", "fs-err", "futures", - "hex", "once_cell", "quickcheck", "regex", From 5c322eada4d6587e36712cba138f2e22056ec302 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Mon, 25 Nov 2024 11:09:40 -0600 Subject: [PATCH 16/18] Removing GenKeyPair --- packages/cosmos-bin/src/wallet.rs | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index f386680..3221621 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -30,8 +30,6 @@ enum Subcommand { /// Destination address HRP (human-readable part) hrp: AddressHrp, }, - /// Generate a Secp256k1 Private/Public key pair - GenKeyPair {}, } pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { @@ -46,20 +44,6 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } => { println!("{}", orig.with_hrp(address_type)); } - Subcommand::GenKeyPair {} => gen_key_pair()?, } Ok(()) -} - -fn gen_key_pair() -> Result<()> { - let address_hrp = AddressHrp::from_static("cosmos"); - let wallet = cosmos::Wallet::generate(address_hrp).unwrap(); - let private_key = wallet.get_privkey().private_key.display_secret(); - let mut public_key = String::new(); - for byte in wallet.public_key_bytes() { - public_key.push_str(&format!("{:02x}", byte)); - } - println!("Private Key: {}", private_key); - println!("Public Key: {}", public_key); - Ok(()) -} +} \ No newline at end of file From d969e570ec80459d659f5d6f60caa8013a027758 Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Mon, 25 Nov 2024 11:13:23 -0600 Subject: [PATCH 17/18] Restoring file to previous commit --- packages/cosmos-bin/src/wallet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cosmos-bin/src/wallet.rs b/packages/cosmos-bin/src/wallet.rs index 3221621..21ae1a6 100644 --- a/packages/cosmos-bin/src/wallet.rs +++ b/packages/cosmos-bin/src/wallet.rs @@ -46,4 +46,4 @@ pub(crate) async fn go(Opt { sub }: Opt) -> Result<()> { } } Ok(()) -} \ No newline at end of file +} From 2d1e668a0572f0bb423837c9c477edf01b41b1da Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Mon, 25 Nov 2024 13:40:46 -0600 Subject: [PATCH 18/18] Using hex crate again --- Cargo.lock | 1 + packages/cosmos-bin/Cargo.toml | 1 + packages/cosmos-bin/src/main.rs | 5 +---- packages/cosmos/src/wallet.rs | 5 +---- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 897eab2..e505e39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -732,6 +732,7 @@ dependencies = [ "cw4-group", "fs-err", "futures", + "hex", "once_cell", "quickcheck", "regex", diff --git a/packages/cosmos-bin/Cargo.toml b/packages/cosmos-bin/Cargo.toml index f8445a6..d88e6b6 100644 --- a/packages/cosmos-bin/Cargo.toml +++ b/packages/cosmos-bin/Cargo.toml @@ -28,6 +28,7 @@ cw4-group = "2.0.0" cw-utils = "2.0.0" cosmwasm-std = "2.1.4" csv = "1.3.0" +hex = "0.4" [dev-dependencies] quickcheck = "1" diff --git a/packages/cosmos-bin/src/main.rs b/packages/cosmos-bin/src/main.rs index be3888a..6bd6254 100644 --- a/packages/cosmos-bin/src/main.rs +++ b/packages/cosmos-bin/src/main.rs @@ -80,10 +80,7 @@ fn gen_wallet(hrp: AddressHrp) -> Result<()> { let phrase = cosmos::SeedPhrase::random(); let wallet = phrase.with_hrp(hrp)?; let private_key = wallet.get_privkey().private_key.display_secret(); - let mut public_key = String::new(); - for byte in wallet.public_key_bytes() { - public_key.push_str(&format!("{:02x}", byte)); - } + let public_key = hex::encode(wallet.public_key_bytes()); println!("Mnemonic: {}", phrase.phrase()); println!("Address: {wallet}"); println!("Private Key: {}", private_key); diff --git a/packages/cosmos/src/wallet.rs b/packages/cosmos/src/wallet.rs index 8c0985f..d6f574b 100644 --- a/packages/cosmos/src/wallet.rs +++ b/packages/cosmos/src/wallet.rs @@ -559,10 +559,7 @@ mod tests { let address_hrp = AddressHrp::from_static("cosmos"); let wallet = Wallet::generate(address_hrp).unwrap(); let private_key = wallet.get_privkey().private_key.display_secret(); - let mut public_key = String::new(); - for byte in wallet.public_key_bytes() { - public_key.push_str(&format!("{:02x}", byte)); - } + let public_key = hex::encode(wallet.public_key_bytes()); assert_eq!(private_key.to_string().len(), 64); assert_eq!(public_key.to_string().len(), 66); }