From e846b0a2b0e73d4e0ddfd1c7a4c61e1236e9921d Mon Sep 17 00:00:00 2001 From: Nicolas Sarlin Date: Tue, 10 Sep 2024 16:46:10 +0200 Subject: [PATCH] feat: add data for proven compact lists --- Cargo.lock | 540 ++++++++++++++++-- Cargo.toml | 7 +- data/0_8/high_level_api/client_key.cbor | 3 + .../hl_proven_heterogeneous_list.bcode | 3 + .../hl_proven_heterogeneous_list.cbor | 3 + .../hl_proven_packed_heterogeneous_list.bcode | 3 + .../hl_proven_packed_heterogeneous_list.cbor | 3 + data/0_8/high_level_api/public_key.cbor | 3 + .../high_level_api/zk_pke_public_params.bcode | 3 + .../high_level_api/zk_pke_public_params.cbor | 3 + data/high_level_api.ron | 49 +- data/shortint.ron | 8 +- src/data_0_6.rs | 34 +- src/data_0_7.rs | 32 +- src/data_0_8.rs | 218 +++++++ src/generate.rs | 37 +- src/lib.rs | 48 +- src/main.rs | 6 +- 18 files changed, 935 insertions(+), 68 deletions(-) create mode 100644 data/0_8/high_level_api/client_key.cbor create mode 100644 data/0_8/high_level_api/hl_proven_heterogeneous_list.bcode create mode 100644 data/0_8/high_level_api/hl_proven_heterogeneous_list.cbor create mode 100644 data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.bcode create mode 100644 data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.cbor create mode 100644 data/0_8/high_level_api/public_key.cbor create mode 100644 data/0_8/high_level_api/zk_pke_public_params.bcode create mode 100644 data/0_8/high_level_api/zk_pke_public_params.cbor create mode 100644 src/data_0_8.rs diff --git a/Cargo.lock b/Cargo.lock index a6097a2..f64b6a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,6 +13,18 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aligned-vec" version = "0.5.0" @@ -22,6 +34,75 @@ dependencies = [ "serde", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "autocfg" version = "1.3.0" @@ -61,11 +142,23 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "bytemuck" -version = "1.17.1" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" + +[[package]] +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cfg-if" @@ -121,6 +214,16 @@ dependencies = [ "rayon", ] +[[package]] +name = "concrete-csprng" +version = "0.4.1" +source = "git+https://github.com/zama-ai/tfhe-rs?branch=ns/versionize_zk#b967beccaf244c0564a10127b00f3ceee5489782" +dependencies = [ + "aes", + "libc", + "rayon", +] + [[package]] name = "concrete-fft" version = "0.4.1" @@ -129,7 +232,22 @@ checksum = "3144f883422ee22c65d4f408c11b3406513eadc0d50b3d65bfadcb97852817e0" dependencies = [ "aligned-vec", "bytemuck", - "dyn-stack", + "dyn-stack 0.9.1", + "num-complex", + "pulp", + "serde", +] + +[[package]] +name = "concrete-fft" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ff7397e00e903afb03f0adca6a5f3bec3a6e96a7cdb70bdc088e01b125e170" +dependencies = [ + "aligned-vec", + "bytemuck", + "dyn-stack 0.10.0", + "js-sys", "num-complex", "pulp", "serde", @@ -145,11 +263,21 @@ dependencies = [ "pulp", ] +[[package]] +name = "concrete-ntt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea708a14b4cfe650eec644eac11889a187404a3a0738a41a5524b0f548850a1" +dependencies = [ + "aligned-vec", + "pulp", +] + [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -195,6 +323,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -215,6 +354,16 @@ dependencies = [ "reborrow", ] +[[package]] +name = "dyn-stack" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" +dependencies = [ + "bytemuck", + "reborrow", +] + [[package]] name = "either" version = "1.13.0" @@ -252,6 +401,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "heck" version = "0.5.0" @@ -276,6 +435,24 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "keccak" version = "0.1.5" @@ -287,9 +464,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" @@ -297,6 +474,22 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -308,6 +501,15 @@ dependencies = [ "serde", ] +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -317,12 +519,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -334,9 +551,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.18.21" +version = "0.18.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec8d02258294f59e4e223b41ad7e81c874aa6b15bc4ced9ba3965826da0eed5" +checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" dependencies = [ "bytemuck", "libm", @@ -353,6 +570,27 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + [[package]] name = "rand_core" version = "0.6.4" @@ -414,22 +652,22 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -461,7 +699,18 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.77", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -484,10 +733,10 @@ dependencies = [ "aligned-vec", "bincode", "bytemuck", - "concrete-csprng", - "concrete-fft", - "dyn-stack", - "itertools", + "concrete-csprng 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "concrete-fft 0.4.1", + "dyn-stack 0.9.1", + "itertools 0.11.0", "paste", "pulp", "rand_core", @@ -498,18 +747,18 @@ dependencies = [ [[package]] name = "tfhe" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "654a8bea9d6a503ebe16c8244c6a44ce924ed4c9c5a9a425fee5e021081243db" +checksum = "0623aaa0dc7836f4f7aa96602ef9c6a55f87cbcb962a94ed7a9e6d00daa32cfb" dependencies = [ "aligned-vec", "bincode", "bytemuck", - "concrete-csprng", - "concrete-fft", - "concrete-ntt", - "dyn-stack", - "itertools", + "concrete-csprng 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "concrete-fft 0.4.1", + "concrete-ntt 0.1.2", + "dyn-stack 0.9.1", + "itertools 0.11.0", "paste", "pulp", "rand_core", @@ -519,9 +768,99 @@ dependencies = [ "tfhe-versionable 0.2.1", ] +[[package]] +name = "tfhe" +version = "0.8.0-alpha.8" +source = "git+https://github.com/zama-ai/tfhe-rs?branch=ns/versionize_zk#b967beccaf244c0564a10127b00f3ceee5489782" +dependencies = [ + "aligned-vec", + "bincode", + "bytemuck", + "concrete-csprng 0.4.1 (git+https://github.com/zama-ai/tfhe-rs?branch=ns/versionize_zk)", + "concrete-fft 0.5.1", + "concrete-ntt 0.2.0", + "dyn-stack 0.10.0", + "itertools 0.11.0", + "paste", + "pulp", + "rand_core", + "rayon", + "serde", + "sha3", + "tfhe-versionable 0.3.0", + "tfhe-zk-pok", +] + +[[package]] +name = "tfhe-ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6769557a36c7d9b2313052badc55562b0e260a0dcca745150b15c3bae65a4957" +dependencies = [ + "ark-serialize", + "ark-std", + "tfhe-ark-ec", + "tfhe-ark-ff", +] + +[[package]] +name = "tfhe-ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ff6eb48b47e2cd6a2db68909cc62888516a7c1c4faaa894cb8dff7d48029b3f" +dependencies = [ + "ark-serialize", + "ark-std", + "derivative", + "hashbrown", + "itertools 0.12.1", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "tfhe-ark-ff", + "tfhe-ark-poly", + "zeroize", +] + +[[package]] +name = "tfhe-ark-ff" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08ab3109583fa162a9c83082ad4006a877786da8d76ad3cd9180bcb3d7ac9e9" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "arrayvec", + "derivative", + "digest", + "itertools 0.12.1", + "num-bigint", + "num-traits", + "paste", + "rayon", + "zeroize", +] + +[[package]] +name = "tfhe-ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4849a880457e8562e759fae62462a8be506f8ce1b8a0d5f90061583c4f6d25de" +dependencies = [ + "ark-serialize", + "ark-std", + "derivative", + "hashbrown", + "rayon", + "tfhe-ark-ff", +] + [[package]] name = "tfhe-backward-compat-data" -version = "0.1.0" +version = "0.2.0" dependencies = [ "bincode", "ciborium", @@ -530,9 +869,11 @@ dependencies = [ "serde", "strum", "tfhe 0.6.4", - "tfhe 0.7.3", + "tfhe 0.7.2", + "tfhe 0.8.0-alpha.8", "tfhe-versionable 0.1.0", "tfhe-versionable 0.2.1", + "tfhe-versionable 0.3.0", ] [[package]] @@ -559,6 +900,17 @@ dependencies = [ "tfhe-versionable-derive 0.2.1", ] +[[package]] +name = "tfhe-versionable" +version = "0.3.0" +source = "git+https://github.com/zama-ai/tfhe-rs?branch=ns/versionize_zk#b967beccaf244c0564a10127b00f3ceee5489782" +dependencies = [ + "aligned-vec", + "num-complex", + "serde", + "tfhe-versionable-derive 0.3.0", +] + [[package]] name = "tfhe-versionable-derive" version = "0.1.0" @@ -567,7 +919,7 @@ checksum = "754aede9c522d81d852b46714d42137d307f418b8b6eed4db03d1466080f4f9d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -578,7 +930,35 @@ checksum = "4709d2c6e0a39b45ed752f4b1151e261cc43c9681cacad00be4ecfc5df655e5c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", +] + +[[package]] +name = "tfhe-versionable-derive" +version = "0.3.0" +source = "git+https://github.com/zama-ai/tfhe-rs?branch=ns/versionize_zk#b967beccaf244c0564a10127b00f3ceee5489782" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "tfhe-zk-pok" +version = "0.3.0-alpha.1" +source = "git+https://github.com/zama-ai/tfhe-rs?branch=ns/versionize_zk#b967beccaf244c0564a10127b00f3ceee5489782" +dependencies = [ + "num-bigint", + "rand", + "rayon", + "serde", + "sha3", + "tfhe-ark-bls12-381", + "tfhe-ark-ec", + "tfhe-ark-ff", + "tfhe-ark-poly", + "tfhe-versionable 0.3.0", + "zeroize", ] [[package]] @@ -589,9 +969,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "version_check" @@ -604,3 +984,99 @@ name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] diff --git a/Cargo.toml b/Cargo.toml index 445307b..b99e7fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tfhe-backward-compat-data" -version = "0.1.0" +version = "0.2.0" license = "BSD-3-Clause-Clear" edition = "2021" @@ -11,9 +11,11 @@ edition = "2021" # They are only activated when generating data, with the binary target and the "generate" feature. tfhe_0_6 = { version = "0.6", features = ["boolean", "integer", "shortint", "x86_64-unix", "experimental-force_fft_algo_dif4"], package = "tfhe", optional = true } tfhe_0_7 = { version = "0.7", features = ["boolean", "integer", "shortint", "x86_64-unix", "experimental-force_fft_algo_dif4"], package = "tfhe", optional = true } +tfhe_0_8 = { features = ["boolean", "integer", "shortint", "x86_64-unix", "zk-pok", "experimental-force_fft_algo_dif4"], package = "tfhe", optional = true, git = "https://github.com/zama-ai/tfhe-rs", branch = "ns/versionize_zk" } tfhe-versionable_0_1 = { version = "0.1", optional = true, package = "tfhe-versionable" } tfhe-versionable_0_2 = { version = "0.2", optional = true, package = "tfhe-versionable" } +tfhe-versionable_0_3 = { version = "0.3", optional = true, package = "tfhe-versionable", git = "https://github.com/zama-ai/tfhe-rs", branch = "ns/versionize_zk" } # other deps serde = { version = "1.0", features = ["derive"] } @@ -30,5 +32,6 @@ required-features = ["generate"] [features] default = ["generate"] -generate = ["dep:tfhe_0_6", "dep:tfhe_0_7", "dep:tfhe-versionable_0_1", "dep:tfhe-versionable_0_2"] +generate = ["dep:tfhe_0_6", "dep:tfhe_0_7", "dep:tfhe_0_8", "dep:tfhe-versionable_0_1", "dep:tfhe-versionable_0_2", "dep:tfhe-versionable_0_3"] load = ["dep:semver"] + diff --git a/data/0_8/high_level_api/client_key.cbor b/data/0_8/high_level_api/client_key.cbor new file mode 100644 index 0000000..3039761 --- /dev/null +++ b/data/0_8/high_level_api/client_key.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0665c8fd54940bb07b3b77520666840c8b5c24be1e5a09ba45bdedb1c064dc72 +size 3578 diff --git a/data/0_8/high_level_api/hl_proven_heterogeneous_list.bcode b/data/0_8/high_level_api/hl_proven_heterogeneous_list.bcode new file mode 100644 index 0000000..17d5ef6 --- /dev/null +++ b/data/0_8/high_level_api/hl_proven_heterogeneous_list.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bb68785d6fde66234a242da46e8765a15a3832022dc453681ed402d9c7f225b +size 19242 diff --git a/data/0_8/high_level_api/hl_proven_heterogeneous_list.cbor b/data/0_8/high_level_api/hl_proven_heterogeneous_list.cbor new file mode 100644 index 0000000..702f9f2 --- /dev/null +++ b/data/0_8/high_level_api/hl_proven_heterogeneous_list.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ac8ef5335cf3a0bf477adc13fa9cac2b98aecd0c8b9b62509caa6c9ba391b74 +size 21959 diff --git a/data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.bcode b/data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.bcode new file mode 100644 index 0000000..215547c --- /dev/null +++ b/data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f52c419fe45ff0227f697493eb245549d6623f8722a33e6006b8ac013b2f977 +size 16632 diff --git a/data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.cbor b/data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.cbor new file mode 100644 index 0000000..6eec1c3 --- /dev/null +++ b/data/0_8/high_level_api/hl_proven_packed_heterogeneous_list.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:450a792596689698633685f066d9cc9623583c05da7476908a14b97e0fcd4c8b +size 18812 diff --git a/data/0_8/high_level_api/public_key.cbor b/data/0_8/high_level_api/public_key.cbor new file mode 100644 index 0000000..854d1d7 --- /dev/null +++ b/data/0_8/high_level_api/public_key.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f160f589db566a84219a2b7a5cdff3577c0ec5bebd6f4b13cb0870a585f6562 +size 37281 diff --git a/data/0_8/high_level_api/zk_pke_public_params.bcode b/data/0_8/high_level_api/zk_pke_public_params.bcode new file mode 100644 index 0000000..3c42656 --- /dev/null +++ b/data/0_8/high_level_api/zk_pke_public_params.bcode @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fca9d71492238a028e536ce856bf77b8064d316d3079f62d8fa5c5115bb3a9ba +size 5652016 diff --git a/data/0_8/high_level_api/zk_pke_public_params.cbor b/data/0_8/high_level_api/zk_pke_public_params.cbor new file mode 100644 index 0000000..9d2aed8 --- /dev/null +++ b/data/0_8/high_level_api/zk_pke_public_params.cbor @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ee86f69e2276f88a5cda2ee67ce887b6d6201d9622091db1791e741f517f824 +size 6625344 diff --git a/data/high_level_api.ron b/data/high_level_api.ron index e3440b3..14e9d53 100644 --- a/data/high_level_api.ron +++ b/data/high_level_api.ron @@ -8,8 +8,12 @@ lwe_dimension: 761, glwe_dimension: 1, polynomial_size: 2048, - lwe_noise_gaussian_stddev: 0.00000636835566258815, - glwe_noise_gaussian_stddev: 0.00000000000000031529322391500584, + lwe_noise_distribution: Gaussian( + stddev: 0.00000636835566258815, + ), + glwe_noise_distribution: Gaussian( + stddev: 0.00000000000000031529322391500584, + ), pbs_base_log: 23, pbs_level: 1, ks_base_log: 3, @@ -291,6 +295,7 @@ test_filename: "hl_packed_heterogeneous_list", key_filename: "client_key.cbor", compressed: false, + proof_info: None, clear_values: [ 17, 18446744073709551604, @@ -312,6 +317,7 @@ test_filename: "hl_heterogeneous_list", key_filename: "client_key.cbor", compressed: false, + proof_info: None, clear_values: [ 17, 18446744073709551604, @@ -333,6 +339,45 @@ test_filename: "hl_compressed_heterogeneous_list", key_filename: "client_key.cbor", compressed: true, + proof_info: None, + clear_values: [ + 17, + 18446744073709551604, + 0, + 1, + ], + data_kinds: [ + Unsigned, + Signed, + Bool, + Bool, + ], + )), + ), + ( + tfhe_version_min: "0.8", + tfhe_module: "high_level_api", + metadata: ZkPkePublicParams(( + test_filename: "zk_pke_public_params", + lwe_dimension: 2048, + max_num_cleartext: 16, + noise_bound: 46, + ciphertext_modulus: 18446744073709551616, + plaintext_modulus: 32, + )), + ), + ( + tfhe_version_min: "0.8", + tfhe_module: "high_level_api", + metadata: HlHeterogeneousCiphertextList(( + test_filename: "hl_proven_heterogeneous_list", + key_filename: "client_key.cbor", + compressed: false, + proof_info: Some(( + public_key_filename: "public_key.cbor", + params_filename: "zk_pke_public_params.cbor", + metadata: "drawkcab", + )), clear_values: [ 17, 18446744073709551604, diff --git a/data/shortint.ron b/data/shortint.ron index 0eb8506..a069784 100644 --- a/data/shortint.ron +++ b/data/shortint.ron @@ -8,8 +8,12 @@ lwe_dimension: 761, glwe_dimension: 1, polynomial_size: 2048, - lwe_noise_gaussian_stddev: 0.00000636835566258815, - glwe_noise_gaussian_stddev: 0.00000000000000031529322391500584, + lwe_noise_distribution: Gaussian( + stddev: 0.00000636835566258815, + ), + glwe_noise_distribution: Gaussian( + stddev: 0.00000000000000031529322391500584, + ), pbs_base_log: 23, pbs_level: 1, ks_base_log: 3, diff --git a/src/data_0_6.rs b/src/data_0_6.rs index 6d0b28d..5256832 100644 --- a/src/data_0_6.rs +++ b/src/data_0_6.rs @@ -2,9 +2,12 @@ use std::{borrow::Cow, fs::create_dir_all}; use tfhe_0_6::{ boolean::engine::BooleanEngine, - core_crypto::commons::{ - generators::DeterministicSeeder, - math::random::{ActivatedRandomGenerator, Seed}, + core_crypto::{ + commons::{ + generators::DeterministicSeeder, + math::random::{ActivatedRandomGenerator, Seed}, + }, + prelude::TUniform, }, generate_keys, prelude::FheEncrypt, @@ -30,8 +33,8 @@ use crate::{ generate::{save_cbor, store_versioned_test_01, TfhersVersion, VALID_TEST_PARAMS}, HlBoolCiphertextListTest, HlBoolCiphertextTest, HlCiphertextListTest, HlCiphertextTest, HlClientKeyTest, HlPublicKeyTest, HlServerKeyTest, HlSignedCiphertextListTest, - HlSignedCiphertextTest, ShortintCiphertextTest, ShortintClientKeyTest, TestMetadata, - TestParameterSet, HL_MODULE_NAME, SHORTINT_MODULE_NAME, + HlSignedCiphertextTest, ShortintCiphertextTest, ShortintClientKeyTest, TestDistribution, + TestMetadata, TestParameterSet, HL_MODULE_NAME, SHORTINT_MODULE_NAME, }; macro_rules! store_versioned_test { @@ -40,18 +43,27 @@ macro_rules! store_versioned_test { }; } +impl From for DynamicDistribution { + fn from(value: TestDistribution) -> Self { + match value { + TestDistribution::Gaussian { stddev } => { + DynamicDistribution::new_gaussian_from_std_dev(StandardDev(stddev)) + } + TestDistribution::TUniform { bound_log2 } => { + DynamicDistribution::TUniform(TUniform::new(bound_log2)) + } + } + } +} + impl From for ClassicPBSParameters { fn from(value: TestParameterSet) -> Self { ClassicPBSParameters { lwe_dimension: LweDimension(value.lwe_dimension), glwe_dimension: GlweDimension(value.glwe_dimension), polynomial_size: PolynomialSize(value.polynomial_size), - lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( - value.lwe_noise_gaussian_stddev, - )), - glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( - value.glwe_noise_gaussian_stddev, - )), + lwe_noise_distribution: value.lwe_noise_distribution.into(), + glwe_noise_distribution: value.glwe_noise_distribution.into(), pbs_base_log: DecompositionBaseLog(value.pbs_base_log), pbs_level: DecompositionLevelCount(value.pbs_level), ks_base_log: DecompositionBaseLog(value.ks_base_log), diff --git a/src/data_0_7.rs b/src/data_0_7.rs index 4476902..e5667aa 100644 --- a/src/data_0_7.rs +++ b/src/data_0_7.rs @@ -2,8 +2,9 @@ use std::{borrow::Cow, fs::create_dir_all}; use tfhe_0_7::{ boolean::engine::BooleanEngine, - core_crypto::commons::{ - generators::DeterministicSeeder, math::random::ActivatedRandomGenerator, + core_crypto::{ + commons::{generators::DeterministicSeeder, math::random::ActivatedRandomGenerator}, + prelude::TUniform, }, generate_keys, prelude::FheEncrypt, @@ -25,7 +26,8 @@ use crate::{ generate::{ store_versioned_auxiliary_02, store_versioned_test_02, TfhersVersion, VALID_TEST_PARAMS, }, - DataKind, HlHeterogeneousCiphertextListTest, TestMetadata, TestParameterSet, HL_MODULE_NAME, + DataKind, HlHeterogeneousCiphertextListTest, TestDistribution, TestMetadata, TestParameterSet, + HL_MODULE_NAME, }; macro_rules! store_versioned_test { @@ -40,18 +42,27 @@ macro_rules! store_versioned_auxiliary { }; } +impl From for DynamicDistribution { + fn from(value: TestDistribution) -> Self { + match value { + TestDistribution::Gaussian { stddev } => { + DynamicDistribution::new_gaussian_from_std_dev(StandardDev(stddev)) + } + TestDistribution::TUniform { bound_log2 } => { + DynamicDistribution::TUniform(TUniform::new(bound_log2)) + } + } + } +} + impl From for ClassicPBSParameters { fn from(value: TestParameterSet) -> Self { ClassicPBSParameters { lwe_dimension: LweDimension(value.lwe_dimension), glwe_dimension: GlweDimension(value.glwe_dimension), polynomial_size: PolynomialSize(value.polynomial_size), - lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( - value.lwe_noise_gaussian_stddev, - )), - glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( - value.glwe_noise_gaussian_stddev, - )), + lwe_noise_distribution: value.lwe_noise_distribution.into(), + glwe_noise_distribution: value.glwe_noise_distribution.into(), pbs_base_log: DecompositionBaseLog(value.pbs_base_log), pbs_level: DecompositionLevelCount(value.pbs_level), ks_base_log: DecompositionBaseLog(value.ks_base_log), @@ -90,6 +101,7 @@ const HL_COMPACTLIST_TEST: HlHeterogeneousCiphertextListTest = HlHeterogeneousCi DataKind::Bool, ]), compressed: false, + proof_info: None, }; const HL_PACKED_COMPACTLIST_TEST: HlHeterogeneousCiphertextListTest = @@ -99,6 +111,7 @@ const HL_PACKED_COMPACTLIST_TEST: HlHeterogeneousCiphertextListTest = clear_values: HL_COMPACTLIST_TEST.clear_values, data_kinds: HL_COMPACTLIST_TEST.data_kinds, compressed: false, + proof_info: None, }; const HL_COMPRESSED_LIST_TEST: HlHeterogeneousCiphertextListTest = @@ -113,6 +126,7 @@ const HL_COMPRESSED_LIST_TEST: HlHeterogeneousCiphertextListTest = DataKind::Bool, ]), compressed: true, + proof_info: None, }; pub struct V0_7; diff --git a/src/data_0_8.rs b/src/data_0_8.rs new file mode 100644 index 0000000..f620696 --- /dev/null +++ b/src/data_0_8.rs @@ -0,0 +1,218 @@ +use std::{borrow::Cow, fs::create_dir_all}; + +use tfhe_0_8::{ + boolean::engine::BooleanEngine, + core_crypto::{ + commons::{generators::DeterministicSeeder, math::random::RandomGenerator}, + prelude::{ActivatedRandomGenerator, TUniform}, + }, + integer::parameters::{ + DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, + LweDimension, PolynomialSize, StandardDev, + }, + shortint::{ + engine::ShortintEngine, CarryModulus, CiphertextModulus, ClassicPBSParameters, + EncryptionKeyChoice, MaxNoiseLevel, MessageModulus, PBSParameters, + }, + zk::{CompactPkeCrs, ZkComputeLoad}, + ClientKey, CompactPublicKey, ProvenCompactCiphertextList, Seed, +}; + +use crate::{ + generate::{ + store_versioned_auxiliary_03, store_versioned_test_03, TfhersVersion, PRNG_SEED, + VALID_TEST_PARAMS_TUNIFORM, + }, + DataKind, HlHeterogeneousCiphertextListTest, PkeZkProofAuxilliaryInfo, TestDistribution, + TestMetadata, TestParameterSet, ZkPkePublicParamsTest, HL_MODULE_NAME, +}; + +macro_rules! store_versioned_test { + ($msg:expr, $dir:expr, $test_filename:expr $(,)? ) => { + store_versioned_test_03($msg, $dir, $test_filename) + }; +} + +macro_rules! store_versioned_auxiliary { + ($msg:expr, $dir:expr, $test_filename:expr $(,)? ) => { + store_versioned_auxiliary_03($msg, $dir, $test_filename) + }; +} + +impl From for DynamicDistribution { + fn from(value: TestDistribution) -> Self { + match value { + TestDistribution::Gaussian { stddev } => { + DynamicDistribution::new_gaussian_from_std_dev(StandardDev(stddev)) + } + TestDistribution::TUniform { bound_log2 } => { + DynamicDistribution::TUniform(TUniform::new(bound_log2)) + } + } + } +} + +impl From for ClassicPBSParameters { + fn from(value: TestParameterSet) -> Self { + ClassicPBSParameters { + lwe_dimension: LweDimension(value.lwe_dimension), + glwe_dimension: GlweDimension(value.glwe_dimension), + polynomial_size: PolynomialSize(value.polynomial_size), + lwe_noise_distribution: value.lwe_noise_distribution.into(), + glwe_noise_distribution: value.glwe_noise_distribution.into(), + pbs_base_log: DecompositionBaseLog(value.pbs_base_log), + pbs_level: DecompositionLevelCount(value.pbs_level), + ks_base_log: DecompositionBaseLog(value.ks_base_log), + ks_level: DecompositionLevelCount(value.ks_level), + message_modulus: MessageModulus(value.message_modulus), + carry_modulus: CarryModulus(value.carry_modulus), + max_noise_level: MaxNoiseLevel::new(value.max_noise_level), + log2_p_fail: value.log2_p_fail, + ciphertext_modulus: CiphertextModulus::try_new(value.ciphertext_modulus).unwrap(), + encryption_key_choice: { + match &*value.encryption_key_choice { + "big" => EncryptionKeyChoice::Big, + "small" => EncryptionKeyChoice::Small, + _ => panic!("Invalid encryption key choice"), + } + }, + } + } +} + +impl From for PBSParameters { + fn from(value: TestParameterSet) -> Self { + let classic_pbs: ClassicPBSParameters = value.into(); + classic_pbs.into() + } +} + +const ZK_PKE_PUBLIC_PARAMS_TEST: ZkPkePublicParamsTest = ZkPkePublicParamsTest { + test_filename: Cow::Borrowed("zk_pke_public_params"), + lwe_dimension: VALID_TEST_PARAMS_TUNIFORM.polynomial_size + * VALID_TEST_PARAMS_TUNIFORM.glwe_dimension, // Lwe dimension of the "big" key is glwe dimension * polynomial size + max_num_cleartext: 16, + noise_bound: match VALID_TEST_PARAMS_TUNIFORM.lwe_noise_distribution { + TestDistribution::Gaussian { .. } => unreachable!(), + TestDistribution::TUniform { bound_log2 } => bound_log2 as usize, + }, + ciphertext_modulus: VALID_TEST_PARAMS_TUNIFORM.ciphertext_modulus, + plaintext_modulus: VALID_TEST_PARAMS_TUNIFORM.message_modulus + * VALID_TEST_PARAMS_TUNIFORM.carry_modulus + * 2, // *2 for padding bit +}; + +const HL_PROVEN_COMPACTLIST_TEST: HlHeterogeneousCiphertextListTest = + HlHeterogeneousCiphertextListTest { + test_filename: Cow::Borrowed("hl_proven_heterogeneous_list"), + key_filename: Cow::Borrowed("client_key.cbor"), + clear_values: Cow::Borrowed(&[17u8 as u64, -12i8 as u64, false as u64, true as u64]), + data_kinds: Cow::Borrowed(&[ + DataKind::Unsigned, + DataKind::Signed, + DataKind::Bool, + DataKind::Bool, + ]), + compressed: false, + proof_info: Some(PkeZkProofAuxilliaryInfo { + public_key_filename: Cow::Borrowed("public_key.cbor"), + params_filename: Cow::Borrowed("zk_pke_public_params.cbor"), + metadata: Cow::Borrowed("drawkcab"), + }), + }; + +pub struct V0_8; + +impl TfhersVersion for V0_8 { + const VERSION_NUMBER: &'static str = "0.8"; + + fn seed_prng(seed: u128) { + let mut seeder = DeterministicSeeder::::new(Seed(seed)); + let shortint_engine = ShortintEngine::new_from_seeder(&mut seeder); + ShortintEngine::with_thread_local_mut(|local_engine| { + let _ = std::mem::replace(local_engine, shortint_engine); + }); + + let boolean_engine = BooleanEngine::new_from_seeder(&mut seeder); + BooleanEngine::replace_thread_local(boolean_engine); + } + + fn gen_shortint_data() -> Vec { + Vec::new() + } + + fn gen_hl_data() -> Vec { + let dir = Self::data_dir().join(HL_MODULE_NAME); + create_dir_all(&dir).unwrap(); + + // Generate a compact public key needed to create a compact list + let config = + tfhe_0_8::ConfigBuilder::with_custom_parameters(VALID_TEST_PARAMS_TUNIFORM).build(); + let hl_client_key = ClientKey::generate(config); + let compact_pub_key = CompactPublicKey::new(&hl_client_key); + + let mut zk_rng: RandomGenerator = + RandomGenerator::new(Seed(PRNG_SEED)); + let crs = CompactPkeCrs::new( + LweDimension(ZK_PKE_PUBLIC_PARAMS_TEST.lwe_dimension), + ZK_PKE_PUBLIC_PARAMS_TEST.max_num_cleartext, + TUniform::::new(ZK_PKE_PUBLIC_PARAMS_TEST.noise_bound as u32), + CiphertextModulus::new(ZK_PKE_PUBLIC_PARAMS_TEST.ciphertext_modulus), + ZK_PKE_PUBLIC_PARAMS_TEST.plaintext_modulus as u64, + &mut zk_rng, + ) + .unwrap(); + + // Store the associated client key to be able to decrypt the ciphertexts in the list + store_versioned_auxiliary!( + &hl_client_key, + &dir, + &HL_PROVEN_COMPACTLIST_TEST.key_filename + ); + + store_versioned_auxiliary!( + &compact_pub_key, + &dir, + &HL_PROVEN_COMPACTLIST_TEST + .proof_info + .unwrap() + .public_key_filename + ); + + let mut proven_builder = ProvenCompactCiphertextList::builder(&compact_pub_key); + proven_builder + .push(HL_PROVEN_COMPACTLIST_TEST.clear_values[0] as u8) + .push(HL_PROVEN_COMPACTLIST_TEST.clear_values[1] as i8) + .push(HL_PROVEN_COMPACTLIST_TEST.clear_values[2] != 0) + .push(HL_PROVEN_COMPACTLIST_TEST.clear_values[3] != 0); + + let proven_list_packed = proven_builder + .build_with_proof_packed( + crs.public_params(), + HL_PROVEN_COMPACTLIST_TEST + .proof_info + .unwrap() + .metadata + .as_bytes(), + ZkComputeLoad::Proof, + ) + .unwrap(); + + store_versioned_test!( + crs.public_params(), + &dir, + &ZK_PKE_PUBLIC_PARAMS_TEST.test_filename, + ); + + store_versioned_test!( + &proven_list_packed, + &dir, + &HL_PROVEN_COMPACTLIST_TEST.test_filename, + ); + + vec![ + TestMetadata::ZkPkePublicParams(ZK_PKE_PUBLIC_PARAMS_TEST), + TestMetadata::HlHeterogeneousCiphertextList(HL_PROVEN_COMPACTLIST_TEST), + ] + } +} diff --git a/src/generate.rs b/src/generate.rs index 8916ed6..bb57ffe 100644 --- a/src/generate.rs +++ b/src/generate.rs @@ -8,16 +8,23 @@ use bincode::Options; use serde::Serialize; use tfhe_versionable_0_1::Versionize as Versionize01; use tfhe_versionable_0_2::Versionize as Versionize02; +use tfhe_versionable_0_3::Versionize as Versionize03; -use crate::{data_dir, dir_for_version, TestMetadata, TestParameterSet}; +use crate::{data_dir, dir_for_version, TestDistribution, TestMetadata, TestParameterSet}; + +pub const PRNG_SEED: u128 = 0xdeadbeef; /// Valid parameter set that can be used in tfhe operations pub const VALID_TEST_PARAMS: TestParameterSet = TestParameterSet { lwe_dimension: 761, glwe_dimension: 1, polynomial_size: 2048, - lwe_noise_gaussian_stddev: 6.36835566258815e-06, - glwe_noise_gaussian_stddev: 3.1529322391500584e-16, + lwe_noise_distribution: TestDistribution::Gaussian { + stddev: 6.36835566258815e-06, + }, + glwe_noise_distribution: TestDistribution::Gaussian { + stddev: 3.1529322391500584e-16, + }, pbs_base_log: 23, pbs_level: 1, ks_base_log: 3, @@ -30,13 +37,31 @@ pub const VALID_TEST_PARAMS: TestParameterSet = TestParameterSet { encryption_key_choice: Cow::Borrowed("big"), }; +pub const VALID_TEST_PARAMS_TUNIFORM: TestParameterSet = TestParameterSet { + lwe_dimension: 887, + glwe_dimension: 1, + polynomial_size: 2048, + lwe_noise_distribution: TestDistribution::TUniform { bound_log2: 46 }, + glwe_noise_distribution: TestDistribution::TUniform { bound_log2: 17 }, + pbs_base_log: 22, + pbs_level: 1, + ks_base_log: 3, + ks_level: 5, + message_modulus: 4, + carry_modulus: 4, + max_noise_level: 5, + log2_p_fail: -64.138, + ciphertext_modulus: (u64::MAX as u128) + 1, + encryption_key_choice: Cow::Borrowed("big"), +}; + /// Invalid parameter set to test the limits pub const INVALID_TEST_PARAMS: TestParameterSet = TestParameterSet { lwe_dimension: usize::MAX, glwe_dimension: usize::MAX, polynomial_size: usize::MAX, - lwe_noise_gaussian_stddev: f64::MAX, - glwe_noise_gaussian_stddev: f64::MAX, + lwe_noise_distribution: TestDistribution::Gaussian { stddev: f64::MAX }, + glwe_noise_distribution: TestDistribution::Gaussian { stddev: f64::MAX }, pbs_base_log: usize::MAX, pbs_level: usize::MAX, ks_base_log: usize::MAX, @@ -82,6 +107,7 @@ macro_rules! define_store_versioned_test_fn { } define_store_versioned_test_fn!(store_versioned_test_01, Versionize01); define_store_versioned_test_fn!(store_versioned_test_02, Versionize02); +define_store_versioned_test_fn!(store_versioned_test_03, Versionize03); /// Stores the auxiliary data in `dir`, encoded in cbor, using the right tfhe-versionable version macro_rules! define_store_versioned_auxiliary_fn { @@ -101,6 +127,7 @@ macro_rules! define_store_versioned_auxiliary_fn { } define_store_versioned_auxiliary_fn!(store_versioned_auxiliary_01, Versionize01); define_store_versioned_auxiliary_fn!(store_versioned_auxiliary_02, Versionize02); +define_store_versioned_auxiliary_fn!(store_versioned_auxiliary_03, Versionize03); pub fn store_metadata>(value: &Meta, path: P) { let serialized = ron::ser::to_string_pretty(value, ron::ser::PrettyConfig::default()).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 3092735..8bcf7f4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,6 +17,8 @@ pub mod data_0_6; #[cfg(feature = "generate")] pub mod data_0_7; #[cfg(feature = "generate")] +pub mod data_0_8; +#[cfg(feature = "generate")] pub mod generate; #[cfg(feature = "load")] pub mod load; @@ -25,6 +27,7 @@ const DATA_DIR: &str = "data"; pub const SHORTINT_MODULE_NAME: &str = "shortint"; pub const HL_MODULE_NAME: &str = "high_level_api"; +pub const ZK_MODULE_NAME: &str = "zk"; /// This struct re-defines tfhe-rs parameter sets but this allows to be independant /// of changes made into the ParameterSet of tfhe-rs. The idea here is to define a type @@ -35,8 +38,8 @@ pub struct TestParameterSet { pub lwe_dimension: usize, pub glwe_dimension: usize, pub polynomial_size: usize, - pub lwe_noise_gaussian_stddev: f64, - pub glwe_noise_gaussian_stddev: f64, + pub lwe_noise_distribution: TestDistribution, + pub glwe_noise_distribution: TestDistribution, pub pbs_base_log: usize, pub pbs_level: usize, pub ks_base_log: usize, @@ -49,6 +52,13 @@ pub struct TestParameterSet { pub encryption_key_choice: Cow<'static, str>, } +/// Representation of a random distribution that is independant from any tfhe-rs version +#[derive(Serialize, Deserialize, Clone, Debug)] +pub enum TestDistribution { + Gaussian { stddev: f64 }, + TUniform { bound_log2: u32 }, +} + pub fn dir_for_version>(data_dir: P, version: &str) -> PathBuf { let mut path = data_dir.as_ref().to_path_buf(); path.push(version.replace('.', "_")); @@ -342,11 +352,20 @@ pub enum DataKind { Unsigned, } +/// Info needed to be able to verify a pke proven compact list +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct PkeZkProofAuxilliaryInfo { + pub public_key_filename: Cow<'static, str>, + pub params_filename: Cow<'static, str>, + pub metadata: Cow<'static, str>, +} + #[derive(Serialize, Deserialize, Clone, Debug)] pub struct HlHeterogeneousCiphertextListTest { pub test_filename: Cow<'static, str>, pub key_filename: Cow<'static, str>, pub compressed: bool, + pub proof_info: Option, pub clear_values: Cow<'static, [u64]>, pub data_kinds: Cow<'static, [DataKind]>, } @@ -365,6 +384,30 @@ impl TestType for HlHeterogeneousCiphertextListTest { } } +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct ZkPkePublicParamsTest { + pub test_filename: Cow<'static, str>, + pub lwe_dimension: usize, + pub max_num_cleartext: usize, + pub noise_bound: usize, + pub ciphertext_modulus: u128, + pub plaintext_modulus: usize, +} + +impl TestType for ZkPkePublicParamsTest { + fn module(&self) -> String { + ZK_MODULE_NAME.to_string() + } + + fn target_type(&self) -> String { + "CompactPkePublicParams".to_string() + } + + fn test_filename(&self) -> String { + self.test_filename.to_string() + } +} + #[derive(Serialize, Deserialize, Clone, Debug, Display)] pub enum TestMetadata { // Shortint @@ -382,6 +425,7 @@ pub enum TestMetadata { HlClientKey(HlClientKeyTest), HlServerKey(HlServerKeyTest), HlPublicKey(HlPublicKeyTest), + ZkPkePublicParams(ZkPkePublicParamsTest), // We place it in the hl folder since it is currently used with hl tests: } #[derive(Serialize, Deserialize, Clone, Debug)] diff --git a/src/main.rs b/src/main.rs index b76c717..2e3d05d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,12 @@ use tfhe_backward_compat_data::{ data_0_6::V0_6, data_0_7::V0_7, + data_0_8::V0_8, data_dir, - generate::{store_metadata, TfhersVersion}, + generate::{store_metadata, TfhersVersion, PRNG_SEED}, Testcase, HL_MODULE_NAME, SHORTINT_MODULE_NAME, }; -const PRNG_SEED: u128 = 0xdeadbeef; - fn gen_all_data() -> Vec { Vers::seed_prng(PRNG_SEED); @@ -37,6 +36,7 @@ fn main() { let root_dir = env!("CARGO_MANIFEST_DIR"); let mut testcases = gen_all_data::(); testcases.extend(gen_all_data::()); + testcases.extend(gen_all_data::()); let shortint_testcases: Vec = testcases .iter()