Skip to content

Commit 8581f05

Browse files
authored
Merge pull request #146 from owl352/feat/private-key
Dynamic type for arguments with private key
2 parents 6762986 + 125283a commit 8581f05

File tree

10 files changed

+146
-19
lines changed

10 files changed

+146
-19
lines changed

Cargo.lock

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "pshenmic-dpp"
3-
version = "1.1.2-dev.5"
3+
version = "1.1.2-dev.6"
44
edition = "2024"
55
rust-version = "1.85"
66

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pshenmic-dpp",
3-
"version": "1.1.2-dev.5",
3+
"version": "1.1.2-dev.6",
44
"main": "dist/wasm/index.js",
55
"types": "dist/wasm/index.d.ts",
66
"type": "module",

packages/enums/src/network/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,15 @@ impl From<NetworkWASM> for Network {
6565
}
6666
}
6767
}
68+
69+
impl From<Network> for NetworkWASM {
70+
fn from(network: Network) -> Self {
71+
match network {
72+
Network::Dash => NetworkWASM::Mainnet,
73+
Network::Testnet => NetworkWASM::Testnet,
74+
Network::Devnet => NetworkWASM::Devnet,
75+
Network::Regtest => NetworkWASM::Regtest,
76+
_ => NetworkWASM::Testnet,
77+
}
78+
}
79+
}

packages/identity_public_key/src/public_key.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ impl IdentityPublicKeyWASM {
9292

9393
#[wasm_bindgen]
9494
impl IdentityPublicKeyWASM {
95-
#[wasm_bindgen(js_name = "validatePrivateKey")]
96-
pub fn validate_private_key(
95+
#[wasm_bindgen(js_name = "validatePrivateKeyBytes")]
96+
pub fn validate_private_key_bytes(
9797
&self,
9898
js_private_key_bytes: Vec<u8>,
9999
js_network: &JsValue,
@@ -250,13 +250,13 @@ impl IdentityPublicKeyWASM {
250250
self.0.is_master()
251251
}
252252

253-
#[wasm_bindgen(js_name = "validatePrivateKeyBytes")]
254-
pub fn validate_private_key_bytes(
253+
#[wasm_bindgen(js_name = "validatePrivateKey")]
254+
pub fn validate_private_key(
255255
&self,
256-
private_key: &PrivateKeyWASM,
257-
js_network: JsValue,
256+
js_private_key: &JsValue,
257+
js_network: &JsValue,
258258
) -> Result<bool, JsValue> {
259-
let network: NetworkWASM = js_network.try_into()?;
259+
let private_key = PrivateKeyWASM::from_js_value(js_private_key, js_network)?;
260260

261261
self.0
262262
.validate_private_key_bytes(
@@ -265,7 +265,7 @@ impl IdentityPublicKeyWASM {
265265
.as_slice()
266266
.try_into()
267267
.map_err(|_| JsValue::from("Cannot convert vec<u8> to [u8; 32]"))?,
268-
network.into(),
268+
private_key.network(),
269269
)
270270
.with_js_error()
271271
}

packages/identity_public_key/src/public_key_in_creation.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use pshenmic_dpp_contract_bounds::ContractBoundsWASM;
1313
use pshenmic_dpp_enums::keys::key_type::KeyTypeWASM;
1414
use pshenmic_dpp_enums::keys::purpose::PurposeWASM;
1515
use pshenmic_dpp_enums::keys::security_level::SecurityLevelWASM;
16-
use pshenmic_dpp_private_key::PrivateKeyWASM;
1716
use pshenmic_dpp_utils::{IntoWasm, WithJsError};
1817
use wasm_bindgen::JsValue;
1918
use wasm_bindgen::prelude::wasm_bindgen;
@@ -132,12 +131,12 @@ impl IdentityPublicKeyInCreationWASM {
132131
#[wasm_bindgen(js_name = "validatePrivateKey")]
133132
pub fn validate_private_key(
134133
&self,
135-
private_key: &PrivateKeyWASM,
136-
js_network: JsValue,
134+
js_private_key: &JsValue,
135+
js_network: &JsValue,
137136
) -> Result<bool, JsValue> {
138137
let public_key: IdentityPublicKeyWASM = IdentityPublicKey::from(self.clone()).into();
139138

140-
public_key.validate_private_key_bytes(private_key, js_network)
139+
public_key.validate_private_key(js_private_key, js_network)
141140
}
142141

143142
#[wasm_bindgen(js_name = "getHash")]

packages/private_key/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ wasm-bindgen = { workspace = true }
1111
dpp = { workspace = true, features = [
1212
"identity-value-conversion",
1313
]}
14+
js-sys = { workspace = true }
1415
pshenmic_dpp_enums = {path = "../enums"}
16+
pshenmic_dpp_utils = {path = "../utils"}
1517
pshenmic_dpp_public_key = {path = "../public_key"}

packages/private_key/src/lib.rs

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
use dpp::dashcore::PrivateKey;
21
use dpp::dashcore::hashes::hex::FromHex;
32
use dpp::dashcore::key::Secp256k1;
43
use dpp::dashcore::secp256k1::Message;
54
use dpp::dashcore::secp256k1::hashes::hex::{Case, DisplayHex};
65
use dpp::dashcore::signer::{CompactSignature, double_sha};
6+
use dpp::dashcore::{Network, PrivateKey, base58};
7+
use js_sys::Uint8Array;
78
use pshenmic_dpp_enums::network::NetworkWASM;
89
use pshenmic_dpp_public_key::PublicKeyWASM;
10+
use pshenmic_dpp_utils::{IntoWasm, get_class_type};
911
use wasm_bindgen::JsValue;
1012
use wasm_bindgen::prelude::wasm_bindgen;
1113

12-
#[derive(Debug)]
14+
#[derive(Debug, Clone)]
1315
#[wasm_bindgen(js_name = "PrivateKeyWASM")]
1416
pub struct PrivateKeyWASM(PrivateKey);
1517

@@ -25,6 +27,11 @@ impl PrivateKeyWASM {
2527
"PrivateKeyWASM".to_string()
2628
}
2729

30+
#[wasm_bindgen(constructor)]
31+
pub fn new(value: &JsValue, js_network: &JsValue) -> Result<PrivateKeyWASM, JsValue> {
32+
PrivateKeyWASM::from_js_value(value, js_network)
33+
}
34+
2835
#[wasm_bindgen(js_name = "fromWIF")]
2936
pub fn from_wif(wif: &str) -> Result<Self, JsValue> {
3037
let pk = PrivateKey::from_wif(wif).map_err(|err| JsValue::from_str(&*err.to_string()));
@@ -69,6 +76,11 @@ impl PrivateKeyWASM {
6976

7077
#[wasm_bindgen]
7178
impl PrivateKeyWASM {
79+
#[wasm_bindgen(js_name = "getNetwork")]
80+
pub fn get_network(&self) -> String {
81+
NetworkWASM::from(self.0.network).into()
82+
}
83+
7284
#[wasm_bindgen(js_name = "WIF")]
7385
pub fn get_wif(&self) -> String {
7486
self.0.to_wif()
@@ -114,3 +126,57 @@ impl PrivateKeyWASM {
114126
Ok(signature.to_vec())
115127
}
116128
}
129+
130+
impl PrivateKeyWASM {
131+
pub fn network(&self) -> Network {
132+
self.0.network
133+
}
134+
135+
pub fn from_js_value(value: &JsValue, js_network: &JsValue) -> Result<Self, JsValue> {
136+
match value.is_string() {
137+
true => {
138+
let str = value
139+
.as_string()
140+
.ok_or(JsValue::from_str("Invalid string"))?;
141+
142+
if str.len() == 64 {
143+
// raw hex
144+
if js_network.is_undefined() {
145+
Err(JsValue::from_str(
146+
"You must specify a network when pass private key hex as arguments",
147+
))
148+
} else {
149+
PrivateKeyWASM::from_hex(&str, js_network)
150+
}
151+
} else {
152+
// base58 check
153+
let key_base58 = base58::decode_check(&str).map_err(|err| {
154+
JsValue::from(format!("Private Key error read wif ({})", err))
155+
})?;
156+
157+
if key_base58.clone().len() == 33 || key_base58.clone().len() == 34 {
158+
PrivateKeyWASM::from_wif(&str)
159+
} else {
160+
Err(JsValue::from(format!(
161+
"Private key decoded wif must be 38 byte length ({})",
162+
key_base58.clone().len()
163+
)))
164+
}
165+
}
166+
}
167+
false => match value.is_object() || value.is_array() {
168+
true => {
169+
if get_class_type(&value) == Ok("PrivateKeyWASM".to_string()) {
170+
Ok(value.to_wasm::<PrivateKeyWASM>("PrivateKeyWASM")?.clone())
171+
} else {
172+
let uint8_array = Uint8Array::from(value.clone());
173+
let bytes = uint8_array.to_vec();
174+
175+
PrivateKeyWASM::from_bytes(bytes, js_network)
176+
}
177+
}
178+
false => Err(JsValue::from("Cannot parse private key"))?,
179+
},
180+
}
181+
}
182+
}

packages/state_transition/src/lib.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,12 @@ impl StateTransitionWASM {
7171
#[wasm_bindgen(js_name = "sign")]
7272
pub fn sign(
7373
&mut self,
74-
private_key: &PrivateKeyWASM,
74+
js_private_key: &JsValue,
7575
public_key: &IdentityPublicKeyWASM,
76+
js_network: &JsValue,
7677
) -> Result<Vec<u8>, JsValue> {
78+
let private_key = PrivateKeyWASM::from_js_value(js_private_key, js_network)?;
79+
7780
self.0
7881
.sign(
7982
&public_key.clone().into(),
@@ -88,10 +91,13 @@ impl StateTransitionWASM {
8891
#[wasm_bindgen(js_name = "signByPrivateKey")]
8992
pub fn sign_by_private_key(
9093
&mut self,
91-
private_key: &PrivateKeyWASM,
94+
js_private_key: &JsValue,
9295
key_id: Option<KeyID>,
9396
js_key_type: &JsValue,
97+
js_network: &JsValue,
9498
) -> Result<Vec<u8>, JsValue> {
99+
let private_key = PrivateKeyWASM::from_js_value(js_private_key, js_network)?;
100+
95101
let key_type = match js_key_type.is_undefined() {
96102
true => KeyTypeWASM::ECDSA_SECP256K1,
97103
false => KeyTypeWASM::try_from(js_key_type.clone())?,

tests/IdentityPublicKey.spec.cjs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,48 @@ describe('PublicKey', function () {
9494

9595
const privateKey = wasm.PrivateKeyWASM.fromWIF(wif)
9696

97+
assert.equal(pubKey.validatePrivateKey(privateKey), false)
98+
})
99+
100+
it('should allow to validate private key bytes', function () {
101+
const pubKey = new wasm.IdentityPublicKeyWASM(
102+
keyId,
103+
purpose,
104+
securityLevel,
105+
keyType,
106+
false,
107+
binaryData)
108+
109+
const privateKey = wasm.PrivateKeyWASM.fromWIF(wif)
110+
97111
assert.equal(pubKey.validatePrivateKey(privateKey.bytes(), wasm.NetworkWASM.Mainnet), false)
98112
})
113+
114+
it('should allow to validate private key hex', function () {
115+
const pubKey = new wasm.IdentityPublicKeyWASM(
116+
keyId,
117+
purpose,
118+
securityLevel,
119+
keyType,
120+
false,
121+
binaryData)
122+
123+
const privateKey = wasm.PrivateKeyWASM.fromWIF(wif)
124+
125+
assert.equal(pubKey.validatePrivateKey(privateKey.hex(), wasm.NetworkWASM.Mainnet), false)
126+
})
127+
128+
it('should allow to validate private key wif', function () {
129+
const pubKey = new wasm.IdentityPublicKeyWASM(
130+
keyId,
131+
purpose,
132+
securityLevel,
133+
keyType,
134+
false,
135+
binaryData)
136+
137+
assert.equal(pubKey.validatePrivateKey(wif), false)
138+
})
99139
})
100140

101141
describe('setters', function () {

0 commit comments

Comments
 (0)