diff --git a/Cargo.lock b/Cargo.lock index 39ce56f..cf6fa5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,6 +57,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "ansi_term" version = "0.12.1" @@ -66,6 +72,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + [[package]] name = "arrayref" version = "0.3.9" @@ -94,7 +106,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -258,6 +270,27 @@ dependencies = [ "rustc-serialize", ] +[[package]] +name = "bulletproofs" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "012e2e5f88332083bd4235d445ae78081c00b2558443821a9ca5adfe1070073d" +dependencies = [ + "byteorder", + "clear_on_drop", + "curve25519-dalek 4.1.3", + "digest 0.10.7", + "group", + "merlin", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "serde_derive", + "sha3 0.10.8", + "subtle", + "thiserror", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -294,7 +327,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9daec6140ab4dcd38c3dd57e580b59a621172a526ac79f1527af760a55afeafd" dependencies = [ - "clap", + "clap 2.34.0", "log", "proc-macro2", "quote", @@ -326,6 +359,33 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half 2.4.1", +] + [[package]] name = "cipher" version = "0.2.5" @@ -350,6 +410,31 @@ dependencies = [ "vec_map", ] +[[package]] +name = "clap" +version = "4.5.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "clear_on_drop" version = "0.2.5" @@ -404,8 +489,8 @@ checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" dependencies = [ "atty", "cast", - "clap", - "criterion-plot", + "clap 2.34.0", + "criterion-plot 0.4.5", "csv", "itertools", "lazy_static 1.5.0", @@ -422,6 +507,32 @@ dependencies = [ "walkdir", ] +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap 4.5.28", + "criterion-plot 0.5.0", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + [[package]] name = "criterion-plot" version = "0.4.5" @@ -432,6 +543,16 @@ dependencies = [ "itertools", ] +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -497,9 +618,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array 0.14.7", "subtle", @@ -553,6 +674,36 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "group", + "rand_core 0.6.4", + "rustc_version", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "der" version = "0.7.9" @@ -846,6 +997,12 @@ dependencies = [ "wedpr_l_utils 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "foreign-types" version = "0.3.2" @@ -950,6 +1107,16 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -959,6 +1126,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -991,7 +1164,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.1", + "crypto-mac 0.11.0", "digest 0.9.0", ] @@ -1024,6 +1197,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "is-terminal" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -1178,13 +1362,13 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "merlin" -version = "1.3.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0942b357c1b4d0dc43ba724674ec89c3218e6ca2b3e8269e7cb53bcecd2f6e" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core 0.4.2", + "rand_core 0.6.4", "zeroize", ] @@ -1730,6 +1914,15 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe834bc780604f4674073badbad26d7219cadfb4a2275802db12cbae17498401" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.40" @@ -1806,6 +1999,12 @@ dependencies = [ "cc", ] +[[package]] +name = "semver" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + [[package]] name = "serde" version = "1.0.195" @@ -1821,7 +2020,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ - "half", + "half 1.8.3", "serde", ] @@ -1919,6 +2118,16 @@ dependencies = [ "opaque-debug 0.2.3", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1998,9 +2207,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2058,6 +2267,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -2299,11 +2528,12 @@ name = "wedpr_ffi_c_zkp" version = "1.0.0" dependencies = [ "cbindgen", - "curve25519-dalek 1.2.6", + "curve25519-dalek 4.1.3", "libc", "wedpr_ffi_common 1.1.0", "wedpr_ffi_macros 1.1.0", "wedpr_l_crypto_zkp_discrete_logarithm_proof", + "wedpr_l_crypto_zkp_range_proof", "wedpr_l_crypto_zkp_utils 1.3.0", "wedpr_l_utils 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2408,25 +2638,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25c251c82cdf6abfb141bae92553c4d7e1a60baa005daffe19bb991d573c863b" -[[package]] -name = "wedpr_l_bulletproofs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a40bf29b5f1ee2526389295af5f65b0b273823dc4814782a7d54bfa9c0221e" -dependencies = [ - "byteorder", - "clear_on_drop", - "curve25519-dalek 1.2.6", - "digest 0.8.1", - "failure", - "merlin", - "rand 0.6.5", - "serde", - "serde_derive", - "sha3 0.8.2", - "subtle", -] - [[package]] name = "wedpr_l_common_coder_base64" version = "1.1.0" @@ -2637,7 +2848,7 @@ dependencies = [ name = "wedpr_l_crypto_ot_base_ot" version = "0.2.0" dependencies = [ - "criterion", + "criterion 0.3.6", "curve25519-dalek 1.2.6", "lazy_static 1.5.0", "rand 0.6.5", @@ -2664,7 +2875,7 @@ dependencies = [ name = "wedpr_l_crypto_signature_secp256k1" version = "1.1.0" dependencies = [ - "criterion", + "criterion 0.3.6", "lazy_static 1.5.0", "secp256k1", "wedpr_l_macros 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2712,10 +2923,10 @@ dependencies = [ name = "wedpr_l_crypto_zkp_discrete_logarithm_proof" version = "1.3.0" dependencies = [ - "criterion", - "curve25519-dalek 1.2.6", + "criterion 0.5.1", + "curve25519-dalek 4.1.3", "hex", - "rand 0.6.5", + "rand 0.8.5", "wedpr_l_crypto_zkp_utils 1.3.0", "wedpr_l_macros 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "wedpr_l_protos 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2726,10 +2937,11 @@ dependencies = [ name = "wedpr_l_crypto_zkp_range_proof" version = "1.2.0" dependencies = [ - "curve25519-dalek 1.2.6", + "bulletproofs", + "criterion 0.5.1", + "curve25519-dalek 4.1.3", "merlin", - "wedpr_l_bulletproofs", - "wedpr_l_crypto_zkp_utils 1.2.0", + "wedpr_l_crypto_zkp_utils 1.3.0", "wedpr_l_macros 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "wedpr_l_utils 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2754,12 +2966,11 @@ dependencies = [ name = "wedpr_l_crypto_zkp_utils" version = "1.3.0" dependencies = [ - "curve25519-dalek 1.2.6", + "curve25519-dalek 4.1.3", "lazy_static 1.5.0", - "rand 0.6.5", - "rand_core 0.5.1", + "rand 0.8.5", "serde", - "sha3 0.8.2", + "sha3 0.10.8", "wedpr_l_crypto_hash_keccak256 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "wedpr_l_macros 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "wedpr_l_utils 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/crypto/zkp/discrete_logarithm_proof/Cargo.toml b/crypto/zkp/discrete_logarithm_proof/Cargo.toml index eeaf6e6..c55bb21 100644 --- a/crypto/zkp/discrete_logarithm_proof/Cargo.toml +++ b/crypto/zkp/discrete_logarithm_proof/Cargo.toml @@ -10,15 +10,15 @@ description = "Library of WeDPR shared zkp Function implement discrete logarithm [dependencies] hex = "0.4.2" -curve25519-dalek = { version = "1.0", features = [ "serde" ] } +curve25519-dalek = { version = "4.1", features = [ "serde" ] } wedpr_l_crypto_zkp_utils = {version = "1.3.0", path = "../utils/"} wedpr_l_macros = "1.0.0" wedpr_l_protos = "1.2.0" wedpr_l_utils = "1.1.0" -rand = "0.6" +rand = "0.8.5" [dev-dependencies] -criterion = "0.3" +criterion = "0.5" [[bench]] name = "dlp" diff --git a/crypto/zkp/discrete_logarithm_proof/benches/dlp.rs b/crypto/zkp/discrete_logarithm_proof/benches/dlp.rs index a338995..cbf1ddf 100644 --- a/crypto/zkp/discrete_logarithm_proof/benches/dlp.rs +++ b/crypto/zkp/discrete_logarithm_proof/benches/dlp.rs @@ -168,7 +168,7 @@ fn create_point_mul_helper(c: &mut Criterion) { fn create_point_mul_1_helper(c: &mut Criterion) { let label = format!("create_point_mul_1_helper",); - let scalar_1 = Scalar::one(); + let scalar_1 = Scalar::from(1u8); let value_basepoint = *BASEPOINT_G1; c.bench_function(&label, move |b| b.iter(|| scalar_1 * value_basepoint)); } diff --git a/crypto/zkp/discrete_logarithm_proof/src/lib.rs b/crypto/zkp/discrete_logarithm_proof/src/lib.rs index ef38ef5..283df7f 100644 --- a/crypto/zkp/discrete_logarithm_proof/src/lib.rs +++ b/crypto/zkp/discrete_logarithm_proof/src/lib.rs @@ -279,8 +279,8 @@ pub fn verify_knowledge_proof_in_batch( } let mut t1_sum_expected: RistrettoPoint = Default::default(); let mut c1_c_expected: RistrettoPoint = Default::default(); - let mut m1_expected: Scalar = Scalar::zero(); - let mut m2_expected: Scalar = Scalar::zero(); + let mut m1_expected: Scalar = Scalar::from(0u8); + let mut m2_expected: Scalar = Scalar::from(0u8); for i in 0..c_point_list.len() { // 8 bit random scalar @@ -418,8 +418,8 @@ pub fn verify_format_proof_in_batch( let mut t2_sum_expected: RistrettoPoint = Default::default(); let mut c1_c_expected: RistrettoPoint = Default::default(); let mut c2_c_expected: RistrettoPoint = Default::default(); - let mut m1_expected: Scalar = Scalar::zero(); - let mut m2_expected: Scalar = Scalar::zero(); + let mut m1_expected: Scalar = Scalar::from(0u8); + let mut m2_expected: Scalar = Scalar::from(0u8); for i in 0..c1_point_list.len() { // 8 bit random scalar @@ -606,11 +606,11 @@ pub fn verify_sum_relationship_in_batch( let mut c1_c_expected: RistrettoPoint = Default::default(); let mut c2_c_expected: RistrettoPoint = Default::default(); let mut c3_c_expected: RistrettoPoint = Default::default(); - let mut m1_expected: Scalar = Scalar::zero(); - let mut m2_expected: Scalar = Scalar::zero(); - let mut m3_expected: Scalar = Scalar::zero(); - let mut m4_expected: Scalar = Scalar::zero(); - let mut m5_expected: Scalar = Scalar::zero(); + let mut m1_expected: Scalar = Scalar::from(0u8); + let mut m2_expected: Scalar = Scalar::from(0u8); + let mut m3_expected: Scalar = Scalar::from(0u8); + let mut m4_expected: Scalar = Scalar::from(0u8); + let mut m5_expected: Scalar = Scalar::from(0u8); for i in 0..c1_point_list.len() { // 8 bit random scalar let random_scalar = get_random_u8(); @@ -832,12 +832,12 @@ pub fn verify_product_relationship_in_batch( let mut t3_c1_c_expected: RistrettoPoint = Default::default(); let mut t3_c2_c_expected: RistrettoPoint = Default::default(); let mut t3_c3_c_expected: RistrettoPoint = Default::default(); - let mut m1_expected: Scalar = Scalar::zero(); - let mut m1_m3_expected: Scalar = Scalar::zero(); - let mut m2_expected: Scalar = Scalar::zero(); - let mut m3_expected: Scalar = Scalar::zero(); - let mut m4_expected: Scalar = Scalar::zero(); - let mut m5_expected: Scalar = Scalar::zero(); + let mut m1_expected: Scalar = Scalar::from(0u8); + let mut m1_m3_expected: Scalar = Scalar::from(0u8); + let mut m2_expected: Scalar = Scalar::from(0u8); + let mut m3_expected: Scalar = Scalar::from(0u8); + let mut m4_expected: Scalar = Scalar::from(0u8); + let mut m5_expected: Scalar = Scalar::from(0u8); for i in 0..c1_point_list.len() { // 8 bit random scalar let random_scalar = get_random_u8(); @@ -988,7 +988,7 @@ pub fn verify_equality_relationship_proof_in_batch( let mut t2_sum_expected: RistrettoPoint = Default::default(); let mut c1_c_expected: RistrettoPoint = Default::default(); let mut c2_c_expected: RistrettoPoint = Default::default(); - let mut m1_expected: Scalar = Scalar::zero(); + let mut m1_expected: Scalar = Scalar::from(0u8); for i in 0..c1_point_list.len() { // 8 bit random scalar let random_scalar = get_random_u8(); @@ -1071,7 +1071,7 @@ mod tests { &[c_basepoint, blinding_basepoint], ); let c3_point = - RistrettoPoint::multiscalar_mul(&[Scalar::zero(), c3_blinding], &[ + RistrettoPoint::multiscalar_mul(&[Scalar::from(0u8), c3_blinding], &[ c_basepoint, blinding_basepoint, ]); diff --git a/crypto/zkp/range_proof/Cargo.toml b/crypto/zkp/range_proof/Cargo.toml index f562bb2..b2b8542 100644 --- a/crypto/zkp/range_proof/Cargo.toml +++ b/crypto/zkp/range_proof/Cargo.toml @@ -9,9 +9,16 @@ description = "Library of WeDPR shared zkp Function implement range proof." # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bulletproofs = { package = "wedpr_l_bulletproofs", version = "1.0.5" } -curve25519-dalek = { version = "1.0", features = [ "serde" ] } -merlin = "1" -wedpr_l_crypto_zkp_utils = "1.2.0" +bulletproofs = { package = "bulletproofs", version = "5.0" } +curve25519-dalek = { version = "4.1", features = [ "serde" ] } +merlin = "3" +wedpr_l_crypto_zkp_utils = {version = "1.3.0", path = "../utils/"} wedpr_l_macros = "1.0.0" wedpr_l_utils = "1.1.0" + +[dev-dependencies] +criterion = "0.5" + +[[bench]] +name = "proof" +harness = false diff --git a/crypto/zkp/range_proof/benches/proof.rs b/crypto/zkp/range_proof/benches/proof.rs new file mode 100644 index 0000000..bac5b87 --- /dev/null +++ b/crypto/zkp/range_proof/benches/proof.rs @@ -0,0 +1,32 @@ +// Copyright 2021 WeDPR Lab Project Authors. Licensed under Apache-2.0. + +#[macro_use] +extern crate criterion; +use criterion::Criterion; + +use curve25519_dalek::{ + ristretto::RistrettoPoint, scalar::Scalar, traits::MultiscalarMul, +}; +use wedpr_l_crypto_zkp_range_proof::{ + self, prove_value_range, verify_value_range, +}; + +fn create_verify_range_proof_helper(c: &mut Criterion) { + let label = format!("create_verify_range_proof_helper"); + let (proof_c1, c1_point, _) = prove_value_range(32u64); + c.bench_function(&label, move |b| { + b.iter(|| { + assert_eq!(true, verify_value_range(&c1_point, &proof_c1)); + }) + }); +} + +criterion_group! { + name = init_proof_test; + config = Criterion::default().sample_size(10); +targets = +create_verify_range_proof_helper, + +} + +criterion_main!(init_proof_test); diff --git a/crypto/zkp/utils/Cargo.toml b/crypto/zkp/utils/Cargo.toml index a559fb4..1b08e65 100644 --- a/crypto/zkp/utils/Cargo.toml +++ b/crypto/zkp/utils/Cargo.toml @@ -10,11 +10,13 @@ description = "Library of WeDPR shared zkp function utils." [dependencies] serde = { version = "1.0", features = ["derive"] } -curve25519-dalek = { version = "1.0", features = [ "serde" ] } +curve25519-dalek = { version = "4.1", features = [ "serde", "digest", "rand_core" ] } lazy_static = "1.4.0" -rand = "0.6" -rand_core = { version = "0.5", features = ["getrandom"] } -sha3 = "0.8" +rand = "0.8.5" +sha3 = "0.10" wedpr_l_crypto_hash_keccak256 = "1.1.0" wedpr_l_macros = "1.0.0" wedpr_l_utils = "1.1.0" + +[patch.crates-io] +zerocopy = { version = "=0.7.35" } diff --git a/crypto/zkp/utils/src/lib.rs b/crypto/zkp/utils/src/lib.rs index a619190..e1d23cc 100644 --- a/crypto/zkp/utils/src/lib.rs +++ b/crypto/zkp/utils/src/lib.rs @@ -379,7 +379,7 @@ fn to_bytes32_slice(barry: &[u8]) -> Result<&[u8; 32], WedprError> { /// Converts a vector to Scalar. pub fn bytes_to_scalar(input: &[u8]) -> Result { let get_num_u8 = to_bytes32_slice(&input)?; - let scalar_num = Scalar::from_bits(*get_num_u8); + let scalar_num = Scalar::from_bytes_mod_order(*get_num_u8); Ok(scalar_num) } @@ -399,7 +399,17 @@ pub fn bytes_to_point(point: &[u8]) -> Result { wedpr_println!("bytes_to_point decode failed"); return Err(WedprError::FormatError); } - let point_value = match CompressedRistretto::from_slice(&point).decompress() + let point_value_result = match CompressedRistretto::from_slice(&point) + { + Ok(v) => v, + Err(_e) => { + wedpr_println!( + "bytes_to_point decompress CompressedRistretto failed" + ); + return Err(WedprError::FormatError); + }, + }; + let point_value = match point_value_result.decompress() { Some(v) => v, None => { diff --git a/ffi/ffi_c/ffi_c_zkp/Cargo.toml b/ffi/ffi_c/ffi_c_zkp/Cargo.toml index 0bf0193..e4c3bfe 100644 --- a/ffi/ffi_c/ffi_c_zkp/Cargo.toml +++ b/ffi/ffi_c/ffi_c_zkp/Cargo.toml @@ -6,20 +6,21 @@ edition = "2018" [features] default = ["wedpr_f_zkp_proof"] -wedpr_f_zkp_proof = ["wedpr_l_crypto_zkp_discrete_logarithm_proof"] +wedpr_f_zkp_proof = ["wedpr_l_crypto_zkp_discrete_logarithm_proof", "wedpr_l_crypto_zkp_range_proof"] [lib] name = "ffi_c_zkp" crate-type = [ "cdylib", "staticlib" ] [dependencies] -curve25519-dalek = { version = "1.0", features = [ "serde" ] } +curve25519-dalek = { version = "4.1", features = [ "serde" ] } libc = "0.2.60" wedpr_l_utils = "1.1.0" wedpr_ffi_common = { path = "../../ffi_common" } wedpr_ffi_macros = { path = "../../ffi_macros" } wedpr_l_crypto_zkp_utils = {version = "1.3.0", path = "../../../crypto/zkp/utils/"} wedpr_l_crypto_zkp_discrete_logarithm_proof = { version = "1.3.0", path = "../../../crypto/zkp/discrete_logarithm_proof/", optional = true} +wedpr_l_crypto_zkp_range_proof = { path = "../../../crypto/zkp/range_proof/", optional = true} # This is required to generate C/C++ header files. [build-dependencies] diff --git a/ffi/ffi_c/ffi_c_zkp/src/lib.rs b/ffi/ffi_c/ffi_c_zkp/src/lib.rs index 575a694..51d273e 100644 --- a/ffi/ffi_c/ffi_c_zkp/src/lib.rs +++ b/ffi/ffi_c/ffi_c_zkp/src/lib.rs @@ -2,5 +2,6 @@ //! compatible architectures (including iOS), with fast binary interfaces. // Copyright 2020 WeDPR Lab Project Authors. Licensed under Apache-2.0. pub mod discrete_logarithm_proof; +pub mod range_proof; pub mod utils; // C/C++ FFI: C-style interfaces will be generated. diff --git a/ffi/ffi_c/ffi_c_zkp/src/range_proof.rs b/ffi/ffi_c/ffi_c_zkp/src/range_proof.rs new file mode 100644 index 0000000..ea6ffd7 --- /dev/null +++ b/ffi/ffi_c/ffi_c_zkp/src/range_proof.rs @@ -0,0 +1,84 @@ +use crate::utils::{ + c_input_buffer_to_point, c_input_buffer_to_scalar, + c_input_buffer_to_vec +}; +use wedpr_ffi_common::utils::{CInputBuffer, COutputBuffer, FAILURE, SUCCESS}; + +use wedpr_ffi_common::utils::c_write_data_to_pointer; + +#[cfg(feature = "wedpr_f_zkp_proof")] +use wedpr_l_crypto_zkp_range_proof::{ + prove_value_range_with_blinding_and_blinding_basepoint, verify_value_range_with_blinding_basepoint +}; + +#[no_mangle] +/// C interface for 'wedpr_generate_range_proof'. +pub unsafe extern "C" fn wedpr_generate_range_proof( + c_value: u64, + c_blinding: &CInputBuffer, + blinding_basepoint_data: &CInputBuffer, + c_range_proof: &mut COutputBuffer, +) -> i8 { + // c_blinding + let c_blinding_result: Result = c_input_buffer_to_scalar(&c_blinding); + let c_blinding_value = match c_blinding_result { + Ok(v) => v, + Err(_) => return FAILURE, + }; + // blinding_basepoint + let blinding_basepoint_result = + c_input_buffer_to_point(blinding_basepoint_data); + let blinding_basepoint = match blinding_basepoint_result { + Ok(v) => v, + Err(_) => return FAILURE, + }; + let (range_proof, _) = prove_value_range_with_blinding_and_blinding_basepoint( + c_value, + &c_blinding_value, + &blinding_basepoint, + ); + // write balance proof back to c_balance_proof + c_write_data_to_pointer( + &range_proof, + c_range_proof.data, + c_range_proof.len, + ); + SUCCESS +} + +#[no_mangle] +/// C interface for 'wedpr_verify_range_proof'. +pub unsafe extern "C" fn wedpr_verify_range_proof( + commitment_point_data: &CInputBuffer, + proof: &CInputBuffer, + blinding_basepoint_data: &CInputBuffer, +) -> i8 { + // c_point + let c_point_result = c_input_buffer_to_point(commitment_point_data); + let c_point = match c_point_result { + Ok(v) => v, + Err(_) => return FAILURE, + }; + // range_proof + let range_proof_result = c_input_buffer_to_vec(proof); + let range_proof = match range_proof_result { + Ok(v) => v, + Err(_) => return FAILURE, + }; + // blinding_basepoint + let blinding_basepoint_result = + c_input_buffer_to_point(blinding_basepoint_data); + let blinding_basepoint = match blinding_basepoint_result { + Ok(v) => v, + Err(_) => return FAILURE, + }; + let result = verify_value_range_with_blinding_basepoint( + &c_point, + &range_proof, + &blinding_basepoint, + ); + if result { + return SUCCESS; + } + FAILURE +} diff --git a/ffi/ffi_c/ffi_c_zkp/src/utils.rs b/ffi/ffi_c/ffi_c_zkp/src/utils.rs index 15be325..5286bf6 100644 --- a/ffi/ffi_c/ffi_c_zkp/src/utils.rs +++ b/ffi/ffi_c/ffi_c_zkp/src/utils.rs @@ -11,6 +11,16 @@ use wedpr_l_utils::error::WedprError; // From Rust to C/C++. use libc::c_char; + +pub unsafe fn c_input_buffer_to_vec( + input_data: &CInputBuffer, +) -> Result, WedprError> { + let rust_bytes_input = c_read_raw_pointer(&input_data); + // avoid the input c buffer been released + // std::mem::forget(rust_bytes_input); + Ok(rust_bytes_input) +} + pub unsafe fn c_input_buffer_to_point( input_data: &CInputBuffer, ) -> Result {