diff --git a/libzkbob-rs-node/Cargo.toml b/libzkbob-rs-node/Cargo.toml index ebe9996..ddf6f52 100644 --- a/libzkbob-rs-node/Cargo.toml +++ b/libzkbob-rs-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libzkbob-rs-node" -version = "0.3.0" +version = "1.0.0" authors = ["Dmitry Vdovin "] repository = "https://github.com/zkBob/libzkbob-rs/" license = "MIT OR Apache-2.0" @@ -11,7 +11,7 @@ exclude = ["index.node"] crate-type = ["cdylib"] [dependencies] -libzkbob-rs = { version = "0.10.0", features = ["native"] } +libzkbob-rs = { version = "1.0.0", features = ["native"] } #libzkbob-rs = { path = "../libzkbob-rs", features = ["native"] } neon = { version = "0.10.0", default-features = false, features = ["channel-api", "napi-6", "promise-api", "task-api"] } # FIXME: Using a random fork for now diff --git a/libzkbob-rs-node/index.d.ts b/libzkbob-rs-node/index.d.ts index 020b1e0..b8f3781 100644 --- a/libzkbob-rs-node/index.d.ts +++ b/libzkbob-rs-node/index.d.ts @@ -131,6 +131,7 @@ declare class Helpers { static parseDelta(delta: string): { v: string, e: string, index: string, poolId: string } static numToStr(num: Buffer): string static strToNum(str: string): Buffer + static isInPrimeSubgroup(num: Buffer): boolean } declare class Keys { diff --git a/libzkbob-rs-node/index.js b/libzkbob-rs-node/index.js index cbf989b..4b4de6e 100644 --- a/libzkbob-rs-node/index.js +++ b/libzkbob-rs-node/index.js @@ -136,6 +136,10 @@ class Helpers { static strToNum(str) { return zp.helpersStrToNum(str) } + + static isInPrimeSubgroup(num) { + return zp.helpersIsInPrimeSubgroup(num) + } } class Keys { diff --git a/libzkbob-rs-node/package.json b/libzkbob-rs-node/package.json index fb38dfd..d3a3f1c 100644 --- a/libzkbob-rs-node/package.json +++ b/libzkbob-rs-node/package.json @@ -1,6 +1,6 @@ { "name": "libzkbob-rs-node", - "version": "0.3.0", + "version": "1.0.0", "description": "Neon version of libzkbob-rs", "main": "index.js", "types": "index.d.ts", diff --git a/libzkbob-rs-node/src/helpers.rs b/libzkbob-rs-node/src/helpers.rs index a52f453..c3421bf 100644 --- a/libzkbob-rs-node/src/helpers.rs +++ b/libzkbob-rs-node/src/helpers.rs @@ -4,6 +4,8 @@ use std::str::FromStr; use libzkbob_rs::libzeropool::constants::OUT; use libzkbob_rs::libzeropool::fawkes_crypto::borsh::{BorshDeserialize, BorshSerialize}; use libzkbob_rs::libzeropool::fawkes_crypto::ff_uint::Num; +use libzkbob_rs::libzeropool::fawkes_crypto::native::ecc::EdwardsPoint; +use libzkbob_rs::libzeropool::native::params::PoolParams; use libzkbob_rs::libzeropool::native::tx::{out_commitment_hash, parse_delta}; use libzkbob_rs::libzeropool::POOL_PARAMS; @@ -81,3 +83,14 @@ pub fn str_to_num(mut cx: FunctionContext) -> JsResult { Ok(buf) } + +pub fn is_in_prime_subgroup(mut cx: FunctionContext) -> JsResult { + let p: Num = { + let buffer = cx.argument::(0)?; + Num::try_from_slice(buffer.as_slice(&cx)).unwrap() + }; + match EdwardsPoint::subgroup_decompress(p, &*POOL_PARAMS.jubjub()) { + Some(_) => Ok(cx.boolean(true)), + None => Ok(cx.boolean(false)) + } +} \ No newline at end of file diff --git a/libzkbob-rs-node/src/lib.rs b/libzkbob-rs-node/src/lib.rs index c576bb3..52956a5 100644 --- a/libzkbob-rs-node/src/lib.rs +++ b/libzkbob-rs-node/src/lib.rs @@ -88,6 +88,7 @@ fn main(mut cx: ModuleContext) -> NeonResult<()> { cx.export_function("helpersParseDelta", helpers::parse_delta_string)?; cx.export_function("helpersNumToStr", helpers::num_to_str)?; cx.export_function("helpersStrToNum", helpers::str_to_num)?; + cx.export_function("helpersIsInPrimeSubgroup", helpers::is_in_prime_subgroup)?; cx.export_function("keysDerive", keys::keys_derive)?; diff --git a/libzkbob-rs-wasm/Cargo.toml b/libzkbob-rs-wasm/Cargo.toml index fca5c5b..f766e2d 100644 --- a/libzkbob-rs-wasm/Cargo.toml +++ b/libzkbob-rs-wasm/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "libzkbob-rs-wasm" description = "A higher level zkBob API for Wasm" -version = "0.9.0" +version = "1.0.0" authors = ["Dmitry Vdovin "] repository = "https://github.com/zkBob/libzkbob-rs/" license = "MIT OR Apache-2.0" diff --git a/libzkbob-rs-wasm/src/lib.rs b/libzkbob-rs-wasm/src/lib.rs index bf56887..f33a917 100644 --- a/libzkbob-rs-wasm/src/lib.rs +++ b/libzkbob-rs-wasm/src/lib.rs @@ -76,7 +76,7 @@ pub fn get_constants() -> Constants { #[wasm_bindgen(js_name = "validateAddress")] pub fn validate_address(address: &str) -> bool { - parse_address::(address).is_ok() + parse_address::(address, &POOL_PARAMS).is_ok() } #[wasm_bindgen(js_name = "assembleAddress")] @@ -90,7 +90,7 @@ pub fn assemble_address(d: &str, p_d: &str) -> String { #[wasm_bindgen(js_name = "parseAddress")] pub fn parse_address_(address: &str) -> IAddressComponents { - let (d, p_d) = parse_address::(address).unwrap(); + let (d, p_d) = parse_address::(address, &POOL_PARAMS).unwrap(); #[derive(Serialize)] struct Address { diff --git a/libzkbob-rs/Cargo.toml b/libzkbob-rs/Cargo.toml index 50e3813..a0446b7 100644 --- a/libzkbob-rs/Cargo.toml +++ b/libzkbob-rs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "libzkbob-rs" description = "A higher level zkBob API" -version = "0.10.0" +version = "1.0.0" authors = ["Dmitry Vdovin "] repository = "https://github.com/zkBob/libzkbob-rs/" license = "MIT OR Apache-2.0" @@ -23,10 +23,10 @@ kvdb-memorydb = "0.9.0" hex = { version = "0.4.3", features = ["serde"] } [dependencies.libzeropool] -git = "https://github.com/zkbob/libzeropool" +git = "https://github.com/zkbob/libzeropool-zkbob" branch = "master" package = "libzeropool-zkbob" -version = "0.6.0" +version = "1.1.0" default-features = false features = ["in3out127"] diff --git a/libzkbob-rs/src/address.rs b/libzkbob-rs/src/address.rs index 6654494..a9f684a 100644 --- a/libzkbob-rs/src/address.rs +++ b/libzkbob-rs/src/address.rs @@ -3,7 +3,7 @@ use libzeropool::{ constants, fawkes_crypto::{ borsh::{BorshDeserialize, BorshSerialize}, - ff_uint::Num, + ff_uint::Num, native::ecc::EdwardsPoint, }, native::boundednum::BoundedNum, native::params::PoolParams, @@ -16,6 +16,8 @@ const ADDR_LEN: usize = 46; pub enum AddressParseError { #[error("Invalid checksum")] InvalidChecksum, + #[error("Pd does not belongs prime subgroup")] + InvalidNumber, #[error("Decode error: {0}")] Base58DecodeError(#[from] bs58::decode::Error), #[error("Deserialization error: {0}")] @@ -24,6 +26,7 @@ pub enum AddressParseError { pub fn parse_address( address: &str, + params: &P, ) -> Result< ( BoundedNum, @@ -45,7 +48,10 @@ pub fn parse_address( let d = BoundedNum::try_from_slice(&bytes[0..10])?; let p_d = Num::try_from_slice(&bytes[10..42])?; - Ok((d, p_d)) + match EdwardsPoint::subgroup_decompress(p_d, params.jubjub()) { + Some(_) => Ok((d, p_d)), + None => Err(AddressParseError::InvalidNumber) + } } pub fn format_address( diff --git a/libzkbob-rs/src/client/mod.rs b/libzkbob-rs/src/client/mod.rs index 85ece22..a8d8f93 100644 --- a/libzkbob-rs/src/client/mod.rs +++ b/libzkbob-rs/src/client/mod.rs @@ -171,7 +171,7 @@ where pub fn is_own_address(&self, address: &str) -> bool { let mut result = false; - if let Ok((d, p_d)) = parse_address::

(address) { + if let Ok((d, p_d)) = parse_address::

(address, &self.params) { let own_p_d = derive_key_p_d(d.to_num(), self.keys.eta, &self.params).x; result = own_p_d == p_d; } @@ -333,7 +333,7 @@ where let out_notes = outputs .iter() .map(|dest| { - let (to_d, to_p_d) = parse_address::

(&dest.to)?; + let (to_d, to_p_d) = parse_address::

(&dest.to, &self.params)?; output_value += dest.amount.to_num();