From ff643501672c2d01b47b780aea7960e13e4887b1 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 6 Oct 2024 13:54:49 +0700 Subject: [PATCH 1/5] feat: add a convenience method to get the public key data for a private key depending on the key type --- .../identity/identity_public_key/key_type.rs | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index d91bec66264..e7cbf329379 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -17,7 +17,7 @@ use lazy_static::lazy_static; use crate::fee::Credits; use crate::version::PlatformVersion; -use crate::ProtocolError; +use crate::{InvalidVectorSizeError, ProtocolError}; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -204,6 +204,61 @@ impl KeyType { } } + /// Gets the public key data for a private key depending on the key type + pub fn public_key_data_from_private_key_data( + &self, + private_key_bytes: Vec, + network: Network, + ) -> Result, ProtocolError> { + match self { + KeyType::ECDSA_SECP256K1 => { + let secp = Secp256k1::new(); + let secret_key = + dashcore::secp256k1::SecretKey::from_slice(private_key_bytes.as_slice()) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let private_key = dashcore::PrivateKey::new(secret_key, network); + + Ok(private_key.public_key(&secp).to_bytes()) + } + KeyType::BLS12_381 => { + let private_key = + bls_signatures::PrivateKey::from_bytes(private_key_bytes.as_slice(), false) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let public_key_bytes = private_key + .g1_element() + .expect("expected to get a public key from a bls private key") + .to_bytes() + .to_vec(); + Ok(public_key_bytes) + } + KeyType::ECDSA_HASH160 => { + let secp = Secp256k1::new(); + let secret_key = + dashcore::secp256k1::SecretKey::from_slice(private_key_bytes.as_slice()) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let private_key = dashcore::PrivateKey::new(secret_key, network); + + Ok(ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec()) + } + KeyType::EDDSA_25519_HASH160 => { + let key_pair = ed25519_dalek::SigningKey::from_bytes( + &private_key_bytes.as_slice().try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( + 32, + private_key_bytes.len(), + )) + })?, + ); + Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) + } + KeyType::BIP13_SCRIPT_HASH => { + return Err(ProtocolError::NotSupported( + "Converting a private key to a script hash is not supported".to_string(), + )); + } + } + } + #[cfg(feature = "random-public-keys")] /// Gets the default size of the public key pub fn random_public_and_private_key_data_v0(&self, rng: &mut StdRng) -> (Vec, Vec) { From c2854459ebd49b1f5a68b813a478184324fe17db Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 6 Oct 2024 14:02:42 +0700 Subject: [PATCH 2/5] fix features --- .../identity/identity_public_key/key_type.rs | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index e7cbf329379..47a7430cca4 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "random-public-keys")] use crate::util::hash::ripemd160_sha256; use anyhow::bail; use bincode::{Decode, Encode}; @@ -8,9 +7,7 @@ use ciborium::value::Value as CborValue; use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; #[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; -#[cfg(feature = "random-public-keys")] use dashcore::secp256k1::Secp256k1; -#[cfg(feature = "random-public-keys")] use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; @@ -241,15 +238,22 @@ impl KeyType { Ok(ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec()) } KeyType::EDDSA_25519_HASH160 => { - let key_pair = ed25519_dalek::SigningKey::from_bytes( - &private_key_bytes.as_slice().try_into().map_err(|_| { - ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( - 32, - private_key_bytes.len(), - )) - })?, - ); - Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) + #[cfg(feature = "ed25519-dalek")] + { + let key_pair = ed25519_dalek::SigningKey::from_bytes( + &private_key_bytes.as_slice().try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( + 32, + private_key_bytes.len(), + )) + })?, + ); + Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) + } + #[cfg(not(feature = "ed25519-dalek"))] + return Err(ProtocolError::NotSupported( + "Converting a private key to a eddsa hash 160 is not supported without the ed25519-dalek feature".to_string(), + )); } KeyType::BIP13_SCRIPT_HASH => { return Err(ProtocolError::NotSupported( From 14d54095652bf7a160991337a8b6b82e8f1725c9 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 6 Oct 2024 14:05:59 +0700 Subject: [PATCH 3/5] fix features --- .../src/identity/identity_public_key/key_type.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 47a7430cca4..cd33e3454c2 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -204,14 +204,14 @@ impl KeyType { /// Gets the public key data for a private key depending on the key type pub fn public_key_data_from_private_key_data( &self, - private_key_bytes: Vec, + private_key_bytes: &[u8], network: Network, ) -> Result, ProtocolError> { match self { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); let secret_key = - dashcore::secp256k1::SecretKey::from_slice(private_key_bytes.as_slice()) + dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); @@ -219,7 +219,7 @@ impl KeyType { } KeyType::BLS12_381 => { let private_key = - bls_signatures::PrivateKey::from_bytes(private_key_bytes.as_slice(), false) + bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let public_key_bytes = private_key .g1_element() @@ -231,7 +231,7 @@ impl KeyType { KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); let secret_key = - dashcore::secp256k1::SecretKey::from_slice(private_key_bytes.as_slice()) + dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); @@ -241,7 +241,7 @@ impl KeyType { #[cfg(feature = "ed25519-dalek")] { let key_pair = ed25519_dalek::SigningKey::from_bytes( - &private_key_bytes.as_slice().try_into().map_err(|_| { + &private_key_bytes.try_into().map_err(|_| { ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( 32, private_key_bytes.len(), From a0e5e0d969c22f4587d7ee40431cc50e080b29d1 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 6 Oct 2024 14:39:02 +0700 Subject: [PATCH 4/5] fix features --- .../identity/identity_public_key/key_type.rs | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index cd33e3454c2..382ef7a0212 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -218,15 +218,22 @@ impl KeyType { Ok(private_key.public_key(&secp).to_bytes()) } KeyType::BLS12_381 => { - let private_key = - bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) - .map_err(|e| ProtocolError::Generic(e.to_string()))?; - let public_key_bytes = private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec(); - Ok(public_key_bytes) + #[cfg(feature = "bls-signatures")] + { + let private_key = + bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let public_key_bytes = private_key + .g1_element() + .expect("expected to get a public key from a bls private key") + .to_bytes() + .to_vec(); + Ok(public_key_bytes) + } + #[cfg(not(feature = "bls-signatures"))] + return Err(ProtocolError::NotSupported( + "Converting a private key to a bls public key is not supported without the bls-signatures feature".to_string(), + )); } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); From 4d838f0d390d6ca8c9642210ea1db12f98770508 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 6 Oct 2024 14:39:10 +0700 Subject: [PATCH 5/5] fix features --- .../src/identity/identity_public_key/key_type.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 382ef7a0212..908f913969f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -210,9 +210,8 @@ impl KeyType { match self { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); - let secret_key = - dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) - .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); Ok(private_key.public_key(&secp).to_bytes()) @@ -237,9 +236,8 @@ impl KeyType { } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); - let secret_key = - dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) - .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); Ok(ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec())