diff --git a/Cargo.lock b/Cargo.lock index eaa6cb98e0..82db2246e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,9 +285,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -342,9 +342,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbb778f50ecb0cebfb5c05580948501927508da7bd628833a8c4bd8545e23e2" +checksum = "6068f356948cd84b5ad9ac30c50478e433847f14a50714d2b68f15d052724049" dependencies = [ "alloy-primitives", "num_enum", @@ -1086,11 +1086,10 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8e52276fdb553d3c11563afad2898f4085165e4093604afe3d78b69afbf408f" +checksum = "ab54221eccefa254ce9f65b079c097b1796e48c21c7ce358230f8988d75392fb" dependencies = [ - "alloy-primitives", "darling", "proc-macro2", "quote", @@ -2001,9 +2000,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.41" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ "find-msvc-tools", "jobserver", @@ -2463,9 +2462,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", "serde_core", @@ -2674,6 +2673,7 @@ dependencies = [ "fhe-traits", "fhe-util", "hex", + "num-bigint", "rand 0.8.5", "zkfhe-greco", ] @@ -2965,7 +2965,7 @@ dependencies = [ "async-trait", "e3-fs", "git2", - "indicatif 0.18.1", + "indicatif 0.18.2", "regex", "serde", "serde_json", @@ -3373,18 +3373,18 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "4.3.0" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", @@ -3491,7 +3491,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#8b921cf1ddf5d6c51ebab4ac454d200f434c0832" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "doc-comment", "fhe-math", @@ -3516,7 +3516,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#8b921cf1ddf5d6c51ebab4ac454d200f434c0832" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "ethnum", "fhe-traits", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#8b921cf1ddf5d6c51ebab4ac454d200f434c0832" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "rand 0.8.5", ] @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#8b921cf1ddf5d6c51ebab4ac454d200f434c0832" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "itertools 0.12.1", "num-bigint-dig", @@ -4316,9 +4316,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -4329,9 +4329,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -4342,11 +4342,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -4357,42 +4356,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -4549,9 +4544,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e0ddd45fe8e09ee1a607920b12271f8a5528a41ecaf6e1d1440d6493315b6b" +checksum = "ade6dfcba0dfb62ad59e59e7241ec8912af34fd29e0e743e3db992bd278e8b65" dependencies = [ "console 0.16.1", "portable-atomic", @@ -4692,9 +4687,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -5226,9 +5221,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "local-channel" @@ -6208,9 +6203,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -6327,14 +6322,13 @@ dependencies = [ [[package]] name = "proptest" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" dependencies = [ "bit-set", "bit-vec 0.8.0", "bitflags 2.10.0", - "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -6981,16 +6975,16 @@ dependencies = [ "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.7", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -7008,9 +7002,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring 0.17.14", "rustls-pki-types", @@ -7802,9 +7796,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -8247,9 +8241,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-width" @@ -8416,9 +8410,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -8427,25 +8421,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.108", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -8456,9 +8436,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8466,22 +8446,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.108", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -8502,9 +8482,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -8947,9 +8927,9 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "ws_stream_wasm" @@ -9008,9 +8988,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.27" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xmltree" @@ -9032,11 +9012,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -9044,9 +9023,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", @@ -9117,9 +9096,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -9128,9 +9107,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -9139,9 +9118,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", @@ -9151,7 +9130,7 @@ dependencies = [ [[package]] name = "zkfhe-greco" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#2fee7ce1d2811c297f5814f2853f3f25b831c753" +source = "git+https://github.com/gnosisguild/zkfhe-generator#82f27e955599ff88f552e43594bc52859fb51681" dependencies = [ "anyhow", "bigint-poly", @@ -9174,7 +9153,7 @@ dependencies = [ [[package]] name = "zkfhe-shared" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#2fee7ce1d2811c297f5814f2853f3f25b831c753" +source = "git+https://github.com/gnosisguild/zkfhe-generator#82f27e955599ff88f552e43594bc52859fb51681" dependencies = [ "anyhow", "bigint-poly", diff --git a/crates/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml index 808051b440..d34e2dfc0e 100644 --- a/crates/bfv-helpers/Cargo.toml +++ b/crates/bfv-helpers/Cargo.toml @@ -15,6 +15,7 @@ rand.workspace = true anyhow.workspace = true fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } greco = { package = "zkfhe-greco", git = "https://github.com/gnosisguild/zkfhe-generator", version = "0.1.0"} +num-bigint = { workspace = true } [dev-dependencies] hex.workspace = true diff --git a/crates/bfv-helpers/src/client.rs b/crates/bfv-helpers/src/client.rs index 3510082795..26701211d5 100644 --- a/crates/bfv-helpers/src/client.rs +++ b/crates/bfv-helpers/src/client.rs @@ -40,7 +40,7 @@ pub fn bfv_encrypt( where Plaintext: for<'a> FheEncoder<&'a T, Error = FheError>, { - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli, None); let pk = PublicKey::from_bytes(&public_key, ¶ms) .map_err(|e| anyhow!("Error deserializing public key:{e}"))?; @@ -91,7 +91,7 @@ pub fn bfv_verifiable_encrypt( where Plaintext: for<'a> FheEncoder<&'a T, Error = FheError>, { - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli, None); let pk = PublicKey::from_bytes(&public_key, ¶ms) .map_err(|e| anyhow!("Error deserializing public key: {}", e))?; @@ -131,11 +131,15 @@ mod tests { #[test] fn test_bfv_encrypt_a64() { + use crate::build_bfv_params_from_set_arc; use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); + let degree = param_set.degree; + let plaintext_modulus = param_set.plaintext_modulus; + let moduli = [param_set.moduli[0]]; let mut rng = thread_rng(); let sk = SecretKey::random(¶ms, &mut rng); let pk = PublicKey::new(&sk, &mut rng); @@ -152,11 +156,15 @@ mod tests { #[test] fn test_bfv_encrypt_v64() { + use crate::build_bfv_params_from_set_arc; use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); + let degree = param_set.degree; + let plaintext_modulus = param_set.plaintext_modulus; + let moduli = [param_set.moduli[0]]; let mut rng = thread_rng(); let sk = SecretKey::random(¶ms, &mut rng); let pk = PublicKey::new(&sk, &mut rng); @@ -180,11 +188,15 @@ mod tests { #[test] fn test_bfv_verifiable_encrypt_a64() { + use crate::build_bfv_params_from_set_arc; use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); + let degree = param_set.degree; + let plaintext_modulus = param_set.plaintext_modulus; + let moduli = [param_set.moduli[0]]; let mut rng = thread_rng(); let sk = SecretKey::random(¶ms, &mut rng); let pk = PublicKey::new(&sk, &mut rng); @@ -201,11 +213,15 @@ mod tests { #[test] fn test_bfv_verifiable_encrypt_v64() { + use crate::build_bfv_params_from_set_arc; use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); + let degree = param_set.degree; + let plaintext_modulus = param_set.plaintext_modulus; + let moduli = [param_set.moduli[0]]; let mut rng = thread_rng(); let sk = SecretKey::random(¶ms, &mut rng); let pk = PublicKey::new(&sk, &mut rng); diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index 9020aa3efe..ff85e72f8a 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -14,27 +14,121 @@ use std::sync::Arc; /// Predefined BFV parameters for common use cases pub mod params { - /// Standard BFV parameters sets - /// Each set is a tuple of (degree, plaintext_modulus, moduli). - /// Naming convention: SET___ + use super::BfvParamSet; + /// Note that 10 is the default value for both error1 and error2 variance + /// for both BFV and TRBFV (if not explicitly set). + + /// Standard development parameters set (DO NOT USE IN PRODUCTION). /// - Degree: 2048 (polynomial ring size) /// - Plaintext modulus: 1032193 /// - Moduli: [0x3FFFFFFF000001] (provides good security level) - pub const SET_2048_1032193_1: (usize, u64, [u64; 1]) = ( - 2048, // degree - 1032193, // plaintext_modulus - [0x3FFFFFFF000001], // moduli - ); + pub const SET_2048_1032193_1: BfvParamSet = BfvParamSet { + degree: 2048, + plaintext_modulus: 1032193, + moduli: &[0x3FFFFFFF000001], + error2_variance: None, + }; + + /// 128bits security TRBFV parameters set (PRODUCTION READY). + /// - Degree: 8192 + /// - Plaintext modulus: 1000 + /// - Moduli: [0x00800000022a0001, 0x00800000021a0001, 0x0080000002120001, 0x0080000001f60001] + /// - Error2 Variance: 52309181128222339698631578526730685514457152477762943514050560000 + pub const SET_8192_1000_4: BfvParamSet = BfvParamSet { + degree: 8192, + plaintext_modulus: 1000, + moduli: &[ + 0x00800000022a0001, + 0x00800000021a0001, + 0x0080000002120001, + 0x0080000001f60001, + ], + error2_variance: Some("52309181128222339698631578526730685514457152477762943514050560000"), + }; + + /// 128bits security BFV parameters set (PRODUCTION READY). + /// - Degree: 8192 + /// - Plaintext modulus: 144115188075855872 + /// - Moduli: [288230376173076481, 288230376167047169] + pub const SET_8192_144115188075855872_2: BfvParamSet = BfvParamSet { + degree: 8192, + plaintext_modulus: 144115188075855872, + moduli: &[288230376173076481, 288230376167047169], + error2_variance: None, + }; +} + +/// A consistent type representing a BFV parameter set. +/// +/// This struct provides a uniform way to represent BFV parameter sets, +/// making it easy to consume them with functions like `build_bfv_params_from_set`. +#[derive(Debug, Clone, Copy)] +pub struct BfvParamSet { + /// The degree of the polynomial ring, must be a power of 2 + pub degree: usize, + /// The modulus for the plaintext space + pub plaintext_modulus: u64, + /// The moduli for the ciphertext space + pub moduli: &'static [u64], + /// Optional error2 variance (as decimal string). If None, defaults to "10" + pub error2_variance: Option<&'static str>, +} + +/// Builds BFV parameters from a `BfvParamSet`. +/// +/// This is a convenience function that consumes a `BfvParamSet` struct +/// and builds the corresponding `BfvParameters` instance. +/// +/// # Arguments +/// +/// * `param_set` - A `BfvParamSet` containing the degree, plaintext modulus, moduli, and optional error2 variance +/// +/// # Returns +/// +/// Returns a `BfvParameters` instance configured with the specified parameters. +pub fn build_bfv_params_from_set(param_set: BfvParamSet) -> BfvParameters { + build_bfv_params( + param_set.degree, + param_set.plaintext_modulus, + param_set.moduli, + param_set.error2_variance, + ) +} + +/// Builds BFV parameters from a `BfvParamSet` wrapped in an `Arc`. +/// +/// This is a convenience function that consumes a `BfvParamSet` struct +/// and builds the corresponding `Arc` instance for thread-safe shared ownership. +/// +/// # Arguments +/// +/// * `param_set` - A `BfvParamSet` containing the degree, plaintext modulus, moduli, and optional error2 variance +/// +/// # Returns +/// +/// Returns an `Arc` instance configured with the specified parameters. +pub fn build_bfv_params_from_set_arc(param_set: BfvParamSet) -> Arc { + build_bfv_params_arc( + param_set.degree, + param_set.plaintext_modulus, + param_set.moduli, + param_set.error2_variance, + ) } /// Builds BFV (Brakerski-Fan-Vercauteren) encryption parameters. /// +/// This function supports both standard BFV and threshold BFV (trBFV) parameters. +/// If `error2_variance` is not provided (None), it defaults to "10", which matches +/// the default variance value for standard BFV. +/// /// # Arguments /// /// * `degree` - The degree of the polynomial ring, must be a power of 2 /// * `plaintext_modulus` - The modulus for the plaintext space /// * `moduli` - The moduli for the ciphertext space +/// * `error2_variance` - Optional error2 variance (as decimal string). Defaults to "10" if None. /// /// # Returns /// @@ -43,16 +137,28 @@ pub mod params { /// # Panics /// /// Panics if the parameters cannot be built (e.g., invalid degree or moduli). -pub fn build_bfv_params(degree: usize, plaintext_modulus: u64, moduli: &[u64]) -> BfvParameters { - match BfvParametersBuilder::new() +pub fn build_bfv_params( + degree: usize, + plaintext_modulus: u64, + moduli: &[u64], + error2_variance: Option<&str>, +) -> BfvParameters { + let mut builder = BfvParametersBuilder::new(); + builder .set_degree(degree) .set_plaintext_modulus(plaintext_modulus) - .set_moduli(moduli) - .build() - { - Ok(params) => params, - Err(e) => panic!("Failed to build BFV Parameters: {}", e), + .set_moduli(moduli); + + if let Some(error2) = error2_variance { + builder + .set_error2_variance_str(error2) + .unwrap_or_else(|e| panic!("Failed to set error2_variance: {}", e)); } + // If error2_variance is None, the builder defaults to 10 + + builder + .build() + .unwrap_or_else(|e| panic!("Failed to build BFV Parameters: {}", e)) } /// Builds BFV encryption parameters wrapped in an `Arc` for shared ownership. @@ -65,6 +171,7 @@ pub fn build_bfv_params(degree: usize, plaintext_modulus: u64, moduli: &[u64]) - /// * `degree` - The degree of the polynomial ring, must be a power of 2 /// * `plaintext_modulus` - The modulus for the plaintext space /// * `moduli` - The moduli for the ciphertext space +/// * `error2_variance` - Optional error2 variance (as decimal string). Defaults to "10" if None. /// /// # Returns /// @@ -77,31 +184,38 @@ pub fn build_bfv_params_arc( degree: usize, plaintext_modulus: u64, moduli: &[u64], + error2_variance: Option<&str>, ) -> Arc { - match BfvParametersBuilder::new() + let mut builder = BfvParametersBuilder::new(); + builder .set_degree(degree) .set_plaintext_modulus(plaintext_modulus) - .set_moduli(moduli) - .build_arc() - { - Ok(params) => params, - Err(e) => panic!("Failed to build BFV Parameters wrapped in Arc: {}", e), + .set_moduli(moduli); + + if let Some(error2) = error2_variance { + builder + .set_error2_variance_str(error2) + .unwrap_or_else(|e| panic!("Failed to set error2_variance: {}", e)); } + // If error2_variance is None, the builder defaults to 10 + + builder + .build_arc() + .unwrap_or_else(|e| panic!("Failed to build BFV Parameters wrapped in Arc: {}", e)) } /// Encodes BFV parameters into ABI-encoded bytes. /// -/// This function converts BFV parameters into a tuple structure of (degree, plaintext_modulus, moduli[]) +/// This function converts BFV parameters into a tuple structure of (degree, plaintext_modulus, moduli[], error2_variance) /// and then ABI-encodes the tuple using Solidity ABI format. The resulting bytes can be used /// in smart contracts or for cross-platform serialization. -/// /// # Arguments /// /// * `params` - The BFV parameters to encode /// /// # Returns /// -/// Returns a `Vec` containing the ABI-encoded parameters as a tuple (uint256, uint256, uint256[]). +/// Returns a `Vec` containing the ABI-encoded parameters as a tuple (uint256, uint256, uint256[], string). pub fn encode_bfv_params(params: &BfvParameters) -> Vec { let value = DynSolValue::Tuple(vec![ DynSolValue::Uint(U256::from(params.degree()), 256), @@ -113,6 +227,7 @@ pub fn encode_bfv_params(params: &BfvParameters) -> Vec { .map(|val| DynSolValue::Uint(U256::from(*val), 256)) .collect(), ), + DynSolValue::String(params.get_error2_variance().to_string()), ]); value.abi_encode() } @@ -120,8 +235,8 @@ pub fn encode_bfv_params(params: &BfvParameters) -> Vec { /// Decodes BFV parameters from ABI-encoded bytes. /// /// This function converts ABI-encoded bytes back into BFV parameters. -/// The bytes should represent a tuple (uint256, uint256, uint256[]) containing -/// (degree, plaintext_modulus, moduli[]) as produced by `encode_bfv_params`. +/// The bytes should represent a tuple (uint256, uint256, uint256[], string) containing +/// (degree, plaintext_modulus, moduli[], error2_variance) as produced by `encode_bfv_params`. /// /// # Arguments /// @@ -135,11 +250,12 @@ pub fn encode_bfv_params(params: &BfvParameters) -> Vec { /// /// Panics if the decoding fails due to invalid format or parameter values. pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { - // Define the expected tuple type: (uint256, uint256, uint256[]) + // Define the expected tuple type: (uint256, uint256, uint256[], string) let tuple_type = DynSolType::Tuple(vec![ DynSolType::Uint(256), // degree DynSolType::Uint(256), // plaintext_modulus DynSolType::Array(Box::new(DynSolType::Uint(256))), // moduli array + DynSolType::String, // error2_variance (as decimal string) ]); let decoded = tuple_type @@ -178,12 +294,20 @@ pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { _ => panic!("Expected array for moduli"), }; + // Extract error2_variance (fourth element) + let error2_variance: String = match &inner_values[3] { + DynSolValue::String(val) => val.clone(), + _ => panic!("Expected string for error2_variance"), + }; + let params = BfvParametersBuilder::new() .set_degree(degree as usize) .set_plaintext_modulus(plaintext) .set_moduli(&moduli) + .set_error2_variance_str(&error2_variance) + .unwrap_or_else(|e| panic!("Failed to set error2_variance: {}", e)) .build() - .expect("Failed to build BFV Parameters"); + .unwrap_or_else(|e| panic!("Failed to build BFV Parameters: {}", e)); params } @@ -195,8 +319,8 @@ pub fn decode_bfv_params(bytes: &[u8]) -> BfvParameters { /// /// This is a convenience function that combines `decode_bfv_params` with `Arc::new` /// to provide thread-safe shared ownership of the decoded parameters. -/// The input bytes should represent a tuple (uint256, uint256, uint256[]) containing -/// (degree, plaintext_modulus, moduli[]) in ABI-encoded format. +/// The input bytes should represent a tuple (uint256, uint256, uint256[], string) containing +/// (degree, plaintext_modulus, moduli[], error2_variance) in ABI-encoded format. /// /// # Arguments /// @@ -216,7 +340,8 @@ pub fn decode_bfv_params_arc(bytes: &[u8]) -> Arc { #[cfg(test)] mod tests { use super::*; - use anyhow::Result; + use num_bigint::BigUint; + use std::str::FromStr; #[test] fn test_build_bfv_params() { @@ -224,10 +349,12 @@ mod tests { let plaintext_modulus = 1032193; let moduli = [0x3FFFFFFF000001]; - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + let params = build_bfv_params(degree, plaintext_modulus, &moduli, None); assert_eq!(params.degree(), degree); assert_eq!(params.plaintext(), plaintext_modulus); assert_eq!(params.moduli(), moduli); + assert_eq!(params.variance(), 10); + assert_eq!(params.get_error2_variance(), &BigUint::from(10u32)); } #[test] @@ -236,10 +363,59 @@ mod tests { let plaintext_modulus = 1032193; let moduli = [0x3FFFFFFF000001]; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli, None); + assert_eq!(params.degree(), degree); + assert_eq!(params.plaintext(), plaintext_modulus); + assert_eq!(params.moduli(), moduli); + assert_eq!(params.variance(), 10); + assert_eq!(params.get_error2_variance(), &BigUint::from(10u32)); + } + + #[test] + fn test_build_trbfv_params() { + let degree = 8192; + let plaintext_modulus = 1000; + let moduli = [ + 0x00800000022a0001, + 0x00800000021a0001, + 0x0080000002120001, + 0x0080000001f60001, + ]; + let error2_variance = "52309181128222339698631578526730685514457152477762943514050560000"; + + let params = build_bfv_params(degree, plaintext_modulus, &moduli, Some(error2_variance)); assert_eq!(params.degree(), degree); assert_eq!(params.plaintext(), plaintext_modulus); assert_eq!(params.moduli(), moduli); + assert_eq!(params.variance(), 10); + assert_eq!( + params.get_error2_variance(), + &BigUint::from_str(error2_variance).unwrap() + ); + } + + #[test] + fn test_build_trbfv_params_arc() { + let degree = 8192; + let plaintext_modulus = 1000; + let moduli = [ + 0x00800000022a0001, + 0x00800000021a0001, + 0x0080000002120001, + 0x0080000001f60001, + ]; + let error2_variance = "52309181128222339698631578526730685514457152477762943514050560000"; + + let params = + build_bfv_params_arc(degree, plaintext_modulus, &moduli, Some(error2_variance)); + assert_eq!(params.degree(), degree); + assert_eq!(params.plaintext(), plaintext_modulus); + assert_eq!(params.moduli(), moduli); + assert_eq!(params.variance(), 10); + assert_eq!( + params.get_error2_variance(), + &BigUint::from_str(error2_variance).unwrap() + ); } #[test] @@ -248,13 +424,15 @@ mod tests { let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + let params = build_bfv_params(degree, plaintext_modulus, &moduli, None); let encoded = encode_bfv_params(¶ms); let decoded = decode_bfv_params(&encoded); assert_eq!(decoded.degree(), degree); assert_eq!(decoded.plaintext(), plaintext_modulus); assert_eq!(decoded.moduli(), moduli.as_slice()); + // Verify error2_variance is preserved (defaults to 10 for standard BFV) + assert_eq!(decoded.get_error2_variance(), params.get_error2_variance()); } #[test] @@ -263,7 +441,7 @@ mod tests { let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + let params = build_bfv_params(degree, plaintext_modulus, &moduli, None); // Verify the encoding result is deterministic let encoded1 = encode_bfv_params(¶ms); @@ -277,7 +455,7 @@ mod tests { let plaintext_modulus = 1032193; let moduli = vec![0x3FFFFFFF000001]; - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + let params = build_bfv_params(degree, plaintext_modulus, &moduli, None); let encoded = encode_bfv_params(¶ms); // Verify we can decode back to the original parameters with Arc @@ -285,6 +463,34 @@ mod tests { assert_eq!(decoded.degree(), degree); assert_eq!(decoded.plaintext(), plaintext_modulus); assert_eq!(decoded.moduli(), moduli.as_slice()); + // Verify error2_variance is preserved + assert_eq!(decoded.get_error2_variance(), params.get_error2_variance()); + } + + #[test] + fn test_encoding_roundtrip_trbfv() { + let degree = 8192; + let plaintext_modulus = 1000; + let moduli = [ + 0x00800000022a0001, + 0x00800000021a0001, + 0x0080000002120001, + 0x0080000001f60001, + ]; + let error2_variance = "52309181128222339698631578526730685514457152477762943514050560000"; + + let params = build_bfv_params(degree, plaintext_modulus, &moduli, Some(error2_variance)); + let encoded = encode_bfv_params(¶ms); + let decoded = decode_bfv_params(&encoded); + + assert_eq!(decoded.degree(), degree); + assert_eq!(decoded.plaintext(), plaintext_modulus); + assert_eq!(decoded.moduli(), moduli); + // Verify error2_variance is preserved for trBFV + assert_eq!( + decoded.get_error2_variance(), + &BigUint::from_str(error2_variance).unwrap() + ); } #[test] @@ -300,80 +506,75 @@ mod tests { #[test] fn test_params_constant() { - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - assert_eq!(degree, 2048); - assert_eq!(plaintext_modulus, 1032193); - assert_eq!(moduli, [0x3FFFFFFF000001]); + let param_set = params::SET_2048_1032193_1; + assert_eq!(param_set.degree, 2048); + assert_eq!(param_set.plaintext_modulus, 1032193); + assert_eq!(param_set.moduli, &[0x3FFFFFFF000001]); } #[test] fn test_params_function() { - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + let param_set = params::SET_2048_1032193_1; + let params = build_bfv_params_from_set(param_set); - assert_eq!(params.degree(), degree); - assert_eq!(params.plaintext(), plaintext_modulus); - assert_eq!(params.moduli(), moduli); + assert_eq!(params.degree(), param_set.degree); + assert_eq!(params.plaintext(), param_set.plaintext_modulus); + assert_eq!(params.moduli(), param_set.moduli); } #[test] fn test_params_arc_function() { - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = params::SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); - assert_eq!(params.degree(), degree); - assert_eq!(params.plaintext(), plaintext_modulus); - assert_eq!(params.moduli(), moduli); + assert_eq!(params.degree(), param_set.degree); + assert_eq!(params.plaintext(), param_set.plaintext_modulus); + assert_eq!(params.moduli(), param_set.moduli); } #[test] fn test_params_encoding_roundtrip() { - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - let params = build_bfv_params(degree, plaintext_modulus, &moduli); + let param_set = params::SET_2048_1032193_1; + let params = build_bfv_params_from_set(param_set); let encoded = encode_bfv_params(¶ms); let decoded = decode_bfv_params(&encoded); - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - assert_eq!(decoded.degree(), degree); - assert_eq!(decoded.plaintext(), plaintext_modulus); - assert_eq!(decoded.moduli(), moduli); + assert_eq!(decoded.degree(), param_set.degree); + assert_eq!(decoded.plaintext(), param_set.plaintext_modulus); + assert_eq!(decoded.moduli(), param_set.moduli); + // Verify error2_variance is preserved + assert_eq!(decoded.get_error2_variance(), params.get_error2_variance()); } #[test] fn test_params_arc_encoding_roundtrip() { - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = params::SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); let encoded = encode_bfv_params(¶ms); let decoded = decode_bfv_params_arc(&encoded); - let (degree, plaintext_modulus, moduli) = params::SET_2048_1032193_1; - assert_eq!(decoded.degree(), degree); - assert_eq!(decoded.plaintext(), plaintext_modulus); - assert_eq!(decoded.moduli(), moduli); + assert_eq!(decoded.degree(), param_set.degree); + assert_eq!(decoded.plaintext(), param_set.plaintext_modulus); + assert_eq!(decoded.moduli(), param_set.moduli); + // Verify error2_variance is preserved + assert_eq!(decoded.get_error2_variance(), params.get_error2_variance()); } #[test] - fn test_real_bfv_params() -> Result<()> { - let decoded = decode_bfv_params_arc(&hex::decode("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001")?); - Ok(()) - } + fn test_params_trbfv_encoding_roundtrip() { + let param_set = params::SET_8192_1000_4; + let params = build_bfv_params_from_set(param_set); + let encoded = encode_bfv_params(¶ms); + let decoded = decode_bfv_params(&encoded); - #[test] - fn test_real_bfv_params_2() -> Result<()> { - let bytes = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 255, 255, 255, 0, - 0, 1, - ]; - - let params = decode_bfv_params_arc(&bytes); - assert_eq!(params.plaintext(), 1032193); - Ok(()) + assert_eq!(decoded.degree(), param_set.degree); + assert_eq!(decoded.plaintext(), param_set.plaintext_modulus); + assert_eq!(decoded.moduli(), param_set.moduli); + // Verify error2_variance is preserved for trBFV + assert_eq!( + decoded.get_error2_variance(), + &BigUint::from_str(param_set.error2_variance.unwrap()).unwrap() + ); } } } diff --git a/crates/fhe/src/fhe.rs b/crates/fhe/src/fhe.rs index ca5f16942d..9e79529fcb 100644 --- a/crates/fhe/src/fhe.rs +++ b/crates/fhe/src/fhe.rs @@ -64,7 +64,7 @@ impl Fhe { crp: &[u8], rng: Arc>, ) -> Result { - let params = build_bfv_params_arc(degree, plaintext_modulus, moduli); + let params = build_bfv_params_arc(degree, plaintext_modulus, moduli, None); Ok(Fhe::new( params.clone(), diff --git a/crates/fhe/src/utils.rs b/crates/fhe/src/utils.rs index 8d174bfe60..3985b0d0ca 100644 --- a/crates/fhe/src/utils.rs +++ b/crates/fhe/src/utils.rs @@ -25,7 +25,7 @@ pub fn setup_crp_params( plaintext_modulus: u64, rng: SharedRng, ) -> ParamsWithCrp { - let params = build_bfv_params_arc(degree, plaintext_modulus, moduli); + let params = build_bfv_params_arc(degree, plaintext_modulus, moduli, None); let crp = create_crp(params.clone(), rng); ParamsWithCrp { moduli: moduli.to_vec(), diff --git a/crates/test-helpers/src/bin/fake_encrypt.rs b/crates/test-helpers/src/bin/fake_encrypt.rs index ace5bb1f14..8d1d7de653 100644 --- a/crates/test-helpers/src/bin/fake_encrypt.rs +++ b/crates/test-helpers/src/bin/fake_encrypt.rs @@ -6,7 +6,7 @@ // This is a test script designed to encrypt some fixed data to a fhe public key use clap::Parser; -use e3_sdk::bfv_helpers::{build_bfv_params_arc, params::SET_2048_1032193_1}; +use e3_sdk::bfv_helpers::{build_bfv_params_from_set_arc, params::SET_2048_1032193_1}; use fhe::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; @@ -34,8 +34,8 @@ fn main() -> Result<(), Box> { let bytes = fs::read(&args.input)?; // Decode the base64 string - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let param_set = SET_2048_1032193_1; + let params = build_bfv_params_from_set_arc(param_set); let pubkey = PublicKey::from_bytes(&bytes, ¶ms)?; let raw_plaintext = args.plaintext; diff --git a/crates/test-helpers/src/bin/pack_e3_params.rs b/crates/test-helpers/src/bin/pack_e3_params.rs index a35a0ca39f..b65da566cd 100644 --- a/crates/test-helpers/src/bin/pack_e3_params.rs +++ b/crates/test-helpers/src/bin/pack_e3_params.rs @@ -24,17 +24,36 @@ struct Args { #[arg(short, long = "plaintext-modulus")] plaintext_modulus: u64, + + #[arg(short, long = "error2-variance")] + error2_variance: Option, } fn main() -> Result<(), Box> { let args = Args::parse(); + let params: std::sync::Arc; if args.moduli.len() == 0 { println!("Parameter `--moduli` must include at least one value"); process::exit(1); } - let params = build_bfv_params_arc(args.degree as usize, args.plaintext_modulus, &args.moduli); + if let Some(error2_variance) = args.error2_variance { + params = build_bfv_params_arc( + args.degree as usize, + args.plaintext_modulus, + &args.moduli, + Some(&error2_variance), + ); + } else { + params = build_bfv_params_arc( + args.degree as usize, + args.plaintext_modulus, + &args.moduli, + None, + ); + } + let encoded = encode_bfv_params(¶ms); for byte in encoded { diff --git a/crates/test-helpers/src/lib.rs b/crates/test-helpers/src/lib.rs index b1bfe093b3..6b65b72a52 100644 --- a/crates/test-helpers/src/lib.rs +++ b/crates/test-helpers/src/lib.rs @@ -19,7 +19,7 @@ use e3_events::{ }; use e3_fhe::{create_crp, setup_crp_params, ParamsWithCrp}; use e3_net::NetEventTranslator; -use e3_sdk::bfv_helpers::params::SET_2048_1032193_1; +use e3_sdk::bfv_helpers::{params::SET_2048_1032193_1, BfvParamSet}; use e3_utils::SharedRng; use fhe::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey}; use fhe::mbfv::CommonRandomPoly; @@ -69,7 +69,7 @@ pub fn create_crp_bytes_params( } pub fn get_common_setup( - param_set: Option<(usize, u64, &[u64])>, + param_set: Option, ) -> Result<( Addr>, SharedRng, @@ -87,11 +87,10 @@ pub fn get_common_setup( let rng = create_shared_rng_from_u64(42); let seed = create_seed_from_u64(123); - let (degree, plaintext_modulus, moduli) = param_set.unwrap_or(( - SET_2048_1032193_1.0, - SET_2048_1032193_1.1, - &SET_2048_1032193_1.2, - )); + let param_set = param_set.unwrap_or(SET_2048_1032193_1); + let degree = param_set.degree; + let plaintext_modulus = param_set.plaintext_modulus; + let moduli = param_set.moduli; let (crp_bytes, params) = create_crp_bytes_params(moduli, degree, plaintext_modulus, &seed); let crpoly = CommonRandomPoly::deserialize(&crp_bytes.clone(), ¶ms)?; diff --git a/crates/tests/tests/integration.rs b/crates/tests/tests/integration.rs index a5e0571781..496c8a2a5b 100644 --- a/crates/tests/tests/integration.rs +++ b/crates/tests/tests/integration.rs @@ -115,7 +115,7 @@ async fn test_trbfv_actor() -> Result<()> { ); // Params for BFV - let params_raw = build_bfv_params_arc(degree, plaintext_modulus, moduli); + let params_raw = build_bfv_params_arc(degree, plaintext_modulus, moduli, None); // Encoded Params let params = ArcBytes::from_bytes(encode_bfv_params(¶ms_raw.clone())); diff --git a/crates/trbfv/tests/integration.rs b/crates/trbfv/tests/integration.rs index 4daab6d802..1ccbb29058 100644 --- a/crates/trbfv/tests/integration.rs +++ b/crates/trbfv/tests/integration.rs @@ -54,7 +54,7 @@ async fn test_trbfv_isolation() -> Result<()> { ] as &[u64], ); - let params_raw = build_bfv_params_arc(degree, plaintext_modulus, moduli); + let params_raw = build_bfv_params_arc(degree, plaintext_modulus, moduli, None); let params = ArcBytes::from_bytes(encode_bfv_params(¶ms_raw.clone())); let cipher = Arc::new(Cipher::from_password("I am the music man.").await?); diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index ce1179f339..b464d5335c 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -229,9 +229,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -286,9 +286,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbb778f50ecb0cebfb5c05580948501927508da7bd628833a8c4bd8545e23e2" +checksum = "6068f356948cd84b5ad9ac30c50478e433847f14a50714d2b68f15d052724049" dependencies = [ "alloy-primitives", "num_enum", @@ -1030,11 +1030,10 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8e52276fdb553d3c11563afad2898f4085165e4093604afe3d78b69afbf408f" +checksum = "ab54221eccefa254ce9f65b079c097b1796e48c21c7ce358230f8988d75392fb" dependencies = [ - "alloy-primitives", "darling", "proc-macro2 1.0.103", "quote 1.0.41", @@ -1680,9 +1679,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.43" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ "find-msvc-tools", "jobserver", @@ -2255,6 +2254,7 @@ dependencies = [ "fhe", "fhe-traits", "fhe-util", + "num-bigint", "rand 0.8.5", "zkfhe-greco", ] @@ -2437,18 +2437,18 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "4.3.0" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2 1.0.103", "quote 1.0.41", @@ -2551,7 +2551,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#698aa22590133858ec63e0293940e39ce8240666" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "doc-comment", "fhe-math", @@ -2576,7 +2576,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#698aa22590133858ec63e0293940e39ce8240666" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "ethnum", "fhe-traits", @@ -2598,7 +2598,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#698aa22590133858ec63e0293940e39ce8240666" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "rand 0.8.5", ] @@ -2606,7 +2606,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.1.0-beta.7" -source = "git+https://github.com/gnosisguild/fhe.rs#698aa22590133858ec63e0293940e39ce8240666" +source = "git+https://github.com/gnosisguild/fhe.rs#c4f01896ac4c017e68ae986ba1237f27be353863" dependencies = [ "itertools 0.12.1", "num-bigint-dig", @@ -3160,9 +3160,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -3173,9 +3173,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -3186,11 +3186,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -3201,42 +3200,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -3461,9 +3456,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -3586,9 +3581,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "local-channel" @@ -4185,9 +4180,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -4676,7 +4671,7 @@ dependencies = [ "tower-service", "url", "wasm-bindgen", - "wasm-bindgen-futures 0.4.54", + "wasm-bindgen-futures 0.4.55", "web-sys", "webpki-roots 1.0.3", ] @@ -4836,9 +4831,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -4846,9 +4841,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -5503,9 +5498,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -5823,9 +5818,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -5940,9 +5935,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if 1.0.4", "once_cell", @@ -5951,20 +5946,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2 1.0.103", - "quote 1.0.41", - "syn 2.0.108", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" version = "0.3.27" @@ -5980,9 +5961,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if 1.0.4", "js-sys", @@ -5993,9 +5974,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote 1.0.41", "wasm-bindgen-macro-support", @@ -6003,22 +5984,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2 1.0.103", "quote 1.0.41", "syn 2.0.108", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -6064,9 +6045,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -6404,9 +6385,9 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "ws_stream_wasm" @@ -6423,7 +6404,7 @@ dependencies = [ "send_wrapper", "thiserror 2.0.17", "wasm-bindgen", - "wasm-bindgen-futures 0.4.54", + "wasm-bindgen-futures 0.4.55", "web-sys", ] @@ -6447,11 +6428,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -6459,9 +6439,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2 1.0.103", "quote 1.0.41", @@ -6532,9 +6512,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -6543,9 +6523,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -6554,9 +6534,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2 1.0.103", "quote 1.0.41", @@ -6588,7 +6568,7 @@ dependencies = [ [[package]] name = "zkfhe-greco" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#8e7b3099f536418e4a133e9029142ebcda2faa65" +source = "git+https://github.com/gnosisguild/zkfhe-generator#82f27e955599ff88f552e43594bc52859fb51681" dependencies = [ "anyhow", "bigint-poly", @@ -6611,7 +6591,7 @@ dependencies = [ [[package]] name = "zkfhe-shared" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#8e7b3099f536418e4a133e9029142ebcda2faa65" +source = "git+https://github.com/gnosisguild/zkfhe-generator#82f27e955599ff88f552e43594bc52859fb51681" dependencies = [ "anyhow", "bigint-poly", diff --git a/examples/CRISP/server/src/cli/commands.rs b/examples/CRISP/server/src/cli/commands.rs index 2ad1116e34..fcfa271eb4 100644 --- a/examples/CRISP/server/src/cli/commands.rs +++ b/examples/CRISP/server/src/cli/commands.rs @@ -16,7 +16,9 @@ use super::CLI_DB; use alloy::primitives::{Address, Bytes, U256}; use alloy::providers::{Provider, ProviderBuilder}; use crisp::config::CONFIG; -use e3_sdk::bfv_helpers::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use e3_sdk::bfv_helpers::{ + build_bfv_params_from_set_arc, encode_bfv_params, params::SET_2048_1032193_1, +}; use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; use fhe::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::{ @@ -317,8 +319,7 @@ pub async fn decrypt_and_publish_result( } fn generate_bfv_parameters() -> Arc { - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - build_bfv_params_arc(degree, plaintext_modulus, &moduli) + build_bfv_params_from_set_arc(SET_2048_1032193_1) } fn generate_keys(params: &Arc) -> (SecretKey, PublicKey) { diff --git a/examples/CRISP/server/src/server/routes/rounds.rs b/examples/CRISP/server/src/server/routes/rounds.rs index ccebc09d91..1ac3d49873 100644 --- a/examples/CRISP/server/src/server/routes/rounds.rs +++ b/examples/CRISP/server/src/server/routes/rounds.rs @@ -13,7 +13,9 @@ use crate::server::models::{ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; -use e3_sdk::bfv_helpers::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; +use e3_sdk::bfv_helpers::{ + build_bfv_params_from_set_arc, encode_bfv_params, params::SET_2048_1032193_1, +}; use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; use log::{error, info}; use num_bigint::BigUint; @@ -179,8 +181,7 @@ pub async fn initialize_crisp_round( } info!("Generating parameters..."); - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = encode_bfv_params(&build_bfv_params_arc(degree, plaintext_modulus, &moduli)); + let params = encode_bfv_params(&build_bfv_params_from_set_arc(SET_2048_1032193_1)); let token_address: Address = token_address.parse()?; let balance_threshold = BigUint::parse_bytes(balance_threshold.as_bytes(), 10) diff --git a/packages/enclave-sdk/src/utils.ts b/packages/enclave-sdk/src/utils.ts index a0c6ae416e..ece09846f0 100644 --- a/packages/enclave-sdk/src/utils.ts +++ b/packages/enclave-sdk/src/utils.ts @@ -63,6 +63,7 @@ export const BFV_PARAMS_SET = { degree: 2048, plaintext_modulus: 1032193, moduli: [0x3fffffff000001n], // BigInt for the modulus + error2_variance: "10", } as const; // Compute provider parameters structure @@ -95,7 +96,8 @@ export const DEFAULT_E3_CONFIG = { export function encodeBfvParams( degree: number = BFV_PARAMS_SET.degree, plaintext_modulus: number = BFV_PARAMS_SET.plaintext_modulus, - moduli: readonly bigint[] = BFV_PARAMS_SET.moduli + moduli: readonly bigint[] = BFV_PARAMS_SET.moduli, + error2_variance: string = BFV_PARAMS_SET.error2_variance ): `0x${string}` { return encodeAbiParameters( [ @@ -106,6 +108,7 @@ export function encodeBfvParams( { name: "degree", type: "uint256" }, { name: "plaintext_modulus", type: "uint256" }, { name: "moduli", type: "uint256[]" }, + { name: "error2_variance", type: "string" }, ], }, ], @@ -114,6 +117,7 @@ export function encodeBfvParams( degree: BigInt(degree), plaintext_modulus: BigInt(plaintext_modulus), moduli: [...moduli], + error2_variance, }, ] ); diff --git a/templates/default/program/src/lib.rs b/templates/default/program/src/lib.rs index 795bf3a331..7ebf0c9bfd 100644 --- a/templates/default/program/src/lib.rs +++ b/templates/default/program/src/lib.rs @@ -26,7 +26,9 @@ pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { mod tests { use super::*; use anyhow::Result; - use e3_bfv_helpers::{build_bfv_params_arc, encode_bfv_params, params::SET_2048_1032193_1}; + use e3_bfv_helpers::{ + build_bfv_params_from_set_arc, encode_bfv_params, params::SET_2048_1032193_1, + }; use fhe::bfv::{Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::FheEncoder; use fhe_traits::FheEncrypter; @@ -37,8 +39,7 @@ mod tests { fn test() -> Result<()> { let mut rng = thread_rng(); - let (degree, plaintext_modulus, moduli) = SET_2048_1032193_1; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli); + let params = build_bfv_params_from_set_arc(SET_2048_1032193_1); let secret_key = SecretKey::random(¶ms, &mut OsRng); let public_key = PublicKey::new(&secret_key, &mut rng);